Remoe all references to leader and follower

This commit is contained in:
Omar Abdulla
2025-09-18 20:03:33 +03:00
parent 496bc9a0ec
commit b962d032b9
8 changed files with 48 additions and 41 deletions
+3 -3
View File
@@ -2,13 +2,13 @@ use std::path::PathBuf;
use revive_dt_common::types::VersionOrRequirement; use revive_dt_common::types::VersionOrRequirement;
use revive_dt_compiler::{Compiler, SolidityCompiler, revive_resolc::Resolc, solc::Solc}; use revive_dt_compiler::{Compiler, SolidityCompiler, revive_resolc::Resolc, solc::Solc};
use revive_dt_config::ExecutionContext; use revive_dt_config::TestExecutionContext;
use semver::Version; use semver::Version;
#[tokio::test] #[tokio::test]
async fn contracts_can_be_compiled_with_solc() { async fn contracts_can_be_compiled_with_solc() {
// Arrange // Arrange
let args = ExecutionContext::default(); let args = TestExecutionContext::default();
let solc = Solc::new(&args, VersionOrRequirement::Version(Version::new(0, 8, 30))) let solc = Solc::new(&args, VersionOrRequirement::Version(Version::new(0, 8, 30)))
.await .await
.unwrap(); .unwrap();
@@ -49,7 +49,7 @@ async fn contracts_can_be_compiled_with_solc() {
#[tokio::test] #[tokio::test]
async fn contracts_can_be_compiled_with_resolc() { async fn contracts_can_be_compiled_with_resolc() {
// Arrange // Arrange
let args = ExecutionContext::default(); let args = TestExecutionContext::default();
let resolc = Resolc::new(&args, VersionOrRequirement::Version(Version::new(0, 8, 30))) let resolc = Resolc::new(&args, VersionOrRequirement::Version(Version::new(0, 8, 30)))
.await .await
.unwrap(); .unwrap();
+16 -16
View File
@@ -27,8 +27,8 @@ use temp_dir::TempDir;
#[derive(Clone, Debug, Parser, Serialize)] #[derive(Clone, Debug, Parser, Serialize)]
#[command(name = "retester")] #[command(name = "retester")]
pub enum Context { pub enum Context {
/// Executes tests in the MatterLabs format differentially against a leader and a follower. /// Executes tests in the MatterLabs format differentially on multiple targets concurrently.
ExecuteTests(Box<ExecutionContext>), ExecuteTests(Box<TestExecutionContext>),
/// Exports the JSON schema of the MatterLabs test format used by the tool. /// Exports the JSON schema of the MatterLabs test format used by the tool.
ExportJsonSchema, ExportJsonSchema,
} }
@@ -152,7 +152,7 @@ impl AsRef<ReportConfiguration> for Context {
} }
#[derive(Clone, Debug, Parser, Serialize)] #[derive(Clone, Debug, Parser, Serialize)]
pub struct ExecutionContext { pub struct TestExecutionContext {
/// The working directory that the program will use for all of the temporary artifacts needed at /// The working directory that the program will use for all of the temporary artifacts needed at
/// runtime. /// runtime.
/// ///
@@ -219,79 +219,79 @@ pub struct ExecutionContext {
pub report_configuration: ReportConfiguration, pub report_configuration: ReportConfiguration,
} }
impl Default for ExecutionContext { impl Default for TestExecutionContext {
fn default() -> Self { fn default() -> Self {
Self::parse_from(["execution-context"]) Self::parse_from(["execution-context"])
} }
} }
impl AsRef<WorkingDirectoryConfiguration> for ExecutionContext { impl AsRef<WorkingDirectoryConfiguration> for TestExecutionContext {
fn as_ref(&self) -> &WorkingDirectoryConfiguration { fn as_ref(&self) -> &WorkingDirectoryConfiguration {
&self.working_directory &self.working_directory
} }
} }
impl AsRef<SolcConfiguration> for ExecutionContext { impl AsRef<SolcConfiguration> for TestExecutionContext {
fn as_ref(&self) -> &SolcConfiguration { fn as_ref(&self) -> &SolcConfiguration {
&self.solc_configuration &self.solc_configuration
} }
} }
impl AsRef<ResolcConfiguration> for ExecutionContext { impl AsRef<ResolcConfiguration> for TestExecutionContext {
fn as_ref(&self) -> &ResolcConfiguration { fn as_ref(&self) -> &ResolcConfiguration {
&self.resolc_configuration &self.resolc_configuration
} }
} }
impl AsRef<GethConfiguration> for ExecutionContext { impl AsRef<GethConfiguration> for TestExecutionContext {
fn as_ref(&self) -> &GethConfiguration { fn as_ref(&self) -> &GethConfiguration {
&self.geth_configuration &self.geth_configuration
} }
} }
impl AsRef<KitchensinkConfiguration> for ExecutionContext { impl AsRef<KitchensinkConfiguration> for TestExecutionContext {
fn as_ref(&self) -> &KitchensinkConfiguration { fn as_ref(&self) -> &KitchensinkConfiguration {
&self.kitchensink_configuration &self.kitchensink_configuration
} }
} }
impl AsRef<ReviveDevNodeConfiguration> for ExecutionContext { impl AsRef<ReviveDevNodeConfiguration> for TestExecutionContext {
fn as_ref(&self) -> &ReviveDevNodeConfiguration { fn as_ref(&self) -> &ReviveDevNodeConfiguration {
&self.revive_dev_node_configuration &self.revive_dev_node_configuration
} }
} }
impl AsRef<EthRpcConfiguration> for ExecutionContext { impl AsRef<EthRpcConfiguration> for TestExecutionContext {
fn as_ref(&self) -> &EthRpcConfiguration { fn as_ref(&self) -> &EthRpcConfiguration {
&self.eth_rpc_configuration &self.eth_rpc_configuration
} }
} }
impl AsRef<GenesisConfiguration> for ExecutionContext { impl AsRef<GenesisConfiguration> for TestExecutionContext {
fn as_ref(&self) -> &GenesisConfiguration { fn as_ref(&self) -> &GenesisConfiguration {
&self.genesis_configuration &self.genesis_configuration
} }
} }
impl AsRef<WalletConfiguration> for ExecutionContext { impl AsRef<WalletConfiguration> for TestExecutionContext {
fn as_ref(&self) -> &WalletConfiguration { fn as_ref(&self) -> &WalletConfiguration {
&self.wallet_configuration &self.wallet_configuration
} }
} }
impl AsRef<ConcurrencyConfiguration> for ExecutionContext { impl AsRef<ConcurrencyConfiguration> for TestExecutionContext {
fn as_ref(&self) -> &ConcurrencyConfiguration { fn as_ref(&self) -> &ConcurrencyConfiguration {
&self.concurrency_configuration &self.concurrency_configuration
} }
} }
impl AsRef<CompilationConfiguration> for ExecutionContext { impl AsRef<CompilationConfiguration> for TestExecutionContext {
fn as_ref(&self) -> &CompilationConfiguration { fn as_ref(&self) -> &CompilationConfiguration {
&self.compilation_configuration &self.compilation_configuration
} }
} }
impl AsRef<ReportConfiguration> for ExecutionContext { impl AsRef<ReportConfiguration> for TestExecutionContext {
fn as_ref(&self) -> &ReportConfiguration { fn as_ref(&self) -> &ReportConfiguration {
&self.report_configuration &self.report_configuration
} }
+17 -10
View File
@@ -112,7 +112,7 @@ fn main() -> anyhow::Result<()> {
#[instrument(level = "debug", name = "Collecting Corpora", skip_all)] #[instrument(level = "debug", name = "Collecting Corpora", skip_all)]
fn collect_corpora( fn collect_corpora(
context: &ExecutionContext, context: &TestExecutionContext,
) -> anyhow::Result<HashMap<Corpus, Vec<MetadataFile>>> { ) -> anyhow::Result<HashMap<Corpus, Vec<MetadataFile>>> {
let mut corpora = HashMap::new(); let mut corpora = HashMap::new();
@@ -134,7 +134,7 @@ fn collect_corpora(
} }
async fn run_driver( async fn run_driver(
context: ExecutionContext, context: TestExecutionContext,
metadata_files: &[MetadataFile], metadata_files: &[MetadataFile],
reporter: Reporter, reporter: Reporter,
report_aggregator_task: impl Future<Output = anyhow::Result<()>>, report_aggregator_task: impl Future<Output = anyhow::Result<()>>,
@@ -143,7 +143,14 @@ async fn run_driver(
let mut nodes = Vec::<(&dyn DynPlatform, NodePool)>::new(); let mut nodes = Vec::<(&dyn DynPlatform, NodePool)>::new();
for platform in platforms.into_iter() { for platform in platforms.into_iter() {
let pool = NodePool::new(Context::ExecuteTests(Box::new(context.clone())), platform) let pool = NodePool::new(Context::ExecuteTests(Box::new(context.clone())), platform)
.context("Failed to initialize follower node pool")?; .inspect_err(|err| {
error!(
%err,
platform_identifier = %platform.platform_identifier(),
"Failed to initialize the node pool for the platform."
)
})
.context("Failed to initialize the node pool")?;
nodes.push((platform, pool)); nodes.push((platform, pool));
} }
@@ -166,7 +173,7 @@ async fn run_driver(
} }
async fn tests_stream<'a>( async fn tests_stream<'a>(
args: &ExecutionContext, args: &TestExecutionContext,
metadata_files: impl IntoIterator<Item = &'a MetadataFile> + Clone, metadata_files: impl IntoIterator<Item = &'a MetadataFile> + Clone,
nodes: &'a [(&dyn DynPlatform, NodePool)], nodes: &'a [(&dyn DynPlatform, NodePool)],
reporter: Reporter, reporter: Reporter,
@@ -284,7 +291,7 @@ async fn tests_stream<'a>(
} }
async fn start_driver_task<'a>( async fn start_driver_task<'a>(
context: &ExecutionContext, context: &TestExecutionContext,
tests: impl Stream<Item = Test<'a>>, tests: impl Stream<Item = Test<'a>>,
) -> anyhow::Result<impl Future<Output = ()>> { ) -> anyhow::Result<impl Future<Output = ()>> {
info!("Starting driver task"); info!("Starting driver task");
@@ -489,7 +496,7 @@ async fn handle_case_driver<'a>(
contract_ident: library_ident, contract_ident: library_ident,
} = contract_sources.remove(library_instance)?; } = contract_sources.remove(library_instance)?;
let (code, leader_abi) = compiler_output let (code, abi) = compiler_output
.contracts .contracts
.get(&library_source_path) .get(&library_source_path)
.and_then(|contracts| contracts.get(library_ident.as_str()))?; .and_then(|contracts| contracts.get(library_ident.as_str()))?;
@@ -537,7 +544,7 @@ async fn handle_case_driver<'a>(
deployed_libraries.get_or_insert_default().insert( deployed_libraries.get_or_insert_default().insert(
library_instance.clone(), library_instance.clone(),
(library_ident.clone(), library_address, leader_abi.clone()), (library_ident.clone(), library_address, abi.clone()),
); );
} }
@@ -601,7 +608,7 @@ async fn handle_case_driver<'a>(
} }
async fn execute_corpus( async fn execute_corpus(
context: ExecutionContext, context: TestExecutionContext,
tests: &[MetadataFile], tests: &[MetadataFile],
reporter: Reporter, reporter: Reporter,
report_aggregator_task: impl Future<Output = anyhow::Result<()>>, report_aggregator_task: impl Future<Output = anyhow::Result<()>>,
@@ -703,7 +710,7 @@ impl<'a> Test<'a> {
} }
} }
// Checks for the compatibility of the EVM version with the leader and follower nodes. // Checks for the compatibility of the EVM version with the platforms specified.
fn check_evm_version_compatibility(&self) -> TestCheckFunctionResult { fn check_evm_version_compatibility(&self) -> TestCheckFunctionResult {
let Some(evm_version_requirement) = self.metadata.required_evm_version else { let Some(evm_version_requirement) = self.metadata.required_evm_version else {
return Ok(()); return Ok(());
@@ -732,7 +739,7 @@ impl<'a> Test<'a> {
} }
} }
/// Checks if the leader and follower compilers support the mode that the test is for. /// Checks if the platforms compilers support the mode that the test is for.
fn check_compiler_compatibility(&self) -> TestCheckFunctionResult { fn check_compiler_compatibility(&self) -> TestCheckFunctionResult {
let mut error_map = indexmap! { let mut error_map = indexmap! {
"test_desired_evm_version" => json!(self.metadata.required_evm_version), "test_desired_evm_version" => json!(self.metadata.required_evm_version),
+3 -3
View File
@@ -855,11 +855,11 @@ impl Drop for GethNode {
mod tests { mod tests {
use super::*; use super::*;
fn test_config() -> ExecutionContext { fn test_config() -> TestExecutionContext {
ExecutionContext::default() TestExecutionContext::default()
} }
fn new_node() -> (ExecutionContext, GethNode) { fn new_node() -> (TestExecutionContext, GethNode) {
let context = test_config(); let context = test_config();
let mut node = GethNode::new(&context); let mut node = GethNode::new(&context);
node.init(context.genesis_configuration.genesis().unwrap().clone()) node.init(context.genesis_configuration.genesis().unwrap().clone())
+4 -4
View File
@@ -1300,13 +1300,13 @@ mod tests {
use super::*; use super::*;
use crate::Node; use crate::Node;
fn test_config() -> ExecutionContext { fn test_config() -> TestExecutionContext {
let mut context = ExecutionContext::default(); let mut context = TestExecutionContext::default();
context.kitchensink_configuration.use_kitchensink = true; context.kitchensink_configuration.use_kitchensink = true;
context context
} }
fn new_node() -> (ExecutionContext, SubstrateNode) { fn new_node() -> (TestExecutionContext, SubstrateNode) {
// Note: When we run the tests in the CI we found that if they're all // Note: When we run the tests in the CI we found that if they're all
// run in parallel then the CI is unable to start all of the nodes in // run in parallel then the CI is unable to start all of the nodes in
// time and their start up times-out. Therefore, we want all of the // time and their start up times-out. Therefore, we want all of the
@@ -1340,7 +1340,7 @@ mod tests {
/// A shared node that multiple tests can use. It starts up once. /// A shared node that multiple tests can use. It starts up once.
fn shared_node() -> &'static SubstrateNode { fn shared_node() -> &'static SubstrateNode {
static NODE: LazyLock<(ExecutionContext, SubstrateNode)> = LazyLock::new(|| { static NODE: LazyLock<(TestExecutionContext, SubstrateNode)> = LazyLock::new(|| {
let (context, node) = new_node(); let (context, node) = new_node();
(context, node) (context, node)
}); });
+2 -2
View File
@@ -466,7 +466,7 @@ pub enum TestCaseStatus {
}, },
} }
/// Information related to the leader or follower node that's being used to execute the step. /// Information related to the platform node that's being used to execute the step.
#[derive(Clone, Debug, Serialize)] #[derive(Clone, Debug, Serialize)]
pub struct TestCaseNodeInformation { pub struct TestCaseNodeInformation {
/// The ID of the node that this case is being executed on. /// The ID of the node that this case is being executed on.
@@ -477,7 +477,7 @@ pub struct TestCaseNodeInformation {
pub connection_string: String, pub connection_string: String,
} }
/// Execution information tied to the leader or the follower. /// Execution information tied to the platform.
#[derive(Clone, Debug, Default, Serialize)] #[derive(Clone, Debug, Default, Serialize)]
pub struct ExecutionInformation { pub struct ExecutionInformation {
/// Information related to the node assigned to this test case. /// Information related to the node assigned to this test case.
+1 -1
View File
@@ -22,7 +22,7 @@ pub struct TestSpecifier {
} }
/// An absolute path for a test that also includes information about the node that it's assigned to /// An absolute path for a test that also includes information about the node that it's assigned to
/// and whether it's the leader or follower. /// and what platform it belongs to.
#[derive(Clone, Debug, PartialEq, Eq, Hash)] #[derive(Clone, Debug, PartialEq, Eq, Hash)]
pub struct ExecutionSpecifier { pub struct ExecutionSpecifier {
pub test_specifier: Arc<TestSpecifier>, pub test_specifier: Arc<TestSpecifier>,
+2 -2
View File
@@ -434,7 +434,7 @@ macro_rules! define_event {
} }
/// A reporter that's tied to a specific execution of the test case such as execution on /// A reporter that's tied to a specific execution of the test case such as execution on
/// a specific node like the leader or follower. /// a specific node from a specific platform.
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct [< $ident ExecutionSpecificReporter >] { pub struct [< $ident ExecutionSpecificReporter >] {
$vis reporter: [< $ident Reporter >], $vis reporter: [< $ident Reporter >],
@@ -520,7 +520,7 @@ define_event! {
/// A reason for the failure of the test. /// A reason for the failure of the test.
reason: String, reason: String,
}, },
/// An event emitted when the test case is assigned a leader node. /// An event emitted when the test case is assigned a platform node.
NodeAssigned { NodeAssigned {
/// A specifier for the test that the assignment is for. /// A specifier for the test that the assignment is for.
test_specifier: Arc<TestSpecifier>, test_specifier: Arc<TestSpecifier>,