From e9f8aed8b8aad0d4e7561cac2b47c6d5feb7337a Mon Sep 17 00:00:00 2001 From: green Date: Mon, 6 Feb 2023 23:45:45 +0000 Subject: [PATCH 1/5] Stop the service if it is not used --- crates/services/src/service.rs | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/crates/services/src/service.rs b/crates/services/src/service.rs index 5e84580001..24f04b4050 100644 --- a/crates/services/src/service.rs +++ b/crates/services/src/service.rs @@ -101,16 +101,25 @@ pub trait RunnableTask: Send { #[derive(Debug)] pub struct ServiceRunner where - S: RunnableService, + S: RunnableService + 'static, { /// The shared state of the service pub shared: S::SharedData, state: Shared>, } +impl Drop for ServiceRunner +where + S: RunnableService + 'static, +{ + fn drop(&mut self) { + self.stop(); + } +} + impl Clone for ServiceRunner where - S: RunnableService, + S: RunnableService + 'static, { fn clone(&self) -> Self { Self { @@ -454,4 +463,19 @@ mod tests { let state = service.stop_and_await().await.unwrap(); assert!(state.stopped()); } + + #[tokio::test] + async fn stop_unused_service() { + let mut receiver; + { + let service = ServiceRunner::new(MockService::new_empty()); + service.start().unwrap(); + receiver = service.state.subscribe(); + } + + receiver.changed().await.unwrap(); + assert!(matches!(receiver.borrow().clone(), State::Stopping)); + receiver.changed().await.unwrap(); + assert!(receiver.borrow().stopped()); + } } From 7d9f48c2bb2fad0c88c22fbdeace92fc0a8acd62 Mon Sep 17 00:00:00 2001 From: green Date: Tue, 7 Feb 2023 00:19:59 +0000 Subject: [PATCH 2/5] Fix a clonning of the `TxPool` --- crates/fuel-core/src/graphql_api/service.rs | 5 ++++- crates/fuel-core/src/service/sub_services.rs | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/crates/fuel-core/src/graphql_api/service.rs b/crates/fuel-core/src/graphql_api/service.rs index d743fadf0e..6ec5ecf90e 100644 --- a/crates/fuel-core/src/graphql_api/service.rs +++ b/crates/fuel-core/src/graphql_api/service.rs @@ -10,7 +10,10 @@ use crate::{ CoreSchema, CoreSchemaBuilder, }, - service::metrics::metrics, + service::{ + adapters::P2PAdapter, + metrics::metrics, + }, }; use async_graphql::{ extensions::Tracing, diff --git a/crates/fuel-core/src/service/sub_services.rs b/crates/fuel-core/src/service/sub_services.rs index 0bad31508d..d7e6eeb83f 100644 --- a/crates/fuel-core/src/service/sub_services.rs +++ b/crates/fuel-core/src/service/sub_services.rs @@ -164,7 +164,7 @@ pub fn init_sub_services( gql_database, schema, Box::new(producer_adapter), - Box::new(txpool.clone()), + Box::new(txpool.shared.clone()), Box::new(poa_adapter), )?; From 8b58eb6e4ce20278c60d80778ac7ea833769d35b Mon Sep 17 00:00:00 2001 From: green Date: Tue, 7 Feb 2023 00:28:35 +0000 Subject: [PATCH 3/5] Not drop the `FuelService` for tests --- tests/tests/contract.rs | 18 +++++++++++++++--- tests/tests/helpers.rs | 4 +++- tests/tests/tx/utxo_validation.rs | 18 +++++++++++++++--- 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/tests/tests/contract.rs b/tests/tests/contract.rs index daa1b55afd..9ac2165b80 100644 --- a/tests/tests/contract.rs +++ b/tests/tests/contract.rs @@ -28,7 +28,11 @@ async fn test_contract_salt() { let (_, contract_id) = test_builder.setup_contract(vec![], None); // spin up node - let TestContext { client, .. } = test_builder.finalize().await; + let TestContext { + client, + srv: _dont_drop, + .. + } = test_builder.finalize().await; let contract = client .contract(format!("{contract_id:#x}").as_str()) @@ -52,7 +56,11 @@ async fn test_contract_balance( test_builder.setup_contract(vec![], Some(vec![(asset, test_balance)])); // spin up node - let TestContext { client, .. } = test_builder.finalize().await; + let TestContext { + client, + srv: _dont_drop, + .. + } = test_builder.finalize().await; let balance = client .contract_balance( @@ -85,7 +93,11 @@ async fn test_5_contract_balances( ]), ); - let TestContext { client, .. } = test_builder.finalize().await; + let TestContext { + client, + srv: _dont_drop, + .. + } = test_builder.finalize().await; let contract_balances = client .contract_balances( diff --git a/tests/tests/helpers.rs b/tests/tests/helpers.rs index b1cee3406e..08dab8682a 100644 --- a/tests/tests/helpers.rs +++ b/tests/tests/helpers.rs @@ -25,6 +25,7 @@ use std::collections::HashMap; /// Helper for wrapping a currently running node environment pub struct TestContext { + pub srv: FuelService, pub rng: StdRng, pub client: FuelClient, } @@ -34,7 +35,7 @@ impl TestContext { let rng = StdRng::seed_from_u64(seed); let srv = FuelService::new_node(Config::local_node()).await.unwrap(); let client = FuelClient::from(srv.bound_address); - Self { rng, client } + Self { srv, rng, client } } } @@ -149,6 +150,7 @@ impl TestSetupBuilder { let client = FuelClient::from(srv.bound_address); TestContext { + srv, rng: self.rng.clone(), client, } diff --git a/tests/tests/tx/utxo_validation.rs b/tests/tests/tx/utxo_validation.rs index 01b8ad0cba..0dbe3c8849 100644 --- a/tests/tests/tx/utxo_validation.rs +++ b/tests/tests/tx/utxo_validation.rs @@ -71,7 +71,11 @@ async fn submit_utxo_verified_tx_with_min_gas_price() { test_builder.config_coin_inputs_from_transactions(&transactions.iter().collect_vec()); // spin up node - let TestContext { client, .. } = test_builder.finalize().await; + let TestContext { + client, + srv: _dont_drop, + .. + } = test_builder.finalize().await; // submit transactions and verify their status for tx in transactions { @@ -119,7 +123,11 @@ async fn submit_utxo_verified_tx_below_min_gas_price_fails() { // initialize node with higher minimum gas price let mut test_builder = TestSetupBuilder::new(2322u64); test_builder.min_gas_price = 10; - let TestContext { client, .. } = test_builder.finalize().await; + let TestContext { + client, + srv: _dont_drop, + .. + } = test_builder.finalize().await; let result = client.submit(&tx).await; @@ -254,7 +262,11 @@ async fn concurrent_tx_submission_produces_expected_blocks() { test_builder.config_coin_inputs_from_transactions(&txs.iter().collect_vec()); let txs: Vec = txs.into_iter().map(Into::into).collect_vec(); - let TestContext { client, .. } = test_builder.finalize().await; + let TestContext { + client, + srv: _dont_drop, + .. + } = test_builder.finalize().await; let tasks = txs.iter().map(|tx| client.submit_and_await_commit(tx)); From 03c44b73da0f7dd719f898f21d8b6b8c4869854d Mon Sep 17 00:00:00 2001 From: green Date: Mon, 13 Feb 2023 17:36:03 +0000 Subject: [PATCH 4/5] Fixed all tests that dropped the `FuelService` before. Also, not create a `PoA` service, if the production is disabled. --- crates/fuel-core/src/graphql_api/ports.rs | 12 +- crates/fuel-core/src/graphql_api/service.rs | 5 +- crates/fuel-core/src/service/adapters.rs | 2 +- .../service/adapters/consensus_module/poa.rs | 9 +- .../src/service/adapters/graphql_api.rs | 27 ++-- crates/fuel-core/src/service/sub_services.rs | 22 +-- tests/tests/resource.rs | 137 ++++++++++++------ tests/tests/sync.rs | 2 +- tests/tests/tx.rs | 28 +++- tests/tests/tx/utxo_validation.rs | 4 +- 10 files changed, 158 insertions(+), 90 deletions(-) diff --git a/crates/fuel-core/src/graphql_api/ports.rs b/crates/fuel-core/src/graphql_api/ports.rs index 3f8cc6ef1b..d4473abc6a 100644 --- a/crates/fuel-core/src/graphql_api/ports.rs +++ b/crates/fuel-core/src/graphql_api/ports.rs @@ -1,6 +1,6 @@ use crate::state::IterDirection; -use anyhow::Result; use async_trait::async_trait; +use fuel_core_services::stream::BoxStream; use fuel_core_storage::{ iter::BoxedIter, tables::{ @@ -19,6 +19,7 @@ use fuel_core_storage::{ Result as StorageResult, StorageInspect, }; +use fuel_core_txpool::service::TxUpdate; use fuel_core_types::{ blockchain::primitives::{ BlockHeight, @@ -145,14 +146,15 @@ pub trait DatabaseChain { fn base_chain_height(&self) -> StorageResult; } + pub trait TxPoolPort: Send + Sync { fn find_one(&self, id: TxId) -> Option; + fn insert(&self, txs: Vec>) -> Vec>; + fn tx_update_subscribe( &self, - ) -> fuel_core_services::stream::BoxStream< - Result, - >; + ) -> BoxStream>; } #[async_trait] @@ -162,7 +164,7 @@ pub trait DryRunExecution { transaction: Transaction, height: Option, utxo_validation: Option, - ) -> Result>; + ) -> anyhow::Result>; } pub trait BlockProducerPort: Send + Sync + DryRunExecution {} diff --git a/crates/fuel-core/src/graphql_api/service.rs b/crates/fuel-core/src/graphql_api/service.rs index 6ec5ecf90e..d743fadf0e 100644 --- a/crates/fuel-core/src/graphql_api/service.rs +++ b/crates/fuel-core/src/graphql_api/service.rs @@ -10,10 +10,7 @@ use crate::{ CoreSchema, CoreSchemaBuilder, }, - service::{ - adapters::P2PAdapter, - metrics::metrics, - }, + service::metrics::metrics, }; use async_graphql::{ extensions::Tracing, diff --git a/crates/fuel-core/src/service/adapters.rs b/crates/fuel-core/src/service/adapters.rs index ed528777ef..07a3b27ed5 100644 --- a/crates/fuel-core/src/service/adapters.rs +++ b/crates/fuel-core/src/service/adapters.rs @@ -19,7 +19,7 @@ pub mod txpool; #[derive(Clone)] pub struct PoAAdapter { - shared_state: fuel_core_poa::service::SharedState, + shared_state: Option, } #[derive(Clone)] diff --git a/crates/fuel-core/src/service/adapters/consensus_module/poa.rs b/crates/fuel-core/src/service/adapters/consensus_module/poa.rs index 000a2f879b..1a0b7beb33 100644 --- a/crates/fuel-core/src/service/adapters/consensus_module/poa.rs +++ b/crates/fuel-core/src/service/adapters/consensus_module/poa.rs @@ -8,6 +8,7 @@ use crate::{ TxPoolAdapter, }, }; +use anyhow::anyhow; use fuel_core_poa::{ ports::{ BlockImporter, @@ -37,7 +38,7 @@ use fuel_core_types::{ }; impl PoAAdapter { - pub fn new(shared_state: SharedState) -> Self { + pub fn new(shared_state: Option) -> Self { Self { shared_state } } } @@ -48,7 +49,11 @@ impl ConsensusModulePort for PoAAdapter { &self, block_times: Vec>, ) -> anyhow::Result<()> { - self.shared_state.manually_produce_block(block_times).await + self.shared_state + .as_ref() + .ok_or(anyhow!("The block production is disabled"))? + .manually_produce_block(block_times) + .await } } diff --git a/crates/fuel-core/src/service/adapters/graphql_api.rs b/crates/fuel-core/src/service/adapters/graphql_api.rs index 2fbd279cca..68b2e217f6 100644 --- a/crates/fuel-core/src/service/adapters/graphql_api.rs +++ b/crates/fuel-core/src/service/adapters/graphql_api.rs @@ -15,11 +15,11 @@ use crate::{ DryRunExecution, TxPoolPort, }, - service::sub_services::TxPoolService, + service::adapters::TxPoolAdapter, state::IterDirection, }; -use anyhow::Result; use async_trait::async_trait; +use fuel_core_services::stream::BoxStream; use fuel_core_storage::{ iter::{ BoxedIter, @@ -29,9 +29,12 @@ use fuel_core_storage::{ Error as StorageError, Result as StorageResult, }; -use fuel_core_txpool::types::{ - ContractId, - TxId, +use fuel_core_txpool::{ + service::TxUpdate, + types::{ + ContractId, + TxId, + }, }; use fuel_core_types::{ blockchain::primitives::{ @@ -198,21 +201,19 @@ impl DatabaseChain for Database { impl DatabasePort for Database {} -impl TxPoolPort for TxPoolService { +impl TxPoolPort for TxPoolAdapter { fn insert(&self, txs: Vec>) -> Vec> { - self.shared.insert(txs) + self.service.insert(txs) } fn tx_update_subscribe( &self, - ) -> fuel_core_services::stream::BoxStream< - Result, - > { - Box::pin(BroadcastStream::new(self.shared.tx_update_subscribe())) + ) -> BoxStream> { + Box::pin(BroadcastStream::new(self.service.tx_update_subscribe())) } fn find_one(&self, id: TxId) -> Option { - self.shared.find_one(id) + self.service.find_one(id) } } @@ -223,7 +224,7 @@ impl DryRunExecution for BlockProducerAdapter { transaction: Transaction, height: Option, utxo_validation: Option, - ) -> Result> { + ) -> anyhow::Result> { self.block_producer .dry_run(transaction, height, utxo_validation) .await diff --git a/crates/fuel-core/src/service/sub_services.rs b/crates/fuel-core/src/service/sub_services.rs index d7e6eeb83f..fe9cfbcb2d 100644 --- a/crates/fuel-core/src/service/sub_services.rs +++ b/crates/fuel-core/src/service/sub_services.rs @@ -118,14 +118,16 @@ pub fn init_sub_services( let poa_config: fuel_core_poa::Config = config.try_into()?; let production_enabled = !matches!(poa_config.trigger, Trigger::Never) || config.manual_blocks_enabled; - let poa = fuel_core_poa::new_service( - last_height, - poa_config, - tx_pool_adapter, - producer_adapter.clone(), - importer_adapter.clone(), - ); - let poa_adapter = PoAAdapter::new(poa.shared.clone()); + let poa = (production_enabled).then(|| { + fuel_core_poa::new_service( + last_height, + poa_config, + tx_pool_adapter.clone(), + producer_adapter.clone(), + importer_adapter.clone(), + ) + }); + let poa_adapter = PoAAdapter::new(poa.as_ref().map(|service| service.shared.clone())); #[cfg(feature = "p2p")] let sync = (!production_enabled) @@ -164,7 +166,7 @@ pub fn init_sub_services( gql_database, schema, Box::new(producer_adapter), - Box::new(txpool.shared.clone()), + Box::new(tx_pool_adapter), Box::new(poa_adapter), )?; @@ -188,7 +190,7 @@ pub fn init_sub_services( Box::new(txpool), ]; - if production_enabled { + if let Some(poa) = poa { services.push(Box::new(poa)); } diff --git a/tests/tests/resource.rs b/tests/tests/resource.rs index 82eb97fbfb..18cd3b0406 100644 --- a/tests/tests/resource.rs +++ b/tests/tests/resource.rs @@ -1,3 +1,4 @@ +use crate::helpers::TestContext; use fuel_core::{ chain_config::{ CoinConfig, @@ -15,6 +16,10 @@ use fuel_core_client::client::{ FuelClient, }; use fuel_core_types::fuel_tx::*; +use rand::{ + prelude::StdRng, + SeedableRng, +}; mod coins { use super::*; @@ -23,7 +28,7 @@ mod coins { owner: Address, asset_id_a: AssetId, asset_id_b: AssetId, - ) -> FuelClient { + ) -> TestContext { // setup config let mut config = Config::local_node(); config.chain_conf.initial_state = Some(StateConfig { @@ -55,7 +60,13 @@ mod coins { // setup server & client let srv = FuelService::new_node(config).await.unwrap(); - FuelClient::from(srv.bound_address) + let client = FuelClient::from(srv.bound_address); + + TestContext { + srv, + rng: StdRng::seed_from_u64(0x123), + client, + } } #[rstest::rstest] @@ -74,10 +85,11 @@ mod coins { } async fn query_target_1(owner: Address, asset_id_a: AssetId, asset_id_b: AssetId) { - let client = setup(owner, asset_id_a, asset_id_b).await; + let context = setup(owner, asset_id_a, asset_id_b).await; // spend_query for 1 a and 1 b - let resources_per_asset = client + let resources_per_asset = context + .client .resources_to_spend( format!("{owner:#x}").as_str(), vec![ @@ -96,10 +108,11 @@ mod coins { } async fn query_target_300(owner: Address, asset_id_a: AssetId, asset_id_b: AssetId) { - let client = setup(owner, asset_id_a, asset_id_b).await; + let context = setup(owner, asset_id_a, asset_id_b).await; // spend_query for 300 a and 300 b - let resources_per_asset = client + let resources_per_asset = context + .client .resources_to_spend( format!("{owner:#x}").as_str(), vec![ @@ -118,10 +131,11 @@ mod coins { } async fn exclude_all(owner: Address, asset_id_a: AssetId, asset_id_b: AssetId) { - let client = setup(owner, asset_id_a, asset_id_b).await; + let context = setup(owner, asset_id_a, asset_id_b).await; // query all resources - let resources_per_asset = client + let resources_per_asset = context + .client .resources_to_spend( format!("{owner:#x}").as_str(), vec![ @@ -145,7 +159,8 @@ mod coins { }) .collect(); let all_utxo_ids = all_utxos.iter().map(String::as_str).collect(); - let resources_per_asset = client + let resources_per_asset = context + .client .resources_to_spend( format!("{owner:#x}").as_str(), vec![ @@ -171,10 +186,11 @@ mod coins { asset_id_a: AssetId, asset_id_b: AssetId, ) { - let client = setup(owner, asset_id_a, asset_id_b).await; + let context = setup(owner, asset_id_a, asset_id_b).await; // not enough resources - let resources_per_asset = client + let resources_per_asset = context + .client .resources_to_spend( format!("{owner:#x}").as_str(), vec![ @@ -200,10 +216,11 @@ mod coins { asset_id_a: AssetId, asset_id_b: AssetId, ) { - let client = setup(owner, asset_id_a, asset_id_b).await; + let context = setup(owner, asset_id_a, asset_id_b).await; // not enough inputs - let resources_per_asset = client + let resources_per_asset = context + .client .resources_to_spend( format!("{owner:#x}").as_str(), vec![ @@ -226,7 +243,7 @@ mod messages { use super::*; - async fn setup(owner: Address) -> (AssetId, FuelClient) { + async fn setup(owner: Address) -> (AssetId, TestContext) { let base_asset_id = AssetId::BASE; // setup config @@ -254,8 +271,13 @@ mod messages { // setup server & client let srv = FuelService::new_node(config).await.unwrap(); let client = FuelClient::from(srv.bound_address); + let context = TestContext { + srv, + rng: StdRng::seed_from_u64(0x123), + client, + }; - (base_asset_id, client) + (base_asset_id, context) } #[rstest::rstest] @@ -272,10 +294,11 @@ mod messages { } async fn query_target_1(owner: Address) { - let (base_asset_id, client) = setup(owner).await; + let (base_asset_id, context) = setup(owner).await; // query resources for `base_asset_id` and target 1 - let resources_per_asset = client + let resources_per_asset = context + .client .resources_to_spend( format!("{owner:#x}").as_str(), vec![(format!("{base_asset_id:#x}").as_str(), 1, None)], @@ -287,10 +310,11 @@ mod messages { } async fn query_target_300(owner: Address) { - let (base_asset_id, client) = setup(owner).await; + let (base_asset_id, context) = setup(owner).await; // query for 300 base assets - let resources_per_asset = client + let resources_per_asset = context + .client .resources_to_spend( format!("{owner:#x}").as_str(), vec![(format!("{base_asset_id:#x}").as_str(), 300, None)], @@ -303,10 +327,11 @@ mod messages { } async fn exclude_all(owner: Address) { - let (base_asset_id, client) = setup(owner).await; + let (base_asset_id, context) = setup(owner).await; // query for 300 base assets - let resources_per_asset = client + let resources_per_asset = context + .client .resources_to_spend( format!("{owner:#x}").as_str(), vec![(format!("{base_asset_id:#x}").as_str(), 300, None)], @@ -327,7 +352,8 @@ mod messages { }) .collect(); let all_message_ids = all_message_ids.iter().map(String::as_str).collect(); - let resources_per_asset = client + let resources_per_asset = context + .client .resources_to_spend( format!("{owner:#x}").as_str(), vec![(format!("{base_asset_id:#x}").as_str(), 1, None)], @@ -346,10 +372,11 @@ mod messages { } async fn query_more_than_we_have(owner: Address) { - let (base_asset_id, client) = setup(owner).await; + let (base_asset_id, context) = setup(owner).await; // max resources reached - let resources_per_asset = client + let resources_per_asset = context + .client .resources_to_spend( format!("{owner:#x}").as_str(), vec![(format!("{base_asset_id:#x}").as_str(), 301, None)], @@ -368,10 +395,11 @@ mod messages { } async fn query_limit_resources(owner: Address) { - let (base_asset_id, client) = setup(owner).await; + let (base_asset_id, context) = setup(owner).await; // not enough inputs - let resources_per_asset = client + let resources_per_asset = context + .client .resources_to_spend( format!("{owner:#x}").as_str(), vec![(format!("{base_asset_id:#x}").as_str(), 300, Some(2))], @@ -392,7 +420,7 @@ mod messages_and_coins { use super::*; - async fn setup(owner: Address, asset_id_b: AssetId) -> (AssetId, FuelClient) { + async fn setup(owner: Address, asset_id_b: AssetId) -> (AssetId, TestContext) { let asset_id_a = AssetId::BASE; // setup config @@ -438,8 +466,13 @@ mod messages_and_coins { // setup server & client let srv = FuelService::new_node(config).await.unwrap(); let client = FuelClient::from(srv.bound_address); + let context = TestContext { + srv, + rng: StdRng::seed_from_u64(0x123), + client, + }; - (asset_id_a, client) + (asset_id_a, context) } #[rstest::rstest] @@ -457,10 +490,11 @@ mod messages_and_coins { } async fn query_target_1(owner: Address, asset_id_b: AssetId) { - let (asset_id_a, client) = setup(owner, asset_id_b).await; + let (asset_id_a, context) = setup(owner, asset_id_b).await; // query resources for `base_asset_id` and target 1 - let resources_per_asset = client + let resources_per_asset = context + .client .resources_to_spend( format!("{owner:#x}").as_str(), vec![ @@ -479,10 +513,11 @@ mod messages_and_coins { } async fn query_target_300(owner: Address, asset_id_b: AssetId) { - let (asset_id_a, client) = setup(owner, asset_id_b).await; + let (asset_id_a, context) = setup(owner, asset_id_b).await; // query for 300 base assets - let resources_per_asset = client + let resources_per_asset = context + .client .resources_to_spend( format!("{owner:#x}").as_str(), vec![ @@ -501,10 +536,11 @@ mod messages_and_coins { } async fn exclude_all(owner: Address, asset_id_b: AssetId) { - let (asset_id_a, client) = setup(owner, asset_id_b).await; + let (asset_id_a, context) = setup(owner, asset_id_b).await; // query for 300 base assets - let resources_per_asset = client + let resources_per_asset = context + .client .resources_to_spend( format!("{owner:#x}").as_str(), vec![ @@ -546,7 +582,8 @@ mod messages_and_coins { assert_eq!(all_utxo_ids.len(), 4); assert_eq!(all_message_ids.len(), 2); - let resources_per_asset = client + let resources_per_asset = context + .client .resources_to_spend( format!("{owner:#x}").as_str(), vec![ @@ -568,10 +605,11 @@ mod messages_and_coins { } async fn query_more_than_we_have(owner: Address, asset_id_b: AssetId) { - let (asset_id_a, client) = setup(owner, asset_id_b).await; + let (asset_id_a, context) = setup(owner, asset_id_b).await; // max resources reached - let resources_per_asset = client + let resources_per_asset = context + .client .resources_to_spend( format!("{owner:#x}").as_str(), vec![ @@ -593,10 +631,11 @@ mod messages_and_coins { } async fn query_limit_resources(owner: Address, asset_id_b: AssetId) { - let (asset_id_a, client) = setup(owner, asset_id_b).await; + let (asset_id_a, context) = setup(owner, asset_id_b).await; // not enough inputs - let resources_per_asset = client + let resources_per_asset = context + .client .resources_to_spend( format!("{owner:#x}").as_str(), vec![ @@ -614,7 +653,7 @@ mod messages_and_coins { } } -async fn empty_setup() -> FuelClient { +async fn empty_setup() -> TestContext { // setup config let mut config = Config::local_node(); config.chain_conf.initial_state = Some(StateConfig { @@ -626,7 +665,13 @@ async fn empty_setup() -> FuelClient { // setup server & client let srv = FuelService::new_node(config).await.unwrap(); - FuelClient::from(srv.bound_address) + let client = FuelClient::from(srv.bound_address); + + TestContext { + srv, + rng: StdRng::seed_from_u64(0x123), + client, + } } #[rstest::rstest] @@ -635,10 +680,11 @@ async fn resources_to_spend_empty( #[values(Address::default(), Address::from([5; 32]), Address::from([16; 32]))] owner: Address, ) { - let client = empty_setup().await; + let context = empty_setup().await; // empty spend_query - let resources_per_asset = client + let resources_per_asset = context + .client .resources_to_spend(format!("{owner:#x}").as_str(), vec![], None) .await .unwrap(); @@ -652,10 +698,11 @@ async fn resources_to_spend_error_duplicate_asset_query( owner: Address, #[values(AssetId::new([1u8; 32]), AssetId::new([99u8; 32]))] asset_id: AssetId, ) { - let client = empty_setup().await; + let context = empty_setup().await; // the queries with the same id - let resources_per_asset = client + let resources_per_asset = context + .client .resources_to_spend( format!("{owner:#x}").as_str(), vec![ diff --git a/tests/tests/sync.rs b/tests/tests/sync.rs index 2aaa1c4515..3b78d0e415 100644 --- a/tests/tests/sync.rs +++ b/tests/tests/sync.rs @@ -268,7 +268,7 @@ async fn test_multiple_producers_different_keys() { } // Wait producers to produce all blocks. - for (expected, mut producer) in expected.iter().zip(producers) { + for (expected, producer) in expected.iter().zip(producers.iter_mut()) { producer.consistency_10s(expected).await; } diff --git a/tests/tests/tx.rs b/tests/tests/tx.rs index c5f15e0fcc..2efb4011b9 100644 --- a/tests/tests/tx.rs +++ b/tests/tests/tx.rs @@ -390,7 +390,7 @@ async fn get_transactions() { async fn get_transactions_from_manual_blocks() { let (executor, db) = get_executor_and_db(); // get access to a client - let client = initialize_client(db).await; + let context = initialize_client(db).await; // create 10 txs let txs: Vec = (0..10).map(create_mock_tx).collect(); @@ -438,7 +438,11 @@ async fn get_transactions_from_manual_blocks() { results: 4, direction: PageDirection::Forward, }; - let response = client.transactions(page_request_forwards).await.unwrap(); + let response = context + .client + .transactions(page_request_forwards) + .await + .unwrap(); let transactions = &response .results .iter() @@ -455,7 +459,8 @@ async fn get_transactions_from_manual_blocks() { results: 5, direction: PageDirection::Forward, }; - let response = client + let response = context + .client .transactions(next_page_request_forwards) .await .unwrap(); @@ -476,7 +481,11 @@ async fn get_transactions_from_manual_blocks() { results: 10, direction: PageDirection::Backward, }; - let response = client.transactions(page_request_backwards).await.unwrap(); + let response = context + .client + .transactions(page_request_backwards) + .await + .unwrap(); let transactions = &response .results .iter() @@ -596,10 +605,15 @@ fn get_executor_and_db() -> (Executor, Database) { (executor, db) } -async fn initialize_client(db: Database) -> FuelClient { +async fn initialize_client(db: Database) -> TestContext { let config = Config::local_node(); - let service = FuelService::from_database(db, config).await.unwrap(); - FuelClient::from(service.bound_address) + let srv = FuelService::from_database(db, config).await.unwrap(); + let client = FuelClient::from(srv.bound_address); + TestContext { + srv, + rng: StdRng::seed_from_u64(0x123), + client, + } } // add random val for unique tx diff --git a/tests/tests/tx/utxo_validation.rs b/tests/tests/tx/utxo_validation.rs index 0dbe3c8849..1ac9db00cc 100644 --- a/tests/tests/tx/utxo_validation.rs +++ b/tests/tests/tx/utxo_validation.rs @@ -173,9 +173,9 @@ async fn dry_run_override_utxo_validation() { .add_witness(Default::default()) .finalize_as_transaction(); - let client = TestSetupBuilder::new(2322).finalize().await.client; + let context = TestSetupBuilder::new(2322).finalize().await; - let log = client.dry_run_opt(&tx, Some(false)).await.unwrap(); + let log = context.client.dry_run_opt(&tx, Some(false)).await.unwrap(); assert_eq!(2, log.len()); assert!(matches!(log[0], From a6008c27e1451f9184186a7469c34f65642e8c43 Mon Sep 17 00:00:00 2001 From: green Date: Mon, 13 Feb 2023 23:12:32 +0000 Subject: [PATCH 5/5] Remove `Clone` trait from `ServiceRunner` --- crates/services/src/service.rs | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/crates/services/src/service.rs b/crates/services/src/service.rs index 24f04b4050..f5a1c3c8ac 100644 --- a/crates/services/src/service.rs +++ b/crates/services/src/service.rs @@ -117,18 +117,6 @@ where } } -impl Clone for ServiceRunner -where - S: RunnableService + 'static, -{ - fn clone(&self) -> Self { - Self { - shared: self.shared.clone(), - state: self.state.clone(), - } - } -} - impl ServiceRunner where S: RunnableService + 'static,