Skip to content

Commit 2a90fa0

Browse files
committed
Migrate 0009-approval-voting-coalescing.zndsl
Signed-off-by: Alexandru Gheorghe <[email protected]>
1 parent e915cad commit 2a90fa0

File tree

4 files changed

+223
-8
lines changed

4 files changed

+223
-8
lines changed

.gitlab/pipeline/zombienet/polkadot.yml

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -136,14 +136,6 @@ zombienet-polkadot-functional-0008-dispute-old-finalized:
136136
--local-dir="${LOCAL_DIR}/functional"
137137
--test="0008-dispute-old-finalized.zndsl"
138138

139-
zombienet-polkadot-functional-0009-approval-voting-coalescing:
140-
extends:
141-
- .zombienet-polkadot-common
142-
script:
143-
- /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh
144-
--local-dir="${LOCAL_DIR}/functional"
145-
--test="0009-approval-voting-coalescing.zndsl"
146-
147139
zombienet-polkadot-functional-0010-validator-disabling:
148140
extends:
149141
- .zombienet-polkadot-common
@@ -449,6 +441,22 @@ zombienet-polkadot-functional-async-backing-6-seconds-rate:
449441
- unset NEXTEST_SUCCESS_OUTPUT
450442
- cargo nextest run --archive-file ./artifacts/polkadot-zombienet-tests.tar.zst --no-capture -- functional::async_backing_6_seconds_rate::async_backing_6_seconds_rate_test
451443

444+
zombienet-polkadot-functional-approval-voting-coalescing::
445+
extends:
446+
- .zombienet-polkadot-common
447+
needs:
448+
- job: build-polkadot-zombienet-tests
449+
artifacts: true
450+
before_script:
451+
- !reference [".zombienet-polkadot-common", "before_script"]
452+
- export POLKADOT_IMAGE="${ZOMBIENET_INTEGRATION_TEST_IMAGE}"
453+
- export X_INFRA_INSTANCE=spot # use spot by default
454+
script:
455+
# we want to use `--no-capture` in zombienet tests.
456+
- unset NEXTEST_FAILURE_OUTPUT
457+
- unset NEXTEST_SUCCESS_OUTPUT
458+
- cargo nextest run --archive-file ./artifacts/polkadot-zombienet-tests.tar.zst --no-capture -- functional::approval_voting_coalescing::approval_voting_coalescing_test
459+
452460
zombienet-polkadot-functional-duplicate-collations:
453461
extends:
454462
- .zombienet-polkadot-common
Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
// Copyright (C) Parity Technologies (UK) Ltd.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
// Test that checks approval voting coalescing does not lag finality.
5+
6+
use anyhow::anyhow;
7+
8+
use crate::helpers::{
9+
assert_finality_lag_less_than, assert_finalized_block_height, assert_para_throughput,
10+
};
11+
use polkadot_primitives::Id as ParaId;
12+
use serde_json::json;
13+
use subxt::{OnlineClient, PolkadotConfig};
14+
use zombienet_sdk::NetworkConfigBuilder;
15+
16+
#[tokio::test(flavor = "multi_thread")]
17+
async fn approval_voting_coalescing_test() -> Result<(), anyhow::Error> {
18+
let _ = env_logger::try_init_from_env(
19+
env_logger::Env::default().filter_or(env_logger::DEFAULT_FILTER_ENV, "info"),
20+
);
21+
22+
let images = zombienet_sdk::environment::get_images_from_env();
23+
let no_show_slots = 4;
24+
let config = NetworkConfigBuilder::new()
25+
.with_relaychain(|r| {
26+
let r = r
27+
.with_chain("rococo-local")
28+
.with_default_command("polkadot")
29+
.with_default_image(images.polkadot.as_str())
30+
.with_default_args(vec![("-lparachain=debug,runtime=debug").into()])
31+
.with_genesis_overrides(json!({
32+
"configuration": {
33+
"config": {
34+
"needed_approvals": 4,
35+
"relay_vrf_modulo_samples": 6,
36+
"no_show_slots": no_show_slots,
37+
"approval_voting_params": {
38+
"max_approval_coalesce_count": 5
39+
}
40+
}
41+
}
42+
}))
43+
.with_node(|node| node.with_name("validator-0"));
44+
45+
(1..12)
46+
.fold(r, |acc, i| acc.with_node(|node| node.with_name(&format!("validator-{i}"))))
47+
})
48+
.with_parachain(|p| {
49+
p.with_id(2000)
50+
.with_default_command("undying-collator")
51+
.with_default_image(
52+
std::env::var("COL_IMAGE")
53+
.unwrap_or("docker.io/paritypr/colander:latest".to_string())
54+
.as_str(),
55+
)
56+
.cumulus_based(false)
57+
.with_default_args(vec![("-lparachain=debug").into()])
58+
.with_collator(|n| n.with_name("collator-undying-2000"))
59+
})
60+
.with_parachain(|p| {
61+
p.with_id(2001)
62+
.with_default_command("undying-collator")
63+
.with_default_image(
64+
std::env::var("COL_IMAGE")
65+
.unwrap_or("docker.io/paritypr/colander:latest".to_string())
66+
.as_str(),
67+
)
68+
.cumulus_based(false)
69+
.with_default_args(vec![("-lparachain=debug").into()])
70+
.with_collator(|n| n.with_name("collator-undying-2001"))
71+
})
72+
.with_parachain(|p| {
73+
p.with_id(2002)
74+
.with_default_command("undying-collator")
75+
.with_default_image(
76+
std::env::var("COL_IMAGE")
77+
.unwrap_or("docker.io/paritypr/colander:latest".to_string())
78+
.as_str(),
79+
)
80+
.cumulus_based(false)
81+
.with_default_args(vec![("-lparachain=debug").into()])
82+
.with_collator(|n| n.with_name("collator-undying-2002"))
83+
})
84+
.with_parachain(|p| {
85+
p.with_id(2003)
86+
.with_default_command("undying-collator")
87+
.with_default_image(
88+
std::env::var("COL_IMAGE")
89+
.unwrap_or("docker.io/paritypr/colander:latest".to_string())
90+
.as_str(),
91+
)
92+
.cumulus_based(false)
93+
.with_default_args(vec![("-lparachain=debug").into()])
94+
.with_collator(|n| n.with_name("collator-undying-2003"))
95+
})
96+
.with_parachain(|p| {
97+
p.with_id(2004)
98+
.with_default_command("undying-collator")
99+
.with_default_image(
100+
std::env::var("COL_IMAGE")
101+
.unwrap_or("docker.io/paritypr/colander:latest".to_string())
102+
.as_str(),
103+
)
104+
.cumulus_based(false)
105+
.with_default_args(vec![("-lparachain=debug").into()])
106+
.with_collator(|n| n.with_name("collator-undying-2004"))
107+
})
108+
.with_parachain(|p| {
109+
p.with_id(2005)
110+
.with_default_command("undying-collator")
111+
.with_default_image(
112+
std::env::var("COL_IMAGE")
113+
.unwrap_or("docker.io/paritypr/colander:latest".to_string())
114+
.as_str(),
115+
)
116+
.cumulus_based(false)
117+
.with_default_args(vec![("-lparachain=debug").into()])
118+
.with_collator(|n| n.with_name("collator-undying-2005"))
119+
})
120+
.with_parachain(|p| {
121+
p.with_id(2006)
122+
.with_default_command("undying-collator")
123+
.with_default_image(
124+
std::env::var("COL_IMAGE")
125+
.unwrap_or("docker.io/paritypr/colander:latest".to_string())
126+
.as_str(),
127+
)
128+
.cumulus_based(false)
129+
.with_default_args(vec![("-lparachain=debug").into()])
130+
.with_collator(|n| n.with_name("collator-undying-2006"))
131+
})
132+
.with_parachain(|p| {
133+
p.with_id(2007)
134+
.with_default_command("undying-collator")
135+
.with_default_image(
136+
std::env::var("COL_IMAGE")
137+
.unwrap_or("docker.io/paritypr/colander:latest".to_string())
138+
.as_str(),
139+
)
140+
.cumulus_based(false)
141+
.with_default_args(vec![("-lparachain=debug").into()])
142+
.with_collator(|n| n.with_name("collator-undying-2007"))
143+
})
144+
.build()
145+
.map_err(|e| {
146+
let errs = e.into_iter().map(|e| e.to_string()).collect::<Vec<_>>().join(" ");
147+
anyhow!("config errs: {errs}")
148+
})?;
149+
150+
let spawn_fn = zombienet_sdk::environment::get_spawn_fn();
151+
152+
log::info!("Spawning network");
153+
let network = spawn_fn(config).await?;
154+
155+
log::info!("Waiting for network to initialize");
156+
let relay_node = network.get_node("validator-0")?;
157+
let para_node_2001 = network.get_node("collator-undying-2000")?;
158+
159+
let relay_client: OnlineClient<PolkadotConfig> = relay_node.wait_client().await?;
160+
161+
log::info!("Waiting for parachains to advance to block 15");
162+
assert_para_throughput(
163+
&relay_client,
164+
15,
165+
[
166+
(ParaId::from(2000), 11..16),
167+
(ParaId::from(2001), 11..16),
168+
(ParaId::from(2002), 11..16),
169+
(ParaId::from(2003), 11..16),
170+
(ParaId::from(2004), 11..16),
171+
(ParaId::from(2005), 11..16),
172+
(ParaId::from(2006), 11..16),
173+
(ParaId::from(2007), 11..16),
174+
]
175+
.into_iter()
176+
.collect(),
177+
)
178+
.await?;
179+
180+
log::info!("Checking finality does not log and no-shows are within range");
181+
for node in network.nodes() {
182+
assert_finality_lag_less_than(&node.wait_client().await?, no_show_slots).await?;
183+
assert!(
184+
node.reports("polkadot_parachain_approvals_no_shows_total").await.unwrap() < 3.1,
185+
"No-shows should be less than 3"
186+
);
187+
}
188+
189+
log::info!("Test finished successfully");
190+
191+
Ok(())
192+
}

polkadot/zombienet-sdk-tests/tests/functional/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@
44
mod async_backing_6_seconds_rate;
55
mod duplicate_collations;
66
mod sync_backing;
7+
mod approval_voting_coalescing;

polkadot/zombienet-sdk-tests/tests/helpers/mod.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,20 @@ pub async fn assert_finalized_block_height(
8181
Ok(())
8282
}
8383

84+
// Helper function for asserting that the finality lag is less than a given value.
85+
pub async fn assert_finality_lag_less_than(
86+
client: &OnlineClient<PolkadotConfig>,
87+
lag: u32,
88+
) -> Result<(), anyhow::Error> {
89+
if let Some(best_block) = client.blocks().subscribe_best().await?.next().await {
90+
let height = best_block?.number();
91+
assert_finalized_block_height(client, height - lag..height).await?;
92+
} else {
93+
assert!(false, "No best block received");
94+
}
95+
Ok(())
96+
}
97+
8498
/// Assert that finality has not stalled.
8599
pub async fn assert_blocks_are_being_finalized(
86100
client: &OnlineClient<PolkadotConfig>,

0 commit comments

Comments
 (0)