Use tracing for logging. (#29)

This commit updates how logging is done in the differential testing
harness to use `tracing` instead of using the `log` crate. This allows
us to be able to better associate logs with the cases being executed
which makes it easier to debug and understand what the harness is doing.
This commit is contained in:
Omar
2025-07-10 10:28:16 +03:00
committed by GitHub
parent de7c7d6703
commit 0513a4befb
23 changed files with 238 additions and 210 deletions
+6 -6
View File
@@ -5,7 +5,7 @@ use std::{
use serde::{Deserialize, Serialize};
use crate::metadata::Metadata;
use crate::metadata::MetadataFile;
#[derive(Clone, Debug, Default, Serialize, Deserialize, Eq, PartialEq, Hash)]
pub struct Corpus {
@@ -21,7 +21,7 @@ impl Corpus {
}
/// Scan the corpus base directory and return all tests found.
pub fn enumerate_tests(&self) -> Vec<Metadata> {
pub fn enumerate_tests(&self) -> Vec<MetadataFile> {
let mut tests = Vec::new();
collect_metadata(&self.path, &mut tests);
tests
@@ -34,11 +34,11 @@ impl Corpus {
/// Found tests are inserted into `tests`.
///
/// `path` is expected to be a directory.
pub fn collect_metadata(path: &Path, tests: &mut Vec<Metadata>) {
pub fn collect_metadata(path: &Path, tests: &mut Vec<MetadataFile>) {
let dir_entry = match std::fs::read_dir(path) {
Ok(dir_entry) => dir_entry,
Err(error) => {
log::error!("failed to read dir '{}': {error}", path.display());
tracing::error!("failed to read dir '{}': {error}", path.display());
return;
}
};
@@ -47,7 +47,7 @@ pub fn collect_metadata(path: &Path, tests: &mut Vec<Metadata>) {
let entry = match entry {
Ok(entry) => entry,
Err(error) => {
log::error!("error reading dir entry: {error}");
tracing::error!("error reading dir entry: {error}");
continue;
}
};
@@ -59,7 +59,7 @@ pub fn collect_metadata(path: &Path, tests: &mut Vec<Metadata>) {
}
if path.is_file() {
if let Some(metadata) = Metadata::try_from_file(&path) {
if let Some(metadata) = MetadataFile::try_from_file(&path) {
tests.push(metadata)
}
}
+3 -3
View File
@@ -126,7 +126,7 @@ impl Input {
.get(&self.instance)
.ok_or_else(|| anyhow::anyhow!("ABI for instance '{}' not found", &self.instance))?;
log::trace!("ABI found for instance: {}", &self.instance);
tracing::trace!("ABI found for instance: {}", &self.instance);
// Find function by selector
let function = abi
@@ -140,7 +140,7 @@ impl Input {
)
})?;
log::trace!("Functions found for instance: {}", &self.instance);
tracing::trace!("Functions found for instance: {}", &self.instance);
let calldata_args = match &self.calldata {
Some(Calldata::Compound(args)) => args,
@@ -155,7 +155,7 @@ impl Input {
);
}
log::trace!(
tracing::trace!(
"Starting encoding ABI's parameters for instance: {}",
&self.instance
);
+31 -7
View File
@@ -1,6 +1,7 @@
use std::{
collections::BTreeMap,
fs::{File, read_to_string},
ops::Deref,
path::{Path, PathBuf},
};
@@ -15,6 +16,29 @@ pub const METADATA_FILE_EXTENSION: &str = "json";
pub const SOLIDITY_CASE_FILE_EXTENSION: &str = "sol";
pub const SOLIDITY_CASE_COMMENT_MARKER: &str = "//!";
#[derive(Debug, Default, Deserialize, Clone, Eq, PartialEq)]
pub struct MetadataFile {
pub path: PathBuf,
pub content: Metadata,
}
impl MetadataFile {
pub fn try_from_file(path: &Path) -> Option<Self> {
Metadata::try_from_file(path).map(|metadata| Self {
path: path.to_owned(),
content: metadata,
})
}
}
impl Deref for MetadataFile {
type Target = Metadata;
fn deref(&self) -> &Self::Target {
&self.content
}
}
#[derive(Debug, Default, Deserialize, Clone, Eq, PartialEq)]
pub struct Metadata {
pub cases: Vec<Case>,
@@ -35,7 +59,7 @@ impl Metadata {
.filter_map(|mode| match mode {
Mode::Solidity(solc_mode) => Some(solc_mode),
Mode::Unknown(mode) => {
log::debug!("compiler: ignoring unknown mode '{mode}'");
tracing::debug!("compiler: ignoring unknown mode '{mode}'");
None
}
})
@@ -90,7 +114,7 @@ impl Metadata {
assert!(path.is_file(), "not a file: {}", path.display());
let Some(file_extension) = path.extension() else {
log::debug!("skipping corpus file: {}", path.display());
tracing::debug!("skipping corpus file: {}", path.display());
return None;
};
@@ -102,14 +126,14 @@ impl Metadata {
return Self::try_from_solidity(path);
}
log::debug!("ignoring invalid corpus file: {}", path.display());
tracing::debug!("ignoring invalid corpus file: {}", path.display());
None
}
fn try_from_json(path: &Path) -> Option<Self> {
let file = File::open(path)
.inspect_err(|error| {
log::error!(
tracing::error!(
"opening JSON test metadata file '{}' error: {error}",
path.display()
);
@@ -122,7 +146,7 @@ impl Metadata {
Some(metadata)
}
Err(error) => {
log::error!(
tracing::error!(
"parsing JSON test metadata file '{}' error: {error}",
path.display()
);
@@ -134,7 +158,7 @@ impl Metadata {
fn try_from_solidity(path: &Path) -> Option<Self> {
let spec = read_to_string(path)
.inspect_err(|error| {
log::error!(
tracing::error!(
"opening JSON test metadata file '{}' error: {error}",
path.display()
);
@@ -163,7 +187,7 @@ impl Metadata {
Some(metadata)
}
Err(error) => {
log::error!(
tracing::error!(
"parsing Solidity test metadata file '{}' error: '{error}' from data: {spec}",
path.display()
);