mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-12 00:41:08 +00:00
Merge remote-tracking branch 'origin/master' into lexnv/update-smoldot
Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>
This commit is contained in:
Generated
+28
-12
@@ -764,6 +764,12 @@ version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||
|
||||
[[package]]
|
||||
name = "cfg_aliases"
|
||||
version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "77e53693616d3075149f4ead59bdeecd204ac6b8192d8969757601b74bddf00f"
|
||||
|
||||
[[package]]
|
||||
name = "chacha20"
|
||||
version = "0.9.1"
|
||||
@@ -1911,9 +1917,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "h2"
|
||||
version = "0.3.24"
|
||||
version = "0.3.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9"
|
||||
checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"fnv",
|
||||
@@ -2237,9 +2243,9 @@ checksum = "8e04e2fd2b8188ea827b32ef11de88377086d690286ab35747ef7f9bf3ccb590"
|
||||
|
||||
[[package]]
|
||||
name = "indoc"
|
||||
version = "2.0.4"
|
||||
version = "2.0.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e186cfbae8084e513daff4240b4797e342f988cecda4fb6c939150f96315fd8"
|
||||
checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5"
|
||||
|
||||
[[package]]
|
||||
name = "inout"
|
||||
@@ -2276,6 +2282,7 @@ name = "integration-tests"
|
||||
version = "0.35.0"
|
||||
dependencies = [
|
||||
"assert_matches",
|
||||
"cfg_aliases",
|
||||
"frame-metadata 16.0.0",
|
||||
"futures",
|
||||
"hex",
|
||||
@@ -2289,6 +2296,7 @@ dependencies = [
|
||||
"subxt-codegen",
|
||||
"subxt-metadata",
|
||||
"subxt-signer",
|
||||
"subxt-test-macro",
|
||||
"syn 2.0.53",
|
||||
"test-runtime",
|
||||
"tokio",
|
||||
@@ -3353,9 +3361,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.10.3"
|
||||
version = "1.10.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15"
|
||||
checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
@@ -4863,6 +4871,14 @@ dependencies = [
|
||||
"zeroize",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "subxt-test-macro"
|
||||
version = "0.35.0"
|
||||
dependencies = [
|
||||
"quote",
|
||||
"syn 2.0.53",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.109"
|
||||
@@ -4985,9 +5001,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
|
||||
|
||||
[[package]]
|
||||
name = "tokio"
|
||||
version = "1.36.0"
|
||||
version = "1.37.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931"
|
||||
checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787"
|
||||
dependencies = [
|
||||
"backtrace",
|
||||
"bytes",
|
||||
@@ -5045,9 +5061,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tokio-stream"
|
||||
version = "0.1.14"
|
||||
version = "0.1.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842"
|
||||
checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af"
|
||||
dependencies = [
|
||||
"futures-core",
|
||||
"pin-project-lite",
|
||||
@@ -5304,9 +5320,9 @@ checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
|
||||
|
||||
[[package]]
|
||||
name = "trybuild"
|
||||
version = "1.0.90"
|
||||
version = "1.0.91"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2aa6f84ec205ebf87fb7a0abdbcd1467fa5af0e86878eb6d888b78ecbb10b6d5"
|
||||
checksum = "8ad7eb6319ebadebca3dacf1f85a93bc54b73dd81b9036795f73de7ddfe27d5a"
|
||||
dependencies = [
|
||||
"glob 0.3.1",
|
||||
"once_cell",
|
||||
|
||||
+6
-5
@@ -7,6 +7,7 @@ members = [
|
||||
"testing/substrate-runner",
|
||||
"testing/test-runtime",
|
||||
"testing/integration-tests",
|
||||
"testing/integration-tests/subxt-test-macro",
|
||||
"testing/ui-tests",
|
||||
"testing/generate-custom-metadata",
|
||||
"macro",
|
||||
@@ -88,7 +89,7 @@ primitive-types = { version = "0.12.2", default-features = false }
|
||||
proc-macro-error = "1.0.4"
|
||||
proc-macro2 = "1.0.79"
|
||||
quote = "1.0.35"
|
||||
regex = { version = "1.10.3", default-features = false }
|
||||
regex = { version = "1.10.4", default-features = false }
|
||||
scale-info = { version = "2.11.0", default-features = false }
|
||||
scale-value = { version = "0.14.1", default-features = false }
|
||||
scale-bits = { version = "0.5.0", default-features = false }
|
||||
@@ -100,11 +101,11 @@ serde = { version = "1.0.197", default-features = false, features = ["derive"] }
|
||||
serde_json = { version = "1.0.114", default-features = false }
|
||||
syn = { version = "2.0.15", features = ["full", "extra-traits"] }
|
||||
thiserror = "1.0.58"
|
||||
tokio = { version = "1.36", default-features = false }
|
||||
tokio = { version = "1.37", default-features = false }
|
||||
tracing = { version = "0.1.40", default-features = false }
|
||||
tracing-wasm = "0.2.1"
|
||||
tracing-subscriber = "0.3.18"
|
||||
trybuild = "1.0.90"
|
||||
trybuild = "1.0.91"
|
||||
url = "2.5.0"
|
||||
wabt = "0.10.0"
|
||||
wasm-bindgen-test = "0.3.24"
|
||||
@@ -114,11 +115,11 @@ strip-ansi-escapes = "0.2.0"
|
||||
# Light client support:
|
||||
smoldot = { path = "/home/lexnv/workspace/smoldot/lib", default-features = false }
|
||||
#smoldot = { version = "0.17.0", default-features = false }
|
||||
|
||||
#smoldot-light = { version = "0.15.0", default-features = false }
|
||||
smoldot-light = { path = "/home/lexnv/workspace/smoldot/light-base", default-features = false }
|
||||
|
||||
tokio-stream = "0.1.14"
|
||||
tokio-stream = "0.1.15"
|
||||
|
||||
futures-util = "0.3.30"
|
||||
rand = "0.8.5"
|
||||
pin-project = "1.1.5"
|
||||
|
||||
@@ -4,7 +4,7 @@ use crate::dynamic::DecodedValueThunk;
|
||||
use crate::metadata::DecodeWithMetadata;
|
||||
use crate::utils::Yes;
|
||||
|
||||
/// This represents the address of a custom value in in the metadata.
|
||||
/// This represents the address of a custom value in the metadata.
|
||||
/// Anything, that implements the [CustomValueAddress] trait can be used, to fetch
|
||||
/// custom values from the metadata.
|
||||
/// The trait is implemented by [str] for dynamic loopup and [StaticAddress] for static queries.
|
||||
|
||||
@@ -11,7 +11,7 @@ use crate::config::BlockHash;
|
||||
use crate::{Config, Error};
|
||||
use derive_where::derive_where;
|
||||
use futures::{Stream, StreamExt};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use serde::{Deserialize, Deserializer, Serialize};
|
||||
use std::collections::{HashMap, VecDeque};
|
||||
use std::task::Poll;
|
||||
|
||||
@@ -377,8 +377,7 @@ pub enum FollowEvent<Hash> {
|
||||
///
|
||||
/// This is the first event generated by the `follow` subscription
|
||||
/// and is submitted only once.
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub struct Initialized<Hash> {
|
||||
/// The hashes of the last finalized blocks.
|
||||
pub finalized_block_hashes: Vec<Hash>,
|
||||
@@ -391,6 +390,30 @@ pub struct Initialized<Hash> {
|
||||
pub finalized_block_runtime: Option<RuntimeEvent>,
|
||||
}
|
||||
|
||||
impl<'de, Hash: Deserialize<'de>> Deserialize<'de> for Initialized<Hash> {
|
||||
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
|
||||
// Custom struct that can deserialize both `finalizedBlockHash` and `finalizedBlockHashes`.
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
struct InitializedIR<Hash> {
|
||||
finalized_block_hashes: Option<Vec<Hash>>,
|
||||
finalized_block_hash: Option<Hash>,
|
||||
finalized_block_runtime: Option<RuntimeEvent>,
|
||||
}
|
||||
|
||||
let ir = InitializedIR::deserialize(deserializer)?;
|
||||
let finalized_block_hashes = ir
|
||||
.finalized_block_hashes
|
||||
.or_else(|| ir.finalized_block_hash.map(|hash| vec![hash]))
|
||||
.ok_or_else(|| serde::de::Error::custom("Missing finalized block hashes"))?;
|
||||
|
||||
Ok(Initialized {
|
||||
finalized_block_hashes,
|
||||
finalized_block_runtime: ir.finalized_block_runtime,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
/// The runtime event generated if the `follow` subscription
|
||||
/// has set the `with_runtime` flag.
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
|
||||
@@ -973,4 +996,30 @@ mod test {
|
||||
let _ = serde_json::from_value::<Foo32>(from_err)
|
||||
.expect_err("can't deser invalid num into u32");
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn chain_head_initialized() {
|
||||
// Latest format version.
|
||||
let event = serde_json::json!({
|
||||
"finalizedBlockHashes": ["0x1", "0x2"],
|
||||
});
|
||||
let decoded: Initialized<String> = serde_json::from_value(event).unwrap();
|
||||
assert_eq!(
|
||||
decoded.finalized_block_hashes,
|
||||
vec!["0x1".to_string(), "0x2".to_string()]
|
||||
);
|
||||
|
||||
// Old format.
|
||||
let event = serde_json::json!({
|
||||
"finalizedBlockHash": "0x1",
|
||||
});
|
||||
let decoded: Initialized<String> = serde_json::from_value(event).unwrap();
|
||||
assert_eq!(decoded.finalized_block_hashes, vec!["0x1".to_string()]);
|
||||
|
||||
// Wrong format.
|
||||
let event = serde_json::json!({
|
||||
"finalizedBlockHash": ["0x1"],
|
||||
});
|
||||
let _ = serde_json::from_value::<Initialized<String>>(event).unwrap_err();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ cfg_jsonrpsee! {
|
||||
|
||||
/// A URL is considered secure if it uses a secure scheme ("https" or "wss") or is referring to localhost.
|
||||
///
|
||||
/// Returns an error if the the string could not be parsed into a URL.
|
||||
/// Returns an error if the string could not be parsed into a URL.
|
||||
pub fn url_is_secure(url: &str) -> Result<bool, Error> {
|
||||
let url = Url::parse(url).map_err(|e| Error::Rpc(RpcError::ClientError(Box::new(e))))?;
|
||||
|
||||
|
||||
@@ -18,6 +18,9 @@ default = []
|
||||
# Enable to run the tests with Light Client support.
|
||||
unstable-light-client = ["subxt/unstable-light-client"]
|
||||
|
||||
# Enable to run the full-client tests with Light Client support.
|
||||
unstable-light-client-long-running = ["subxt/unstable-light-client"]
|
||||
|
||||
# Enable this to use the unstable backend in tests _instead of_
|
||||
# the default one which relies on the "old" RPC methods.
|
||||
unstable-backend-client = []
|
||||
@@ -43,3 +46,7 @@ tracing = { workspace = true }
|
||||
tracing-subscriber = { workspace = true }
|
||||
wabt = { workspace = true }
|
||||
substrate-runner = { workspace = true }
|
||||
subxt-test-macro = { path = "subxt-test-macro" }
|
||||
|
||||
[build-dependencies]
|
||||
cfg_aliases = "0.2.0"
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
use cfg_aliases::cfg_aliases;
|
||||
|
||||
fn main() {
|
||||
// Setup cfg aliases
|
||||
cfg_aliases! {
|
||||
lightclient: { any(feature = "unstable-light-client", feature = "unstable-light-client-long-running") },
|
||||
fullclient: { all(not(feature = "unstable-light-client"), not(feature = "unstable-light-client-long-running")) },
|
||||
}
|
||||
}
|
||||
@@ -2,17 +2,29 @@
|
||||
// This file is dual-licensed as Apache-2.0 or GPL-3.0.
|
||||
// see LICENSE for license details.
|
||||
|
||||
use crate::{test_context, utils::node_runtime};
|
||||
use crate::{subxt_test, test_context};
|
||||
use codec::{Compact, Encode};
|
||||
use futures::StreamExt;
|
||||
use subxt::config::signed_extensions::{ChargeAssetTxPayment, CheckMortality, CheckNonce};
|
||||
use subxt::config::DefaultExtrinsicParamsBuilder;
|
||||
use subxt::config::SubstrateConfig;
|
||||
use subxt::utils::Era;
|
||||
use subxt_metadata::Metadata;
|
||||
|
||||
#[cfg(fullclient)]
|
||||
use crate::utils::node_runtime;
|
||||
|
||||
#[cfg(fullclient)]
|
||||
use subxt::{
|
||||
config::{
|
||||
signed_extensions::{ChargeAssetTxPayment, CheckMortality, CheckNonce},
|
||||
DefaultExtrinsicParamsBuilder, SubstrateConfig,
|
||||
},
|
||||
utils::Era,
|
||||
};
|
||||
|
||||
#[cfg(fullclient)]
|
||||
use subxt_signer::sr25519::dev;
|
||||
|
||||
#[tokio::test]
|
||||
use subxt_metadata::Metadata;
|
||||
|
||||
#[cfg(fullclient)]
|
||||
#[subxt_test]
|
||||
async fn block_subscriptions_are_consistent_with_eachother() -> Result<(), subxt::Error> {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -76,7 +88,7 @@ async fn block_subscriptions_are_consistent_with_eachother() -> Result<(), subxt
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn finalized_headers_subscription() -> Result<(), subxt::Error> {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -93,7 +105,7 @@ async fn finalized_headers_subscription() -> Result<(), subxt::Error> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn missing_block_headers_will_be_filled_in() -> Result<(), subxt::Error> {
|
||||
use subxt::backend::legacy;
|
||||
|
||||
@@ -138,7 +150,7 @@ async fn missing_block_headers_will_be_filled_in() -> Result<(), subxt::Error> {
|
||||
}
|
||||
|
||||
// Check that we can subscribe to non-finalized blocks.
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn runtime_api_call() -> Result<(), subxt::Error> {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -163,7 +175,8 @@ async fn runtime_api_call() -> Result<(), subxt::Error> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[cfg(fullclient)]
|
||||
#[subxt_test]
|
||||
async fn fetch_block_and_decode_extrinsic_details() {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -232,7 +245,8 @@ async fn fetch_block_and_decode_extrinsic_details() {
|
||||
assert!(tx.is_signed());
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[cfg(fullclient)]
|
||||
#[subxt_test]
|
||||
async fn decode_signed_extensions_from_blocks() {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
//! Just sanity checking some of the legacy RPC methods to make
|
||||
//! sure they don't error out and can decode their results OK.
|
||||
|
||||
use crate::test_context;
|
||||
use crate::{subxt_test, test_context};
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn chain_get_block_hash() {
|
||||
let ctx = test_context().await;
|
||||
let rpc = ctx.legacy_rpc_methods().await;
|
||||
@@ -15,7 +15,7 @@ async fn chain_get_block_hash() {
|
||||
rpc.chain_get_block_hash(None).await.unwrap();
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn chain_get_block() {
|
||||
let ctx = test_context().await;
|
||||
let rpc = ctx.legacy_rpc_methods().await;
|
||||
@@ -24,7 +24,7 @@ async fn chain_get_block() {
|
||||
rpc.chain_get_block(hash).await.unwrap();
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn chain_get_finalized_head() {
|
||||
let ctx = test_context().await;
|
||||
let rpc = ctx.legacy_rpc_methods().await;
|
||||
@@ -32,7 +32,7 @@ async fn chain_get_finalized_head() {
|
||||
rpc.chain_get_finalized_head().await.unwrap();
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn chain_subscribe_all_heads() {
|
||||
let ctx = test_context().await;
|
||||
let rpc = ctx.legacy_rpc_methods().await;
|
||||
@@ -41,7 +41,7 @@ async fn chain_subscribe_all_heads() {
|
||||
let _block_header = sub.next().await.unwrap().unwrap();
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn chain_subscribe_finalized_heads() {
|
||||
let ctx = test_context().await;
|
||||
let rpc = ctx.legacy_rpc_methods().await;
|
||||
@@ -50,7 +50,7 @@ async fn chain_subscribe_finalized_heads() {
|
||||
let _block_header = sub.next().await.unwrap().unwrap();
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn chain_subscribe_new_heads() {
|
||||
let ctx = test_context().await;
|
||||
let rpc = ctx.legacy_rpc_methods().await;
|
||||
@@ -59,7 +59,7 @@ async fn chain_subscribe_new_heads() {
|
||||
let _block_header = sub.next().await.unwrap().unwrap();
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn genesis_hash() {
|
||||
let ctx = test_context().await;
|
||||
let rpc = ctx.legacy_rpc_methods().await;
|
||||
@@ -67,7 +67,7 @@ async fn genesis_hash() {
|
||||
let _genesis_hash = rpc.genesis_hash().await.unwrap();
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn state_get_metadata() {
|
||||
let ctx = test_context().await;
|
||||
let rpc = ctx.legacy_rpc_methods().await;
|
||||
@@ -75,7 +75,7 @@ async fn state_get_metadata() {
|
||||
let _metadata = rpc.state_get_metadata(None).await.unwrap();
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn state_call() {
|
||||
let ctx = test_context().await;
|
||||
let rpc = ctx.legacy_rpc_methods().await;
|
||||
@@ -86,7 +86,7 @@ async fn state_call() {
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn system_health() {
|
||||
let ctx = test_context().await;
|
||||
let rpc = ctx.legacy_rpc_methods().await;
|
||||
@@ -94,7 +94,7 @@ async fn system_health() {
|
||||
let _ = rpc.system_health().await.unwrap();
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn system_chain() {
|
||||
let ctx = test_context().await;
|
||||
let rpc = ctx.legacy_rpc_methods().await;
|
||||
@@ -102,7 +102,7 @@ async fn system_chain() {
|
||||
let _ = rpc.system_chain().await.unwrap();
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn system_name() {
|
||||
let ctx = test_context().await;
|
||||
let rpc = ctx.legacy_rpc_methods().await;
|
||||
@@ -110,7 +110,7 @@ async fn system_name() {
|
||||
let _ = rpc.system_name().await.unwrap();
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn system_version() {
|
||||
let ctx = test_context().await;
|
||||
let rpc = ctx.legacy_rpc_methods().await;
|
||||
@@ -118,7 +118,7 @@ async fn system_version() {
|
||||
let _ = rpc.system_version().await.unwrap();
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn system_properties() {
|
||||
let ctx = test_context().await;
|
||||
let rpc = ctx.legacy_rpc_methods().await;
|
||||
|
||||
@@ -3,11 +3,14 @@
|
||||
// see LICENSE for license details.
|
||||
|
||||
use crate::{
|
||||
test_context,
|
||||
subxt_test, test_context,
|
||||
utils::{node_runtime, wait_for_blocks},
|
||||
};
|
||||
use codec::{Decode, Encode};
|
||||
|
||||
#[cfg(fullclient)]
|
||||
use futures::StreamExt;
|
||||
|
||||
use subxt::{
|
||||
backend::BackendExt,
|
||||
error::{DispatchError, Error},
|
||||
@@ -15,10 +18,13 @@ use subxt::{
|
||||
};
|
||||
use subxt_signer::sr25519::dev;
|
||||
|
||||
#[cfg(fullclient)]
|
||||
mod legacy_rpcs;
|
||||
|
||||
mod unstable_rpcs;
|
||||
|
||||
#[tokio::test]
|
||||
#[cfg(fullclient)]
|
||||
#[subxt_test]
|
||||
async fn storage_fetch_raw_keys() {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -39,7 +45,8 @@ async fn storage_fetch_raw_keys() {
|
||||
assert_eq!(len, 13)
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[cfg(fullclient)]
|
||||
#[subxt_test]
|
||||
async fn storage_iter() {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -63,7 +70,8 @@ async fn storage_iter() {
|
||||
assert_eq!(len, 13);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[cfg(fullclient)]
|
||||
#[subxt_test]
|
||||
async fn storage_child_values_same_across_backends() {
|
||||
let ctx = test_context().await;
|
||||
|
||||
@@ -103,7 +111,7 @@ async fn storage_child_values_same_across_backends() {
|
||||
}
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn transaction_validation() {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -137,7 +145,7 @@ async fn transaction_validation() {
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn validation_fails() {
|
||||
use std::str::FromStr;
|
||||
use subxt_signer::{sr25519::Keypair, SecretUri};
|
||||
@@ -171,7 +179,7 @@ async fn validation_fails() {
|
||||
);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn external_signing() {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -204,10 +212,11 @@ async fn external_signing() {
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
#[cfg(fullclient)]
|
||||
// TODO: Investigate and fix this test failure when using the UnstableBackend.
|
||||
// (https://github.com/paritytech/subxt/issues/1308)
|
||||
#[cfg(not(feature = "unstable-backend-client"))]
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn submit_large_extrinsic() {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -234,7 +243,7 @@ async fn submit_large_extrinsic() {
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn decode_a_module_error() {
|
||||
use node_runtime::runtime_types::pallet_assets::pallet as assets;
|
||||
|
||||
@@ -248,9 +257,14 @@ async fn decode_a_module_error() {
|
||||
// "unknown" module error from the assets pallet.
|
||||
let freeze_unknown_asset = node_runtime::tx().assets().freeze(1, alice_addr);
|
||||
|
||||
let err = api
|
||||
let signed_extrinsic = api
|
||||
.tx()
|
||||
.sign_and_submit_then_watch_default(&freeze_unknown_asset, &alice)
|
||||
.create_signed(&freeze_unknown_asset, &alice, Default::default())
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
let err = signed_extrinsic
|
||||
.submit_and_watch()
|
||||
.await
|
||||
.unwrap()
|
||||
.wait_for_finalized_success()
|
||||
@@ -271,7 +285,7 @@ async fn decode_a_module_error() {
|
||||
);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn unsigned_extrinsic_is_same_shape_as_polkadotjs() {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -299,7 +313,7 @@ async fn unsigned_extrinsic_is_same_shape_as_polkadotjs() {
|
||||
assert_eq!(actual_tx_bytes, expected_tx_bytes);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn extrinsic_hash_is_same_as_returned() {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -351,7 +365,7 @@ pub struct InclusionFee {
|
||||
pub adjusted_weight_fee: u128,
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn partial_fee_estimate_correct() {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
//! Just sanity checking some of the new RPC methods to try and
|
||||
//! catch differences as the implementations evolve.
|
||||
|
||||
use crate::{test_context, utils::node_runtime};
|
||||
use crate::{subxt_test, test_context, utils::node_runtime};
|
||||
use assert_matches::assert_matches;
|
||||
use codec::Encode;
|
||||
use futures::Stream;
|
||||
@@ -18,9 +18,10 @@ use subxt::{
|
||||
utils::{AccountId32, MultiAddress},
|
||||
SubstrateConfig,
|
||||
};
|
||||
|
||||
use subxt_signer::sr25519::dev;
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn chainhead_unstable_follow() {
|
||||
let ctx = test_context().await;
|
||||
let rpc = ctx.unstable_rpc_methods().await;
|
||||
@@ -60,7 +61,7 @@ async fn chainhead_unstable_follow() {
|
||||
);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn chainhead_unstable_body() {
|
||||
let ctx = test_context().await;
|
||||
let rpc = ctx.unstable_rpc_methods().await;
|
||||
@@ -88,7 +89,7 @@ async fn chainhead_unstable_body() {
|
||||
);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn chainhead_unstable_header() {
|
||||
let ctx = test_context().await;
|
||||
let rpc = ctx.unstable_rpc_methods().await;
|
||||
@@ -116,7 +117,7 @@ async fn chainhead_unstable_header() {
|
||||
assert_eq!(new_header, old_header);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn chainhead_unstable_storage() {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -162,7 +163,7 @@ async fn chainhead_unstable_storage() {
|
||||
assert_matches!(event, FollowEvent::OperationStorageDone(res) if res.operation_id == operation_id);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn chainhead_unstable_call() {
|
||||
let ctx = test_context().await;
|
||||
let rpc = ctx.unstable_rpc_methods().await;
|
||||
@@ -199,7 +200,7 @@ async fn chainhead_unstable_call() {
|
||||
);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn chainhead_unstable_unpin() {
|
||||
let ctx = test_context().await;
|
||||
let rpc = ctx.unstable_rpc_methods().await;
|
||||
@@ -217,7 +218,8 @@ async fn chainhead_unstable_unpin() {
|
||||
assert!(rpc.chainhead_unstable_unpin(sub_id, hash).await.is_err());
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[cfg(fullclient)]
|
||||
#[subxt_test]
|
||||
async fn chainspec_v1_genesishash() {
|
||||
let ctx = test_context().await;
|
||||
let old_rpc = ctx.legacy_rpc_methods().await;
|
||||
@@ -229,7 +231,8 @@ async fn chainspec_v1_genesishash() {
|
||||
assert_eq!(a, b);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[cfg(fullclient)]
|
||||
#[subxt_test]
|
||||
async fn chainspec_v1_chainname() {
|
||||
let ctx = test_context().await;
|
||||
let old_rpc = ctx.legacy_rpc_methods().await;
|
||||
@@ -241,7 +244,8 @@ async fn chainspec_v1_chainname() {
|
||||
assert_eq!(a, b);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[cfg(fullclient)]
|
||||
#[subxt_test]
|
||||
async fn chainspec_v1_properties() {
|
||||
let ctx = test_context().await;
|
||||
let old_rpc = ctx.legacy_rpc_methods().await;
|
||||
@@ -253,7 +257,8 @@ async fn chainspec_v1_properties() {
|
||||
assert_eq!(a, b);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[cfg(fullclient)]
|
||||
#[subxt_test]
|
||||
async fn transaction_unstable_submit_and_watch() {
|
||||
let ctx = test_context().await;
|
||||
let rpc = ctx.unstable_rpc_methods().await;
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
use crate::{
|
||||
node_runtime::{self, balances, runtime_types, system},
|
||||
test_context,
|
||||
subxt_test, test_context,
|
||||
};
|
||||
use codec::Decode;
|
||||
use subxt::{
|
||||
@@ -13,7 +13,7 @@ use subxt::{
|
||||
};
|
||||
use subxt_signer::sr25519::dev;
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn tx_basic_transfer() -> Result<(), subxt::Error> {
|
||||
let alice = dev::alice();
|
||||
let bob = dev::bob();
|
||||
@@ -45,12 +45,18 @@ async fn tx_basic_transfer() -> Result<(), subxt::Error> {
|
||||
.balances()
|
||||
.transfer_allow_death(bob_address, 10_000);
|
||||
|
||||
let events = api
|
||||
let signed_extrinsic = api
|
||||
.tx()
|
||||
.sign_and_submit_then_watch_default(&tx, &alice)
|
||||
.await?
|
||||
.create_signed(&tx, &alice, Default::default())
|
||||
.await?;
|
||||
|
||||
let events = signed_extrinsic
|
||||
.submit_and_watch()
|
||||
.await
|
||||
.unwrap()
|
||||
.wait_for_finalized_success()
|
||||
.await?;
|
||||
|
||||
let event = events
|
||||
.find_first::<balances::events::Transfer>()
|
||||
.expect("Failed to decode balances::events::Transfer")
|
||||
@@ -85,7 +91,8 @@ async fn tx_basic_transfer() -> Result<(), subxt::Error> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[cfg(fullclient)]
|
||||
#[subxt_test]
|
||||
async fn tx_dynamic_transfer() -> Result<(), subxt::Error> {
|
||||
use subxt::ext::scale_value::{At, Composite, Value};
|
||||
|
||||
@@ -207,7 +214,7 @@ async fn tx_dynamic_transfer() -> Result<(), subxt::Error> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn multiple_sequential_transfers_work() -> Result<(), subxt::Error> {
|
||||
let alice = dev::alice();
|
||||
let bob = dev::bob();
|
||||
@@ -232,9 +239,15 @@ async fn multiple_sequential_transfers_work() -> Result<(), subxt::Error> {
|
||||
.balances()
|
||||
.transfer_allow_death(bob_address.clone(), 10_000);
|
||||
for _ in 0..3 {
|
||||
api.tx()
|
||||
.sign_and_submit_then_watch_default(&tx, &alice)
|
||||
.await?
|
||||
let signed_extrinsic = api
|
||||
.tx()
|
||||
.create_signed(&tx, &alice, Default::default())
|
||||
.await?;
|
||||
|
||||
signed_extrinsic
|
||||
.submit_and_watch()
|
||||
.await
|
||||
.unwrap()
|
||||
.wait_for_finalized_success()
|
||||
.await?;
|
||||
}
|
||||
@@ -250,7 +263,7 @@ async fn multiple_sequential_transfers_work() -> Result<(), subxt::Error> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn storage_total_issuance() {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -267,7 +280,7 @@ async fn storage_total_issuance() {
|
||||
assert_ne!(total_issuance, 0);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn storage_balance_lock() -> Result<(), subxt::Error> {
|
||||
let bob_signer = dev::bob();
|
||||
let bob: AccountId32 = dev::bob().public_key().into();
|
||||
@@ -279,9 +292,15 @@ async fn storage_balance_lock() -> Result<(), subxt::Error> {
|
||||
runtime_types::pallet_staking::RewardDestination::Stash,
|
||||
);
|
||||
|
||||
api.tx()
|
||||
.sign_and_submit_then_watch_default(&tx, &bob_signer)
|
||||
.await?
|
||||
let signed_extrinsic = api
|
||||
.tx()
|
||||
.create_signed(&tx, &bob_signer, Default::default())
|
||||
.await?;
|
||||
|
||||
signed_extrinsic
|
||||
.submit_and_watch()
|
||||
.await
|
||||
.unwrap()
|
||||
.wait_for_finalized_success()
|
||||
.await?
|
||||
.find_first::<system::events::ExtrinsicSuccess>()?
|
||||
@@ -308,7 +327,7 @@ async fn storage_balance_lock() -> Result<(), subxt::Error> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn transfer_error() {
|
||||
let alice = dev::alice();
|
||||
let alice_addr = alice.public_key().into();
|
||||
@@ -324,8 +343,13 @@ async fn transfer_error() {
|
||||
.balances()
|
||||
.transfer_allow_death(alice_addr, 100_000_000_000_000_000);
|
||||
|
||||
api.tx()
|
||||
.sign_and_submit_then_watch_default(&to_bob_tx, &alice)
|
||||
let signed_extrinsic = api
|
||||
.tx()
|
||||
.create_signed(&to_bob_tx, &alice, Default::default())
|
||||
.await
|
||||
.unwrap();
|
||||
signed_extrinsic
|
||||
.submit_and_watch()
|
||||
.await
|
||||
.unwrap()
|
||||
.wait_for_finalized_success()
|
||||
@@ -334,9 +358,14 @@ async fn transfer_error() {
|
||||
|
||||
// When we try giving all of the funds back, Bob doesn't have
|
||||
// anything left to pay transfer fees, so we hit an error.
|
||||
let res = api
|
||||
let signed_extrinsic = api
|
||||
.tx()
|
||||
.sign_and_submit_then_watch_default(&to_alice_tx, &bob)
|
||||
.create_signed(&to_alice_tx, &bob, Default::default())
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
let res = signed_extrinsic
|
||||
.submit_and_watch()
|
||||
.await
|
||||
.unwrap()
|
||||
.wait_for_finalized_success()
|
||||
@@ -353,7 +382,7 @@ async fn transfer_error() {
|
||||
);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn transfer_implicit_subscription() {
|
||||
let alice = dev::alice();
|
||||
let bob: AccountId32 = dev::bob().public_key().into();
|
||||
@@ -364,9 +393,14 @@ async fn transfer_implicit_subscription() {
|
||||
.balances()
|
||||
.transfer_allow_death(bob.clone().into(), 10_000);
|
||||
|
||||
let event = api
|
||||
let signed_extrinsic = api
|
||||
.tx()
|
||||
.sign_and_submit_then_watch_default(&to_bob_tx, &alice)
|
||||
.create_signed(&to_bob_tx, &alice, Default::default())
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
let event = signed_extrinsic
|
||||
.submit_and_watch()
|
||||
.await
|
||||
.unwrap()
|
||||
.wait_for_finalized_success()
|
||||
@@ -386,7 +420,7 @@ async fn transfer_implicit_subscription() {
|
||||
);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn constant_existential_deposit() {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
|
||||
@@ -9,10 +9,10 @@ use crate::{
|
||||
runtime_types::{pallet_contracts::wasm::Determinism, sp_weights::weight_v2::Weight},
|
||||
system,
|
||||
},
|
||||
test_context, TestContext,
|
||||
subxt_test, test_context, TestClient, TestConfig, TestContext,
|
||||
};
|
||||
use subxt::ext::futures::StreamExt;
|
||||
use subxt::{tx::TxProgress, utils::MultiAddress, Config, Error, OnlineClient, SubstrateConfig};
|
||||
use subxt::{tx::TxProgress, utils::MultiAddress, Config, Error};
|
||||
use subxt_signer::sr25519::{self, dev};
|
||||
|
||||
struct ContractsTestContext {
|
||||
@@ -20,8 +20,8 @@ struct ContractsTestContext {
|
||||
signer: sr25519::Keypair,
|
||||
}
|
||||
|
||||
type Hash = <SubstrateConfig as Config>::Hash;
|
||||
type AccountId = <SubstrateConfig as Config>::AccountId;
|
||||
type Hash = <TestConfig as Config>::Hash;
|
||||
type AccountId = <TestConfig as Config>::AccountId;
|
||||
|
||||
/// A dummy contract which does nothing at all.
|
||||
const CONTRACT: &str = r#"
|
||||
@@ -42,7 +42,7 @@ impl ContractsTestContext {
|
||||
Self { cxt, signer }
|
||||
}
|
||||
|
||||
fn client(&self) -> OnlineClient<SubstrateConfig> {
|
||||
fn client(&self) -> TestClient {
|
||||
self.cxt.client()
|
||||
}
|
||||
|
||||
@@ -54,11 +54,16 @@ impl ContractsTestContext {
|
||||
.contracts()
|
||||
.upload_code(code, None, Determinism::Enforced);
|
||||
|
||||
let events = self
|
||||
let signed_extrinsic = self
|
||||
.client()
|
||||
.tx()
|
||||
.sign_and_submit_then_watch_default(&upload_tx, &self.signer)
|
||||
.await?
|
||||
.create_signed(&upload_tx, &self.signer, Default::default())
|
||||
.await?;
|
||||
|
||||
let events = signed_extrinsic
|
||||
.submit_and_watch()
|
||||
.await
|
||||
.unwrap()
|
||||
.wait_for_finalized_success()
|
||||
.await?;
|
||||
|
||||
@@ -84,11 +89,16 @@ impl ContractsTestContext {
|
||||
vec![], // salt
|
||||
);
|
||||
|
||||
let events = self
|
||||
let signed_extrinsic = self
|
||||
.client()
|
||||
.tx()
|
||||
.sign_and_submit_then_watch_default(&instantiate_tx, &self.signer)
|
||||
.await?
|
||||
.create_signed(&instantiate_tx, &self.signer, Default::default())
|
||||
.await?;
|
||||
|
||||
let events = signed_extrinsic
|
||||
.submit_and_watch()
|
||||
.await
|
||||
.unwrap()
|
||||
.wait_for_finalized_success()
|
||||
.await?;
|
||||
|
||||
@@ -126,11 +136,15 @@ impl ContractsTestContext {
|
||||
salt,
|
||||
);
|
||||
|
||||
let result = self
|
||||
let signed_extrinsic = self
|
||||
.client()
|
||||
.tx()
|
||||
.sign_and_submit_then_watch_default(&instantiate_tx, &self.signer)
|
||||
.await?
|
||||
.create_signed(&instantiate_tx, &self.signer, Default::default())
|
||||
.await?;
|
||||
let result = signed_extrinsic
|
||||
.submit_and_watch()
|
||||
.await
|
||||
.unwrap()
|
||||
.wait_for_finalized_success()
|
||||
.await?;
|
||||
|
||||
@@ -146,7 +160,7 @@ impl ContractsTestContext {
|
||||
&self,
|
||||
contract: AccountId,
|
||||
input_data: Vec<u8>,
|
||||
) -> Result<TxProgress<SubstrateConfig, OnlineClient<SubstrateConfig>>, Error> {
|
||||
) -> Result<TxProgress<TestConfig, TestClient>, Error> {
|
||||
tracing::info!("call: {:?}", contract);
|
||||
let call_tx = node_runtime::tx().contracts().call(
|
||||
MultiAddress::Id(contract),
|
||||
@@ -170,7 +184,7 @@ impl ContractsTestContext {
|
||||
}
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn tx_instantiate_with_code() {
|
||||
let ctx = ContractsTestContext::init().await;
|
||||
let result = ctx.instantiate_with_code().await;
|
||||
@@ -181,7 +195,7 @@ async fn tx_instantiate_with_code() {
|
||||
);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn tx_instantiate() {
|
||||
let ctx = ContractsTestContext::init().await;
|
||||
let code_hash = ctx.upload_code().await.unwrap();
|
||||
@@ -194,7 +208,7 @@ async fn tx_instantiate() {
|
||||
);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn tx_call() {
|
||||
let cxt = ContractsTestContext::init().await;
|
||||
let (_, contract) = cxt.instantiate_with_code().await.unwrap();
|
||||
|
||||
@@ -5,8 +5,11 @@
|
||||
//! Test interactions with some built-in FRAME pallets.
|
||||
|
||||
mod balances;
|
||||
mod contracts;
|
||||
mod staking;
|
||||
mod sudo;
|
||||
mod system;
|
||||
mod timestamp;
|
||||
|
||||
#[cfg(fullclient)]
|
||||
mod contracts;
|
||||
#[cfg(fullclient)]
|
||||
mod sudo;
|
||||
|
||||
@@ -11,7 +11,7 @@ use crate::{
|
||||
},
|
||||
staking,
|
||||
},
|
||||
test_context,
|
||||
subxt_test, test_context,
|
||||
};
|
||||
use assert_matches::assert_matches;
|
||||
use subxt::error::{DispatchError, Error};
|
||||
@@ -34,7 +34,7 @@ fn default_validator_prefs() -> ValidatorPrefs {
|
||||
}
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn validate_with_stash_account() {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -45,8 +45,14 @@ async fn validate_with_stash_account() {
|
||||
.staking()
|
||||
.validate(default_validator_prefs());
|
||||
|
||||
api.tx()
|
||||
.sign_and_submit_then_watch_default(&tx, &alice_stash)
|
||||
let signed_extrinsic = api
|
||||
.tx()
|
||||
.create_signed(&tx, &alice_stash, Default::default())
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
signed_extrinsic
|
||||
.submit_and_watch()
|
||||
.await
|
||||
.unwrap()
|
||||
.wait_for_finalized_success()
|
||||
@@ -54,7 +60,7 @@ async fn validate_with_stash_account() {
|
||||
.expect("should be successful");
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn validate_not_possible_for_controller_account() -> Result<(), Error> {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -65,12 +71,18 @@ async fn validate_not_possible_for_controller_account() -> Result<(), Error> {
|
||||
.staking()
|
||||
.validate(default_validator_prefs());
|
||||
|
||||
let announce_validator = api
|
||||
let signed_extrinsic = api
|
||||
.tx()
|
||||
.sign_and_submit_then_watch_default(&tx, &alice)
|
||||
.await?
|
||||
.create_signed(&tx, &alice, Default::default())
|
||||
.await?;
|
||||
|
||||
let announce_validator = signed_extrinsic
|
||||
.submit_and_watch()
|
||||
.await
|
||||
.unwrap()
|
||||
.wait_for_finalized_success()
|
||||
.await;
|
||||
|
||||
assert_matches!(announce_validator, Err(Error::Runtime(DispatchError::Module(err))) => {
|
||||
let details = err.details().unwrap();
|
||||
assert_eq!(details.pallet.name(), "Staking");
|
||||
@@ -79,7 +91,7 @@ async fn validate_not_possible_for_controller_account() -> Result<(), Error> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn nominate_with_stash_account() {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -91,8 +103,14 @@ async fn nominate_with_stash_account() {
|
||||
.staking()
|
||||
.nominate(vec![bob.public_key().to_address()]);
|
||||
|
||||
api.tx()
|
||||
.sign_and_submit_then_watch_default(&tx, &alice_stash)
|
||||
let signed_extrinsic = api
|
||||
.tx()
|
||||
.create_signed(&tx, &alice_stash, Default::default())
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
signed_extrinsic
|
||||
.submit_and_watch()
|
||||
.await
|
||||
.unwrap()
|
||||
.wait_for_finalized_success()
|
||||
@@ -100,7 +118,7 @@ async fn nominate_with_stash_account() {
|
||||
.expect("should be successful");
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn nominate_not_possible_for_controller_account() -> Result<(), Error> {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -112,9 +130,13 @@ async fn nominate_not_possible_for_controller_account() -> Result<(), Error> {
|
||||
.staking()
|
||||
.nominate(vec![bob.public_key().to_address()]);
|
||||
|
||||
let nomination = api
|
||||
let signed_extrinsic = api
|
||||
.tx()
|
||||
.sign_and_submit_then_watch_default(&tx, &alice)
|
||||
.create_signed(&tx, &alice, Default::default())
|
||||
.await
|
||||
.unwrap();
|
||||
let nomination = signed_extrinsic
|
||||
.submit_and_watch()
|
||||
.await
|
||||
.unwrap()
|
||||
.wait_for_finalized_success()
|
||||
@@ -128,7 +150,7 @@ async fn nominate_not_possible_for_controller_account() -> Result<(), Error> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn chill_works_for_stash_only() -> Result<(), Error> {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -141,9 +163,15 @@ async fn chill_works_for_stash_only() -> Result<(), Error> {
|
||||
let nominate_tx = node_runtime::tx()
|
||||
.staking()
|
||||
.nominate(vec![bob_stash.public_key().to_address()]);
|
||||
api.tx()
|
||||
.sign_and_submit_then_watch_default(&nominate_tx, &alice_stash)
|
||||
.await?
|
||||
|
||||
let signed_extrinsic = api
|
||||
.tx()
|
||||
.create_signed(&nominate_tx, &alice_stash, Default::default())
|
||||
.await?;
|
||||
signed_extrinsic
|
||||
.submit_and_watch()
|
||||
.await
|
||||
.unwrap()
|
||||
.wait_for_finalized_success()
|
||||
.await?;
|
||||
|
||||
@@ -161,10 +189,15 @@ async fn chill_works_for_stash_only() -> Result<(), Error> {
|
||||
|
||||
let chill_tx = node_runtime::tx().staking().chill();
|
||||
|
||||
let chill = api
|
||||
let signed_extrinsic = api
|
||||
.tx()
|
||||
.sign_and_submit_then_watch_default(&chill_tx, &alice)
|
||||
.await?
|
||||
.create_signed(&chill_tx, &alice, Default::default())
|
||||
.await?;
|
||||
|
||||
let chill = signed_extrinsic
|
||||
.submit_and_watch()
|
||||
.await
|
||||
.unwrap()
|
||||
.wait_for_finalized_success()
|
||||
.await;
|
||||
|
||||
@@ -174,19 +207,23 @@ async fn chill_works_for_stash_only() -> Result<(), Error> {
|
||||
assert_eq!(&details.variant.name, "NotController");
|
||||
});
|
||||
|
||||
let is_chilled = api
|
||||
let signed_extrinsic = api
|
||||
.tx()
|
||||
.sign_and_submit_then_watch_default(&chill_tx, &alice_stash)
|
||||
.create_signed(&chill_tx, &alice_stash, Default::default())
|
||||
.await?;
|
||||
let is_chilled = signed_extrinsic
|
||||
.submit_and_watch()
|
||||
.await?
|
||||
.wait_for_finalized_success()
|
||||
.await?
|
||||
.has::<staking::events::Chilled>()?;
|
||||
|
||||
assert!(is_chilled);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn tx_bond() -> Result<(), Error> {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -197,18 +234,24 @@ async fn tx_bond() -> Result<(), Error> {
|
||||
.staking()
|
||||
.bond(100_000_000_000_000, RewardDestination::Stash);
|
||||
|
||||
let bond = api
|
||||
let signed_extrinsic = api
|
||||
.tx()
|
||||
.sign_and_submit_then_watch_default(&bond_tx, &alice)
|
||||
.create_signed(&bond_tx, &alice, Default::default())
|
||||
.await?;
|
||||
let bond = signed_extrinsic
|
||||
.submit_and_watch()
|
||||
.await?
|
||||
.wait_for_finalized_success()
|
||||
.await;
|
||||
|
||||
assert!(bond.is_ok());
|
||||
|
||||
let bond_again = api
|
||||
let signed_extrinsic = api
|
||||
.tx()
|
||||
.sign_and_submit_then_watch_default(&bond_tx, &alice)
|
||||
.create_signed(&bond_tx, &alice, Default::default())
|
||||
.await?;
|
||||
|
||||
let bond_again = signed_extrinsic
|
||||
.submit_and_watch()
|
||||
.await?
|
||||
.wait_for_finalized_success()
|
||||
.await;
|
||||
@@ -221,7 +264,7 @@ async fn tx_bond() -> Result<(), Error> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn storage_history_depth() -> Result<(), Error> {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -231,7 +274,7 @@ async fn storage_history_depth() -> Result<(), Error> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn storage_current_era() -> Result<(), Error> {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -246,7 +289,7 @@ async fn storage_current_era() -> Result<(), Error> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn storage_era_reward_points() -> Result<(), Error> {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
|
||||
@@ -8,14 +8,14 @@ use crate::{
|
||||
runtime_types::{self, sp_weights::weight_v2::Weight},
|
||||
sudo,
|
||||
},
|
||||
test_context,
|
||||
subxt_test, test_context,
|
||||
};
|
||||
use subxt_signer::sr25519::dev;
|
||||
|
||||
type Call = runtime_types::kitchensink_runtime::RuntimeCall;
|
||||
type BalancesCall = runtime_types::pallet_balances::pallet::Call;
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn test_sudo() -> Result<(), subxt::Error> {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -29,9 +29,13 @@ async fn test_sudo() -> Result<(), subxt::Error> {
|
||||
});
|
||||
let tx = node_runtime::tx().sudo().sudo(call);
|
||||
|
||||
let found_event = api
|
||||
let signed_extrinsic = api
|
||||
.tx()
|
||||
.sign_and_submit_then_watch_default(&tx, &alice)
|
||||
.create_signed(&tx, &alice, Default::default())
|
||||
.await?;
|
||||
|
||||
let found_event = signed_extrinsic
|
||||
.submit_and_watch()
|
||||
.await?
|
||||
.wait_for_finalized_success()
|
||||
.await?
|
||||
@@ -41,7 +45,7 @@ async fn test_sudo() -> Result<(), subxt::Error> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn test_sudo_unchecked_weight() -> Result<(), subxt::Error> {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -61,9 +65,13 @@ async fn test_sudo_unchecked_weight() -> Result<(), subxt::Error> {
|
||||
},
|
||||
);
|
||||
|
||||
let found_event = api
|
||||
let signed_extrinsic = api
|
||||
.tx()
|
||||
.sign_and_submit_then_watch_default(&tx, &alice)
|
||||
.create_signed(&tx, &alice, Default::default())
|
||||
.await?;
|
||||
|
||||
let found_event = signed_extrinsic
|
||||
.submit_and_watch()
|
||||
.await?
|
||||
.wait_for_finalized_success()
|
||||
.await?
|
||||
|
||||
@@ -4,12 +4,12 @@
|
||||
|
||||
use crate::{
|
||||
node_runtime::{self, system},
|
||||
test_context,
|
||||
subxt_test, test_context,
|
||||
};
|
||||
use assert_matches::assert_matches;
|
||||
use subxt_signer::sr25519::dev;
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn storage_account() -> Result<(), subxt::Error> {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -31,7 +31,7 @@ async fn storage_account() -> Result<(), subxt::Error> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn tx_remark_with_event() -> Result<(), subxt::Error> {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -42,9 +42,13 @@ async fn tx_remark_with_event() -> Result<(), subxt::Error> {
|
||||
.system()
|
||||
.remark_with_event(b"remarkable".to_vec());
|
||||
|
||||
let found_event = api
|
||||
let signed_extrinsic = api
|
||||
.tx()
|
||||
.sign_and_submit_then_watch_default(&tx, &alice)
|
||||
.create_signed(&tx, &alice, Default::default())
|
||||
.await?;
|
||||
|
||||
let found_event = signed_extrinsic
|
||||
.submit_and_watch()
|
||||
.await?
|
||||
.wait_for_finalized_success()
|
||||
.await?
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
// This file is dual-licensed as Apache-2.0 or GPL-3.0.
|
||||
// see LICENSE for license details.
|
||||
|
||||
use crate::{node_runtime, test_context};
|
||||
use crate::{node_runtime, subxt_test, test_context};
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn storage_get_current_timestamp() {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// This file is dual-licensed as Apache-2.0 or GPL-3.0.
|
||||
// see LICENSE for license details.
|
||||
|
||||
use crate::{node_runtime, test_context, TestContext};
|
||||
use crate::{node_runtime, subxt_test, test_context, TestContext};
|
||||
use frame_metadata::v15::{
|
||||
CustomMetadata, ExtrinsicMetadata, OuterEnums, PalletCallMetadata, PalletMetadata,
|
||||
PalletStorageMetadata, RuntimeMetadataV15, StorageEntryMetadata, StorageEntryModifier,
|
||||
@@ -97,7 +97,7 @@ fn pallets_to_metadata(pallets: Vec<PalletMetadata>) -> Metadata {
|
||||
))
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn full_metadata_check() {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -114,7 +114,7 @@ async fn full_metadata_check() {
|
||||
assert!(!node_runtime::is_codegen_valid_for(&metadata));
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn constant_values_are_not_validated() {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -146,7 +146,7 @@ async fn constant_values_are_not_validated() {
|
||||
assert!(api.constants().at(&deposit_addr).is_ok());
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn calls_check() {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -232,7 +232,7 @@ async fn calls_check() {
|
||||
assert!(api.tx().validate(&withdraw_unbonded_addr).is_ok());
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn storage_check() {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
|
||||
@@ -2,12 +2,12 @@
|
||||
// This file is dual-licensed as Apache-2.0 or GPL-3.0.
|
||||
// see LICENSE for license details.
|
||||
|
||||
use crate::{node_runtime, test_context};
|
||||
use crate::{node_runtime, subxt_test, test_context};
|
||||
use codec::Encode;
|
||||
use subxt::utils::AccountId32;
|
||||
use subxt_signer::sr25519::dev;
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn account_nonce() -> Result<(), subxt::Error> {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -29,8 +29,13 @@ async fn account_nonce() -> Result<(), subxt::Error> {
|
||||
|
||||
// Do some transaction to bump the Alice nonce to 1:
|
||||
let remark_tx = node_runtime::tx().system().remark(vec![1, 2, 3, 4, 5]);
|
||||
api.tx()
|
||||
.sign_and_submit_then_watch_default(&remark_tx, &alice)
|
||||
let signed_extrinsic = api
|
||||
.tx()
|
||||
.create_signed(&remark_tx, &alice, Default::default())
|
||||
.await?;
|
||||
|
||||
signed_extrinsic
|
||||
.submit_and_watch()
|
||||
.await?
|
||||
.wait_for_finalized_success()
|
||||
.await?;
|
||||
@@ -49,7 +54,7 @@ async fn account_nonce() -> Result<(), subxt::Error> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn unchecked_extrinsic_encoding() -> Result<(), subxt::Error> {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
|
||||
@@ -2,11 +2,14 @@
|
||||
// This file is dual-licensed as Apache-2.0 or GPL-3.0.
|
||||
// see LICENSE for license details.
|
||||
|
||||
use crate::{node_runtime, test_context, utils::wait_for_blocks};
|
||||
use crate::{node_runtime, subxt_test, test_context, utils::wait_for_blocks};
|
||||
|
||||
#[cfg(fullclient)]
|
||||
use subxt::utils::AccountId32;
|
||||
#[cfg(fullclient)]
|
||||
use subxt_signer::sr25519::dev;
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn storage_plain_lookup() -> Result<(), subxt::Error> {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -27,7 +30,8 @@ async fn storage_plain_lookup() -> Result<(), subxt::Error> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[cfg(fullclient)]
|
||||
#[subxt_test]
|
||||
async fn storage_map_lookup() -> Result<(), subxt::Error> {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -56,7 +60,8 @@ async fn storage_map_lookup() -> Result<(), subxt::Error> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[cfg(fullclient)]
|
||||
#[subxt_test]
|
||||
async fn storage_n_mapish_key_is_properly_created() -> Result<(), subxt::Error> {
|
||||
use codec::Encode;
|
||||
use node_runtime::runtime_types::sp_core::crypto::KeyTypeId;
|
||||
@@ -89,7 +94,8 @@ async fn storage_n_mapish_key_is_properly_created() -> Result<(), subxt::Error>
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[cfg(fullclient)]
|
||||
#[subxt_test]
|
||||
async fn storage_n_map_storage_lookup() -> Result<(), subxt::Error> {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -125,7 +131,8 @@ async fn storage_n_map_storage_lookup() -> Result<(), subxt::Error> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[cfg(fullclient)]
|
||||
#[subxt_test]
|
||||
async fn storage_partial_lookup() -> Result<(), subxt::Error> {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -199,7 +206,7 @@ async fn storage_partial_lookup() -> Result<(), subxt::Error> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn storage_runtime_wasm_code() -> Result<(), subxt::Error> {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
@@ -208,7 +215,7 @@ async fn storage_runtime_wasm_code() -> Result<(), subxt::Error> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
#[subxt_test]
|
||||
async fn storage_pallet_storage_version() -> Result<(), subxt::Error> {
|
||||
let ctx = test_context().await;
|
||||
let api = ctx.client();
|
||||
|
||||
@@ -14,7 +14,10 @@ pub mod utils;
|
||||
#[cfg_attr(test, allow(unused_imports))]
|
||||
use utils::*;
|
||||
|
||||
#[cfg(all(test, not(feature = "unstable-light-client")))]
|
||||
#[cfg(any(
|
||||
all(test, not(feature = "unstable-light-client")),
|
||||
all(test, feature = "unstable-light-client-long-running")
|
||||
))]
|
||||
mod full_client;
|
||||
|
||||
#[cfg(all(test, feature = "unstable-light-client"))]
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
|
||||
pub(crate) use crate::{node_runtime, utils::TestNodeProcess};
|
||||
|
||||
use subxt::client::OnlineClient;
|
||||
use subxt::SubstrateConfig;
|
||||
|
||||
/// `substrate-node` should be installed on the $PATH. We fall back
|
||||
@@ -20,8 +21,12 @@ pub async fn test_context_with(authority: String) -> TestContext {
|
||||
proc.spawn::<SubstrateConfig>().await.unwrap()
|
||||
}
|
||||
|
||||
pub type TestConfig = SubstrateConfig;
|
||||
|
||||
pub type TestContext = TestNodeProcess<SubstrateConfig>;
|
||||
|
||||
pub type TestClient = OnlineClient<SubstrateConfig>;
|
||||
|
||||
pub async fn test_context() -> TestContext {
|
||||
test_context_with("alice".to_string()).await
|
||||
}
|
||||
|
||||
@@ -8,4 +8,15 @@ mod wait_for_blocks;
|
||||
|
||||
pub use context::*;
|
||||
pub use node_proc::TestNodeProcess;
|
||||
pub use wait_for_blocks::wait_for_blocks;
|
||||
pub use wait_for_blocks::*;
|
||||
|
||||
pub use subxt_test_macro::subxt_test;
|
||||
|
||||
/// The test timeout is set to 1 second.
|
||||
/// However, the test is sleeping for 5 seconds.
|
||||
/// This must cause the test to panic.
|
||||
#[subxt_test(timeout = 1)]
|
||||
#[should_panic]
|
||||
async fn test_subxt_macro() {
|
||||
tokio::time::sleep(std::time::Duration::from_secs(5)).await;
|
||||
}
|
||||
|
||||
@@ -145,7 +145,7 @@ impl TestNodeProcessBuilder {
|
||||
#[allow(unused_assignments, unused_mut)]
|
||||
let mut legacy_client = None;
|
||||
|
||||
#[cfg(feature = "unstable-light-client")]
|
||||
#[cfg(lightclient)]
|
||||
let client = build_light_client(&proc).await?;
|
||||
|
||||
#[cfg(feature = "unstable-backend-client")]
|
||||
@@ -155,10 +155,7 @@ impl TestNodeProcessBuilder {
|
||||
client
|
||||
};
|
||||
|
||||
#[cfg(all(
|
||||
not(feature = "unstable-light-client"),
|
||||
not(feature = "unstable-backend-client")
|
||||
))]
|
||||
#[cfg(all(not(lightclient), not(feature = "unstable-backend-client")))]
|
||||
let client = {
|
||||
let client = build_legacy_client(rpc_client.clone()).await?;
|
||||
legacy_client = Some(client.clone());
|
||||
@@ -219,7 +216,7 @@ async fn build_unstable_client<T: Config>(
|
||||
Ok(client)
|
||||
}
|
||||
|
||||
#[cfg(feature = "unstable-light-client")]
|
||||
#[cfg(lightclient)]
|
||||
async fn build_light_client<T: Config>(proc: &SubstrateNode) -> Result<OnlineClient<T>, String> {
|
||||
use subxt::lightclient::{ChainConfig, LightClient};
|
||||
|
||||
@@ -230,7 +227,11 @@ async fn build_light_client<T: Config>(proc: &SubstrateNode) -> Result<OnlineCli
|
||||
let client = OnlineClient::<T>::from_url(ws_url.clone())
|
||||
.await
|
||||
.map_err(|err| format!("Failed to connect to node rpc at {ws_url}: {err}"))?;
|
||||
super::wait_for_blocks(&client).await;
|
||||
|
||||
// Wait for at least a few blocks before starting the light client.
|
||||
// Otherwise, the lightclient might error with
|
||||
// `"Error when retrieving the call proof: No node available for call proof query"`.
|
||||
super::wait_for_number_of_blocks(&client, 5).await;
|
||||
|
||||
// Now, configure a light client; fetch the chain spec and modify the bootnodes.
|
||||
let bootnode = format!(
|
||||
@@ -252,9 +253,5 @@ async fn build_light_client<T: Config>(proc: &SubstrateNode) -> Result<OnlineCli
|
||||
.map_err(|e| format!("Light client: cannot add relay chain: {e}"))?;
|
||||
|
||||
// Instantiate subxt client from this.
|
||||
let api = OnlineClient::from_rpc_client(rpc)
|
||||
.await
|
||||
.map_err(|e| format!("Failed to build OnlineClient from light client RPC: {e}"))?;
|
||||
|
||||
Ok(api)
|
||||
build_unstable_client(rpc.into()).await
|
||||
}
|
||||
|
||||
@@ -8,9 +8,18 @@ use subxt::{client::OnlineClientT, Config};
|
||||
/// wait for one more finalized block to be produced, which is important because
|
||||
/// the first finalized block doesn't have much state etc associated with it.
|
||||
pub async fn wait_for_blocks<C: Config>(api: &impl OnlineClientT<C>) {
|
||||
let mut sub = api.blocks().subscribe_finalized().await.unwrap();
|
||||
// The current finalized block:
|
||||
sub.next().await;
|
||||
// The next one:
|
||||
sub.next().await;
|
||||
// The current finalized block and the next block.
|
||||
wait_for_number_of_blocks(api, 2).await;
|
||||
}
|
||||
|
||||
/// Wait for a number of blocks to be produced.
|
||||
pub async fn wait_for_number_of_blocks<C: Config>(
|
||||
api: &impl OnlineClientT<C>,
|
||||
number_of_blocks: usize,
|
||||
) {
|
||||
let mut sub = api.blocks().subscribe_finalized().await.unwrap();
|
||||
|
||||
for _ in 0..number_of_blocks {
|
||||
sub.next().await;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
[package]
|
||||
name = "subxt-test-macro"
|
||||
version.workspace = true
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
rust-version.workspace = true
|
||||
publish = false
|
||||
|
||||
license.workspace = true
|
||||
repository.workspace = true
|
||||
documentation.workspace = true
|
||||
homepage.workspace = true
|
||||
description = "Subxt integration tests proc-macros"
|
||||
|
||||
[lib]
|
||||
proc-macro = true
|
||||
|
||||
[dependencies]
|
||||
syn = { workspace = true }
|
||||
quote = { workspace = true }
|
||||
@@ -0,0 +1,95 @@
|
||||
// Copyright 2019-2023 Parity Technologies (UK) Ltd.
|
||||
// This file is dual-licensed as Apache-2.0 or GPL-3.0.
|
||||
// see LICENSE for license details.
|
||||
|
||||
extern crate proc_macro;
|
||||
use proc_macro::TokenStream;
|
||||
|
||||
use quote::{format_ident, quote};
|
||||
use syn::{
|
||||
parse::{Parse, ParseStream},
|
||||
Error,
|
||||
};
|
||||
|
||||
/// Environment variable for setting the timeout for the test.
|
||||
const SUBXT_TEST_TIMEOUT: &str = "SUBXT_TEST_TIMEOUT";
|
||||
|
||||
/// Default timeout for the test.
|
||||
const DEFAULT_TIMEOUT_SECS: u64 = 60 * 6;
|
||||
|
||||
#[proc_macro_attribute]
|
||||
pub fn subxt_test(attr: TokenStream, item: TokenStream) -> TokenStream {
|
||||
let subxt_attr = match syn::parse::<SubxtTestAttr>(attr) {
|
||||
Ok(subxt_attr) => subxt_attr,
|
||||
Err(err) => return err.into_compile_error().into(),
|
||||
};
|
||||
|
||||
// Timeout is determined by:
|
||||
// - The timeout attribute if it is set.
|
||||
// - The SUBXT_TEST_TIMEOUT environment variable if it is set.
|
||||
// - A default of 6 minutes.
|
||||
let timeout_duration = subxt_attr.timeout.unwrap_or_else(|| {
|
||||
std::env::var(SUBXT_TEST_TIMEOUT)
|
||||
.map(|str| str.parse().unwrap_or(DEFAULT_TIMEOUT_SECS))
|
||||
.unwrap_or(DEFAULT_TIMEOUT_SECS)
|
||||
});
|
||||
|
||||
let func: syn::ItemFn = match syn::parse(item) {
|
||||
Ok(func) => func,
|
||||
Err(err) => return err.into_compile_error().into(),
|
||||
};
|
||||
|
||||
let func_attrs = &func.attrs;
|
||||
let func_vis = &func.vis;
|
||||
let func_sig = &func.sig;
|
||||
let func_block = &func.block;
|
||||
|
||||
let mut inner_func_sig = func.sig.clone();
|
||||
inner_func_sig.ident = format_ident!("{}_inner", inner_func_sig.ident);
|
||||
let inner_func_name = &inner_func_sig.ident;
|
||||
|
||||
let result = quote! {
|
||||
#[tokio::test]
|
||||
#( #func_attrs )*
|
||||
#func_vis #func_sig {
|
||||
#func_vis #inner_func_sig
|
||||
#func_block
|
||||
|
||||
tokio::time::timeout(std::time::Duration::from_secs(#timeout_duration), #inner_func_name())
|
||||
.await
|
||||
.expect("Test timedout")
|
||||
}
|
||||
};
|
||||
result.into()
|
||||
}
|
||||
|
||||
mod keywords {
|
||||
syn::custom_keyword!(timeout);
|
||||
}
|
||||
|
||||
struct SubxtTestAttr {
|
||||
timeout: Option<u64>,
|
||||
}
|
||||
|
||||
impl Parse for SubxtTestAttr {
|
||||
fn parse(input: ParseStream) -> Result<Self, Error> {
|
||||
if input.is_empty() {
|
||||
return Ok(Self { timeout: None });
|
||||
}
|
||||
|
||||
let _keyword = input.parse::<keywords::timeout>()?;
|
||||
input.parse::<syn::token::Eq>()?;
|
||||
let timeout = input.parse::<syn::LitInt>()?.base10_parse::<u64>()?;
|
||||
|
||||
if !input.is_empty() {
|
||||
return Err(Error::new(
|
||||
input.span(),
|
||||
"Expected tokens: `timeout = value`",
|
||||
));
|
||||
}
|
||||
|
||||
Ok(Self {
|
||||
timeout: Some(timeout),
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user