Skip to content
Merged
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions forc/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,4 @@ uwu = ["uwuify"]

[dev-dependencies]
completest-pty = "0.5.0"
rexpect = "0.5"
41 changes: 20 additions & 21 deletions forc/src/cli/commands/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -61,16 +61,15 @@ pub struct Command {
#[derive(Parser, Debug, Clone)]
#[clap(after_help = help())]
pub struct TestPrintOpts {
#[clap(long = "pretty-print", short = 'r')]
#[clap(long = "pretty")]
/// Pretty-print the logs emitted from tests.
pub pretty_print: bool,
/// Print `Log` and `LogData` receipts for tests.
#[clap(long = "logs", short = 'l')]
pub print_logs: bool,
/// Decode logs and show decoded log information in human readable format alongside the raw
/// logs.
#[clap(long = "decode", short = 'd')]
pub decode_logs: bool,
/// Print the raw logs for tests.
#[clap(long)]
pub raw_logs: bool,
}

pub(crate) fn exec(cmd: Command) -> ForcResult<()> {
Expand Down Expand Up @@ -150,26 +149,26 @@ fn print_tested_pkg(pkg: &TestedPackage, test_print_opts: &TestPrintOpts) -> For
);

// If logs are enabled, print them.
let logs = &test.logs;
if test_print_opts.print_logs {
let logs = &test.logs;
if test_print_opts.decode_logs {
for log in logs {
if let Receipt::LogData {
rb,
data: Some(data),
..
} = log
{
let decoded_log_data =
decode_log_data(&rb.to_string(), data, &pkg.built.program_abi)?;
let var_value = decoded_log_data.value;
info!("Decoded log value: {}, log rb: {}", var_value, rb);
}
for log in logs {
if let Receipt::LogData {
rb,
data: Some(data),
..
} = log
{
let decoded_log_data =
decode_log_data(&rb.to_string(), data, &pkg.built.program_abi)?;
let var_value = decoded_log_data.value;
info!("Decoded log value: {}, log rb: {}", var_value, rb);
}
info!("Raw logs:");
}
}

if test_print_opts.raw_logs {
let formatted_logs = format_log_receipts(logs, test_print_opts.pretty_print)?;
info!("{}", formatted_logs);
info!("Raw logs:\n{}", formatted_logs);
}

// If the test is failing, save the test result for printing the details later on.
Expand Down
82 changes: 82 additions & 0 deletions forc/tests/cli_integration.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
use std::path::PathBuf;

use rexpect::spawn;

fn test_fixtures_path() -> PathBuf {
PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("tests")
.join("fixtures")
.canonicalize()
.unwrap()
}

#[test]
fn test_forc_test_decoded_logs() -> Result<(), rexpect::error::Error> {
// Spawn the forc binary using cargo run
let project_dir = test_fixtures_path().join("test_contract");
let mut process = spawn(
&format!(
"cargo run --bin forc -- test --logs --path {}",
project_dir.to_string_lossy()
),
Some(30000),
)?;

// Assert that the output is correct
process.exp_string(" test test_log_4")?;
process.exp_string("Decoded log value: 4, log rb: 1515152261580153489")?;
process.exp_string(" test test_log_2")?;
process.exp_string("Decoded log value: 2, log rb: 1515152261580153489")?;

process.process.exit()?;
Ok(())
}

#[test]
fn test_forc_test_raw_logs() -> Result<(), rexpect::error::Error> {
// Spawn the forc binary using cargo run
let project_dir = test_fixtures_path().join("test_contract");
let mut process = spawn(
&format!(
"cargo run --bin forc -- test --raw-logs --path {}",
project_dir.to_string_lossy()
),
Some(30000),
)?;

// Assert that the output is correct
process.exp_string(" test test_log_4")?;
process.exp_string("Raw logs:")?;
process.exp_string(r#"[{"LogData":{"data":"0000000000000004","digest":"8005f02d43fa06e7d0585fb64c961d57e318b27a145c857bcd3a6bdb413ff7fc","id":"0000000000000000000000000000000000000000000000000000000000000000","is":10368,"len":8,"pc":12652,"ptr":67107840,"ra":0,"rb":1515152261580153489}}]"#)?;
process.exp_string(" test test_log_2")?;
process.exp_string("Raw logs:")?;
process.exp_string(r#"[{"LogData":{"data":"0000000000000002","digest":"cd04a4754498e06db5a13c5f371f1f04ff6d2470f24aa9bd886540e5dce77f70","id":"0000000000000000000000000000000000000000000000000000000000000000","is":10368,"len":8,"pc":12652,"ptr":67107840,"ra":0,"rb":1515152261580153489}}]"#)?;

process.process.exit()?;
Ok(())
}

#[test]
fn test_forc_test_both_logs() -> Result<(), rexpect::error::Error> {
// Spawn the forc binary using cargo run
let project_dir = test_fixtures_path().join("test_contract");
let mut process = spawn(
&format!(
"cargo run --bin forc -- test --logs --raw-logs --path {}",
project_dir.to_string_lossy()
),
Some(30000),
)?;

// Assert that the output is correct
process.exp_string(" test test_log_4")?;
process.exp_string("Decoded log value: 4, log rb: 1515152261580153489")?;
process.exp_string("Raw logs:")?;
process.exp_string(r#"[{"LogData":{"data":"0000000000000004","digest":"8005f02d43fa06e7d0585fb64c961d57e318b27a145c857bcd3a6bdb413ff7fc","id":"0000000000000000000000000000000000000000000000000000000000000000","is":10368,"len":8,"pc":12652,"ptr":67107840,"ra":0,"rb":1515152261580153489}}]"#)?;
process.exp_string(" test test_log_2")?;
process.exp_string("Decoded log value: 2, log rb: 1515152261580153489")?;
process.exp_string("Raw logs:")?;
process.exp_string(r#"[{"LogData":{"data":"0000000000000002","digest":"cd04a4754498e06db5a13c5f371f1f04ff6d2470f24aa9bd886540e5dce77f70","id":"0000000000000000000000000000000000000000000000000000000000000000","is":10368,"len":8,"pc":12652,"ptr":67107840,"ra":0,"rb":1515152261580153489}}]"#)?;
process.process.exit()?;
Ok(())
}
2 changes: 2 additions & 0 deletions forc/tests/fixtures/test_contract/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
out
target
13 changes: 13 additions & 0 deletions forc/tests/fixtures/test_contract/Forc.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
[[package]]
name = "core"
source = "path+from-root-4D4735C41181917E"

[[package]]
name = "std"
source = "path+from-root-4D4735C41181917E"
dependencies = ["core"]

[[package]]
name = "test_contract"
source = "member"
dependencies = ["std"]
8 changes: 8 additions & 0 deletions forc/tests/fixtures/test_contract/Forc.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
[project]
authors = ["Fuel Labs <contact@fuel.sh>"]
entry = "main.sw"
license = "Apache-2.0"
name = "test_contract"

[dependencies]
std = { path = "../../../../sway-lib-std/" }
23 changes: 23 additions & 0 deletions forc/tests/fixtures/test_contract/src/main.sw
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
contract;

abi MyContract {
fn test_function() -> bool;
}

impl MyContract for Contract {
fn test_function() -> bool {
true
}
}

#[test]
fn test_log_4() {
log(4);
assert(1 == 1)
}

#[test]
fn test_log_2() {
log(2);
assert(1 == 1)
}
Loading