From 87c9a8b60fa4a716c8576d54cef3d371ad3e58c3 Mon Sep 17 00:00:00 2001 From: adrian Date: Wed, 3 Sep 2025 09:57:39 +0200 Subject: [PATCH] test: check that all the existing substreams integration test files can be parsed --- protocol-testing/Cargo.lock | 77 +++++++++++++++++-- protocol-testing/Cargo.toml | 7 +- protocol-testing/src/test_runner.rs | 71 +++++++++++++++-- protocol-testing/src/tycho_runner.rs | 4 +- .../integration_test.tycho.yaml | 6 +- .../integration_test.tycho.yaml | 6 +- 6 files changed, 147 insertions(+), 24 deletions(-) diff --git a/protocol-testing/Cargo.lock b/protocol-testing/Cargo.lock index 3be8058..55ece36 100644 --- a/protocol-testing/Cargo.lock +++ b/protocol-testing/Cargo.lock @@ -1389,6 +1389,15 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "backtrace-ext" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "537beee3be4a18fb023b570f80e3ae28003db9167a751266b259926e25539d50" +dependencies = [ + "backtrace", +] + [[package]] name = "base16ct" version = "0.2.0" @@ -4125,6 +4134,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "is_ci" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" + [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -4499,8 +4514,16 @@ version = "7.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f98efec8807c63c752b5bd61f862c165c115b0a35685bdcfd9238c7aeb592b7" dependencies = [ + "backtrace", + "backtrace-ext", "cfg-if", "miette-derive", + "owo-colors", + "supports-color", + "supports-hyperlinks", + "supports-unicode", + "terminal_size", + "textwrap", "unicode-width 0.1.14", ] @@ -4879,6 +4902,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "owo-colors" +version = "4.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48dd4f4a2c8405440fd0462561f0e5806bd0f77e86f51c761481bdd4018b545e" + [[package]] name = "p256" version = "0.13.2" @@ -5397,6 +5426,7 @@ dependencies = [ "colored", "dotenv", "figment", + "glob", "hex", "miette", "postgres", @@ -6937,6 +6967,27 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "supports-color" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fc7232dd8d2e4ac5ce4ef302b1d81e0b80d055b9d77c7c4f51f6aa4c867d6" +dependencies = [ + "is_ci", +] + +[[package]] +name = "supports-hyperlinks" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "804f44ed3c63152de6a9f90acbea1a110441de43006ea51bcce8f436196a288b" + +[[package]] +name = "supports-unicode" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2" + [[package]] name = "sval" version = "2.14.1" @@ -7158,6 +7209,16 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "textwrap" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +dependencies = [ + "unicode-linebreak", + "unicode-width 0.2.0", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -7697,9 +7758,9 @@ dependencies = [ [[package]] name = "tycho-client" -version = "0.82.0" +version = "0.83.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19a7ed885ea7e01efc3c98135b1be5c0472e81ada6455517f61ca67313271587" +checksum = "68faa54caad8f18d764acc300564b3d468e32eb63c67219cea7429a21b71cac9" dependencies = [ "anyhow", "async-trait", @@ -7724,9 +7785,9 @@ dependencies = [ [[package]] name = "tycho-common" -version = "0.82.0" +version = "0.83.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "096c87ebe011785fcd7ed59ec501ac12b465a64fbd2914b8c0c57125c253682b" +checksum = "e031808e0cc6fe9d6402a46277464dc224c174aee40eb07122ed38bbbe2a3c65" dependencies = [ "anyhow", "async-trait", @@ -7749,7 +7810,7 @@ dependencies = [ [[package]] name = "tycho-simulation" -version = "0.155.2" +version = "0.155.0" dependencies = [ "alloy", "async-stream", @@ -7893,6 +7954,12 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + [[package]] name = "unicode-normalization" version = "0.1.24" diff --git a/protocol-testing/Cargo.toml b/protocol-testing/Cargo.toml index 6a02802..89ef520 100644 --- a/protocol-testing/Cargo.toml +++ b/protocol-testing/Cargo.toml @@ -4,12 +4,13 @@ version = "0.1.0" edition = "2021" [dependencies] -miette = "7.6.0" +glob = "0.3.0" +miette = { version = "7.6.0", features = ["fancy"] } # Logging & Tracing tracing = "0.1.37" # Tycho dependencies -tycho-common = "0.82.0" -tycho-client = "0.82.0" +tycho-common = "0.83.0" +tycho-client = "0.83.0" # TODO make this less hacky. We should probably try to build this in a similar way that the indexer is built tycho-simulation = { path = "../../tycho-simulation", features = ["evm"] } # EVM dependencies diff --git a/protocol-testing/src/test_runner.rs b/protocol-testing/src/test_runner.rs index fd41793..2027ba0 100644 --- a/protocol-testing/src/test_runner.rs +++ b/protocol-testing/src/test_runner.rs @@ -54,12 +54,7 @@ impl TestRunner { .substreams_path .join("integration_test.tycho.yaml"); - let figment = Figment::new().merge(Yaml::file(&config_yaml_path)); - - let config = figment - .extract::() - .into_diagnostic() - .wrap_err("Failed to load test configuration:")?; + let config = Self::parse_config(&config_yaml_path)?; info!("Running {} tests ...\n", config.tests.len()); info!("--------------------------------\n"); @@ -100,6 +95,17 @@ impl TestRunner { Ok(()) } + fn parse_config(config_yaml_path: &PathBuf) -> miette::Result { + info!("Config YAML: {}", config_yaml_path.display()); + let yaml = Yaml::file(&config_yaml_path); + let figment = Figment::new().merge(yaml); + let config = figment + .extract::() + .into_diagnostic() + .wrap_err("Failed to load test configuration:")?; + Ok(config) + } + fn run_test( &self, test: &IntegrationTest, @@ -402,3 +408,56 @@ fn validate_state( info!("\n✅ Simulation validation passed.\n"); Ok(()) } + +#[cfg(test)] +mod tests { + use glob::glob; + + use super::*; + + #[test] + fn test_parse_all_configs() { + let manifest_dir = env!("CARGO_MANIFEST_DIR"); + let curr_dir = PathBuf::from(manifest_dir); + let parent_dir = curr_dir.parent().unwrap(); + env::set_current_dir(parent_dir).expect("Failed to set working directory"); + + let pattern = "./substreams/*/integration_test.tycho.yaml"; + let mut results = Vec::new(); + + if glob(pattern).unwrap().count() == 0 { + panic!("No integration_test.tycho.yaml files found in substreams/*/"); + } + for entry in glob(pattern).unwrap() { + match entry { + Ok(path) => { + if !path.is_file() { + results.push(Err(format!("Path is not a file: {}", path.display()))); + } else { + let result = TestRunner::parse_config(&path); + if let Err(e) = &result { + results.push(Err(format!( + "Failed to parse config at {}: {e:?}", + path.display(), + ))); + } else { + results.push(Ok(())); + } + } + } + Err(e) => results.push(Err(format!("Glob error: {e:?}"))), + } + } + + let errors: Vec<_> = results + .iter() + .filter_map(|r| r.as_ref().err()) + .collect(); + if !errors.is_empty() { + for error in errors { + println!("{error}"); + } + panic!("One or more config files failed to parse."); + } + } +} diff --git a/protocol-testing/src/tycho_runner.rs b/protocol-testing/src/tycho_runner.rs index b3d59d8..0bf5bc4 100644 --- a/protocol-testing/src/tycho_runner.rs +++ b/protocol-testing/src/tycho_runner.rs @@ -7,7 +7,7 @@ use std::{ }; use dotenv::dotenv; -use miette::{miette, IntoDiagnostic, WrapErr}; +use miette::{IntoDiagnostic, WrapErr}; use tracing::debug; use crate::config::ProtocolComponentWithTestConfig; @@ -83,7 +83,7 @@ impl TychoRunner { .wait() .into_diagnostic() .wrap_err("Failed to wait on Tycho indexer process")?; - + // Note: tycho-indexer may exit with non-zero status when stream ends normally // This is expected behavior and should not be treated as an error if !status.success() { diff --git a/substreams/ethereum-template-factory/integration_test.tycho.yaml b/substreams/ethereum-template-factory/integration_test.tycho.yaml index 5dacda4..8dc9656 100644 --- a/substreams/ethereum-template-factory/integration_test.tycho.yaml +++ b/substreams/ethereum-template-factory/integration_test.tycho.yaml @@ -45,9 +45,7 @@ tests: - "0xdac17f958d2ee523a2206206994597c13d831ec7" - "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" - "0x6b175474e89094c44da98b954eedeac495271d0f" - static_attributes: - attr_1: "value" - attr_2: "value" + static_attributes: {} creation_tx: "0x20793bbf260912aae189d5d261ff003c9b9166da8191d8f9d63ff1c7722f3ac6" # Whether or not the script should skip trying to simulate a swap on this component. # If set to `true` please always add a reason why it's skipped. @@ -60,6 +58,6 @@ tests: tokens: - "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE" - "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84" - static_attributes: null + static_attributes: {} creation_tx: "0xfac67ecbd423a5b915deff06045ec9343568edaec34ae95c43d35f2c018afdaa" skip_simulation: true # If true, always add a reason diff --git a/substreams/ethereum-template-singleton/integration_test.tycho.yaml b/substreams/ethereum-template-singleton/integration_test.tycho.yaml index bea6aa3..566d9a7 100644 --- a/substreams/ethereum-template-singleton/integration_test.tycho.yaml +++ b/substreams/ethereum-template-singleton/integration_test.tycho.yaml @@ -37,9 +37,7 @@ tests: - "0xdac17f958d2ee523a2206206994597c13d831ec7" - "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" - "0x6b175474e89094c44da98b954eedeac495271d0f" - static_attributes: - attr_1: "value" - attr_2: "value" + static_attributes: {} creation_tx: "0x20793bbf260912aae189d5d261ff003c9b9166da8191d8f9d63ff1c7722f3ac6" # Whether or not the script should skip trying to simulate a swap on this component. # If set to `true` please always add a reason why it's skipped. @@ -52,6 +50,6 @@ tests: tokens: - "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE" - "0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84" - static_attributes: null + static_attributes: {} creation_tx: "0xfac67ecbd423a5b915deff06045ec9343568edaec34ae95c43d35f2c018afdaa" skip_simulation: true # If true, always add a reason