Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.

Commit 4861923

Browse files
tomusdrwrphmeier
authored andcommitted
Substrate test client crate & chain subscription test (#139)
* Test client used in RPC tests. * Use test-client for network tests. * Expose BlockOrigin and clean up the API.
1 parent 57eb390 commit 4861923

16 files changed

Lines changed: 289 additions & 222 deletions

File tree

Cargo.lock

Lines changed: 23 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

substrate/client/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,4 @@ substrate-state-machine = { path = "../state-machine" }
2121
substrate-keyring = { path = "../../substrate/keyring" }
2222

2323
[dev-dependencies]
24-
substrate-test-runtime = { path = "../test-runtime" }
24+
substrate-test-client = { path = "../test-client" }

substrate/client/src/blockchain.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ use primitives::block::{self, Id as BlockId};
2020
use primitives;
2121
use error::Result;
2222

23-
2423
/// Blockchain database backend. Does not perform any validation.
2524
pub trait Backend: Send + Sync {
2625
/// Get block header. Returns `None` if block is not found.

substrate/client/src/client.rs

Lines changed: 10 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -447,62 +447,15 @@ mod tests {
447447
use super::*;
448448
use codec::Slicable;
449449
use keyring::Keyring;
450-
use {primitives, genesis};
451450
use primitives::block::Extrinsic as PrimitiveExtrinsic;
452-
use test_runtime::genesismap::{GenesisConfig, additional_storage_with_genesis};
453-
use test_runtime::{UncheckedTransaction, Transaction};
454-
use test_runtime;
455-
456-
native_executor_instance!(Executor, test_runtime::api::dispatch, include_bytes!("../../test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm"));
457-
458-
fn genesis_config() -> GenesisConfig {
459-
GenesisConfig::new_simple(vec![
460-
Keyring::Alice.to_raw_public(),
461-
Keyring::Bob.to_raw_public(),
462-
Keyring::Charlie.to_raw_public()
463-
], 1000)
464-
}
465-
466-
fn prepare_genesis() -> (primitives::block::Header, Vec<(Vec<u8>, Vec<u8>)>) {
467-
let mut storage = genesis_config().genesis_map();
468-
let block = genesis::construct_genesis_block(&storage);
469-
storage.extend(additional_storage_with_genesis(&block));
470-
(primitives::block::Header::decode(&mut block.header.encode().as_ref()).expect("to_vec() always gives a valid serialisation; qed"), storage.into_iter().collect())
471-
}
472-
473-
// since we are in the client module we can create falsely justified
474-
// headers.
475-
// TODO: remove this in favor of custom verification pipelines for the
476-
// client
477-
fn justify(header: &block::Header) -> bft::UncheckedJustification {
478-
let hash = header.blake2_256().into();
479-
let authorities = vec![
480-
Keyring::Alice.into(),
481-
Keyring::Bob.into(),
482-
Keyring::Charlie.into(),
483-
];
484-
485-
bft::UncheckedJustification {
486-
digest: hash,
487-
signatures: authorities.iter().map(|key| {
488-
let msg = bft::sign_message(
489-
bft::generic::Vote::Commit(1, hash).into(),
490-
key,
491-
header.parent_hash
492-
);
493-
494-
match msg {
495-
bft::generic::LocalizedMessage::Vote(vote) => vote.signature,
496-
_ => panic!("signing vote leads to signed vote"),
497-
}
498-
}).collect(),
499-
round_number: 1,
500-
}
501-
}
451+
use test_client::{self, TestClient};
452+
use test_client::client::BlockOrigin;
453+
use test_client::runtime as test_runtime;
454+
use test_client::runtime::{UncheckedTransaction, Transaction};
502455

503456
#[test]
504457
fn client_initialises_from_genesis_ok() {
505-
let client = new_in_mem(Executor::new(), prepare_genesis).unwrap();
458+
let client = test_client::new();
506459
let genesis_hash = client.block_hash(0).unwrap().unwrap();
507460

508461
assert_eq!(client.using_environment(|| test_runtime::system::latest_block_hash()).unwrap(), genesis_hash);
@@ -512,15 +465,7 @@ mod tests {
512465

513466
#[test]
514467
fn authorities_call_works() {
515-
let genesis_config = genesis_config();
516-
517-
let prepare_genesis = || {
518-
let mut storage = genesis_config.genesis_map();
519-
let block = genesis::construct_genesis_block(&storage);
520-
storage.extend(additional_storage_with_genesis(&block));
521-
(primitives::block::Header::decode(&mut block.header.encode().as_ref()).expect("to_vec() always gives a valid serialisation; qed"), storage.into_iter().collect())
522-
};
523-
let client = new_in_mem(Executor::new(), prepare_genesis).unwrap();
468+
let client = test_client::new();
524469

525470
assert_eq!(client.info().unwrap().chain.best_number, 0);
526471
assert_eq!(client.authorities_at(&BlockId::Number(0)).unwrap(), vec![
@@ -532,22 +477,11 @@ mod tests {
532477

533478
#[test]
534479
fn block_builder_works_with_no_transactions() {
535-
let genesis_config = genesis_config();
536-
537-
let prepare_genesis = || {
538-
let mut storage = genesis_config.genesis_map();
539-
let block = genesis::construct_genesis_block(&storage);
540-
storage.extend(additional_storage_with_genesis(&block));
541-
(primitives::block::Header::decode(&mut block.header.encode().as_ref()).expect("to_vec() always gives a valid serialisation; qed"), storage.into_iter().collect())
542-
};
543-
let client = new_in_mem(Executor::new(), prepare_genesis).unwrap();
480+
let client = test_client::new();
544481

545482
let builder = client.new_block().unwrap();
546-
let block = builder.bake().unwrap();
547483

548-
let justification = justify(&block.header);
549-
let justified = client.check_justification(block.header, justification).unwrap();
550-
client.import_block(BlockOrigin::Own, justified, Some(block.transactions)).unwrap();
484+
client.justify_and_import(BlockOrigin::Own, builder.bake().unwrap()).unwrap();
551485

552486
assert_eq!(client.info().unwrap().chain.best_number, 1);
553487
assert_eq!(client.using_environment(|| test_runtime::system::latest_block_hash()).unwrap(), client.block_hash(1).unwrap().unwrap());
@@ -565,19 +499,7 @@ mod tests {
565499

566500
#[test]
567501
fn block_builder_works_with_transactions() {
568-
let genesis_config = GenesisConfig::new_simple(vec![
569-
Keyring::Alice.to_raw_public(),
570-
Keyring::Bob.to_raw_public(),
571-
Keyring::Charlie.to_raw_public()
572-
], 1000);
573-
574-
let prepare_genesis = || {
575-
let mut storage = genesis_config.genesis_map();
576-
let block = genesis::construct_genesis_block(&storage);
577-
storage.extend(additional_storage_with_genesis(&block));
578-
(primitives::block::Header::decode(&mut block.header.encode().as_ref()).expect("to_vec() always gives a valid serialisation; qed"), storage.into_iter().collect())
579-
};
580-
let client = new_in_mem(Executor::new(), prepare_genesis).unwrap();
502+
let client = test_client::new();
581503

582504
let mut builder = client.new_block().unwrap();
583505

@@ -587,11 +509,8 @@ mod tests {
587509
amount: 42,
588510
nonce: 0
589511
}.signed()).unwrap();
590-
let block = builder.bake().unwrap();
591512

592-
let justification = justify(&block.header);
593-
let justified = client.check_justification(block.header, justification).unwrap();
594-
client.import_block(BlockOrigin::Own, justified, Some(block.transactions)).unwrap();
513+
client.justify_and_import(BlockOrigin::Own, builder.bake().unwrap()).unwrap();
595514

596515
assert_eq!(client.info().unwrap().chain.best_number, 1);
597516
assert!(client.state_at(&BlockId::Number(1)).unwrap() != client.state_at(&BlockId::Number(0)).unwrap());

substrate/client/src/genesis.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,16 @@ mod tests {
4242
use codec::{Slicable, Joiner};
4343
use runtime_support::Hashable;
4444
use keyring::Keyring;
45-
use test_runtime::genesismap::{GenesisConfig, additional_storage_with_genesis};
4645
use executor::WasmExecutor;
4746
use state_machine::{execute, OverlayedChanges};
4847
use state_machine::backend::InMemory;
49-
use test_runtime::{self, Hash, Block, BlockNumber, Header, Digest, Transaction,
48+
use test_client;
49+
use test_client::runtime::genesismap::{GenesisConfig, additional_storage_with_genesis};
50+
use test_client::runtime::{Hash, Block, BlockNumber, Header, Digest, Transaction,
5051
UncheckedTransaction};
5152
use ed25519::{Public, Pair};
5253

53-
native_executor_instance!(Executor, test_runtime::api::dispatch, include_bytes!("../../test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm"));
54+
native_executor_instance!(Executor, test_client::runtime::api::dispatch, include_bytes!("../../test-runtime/wasm/target/wasm32-unknown-unknown/release/substrate_test_runtime.compact.wasm"));
5455

5556
fn construct_block(backend: &InMemory, number: BlockNumber, parent_hash: Hash, state_root: Hash, txs: Vec<Transaction>) -> (Vec<u8>, Hash) {
5657
use triehash::ordered_trie_root;

substrate/client/src/lib.rs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,22 +19,23 @@
1919
#![warn(missing_docs)]
2020

2121
extern crate substrate_bft as bft;
22-
extern crate substrate_runtime_support as runtime_support;
23-
extern crate substrate_runtime_io as runtime_io;
22+
extern crate substrate_codec as codec;
2423
extern crate substrate_primitives as primitives;
24+
extern crate substrate_runtime_io as runtime_io;
25+
extern crate substrate_runtime_support as runtime_support;
2526
extern crate substrate_state_machine as state_machine;
26-
extern crate substrate_codec as codec;
27-
#[cfg(test)] #[macro_use] extern crate substrate_executor as executor;
28-
extern crate ed25519;
29-
#[cfg(test)] extern crate substrate_test_runtime as test_runtime;
3027
#[cfg(test)] extern crate substrate_keyring as keyring;
28+
#[cfg(test)] extern crate substrate_test_client as test_client;
3129

32-
extern crate triehash;
33-
extern crate parking_lot;
30+
extern crate ed25519;
3431
extern crate futures;
35-
#[cfg(test)] #[macro_use] extern crate hex_literal;
32+
extern crate parking_lot;
33+
extern crate triehash;
34+
3635
#[macro_use] extern crate error_chain;
3736
#[macro_use] extern crate log;
37+
#[cfg(test)] #[macro_use] extern crate substrate_executor as executor;
38+
#[cfg(test)] #[macro_use] extern crate hex_literal;
3839

3940
pub mod error;
4041
pub mod blockchain;
@@ -44,6 +45,10 @@ pub mod genesis;
4445
pub mod block_builder;
4546
mod client;
4647

47-
pub use client::{Client, ClientInfo, CallResult, ImportResult, ChainHead,
48-
BlockStatus, BlockOrigin, new_in_mem, BlockchainEventStream, BlockchainEvents};
48+
pub use client::{
49+
new_in_mem,
50+
BlockStatus, BlockOrigin, BlockchainEventStream, BlockchainEvents,
51+
Client, ClientInfo, CallResult, ChainHead,
52+
ImportResult,
53+
};
4954
pub use blockchain::Info as ChainInfo;

substrate/network/Cargo.toml

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,7 @@ substrate-runtime-support = { path = "../../substrate/runtime-support" }
2929
substrate-bft = { path = "../../substrate/bft" }
3030

3131
[dev-dependencies]
32-
substrate-test-runtime = { path = "../test-runtime" }
33-
substrate-executor = { path = "../../substrate/executor" }
34-
substrate-keyring = { path = "../../substrate/keyring" }
35-
substrate-codec = { path = "../../substrate/codec" }
36-
substrate-bft = { path = "../bft" }
3732
env_logger = "0.4"
33+
substrate-codec = { path = "../../substrate/codec" }
34+
substrate-keyring = { path = "../../substrate/keyring" }
35+
substrate-test-client = { path = "../../substrate/test-client" }

substrate/network/src/lib.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,9 @@ extern crate ed25519;
4040
#[macro_use] extern crate error_chain;
4141

4242
#[cfg(test)] extern crate env_logger;
43-
#[cfg(test)] extern crate substrate_test_runtime as test_runtime;
44-
#[cfg(test)] extern crate substrate_keyring as keyring;
45-
#[cfg(test)] #[macro_use] extern crate substrate_executor as executor;
4643
#[cfg(test)] extern crate substrate_codec as codec;
47-
#[cfg(test)] extern crate substrate_bft as bft;
44+
#[cfg(test)] extern crate substrate_keyring as keyring;
45+
#[cfg(test)] extern crate substrate_test_client as test_client;
4846

4947
mod service;
5048
mod sync;

0 commit comments

Comments
 (0)