mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-13 17:31:05 +00:00
New testing helpers (#6555)
* Initial commit
Forked at: 424d5c722d
Parent branch: origin/master
* Add send_transaction to RpcHandlers
* Extension trait for RpcHandlers
* Revert "Add send_transaction to RpcHandlers"
This reverts commit 03c89e13d404bae3f3123387dd50f026061bca82.
* Add an extension trait for BlockchainEvents
* Update test-utils/client/src/lib.rs
Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com>
* Update test-utils/client/src/lib.rs
* fix
* deps fix
Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com>
This commit is contained in:
@@ -36,14 +36,17 @@ pub use sp_keyring::{
|
||||
pub use sp_core::{traits::BareCryptoStorePtr, tasks::executor as tasks_executor};
|
||||
pub use sp_runtime::{Storage, StorageChild};
|
||||
pub use sp_state_machine::ExecutionStrategy;
|
||||
pub use sc_service::client;
|
||||
pub use sc_service::{RpcHandlers, RpcSession, client};
|
||||
pub use self::client_ext::{ClientExt, ClientBlockImportExt};
|
||||
|
||||
use std::pin::Pin;
|
||||
use std::sync::Arc;
|
||||
use std::collections::HashMap;
|
||||
use std::collections::{HashSet, HashMap};
|
||||
use futures::{future::{Future, FutureExt}, stream::StreamExt};
|
||||
use sp_core::storage::ChildInfo;
|
||||
use sp_runtime::traits::{Block as BlockT, BlakeTwo256};
|
||||
use sp_runtime::{OpaqueExtrinsic, codec::Encode, traits::{Block as BlockT, BlakeTwo256}};
|
||||
use sc_service::client::{LocalCallExecutor, ClientConfig};
|
||||
use sc_client_api::BlockchainEvents;
|
||||
|
||||
/// Test client light database backend.
|
||||
pub type LightBackend<Block> = sc_light::Backend<
|
||||
@@ -255,3 +258,81 @@ impl<Block: BlockT, E, Backend, G: GenesisInit> TestClientBuilder<
|
||||
self.build_with_executor(executor)
|
||||
}
|
||||
}
|
||||
|
||||
/// An extension trait for `RpcHandlers`.
|
||||
pub trait RpcHandlersExt {
|
||||
/// Send a transaction through the RpcHandlers.
|
||||
fn send_transaction(
|
||||
&self,
|
||||
extrinsic: OpaqueExtrinsic,
|
||||
) -> Pin<Box<dyn Future<
|
||||
Output = (
|
||||
Option<String>,
|
||||
RpcSession,
|
||||
futures01::sync::mpsc::Receiver<String>,
|
||||
),
|
||||
> + Send>>;
|
||||
}
|
||||
|
||||
impl RpcHandlersExt for RpcHandlers {
|
||||
fn send_transaction(
|
||||
&self,
|
||||
extrinsic: OpaqueExtrinsic,
|
||||
) -> Pin<Box<dyn Future<
|
||||
Output = (
|
||||
Option<String>,
|
||||
RpcSession,
|
||||
futures01::sync::mpsc::Receiver<String>,
|
||||
),
|
||||
> + Send>> {
|
||||
let (tx, rx) = futures01::sync::mpsc::channel(0);
|
||||
let mem = RpcSession::new(tx.into());
|
||||
Box::pin(self
|
||||
.rpc_query(
|
||||
&mem,
|
||||
&format!(
|
||||
r#"{{
|
||||
"jsonrpc": "2.0",
|
||||
"method": "author_submitExtrinsic",
|
||||
"params": ["0x{}"],
|
||||
"id": 0
|
||||
}}"#,
|
||||
hex::encode(extrinsic.encode())
|
||||
),
|
||||
)
|
||||
.map(move |res| (res, mem, rx)))
|
||||
}
|
||||
}
|
||||
|
||||
/// An extension trait for `BlockchainEvents`.
|
||||
pub trait BlockchainEventsExt<C, B>
|
||||
where
|
||||
C: BlockchainEvents<B>,
|
||||
B: BlockT,
|
||||
{
|
||||
/// Wait for `count` blocks to be imported in the node and then exit. This function will not return if no blocks
|
||||
/// are ever created, thus you should restrict the maximum amount of time of the test execution.
|
||||
fn wait_for_blocks(&self, count: usize) -> Pin<Box<dyn Future<Output = ()> + Send>>;
|
||||
}
|
||||
|
||||
impl<C, B> BlockchainEventsExt<C, B> for C
|
||||
where
|
||||
C: BlockchainEvents<B>,
|
||||
B: BlockT,
|
||||
{
|
||||
fn wait_for_blocks(&self, count: usize) -> Pin<Box<dyn Future<Output = ()> + Send>> {
|
||||
assert!(count > 0, "'count' argument must be greater than 0");
|
||||
|
||||
let mut import_notification_stream = self.import_notification_stream();
|
||||
let mut blocks = HashSet::new();
|
||||
|
||||
Box::pin(async move {
|
||||
while let Some(notification) = import_notification_stream.next().await {
|
||||
blocks.insert(notification.hash);
|
||||
if blocks.len() == count {
|
||||
break;
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user