Skip to content

Commit

Permalink
rewrite basic_3cores and doesnt_break_parachains tests
Browse files Browse the repository at this point in the history
  • Loading branch information
alindima committed Dec 4, 2024
1 parent 0a5f5ed commit 060bd62
Show file tree
Hide file tree
Showing 12 changed files with 328 additions and 171 deletions.
55 changes: 30 additions & 25 deletions .gitlab/pipeline/zombienet/polkadot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -166,31 +166,6 @@ zombienet-polkadot-functional-0010-validator-disabling:
--local-dir="${LOCAL_DIR}/functional"
--test="0011-async-backing-6-seconds-rate.zndsl"

zombienet-polkadot-elastic-scaling-0001-basic-3cores-6s-blocks:
extends:
- .zombienet-polkadot-common
variables:
FORCED_INFRA_INSTANCE: "spot-iops"
before_script:
- !reference [ .zombienet-polkadot-common, before_script ]
- cp --remove-destination ${LOCAL_DIR}/assign-core.js ${LOCAL_DIR}/elastic_scaling
script:
- /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh
--local-dir="${LOCAL_DIR}/elastic_scaling"
--test="0001-basic-3cores-6s-blocks.zndsl"

zombienet-polkadot-elastic-scaling-0002-elastic-scaling-doesnt-break-parachains:
extends:
- .zombienet-polkadot-common
before_script:
- !reference [ .zombienet-polkadot-common, before_script ]
- cp --remove-destination ${LOCAL_DIR}/assign-core.js ${LOCAL_DIR}/elastic_scaling
script:
- /home/nonroot/zombie-net/scripts/ci/run-test-local-env-manager.sh
--local-dir="${LOCAL_DIR}/elastic_scaling"
--test="0002-elastic-scaling-doesnt-break-parachains.zndsl"


.zombienet-polkadot-functional-0012-spam-statement-distribution-requests:
extends:
- .zombienet-polkadot-common
Expand Down Expand Up @@ -419,3 +394,33 @@ zombienet-polkadot-elastic-scaling-mixed-receipt-versions:
- unset NEXTEST_FAILURE_OUTPUT
- unset NEXTEST_SUCCESS_OUTPUT
- cargo nextest run --archive-file ./artifacts/polkadot-zombienet-tests.tar.zst --no-capture -- elastic_scaling::mixed_receipt_versions::mixed_receipt_versions_test

zombienet-polkadot-elastic-scaling-doesnt-break-parachains:
extends:
- .zombienet-polkadot-common
needs:
- job: build-polkadot-zombienet-tests
artifacts: true
before_script:
- !reference [ ".zombienet-polkadot-common", "before_script" ]
- export CUMULUS_IMAGE="docker.io/paritypr/test-parachain:${PIPELINE_IMAGE_TAG}"
script:
# we want to use `--no-capture` in zombienet tests.
- unset NEXTEST_FAILURE_OUTPUT
- unset NEXTEST_SUCCESS_OUTPUT
- cargo nextest run --archive-file ./artifacts/polkadot-zombienet-tests.tar.zst --no-capture -- elastic_scaling::doesnt_break_parachains::doesnt_break_parachains_test

zombienet-polkadot-elastic-scaling-basic-3cores:
extends:
- .zombienet-polkadot-common
needs:
- job: build-polkadot-zombienet-tests
artifacts: true
before_script:
- !reference [ ".zombienet-polkadot-common", "before_script" ]
- export CUMULUS_IMAGE="${COL_IMAGE}"
script:
# we want to use `--no-capture` in zombienet tests.
- unset NEXTEST_FAILURE_OUTPUT
- unset NEXTEST_SUCCESS_OUTPUT
- cargo nextest run --archive-file ./artifacts/polkadot-zombienet-tests.tar.zst --no-capture -- elastic_scaling::basic_3cores::basic_3cores_test
133 changes: 133 additions & 0 deletions polkadot/zombienet-sdk-tests/tests/elastic_scaling/basic_3cores.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
// Copyright (C) Parity Technologies (UK) Ltd.
// SPDX-License-Identifier: Apache-2.0

// Test that a parachain that uses a basic collator (like adder-collator) with elastic scaling
// can achieve full throughput of 3 candidates per block.

use anyhow::anyhow;

use super::{
helpers::assert_para_throughput,
rococo,
rococo::runtime_types::{
pallet_broker::coretime_interface::CoreAssignment,
polkadot_runtime_parachains::assigner_coretime::PartsOf57600,
},
};
use serde_json::json;
use subxt::{OnlineClient, PolkadotConfig};
use subxt_signer::sr25519::dev;
use zombienet_sdk::NetworkConfigBuilder;

#[tokio::test(flavor = "multi_thread")]
async fn basic_3cores_test() -> Result<(), anyhow::Error> {
let _ = env_logger::try_init_from_env(
env_logger::Env::default().filter_or(env_logger::DEFAULT_FILTER_ENV, "info"),
);

let images = zombienet_sdk::environment::get_images_from_env();

let config = NetworkConfigBuilder::new()
.with_relaychain(|r| {
let r = r
.with_chain("rococo-local")
.with_default_command("polkadot")
.with_default_image(images.polkadot.as_str())
.with_default_args(vec![("-lparachain=debug").into()])
.with_genesis_overrides(json!({
"configuration": {
"config": {
"scheduler_params": {
"num_cores": 2,
"max_validators_per_core": 1
},
"async_backing_params": {
"max_candidate_depth": 6,
"allowed_ancestry_len": 2
}
}
}
}))
// Have to set a `with_node` outside of the loop below, so that `r` has the right
// type.
.with_node(|node| node.with_name("validator-0"));

(1..4).fold(r, |acc, i| acc.with_node(|node| node.with_name(&format!("validator-{i}"))))
})
.with_parachain(|p| {
p.with_id(2000)
.with_default_command("adder-collator")
.cumulus_based(false)
.with_default_image(images.cumulus.as_str())
.with_default_args(vec![("-lparachain=debug").into()])
.with_collator(|n| n.with_name("adder-2000"))
})
.with_parachain(|p| {
p.with_id(2001)
.with_default_command("adder-collator")
.cumulus_based(false)
.with_default_image(images.cumulus.as_str())
.with_default_args(vec![("-lparachain=debug").into()])
.with_collator(|n| n.with_name("adder-2001"))
})
.build()
.map_err(|e| {
let errs = e.into_iter().map(|e| e.to_string()).collect::<Vec<_>>().join(" ");
anyhow!("config errs: {errs}")
})?;

let spawn_fn = zombienet_sdk::environment::get_spawn_fn();
let network = spawn_fn(config).await?;

let relay_node = network.get_node("validator-0")?;

let relay_client: OnlineClient<PolkadotConfig> = relay_node.wait_client().await?;
let alice = dev::alice();

// Assign two extra cores to adder-2000.
relay_client
.tx()
.sign_and_submit_then_watch_default(
&rococo::tx()
.sudo()
.sudo(rococo::runtime_types::rococo_runtime::RuntimeCall::Utility(
rococo::runtime_types::pallet_utility::pallet::Call::batch {
calls: vec![
rococo::runtime_types::rococo_runtime::RuntimeCall::Coretime(
rococo::runtime_types::polkadot_runtime_parachains::coretime::pallet::Call::assign_core {
core: 0,
begin: 0,
assignment: vec![(CoreAssignment::Task(2000), PartsOf57600(57600))],
end_hint: None
}
),
rococo::runtime_types::rococo_runtime::RuntimeCall::Coretime(
rococo::runtime_types::polkadot_runtime_parachains::coretime::pallet::Call::assign_core {
core: 1,
begin: 0,
assignment: vec![(CoreAssignment::Task(2000), PartsOf57600(57600))],
end_hint: None
}
),
],
},
)),
&alice,
)
.await?
.wait_for_finalized_success()
.await?;

log::info!("2 more cores assigned to adder-2000");

assert_para_throughput(
&relay_client,
15,
[(2000, 40..46), (2001, 12..16)].into_iter().collect(),
)
.await?;

log::info!("Test finished successfully");

Ok(())
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
// Copyright (C) Parity Technologies (UK) Ltd.
// SPDX-License-Identifier: Apache-2.0

// Test that a paraid that doesn't use elastic scaling which acquired multiple cores does not brick
// itself if ElasticScalingMVP feature is enabled in genesis.

use anyhow::anyhow;

use super::{
helpers::{assert_finalized_block_height, assert_para_throughput},
rococo,
rococo::runtime_types::{
pallet_broker::coretime_interface::CoreAssignment,
polkadot_runtime_parachains::assigner_coretime::PartsOf57600,
},
};
use serde_json::json;
use subxt::{OnlineClient, PolkadotConfig};
use subxt_signer::sr25519::dev;
use zombienet_sdk::NetworkConfigBuilder;

#[tokio::test(flavor = "multi_thread")]
async fn doesnt_break_parachains_test() -> Result<(), anyhow::Error> {
let _ = env_logger::try_init_from_env(
env_logger::Env::default().filter_or(env_logger::DEFAULT_FILTER_ENV, "info"),
);

let images = zombienet_sdk::environment::get_images_from_env();

let config = NetworkConfigBuilder::new()
.with_relaychain(|r| {
let r = r
.with_chain("rococo-local")
.with_default_command("polkadot")
.with_default_image(images.polkadot.as_str())
.with_default_args(vec![("-lparachain=debug").into()])
.with_genesis_overrides(json!({
"configuration": {
"config": {
"scheduler_params": {
"num_cores": 1,
"max_validators_per_core": 2
},
"async_backing_params": {
"max_candidate_depth": 6,
"allowed_ancestry_len": 2
}
}
}
}))
// Have to set a `with_node` outside of the loop below, so that `r` has the right
// type.
.with_node(|node| node.with_name("validator-0"));

(1..4).fold(r, |acc, i| acc.with_node(|node| node.with_name(&format!("validator-{i}"))))
})
.with_parachain(|p| {
// Use rococo-parachain default, which has 6 second slot time. Also, don't use
// slot-based collator.
p.with_id(2000)
.with_default_command("polkadot-parachain")
.with_default_image(images.cumulus.as_str())
.with_default_args(vec![("-lparachain=debug,aura=debug").into()])
.with_collator(|n| n.with_name("collator-2000"))
})
.build()
.map_err(|e| {
let errs = e.into_iter().map(|e| e.to_string()).collect::<Vec<_>>().join(" ");
anyhow!("config errs: {errs}")
})?;

let spawn_fn = zombienet_sdk::environment::get_spawn_fn();
let network = spawn_fn(config).await?;

let relay_node = network.get_node("validator-0")?;
let para_node = network.get_node("collator-2000")?;

let relay_client: OnlineClient<PolkadotConfig> = relay_node.wait_client().await?;
let alice = dev::alice();

relay_client
.tx()
.sign_and_submit_then_watch_default(
&rococo::tx()
.sudo()
.sudo(rococo::runtime_types::rococo_runtime::RuntimeCall::Coretime(
rococo::runtime_types::polkadot_runtime_parachains::coretime::pallet::Call::assign_core {
core: 0,
begin: 0,
assignment: vec![(CoreAssignment::Task(2000), PartsOf57600(57600))],
end_hint: None
}
)),
&alice,
)
.await?
.wait_for_finalized_success()
.await?;

log::info!("1 more core assigned to the parachain");

// Expect the parachain to be making normal progress, 1 candidate backed per relay chain block.
assert_para_throughput(&relay_client, 15, [(2000, 13..16)].into_iter().collect()).await?;

let para_client = para_node.wait_client().await?;
// Assert the parachain finalized block height is also on par with the number of backed
// candidates.
assert_finalized_block_height(&para_client, 12..16).await?;

log::info!("Test finished successfully");

Ok(())
}
18 changes: 18 additions & 0 deletions polkadot/zombienet-sdk-tests/tests/elastic_scaling/helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,21 @@ pub async fn assert_para_throughput(

Ok(())
}

// Helper function for retrieving the latest finalized block height and asserting it's within a
// range.
pub async fn assert_finalized_block_height(
client: &OnlineClient<PolkadotConfig>,
expected_range: Range<u32>,
) -> Result<(), anyhow::Error> {
if let Some(block) = client.blocks().subscribe_finalized().await?.next().await {
let height = block?.number();
log::info!("Finalized block number number {height}");

assert!(
expected_range.contains(&height),
"Finalized block number {height} not within range {expected_range:?}"
);
}
Ok(())
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
use anyhow::anyhow;

use super::{
helpers::assert_para_throughput,
helpers::{assert_finalized_block_height, assert_para_throughput},
rococo,
rococo::runtime_types::{
pallet_broker::coretime_interface::CoreAssignment,
Expand All @@ -33,6 +33,7 @@ async fn mixed_receipt_versions_test() -> Result<(), anyhow::Error> {
.with_chain("rococo-local")
.with_default_command("polkadot")
.with_default_image(images.polkadot.as_str())
.with_default_args(vec![("-lparachain=debug").into()])
.with_genesis_overrides(json!({
"configuration": {
"config": {
Expand All @@ -59,7 +60,10 @@ async fn mixed_receipt_versions_test() -> Result<(), anyhow::Error> {
.with_default_command("test-parachain")
.with_default_image(images.cumulus.as_str())
.with_chain("elastic-scaling")
.with_default_args(vec![("--experimental-use-slot-based").into()])
.with_default_args(vec![
("--experimental-use-slot-based").into(),
("-lparachain=debug,aura=debug").into(),
])
// This collator uses the image from the PR, which will build a v2 receipt.
.with_collator(|n| n.with_name("collator-elastic"))
// This collator uses an old image, which will build a v1 receipt.
Expand All @@ -79,6 +83,7 @@ async fn mixed_receipt_versions_test() -> Result<(), anyhow::Error> {
let network = spawn_fn(config).await?;

let relay_node = network.get_node("validator-0")?;
let para_node = network.get_node("collator-elastic")?;

let relay_client: OnlineClient<PolkadotConfig> = relay_node.wait_client().await?;
let alice = dev::alice();
Expand Down Expand Up @@ -125,6 +130,11 @@ async fn mixed_receipt_versions_test() -> Result<(), anyhow::Error> {
// blocks.
assert_para_throughput(&relay_client, 15, [(2200, 25..35)].into_iter().collect()).await?;

let para_client = para_node.wait_client().await?;
// Assert the parachain finalized block height is also on par with the number of backed
// candidates.
assert_finalized_block_height(&para_client, 22..35).await?;

log::info!("Test finished successfully");

Ok(())
Expand Down
2 changes: 2 additions & 0 deletions polkadot/zombienet-sdk-tests/tests/elastic_scaling/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
#[subxt::subxt(runtime_metadata_path = "metadata-files/rococo-local.scale")]
pub mod rococo {}

mod basic_3cores;
mod doesnt_break_parachains;
mod helpers;
mod mixed_receipt_versions;
mod slot_based_3cores;
Loading

0 comments on commit 060bd62

Please sign in to comment.