This repository was archived by the owner on Nov 15, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 371
Fix integration test #124
Merged
Merged
Fix integration test #124
Changes from all commits
Commits
Show all changes
38 commits
Select commit
Hold shift + click to select a range
2949849
Initial commit
cecton 8672ca5
Change branch
cecton b3eed66
WIP
cecton e960f56
WIP
cecton 54f9db5
WIP
cecton bb244ab
WIP
cecton b32f136
CLEANUP
cecton 98479fd
WIP
cecton 3342c2e
WIP
cecton cbc7479
WIP
cecton 4dc2222
WIP
cecton 614bfaf
WIP
cecton 24eced7
WIP
cecton f163df5
Merge remote-tracking branch 'origin/master' into cecton-fix-int-test-3
cecton d00411a
Switch substrate branch to cumulus-branch
cecton 1ee7240
WIP
cecton eb996e0
WIP
cecton 4278565
change branch
cecton d8b2855
adapt code
cecton ea8e3f0
Merge commit 82db23f2ed78bfd1f9829563a1cfcb918215474d (conflicts)
cecton 51183c9
Merge commit 5cac590a4b13004df5eec8dbe9a3c24f6d21a15e (no conflict)
cecton 6ad5d6b
Merge commit 416c97030c08eb46dfe1372e408e0b23a66183a0 (conflicts)
cecton 87650dd
Merge commit 03205eb60104499eba0634f8a61d707326d03f86 (conflicts)
cecton 0ab83a5
adapt code
cecton b405a22
Update branches
cecton 9b4a31b
adapt code
cecton eaaf7a9
CLEANUP
cecton d186bfb
replace asyncstd by tokio
cecton 533b879
CLEANUP
cecton aaef29d
CLEANUP
cecton 712f428
CLEANUP
cecton 2deb133
CLEANUP
cecton 8c16c1b
fmt
cecton ea1ff8e
CLEANUP
cecton 792faca
CLEANUP
cecton 325a217
Applied suggestion and added prefix for debugging & cleanup
cecton 3016f8d
Revert branch change
cecton 7f840ff
Adapt code to current substrate
cecton File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,211 @@ | ||
| // Copyright 2020 Parity Technologies (UK) Ltd. | ||
| // This file is part of Substrate. | ||
|
|
||
| // Substrate is free software: you can redistribute it and/or modify | ||
| // it under the terms of the GNU General Public License as published by | ||
| // the Free Software Foundation, either version 3 of the License, or | ||
| // (at your option) any later version. | ||
|
|
||
| // Substrate is distributed in the hope that it will be useful, | ||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| // GNU General Public License for more details. | ||
|
|
||
| // You should have received a copy of the GNU General Public License | ||
| // along with Substrate. If not, see <http://www.gnu.org/licenses/>. | ||
|
|
||
| use codec::Encode; | ||
| use futures::{ | ||
| future::{self, FutureExt}, | ||
| pin_mut, select, | ||
| }; | ||
| use polkadot_primitives::parachain::{Id as ParaId, Info, Scheduling}; | ||
| use polkadot_runtime_common::registrar; | ||
| use polkadot_test_runtime_client::Sr25519Keyring; | ||
| use sc_client_api::execution_extensions::ExecutionStrategies; | ||
| use sc_informant::OutputFormat; | ||
| use sc_network::{config::TransportConfig, multiaddr}; | ||
| use sc_service::{ | ||
| config::{ | ||
| DatabaseConfig, KeystoreConfig, MultiaddrWithPeerId, NetworkConfiguration, | ||
| WasmExecutionMethod, | ||
| }, | ||
| BasePath, Configuration, Error as ServiceError, Role, TaskExecutor, | ||
| }; | ||
| use std::{sync::Arc, time::Duration}; | ||
| use substrate_test_client::BlockchainEventsExt; | ||
| use substrate_test_runtime_client::AccountKeyring::*; | ||
| use tokio::{spawn, time::delay_for as sleep}; | ||
|
|
||
| static INTEGRATION_TEST_ALLOWED_TIME: Option<&str> = option_env!("INTEGRATION_TEST_ALLOWED_TIME"); | ||
|
|
||
| #[tokio::test] | ||
| #[ignore] | ||
| async fn integration_test() { | ||
| let task_executor: TaskExecutor = (|fut, _| { | ||
| spawn(fut); | ||
| }) | ||
| .into(); | ||
|
|
||
| // start alice | ||
| let mut alice = | ||
| polkadot_test_service::run_test_node(task_executor.clone(), Alice, || {}, vec![]); | ||
|
|
||
| // start bob | ||
| let mut bob = polkadot_test_service::run_test_node( | ||
| task_executor.clone(), | ||
| Bob, | ||
| || {}, | ||
| vec![alice.addr.clone()], | ||
| ); | ||
|
|
||
| let t1 = sleep(Duration::from_secs( | ||
| INTEGRATION_TEST_ALLOWED_TIME | ||
| .and_then(|x| x.parse().ok()) | ||
| .unwrap_or(600), | ||
| )) | ||
| .fuse(); | ||
|
|
||
| let t2 = async { | ||
| let para_id = ParaId::from(100); | ||
|
|
||
| future::join(alice.wait_for_blocks(2), bob.wait_for_blocks(2)).await; | ||
|
|
||
| // export genesis state | ||
| let genesis_state = crate::command::generate_genesis_state(para_id) | ||
| .unwrap() | ||
| .encode(); | ||
|
|
||
| // create and sign transaction | ||
| let function = polkadot_test_runtime::Call::Sudo(pallet_sudo::Call::sudo(Box::new( | ||
| polkadot_test_runtime::Call::Registrar(registrar::Call::register_para( | ||
| para_id, | ||
| Info { | ||
| scheduling: Scheduling::Always, | ||
| }, | ||
| parachain_runtime::WASM_BINARY.to_vec().into(), | ||
| genesis_state.into(), | ||
| )), | ||
| ))); | ||
|
|
||
| // register parachain | ||
| let _ = alice.call_function(function, Alice).await.unwrap(); | ||
|
|
||
| // run cumulus charlie | ||
| let key = Arc::new(sp_core::Pair::from_seed(&[10; 32])); | ||
| let mut polkadot_config = polkadot_test_service::node_config( | ||
| || {}, | ||
| task_executor.clone(), | ||
| Charlie, | ||
| vec![alice.addr.clone(), bob.addr.clone()], | ||
| ); | ||
| use std::net::{Ipv4Addr, SocketAddr}; | ||
| polkadot_config.rpc_http = Some(SocketAddr::new(Ipv4Addr::LOCALHOST.into(), 27016)); | ||
| polkadot_config.rpc_methods = sc_service::config::RpcMethods::Unsafe; | ||
| let parachain_config = | ||
| parachain_config(task_executor.clone(), Charlie, vec![], para_id).unwrap(); | ||
| let service = | ||
| crate::service::run_collator(parachain_config, key, polkadot_config, para_id).unwrap(); | ||
| sleep(Duration::from_secs(3)).await; | ||
| service.client.wait_for_blocks(4).await; | ||
|
|
||
| alice.task_manager.terminate(); | ||
| bob.task_manager.terminate(); | ||
| } | ||
| .fuse(); | ||
|
|
||
| pin_mut!(t1, t2); | ||
|
|
||
| select! { | ||
| _ = t1 => { | ||
| panic!("the test took too long, maybe no parachain blocks have been produced"); | ||
| }, | ||
| _ = t2 => {}, | ||
| } | ||
| } | ||
|
|
||
| pub fn parachain_config( | ||
| task_executor: TaskExecutor, | ||
| key: Sr25519Keyring, | ||
| boot_nodes: Vec<MultiaddrWithPeerId>, | ||
| para_id: ParaId, | ||
| ) -> Result<Configuration, ServiceError> { | ||
| let base_path = BasePath::new_temp_dir()?; | ||
| let root = base_path.path().to_path_buf(); | ||
| let role = Role::Authority { | ||
| sentry_nodes: Vec::new(), | ||
| }; | ||
| let key_seed = key.to_seed(); | ||
| let spec = crate::chain_spec::get_chain_spec(para_id); | ||
|
|
||
| let mut network_config = NetworkConfiguration::new( | ||
| format!("Cumulus Test Node for: {}", key_seed), | ||
| "network/test/0.1", | ||
| Default::default(), | ||
| None, | ||
| ); | ||
| let informant_output_format = OutputFormat { | ||
| enable_color: false, | ||
| prefix: format!("[{}] ", key_seed), | ||
| }; | ||
|
|
||
| network_config.boot_nodes = boot_nodes; | ||
|
|
||
| network_config.allow_non_globals_in_dht = true; | ||
|
|
||
| network_config | ||
| .listen_addresses | ||
| .push(multiaddr::Protocol::Memory(rand::random()).into()); | ||
|
|
||
| network_config.transport = TransportConfig::MemoryOnly; | ||
|
|
||
| Ok(Configuration { | ||
| impl_name: "cumulus-test-node".to_string(), | ||
| impl_version: "0.1".to_string(), | ||
| role, | ||
| task_executor, | ||
| transaction_pool: Default::default(), | ||
| network: network_config, | ||
| keystore: KeystoreConfig::Path { | ||
| path: root.join("key"), | ||
| password: None, | ||
| }, | ||
| database: DatabaseConfig::RocksDb { | ||
| path: root.join("db"), | ||
| cache_size: 128, | ||
| }, | ||
| state_cache_size: 16777216, | ||
| state_cache_child_ratio: None, | ||
| pruning: Default::default(), | ||
| chain_spec: Box::new(spec), | ||
| wasm_method: WasmExecutionMethod::Interpreted, | ||
| // NOTE: we enforce the use of the native runtime to make the errors more debuggable | ||
| execution_strategies: ExecutionStrategies { | ||
| syncing: sc_client_api::ExecutionStrategy::NativeWhenPossible, | ||
| importing: sc_client_api::ExecutionStrategy::NativeWhenPossible, | ||
| block_construction: sc_client_api::ExecutionStrategy::NativeWhenPossible, | ||
| offchain_worker: sc_client_api::ExecutionStrategy::NativeWhenPossible, | ||
| other: sc_client_api::ExecutionStrategy::NativeWhenPossible, | ||
| }, | ||
| rpc_http: None, | ||
| rpc_ws: None, | ||
| rpc_ipc: None, | ||
| rpc_ws_max_connections: None, | ||
| rpc_cors: None, | ||
| rpc_methods: Default::default(), | ||
| prometheus_config: None, | ||
| telemetry_endpoints: None, | ||
| telemetry_external_transport: None, | ||
| default_heap_pages: None, | ||
| offchain_worker: Default::default(), | ||
| force_authoring: false, | ||
| disable_grandpa: false, | ||
| dev_key_seed: Some(key_seed), | ||
| tracing_targets: None, | ||
| tracing_receiver: Default::default(), | ||
| max_runtime_instances: 8, | ||
| announce_block: true, | ||
| base_path: Some(base_path), | ||
| informant_output_format, | ||
| }) | ||
| } | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In general this is something that could be moved to polkadot-test-service as helper function. Especially the generation of
t1.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🤔 you mean to substrate no? I could probably make a macro to will also handle the runtime using tokio like tokio::test but substrate::test (will do async + timeout for the test)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I made this PR to address this: paritytech/substrate#6651