From 5001151579362041eb854e15442d98164cbd9b6d Mon Sep 17 00:00:00 2001 From: Gav Date: Tue, 13 Feb 2018 11:54:24 +0100 Subject: [PATCH] Test for block builder. --- substrate/substrate/client/src/lib.rs | 24 +++++++++++++++++++ .../substrate/executor/src/native_executor.rs | 8 ++++++- .../substrate/executor/src/wasm_executor.rs | 2 +- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/substrate/substrate/client/src/lib.rs b/substrate/substrate/client/src/lib.rs index f347dda3cb..046d84de5f 100644 --- a/substrate/substrate/client/src/lib.rs +++ b/substrate/substrate/client/src/lib.rs @@ -306,10 +306,34 @@ mod tests { }; let client = new_in_mem(Executor::new(), prepare_genesis).unwrap(); + assert_eq!(client.info().unwrap().chain.best_number, 0); assert_eq!(client.authorities_at(&BlockId::Number(0)).unwrap(), vec![ Keyring::Alice.to_raw_public(), Keyring::Bob.to_raw_public(), Keyring::Charlie.to_raw_public() ]); } + + #[test] + fn block_builder_works() { + let genesis_config = GenesisConfig::new_simple(vec![ + Keyring::Alice.to_raw_public(), + Keyring::Bob.to_raw_public(), + Keyring::Charlie.to_raw_public() + ], 1000); + + let prepare_genesis = || { + let mut storage = genesis_config.genesis_map(); + let block = genesis::construct_genesis_block(&storage); + storage.extend(additional_storage_with_genesis(&block)); + (primitives::block::Header::decode(&mut block.header.encode().as_ref()).expect("to_vec() always gives a valid serialisation; qed"), storage.into_iter().collect()) + }; + let client = new_in_mem(Executor::new(), prepare_genesis).unwrap(); + + let builder = client.new_block().unwrap(); + let block = builder.bake().unwrap(); + client.import_block(block.header, Some(block.transactions)).unwrap(); + + assert_eq!(client.info().unwrap().chain.best_number, 1); + } } diff --git a/substrate/substrate/executor/src/native_executor.rs b/substrate/substrate/executor/src/native_executor.rs index 99773b9f76..a759c046c6 100644 --- a/substrate/substrate/executor/src/native_executor.rs +++ b/substrate/substrate/executor/src/native_executor.rs @@ -45,12 +45,18 @@ pub trait NativeExecutionDispatch { /// A generic `CodeExecutor` implementation that uses a delegate to determine wasm code equivalence /// and dispatch to native code when possible, falling back on `WasmExecutor` when not. -#[derive(Default)] +#[derive(Debug, Default)] pub struct NativeExecutor { /// Dummy field to avoid the compiler complaining about us not using `D`. pub _dummy: ::std::marker::PhantomData, } +impl Clone for NativeExecutor { + fn clone(&self) -> Self { + NativeExecutor { _dummy: Default::default() } + } +} + impl CodeExecutor for NativeExecutor { type Error = Error; diff --git a/substrate/substrate/executor/src/wasm_executor.rs b/substrate/substrate/executor/src/wasm_executor.rs index eef0df976d..00bdb55865 100644 --- a/substrate/substrate/executor/src/wasm_executor.rs +++ b/substrate/substrate/executor/src/wasm_executor.rs @@ -276,7 +276,7 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, /// Wasm rust executor for contracts. /// /// Executes the provided code in a sandboxed wasm runtime. -#[derive(Debug, Default)] +#[derive(Debug, Default, Clone)] pub struct WasmExecutor; impl CodeExecutor for WasmExecutor {