diff --git a/.github/workflows/zombienet_polkadot.yml b/.github/workflows/zombienet_polkadot.yml index 8811cf26f8895..356312ffef4fe 100644 --- a/.github/workflows/zombienet_polkadot.yml +++ b/.github/workflows/zombienet_polkadot.yml @@ -56,12 +56,12 @@ jobs: zombienet-polkadot-tests: name: ${{ matrix.test.job-name }} - runs-on: ${{ matrix.test.runner-type == 'large' && (matrix.test.use-zombienet-sdk && needs.preflight.outputs.ZOMBIENET_SDK_LARGE_RUNNER || needs.preflight.outputs.ZOMBIENET_LARGE_RUNNER) || (matrix.test.use-zombienet-sdk && needs.preflight.outputs.ZOMBIENET_SDK_DEFAULT_RUNNER || needs.preflight.outputs.ZOMBIENET_DEFAULT_RUNNER) }} + runs-on: ${{ matrix.test.runner-type == 'large' && needs.preflight.outputs.ZOMBIENET_SDK_LARGE_RUNNER || needs.preflight.outputs.ZOMBIENET_SDK_DEFAULT_RUNNER }} timeout-minutes: 70 # 60 for test + 10 for send logs needs: [preflight] if: ${{ github.event_name == 'workflow_call' || github.event_name == 'workflow_dispatch' || github.event_name == 'merge_group' || (needs.preflight.outputs.changes_substrate == 'true' || needs.preflight.outputs.changes_polkadot == 'true' || needs.preflight.outputs.changes_zombienet == 'true') }} container: - image: ${{ matrix.test.use-zombienet-sdk && needs.preflight.outputs.ZOMBIENET_SDK_IMAGE || needs.preflight.outputs.ZOMBIENET_IMAGE }} + image: ${{ needs.preflight.outputs.ZOMBIENET_SDK_IMAGE }} options: -v /tmp/zombienet:/tmp/zombienet env: ZOMBIENET_INTEGRATION_TEST_IMAGE: "${{ needs.preflight.outputs.TEMP_IMAGES_BASE }}/polkadot-debug:${{ needs.preflight.outputs.DOCKER_IMAGES_VERSION }}" @@ -93,21 +93,7 @@ jobs: shell: bash run: ${{ matrix.test.additional-setup }} - - name: zombienet_test (v1) - if: ${{ !matrix.test.use-zombienet-sdk }} - timeout-minutes: 60 - uses: ./.github/actions/zombienet - with: - test-definition: ${{ matrix.test.test-definition }} - job-name: ${{ matrix.test.job-name }} - local-dir: ${{ matrix.test.local-dir }} - concurrency: ${{ matrix.test.concurrency || 1 }} - gh-token: ${{ secrets.GITHUB_TOKEN }} - build-id: ${{ needs.preflight.outputs.BUILD_RUN_ID }} - ref-slug: ${{ needs.preflight.outputs.SOURCE_REF_SLUG }} - - - name: zombienet_test (sdk) - if: ${{ matrix.test.use-zombienet-sdk }} + - name: zombienet_test uses: ./.github/actions/zombienet-sdk with: test-filter: ${{ matrix.test.test-filter }} diff --git a/.github/workflows/zombienet_substrate.yml b/.github/workflows/zombienet_substrate.yml index 0eb240616de05..ab366524fc5a0 100644 --- a/.github/workflows/zombienet_substrate.yml +++ b/.github/workflows/zombienet_substrate.yml @@ -60,12 +60,12 @@ jobs: zombienet-substrate-tests: name: ${{ matrix.test.job-name }} - runs-on: ${{ matrix.test.runner-type == 'large' && (matrix.test.use-zombienet-sdk && needs.preflight.outputs.ZOMBIENET_SDK_LARGE_RUNNER || needs.preflight.outputs.ZOMBIENET_LARGE_RUNNER) || (matrix.test.use-zombienet-sdk && needs.preflight.outputs.ZOMBIENET_SDK_DEFAULT_RUNNER || needs.preflight.outputs.ZOMBIENET_DEFAULT_RUNNER) }} + runs-on: ${{ matrix.test.runner-type == 'large' && needs.preflight.outputs.ZOMBIENET_SDK_LARGE_RUNNER || needs.preflight.outputs.ZOMBIENET_SDK_DEFAULT_RUNNER }} timeout-minutes: 70 # 60 for test + 10 for send logs needs: [preflight] if: ${{ github.event_name == 'workflow_call' || github.event_name == 'workflow_dispatch' || github.event_name == 'merge_group' || (needs.preflight.outputs.changes_substrate == 'true' || needs.preflight.outputs.changes_polkadot == 'true' || needs.preflight.outputs.changes_zombienet == 'true') }} container: - image: ${{ matrix.test.use-zombienet-sdk && needs.preflight.outputs.ZOMBIENET_SDK_IMAGE || needs.preflight.outputs.ZOMBIENET_IMAGE }} + image: ${{ needs.preflight.outputs.ZOMBIENET_SDK_IMAGE }} options: -v /tmp/zombienet:/tmp/zombienet env: ZOMBIENET_INTEGRATION_TEST_IMAGE: "${{ needs.preflight.outputs.TEMP_IMAGES_BASE }}/polkadot-debug:${{ needs.preflight.outputs.DOCKER_IMAGES_VERSION }}" @@ -87,8 +87,7 @@ jobs: shell: bash run: ${{ matrix.test.additional-setup }} - - name: zombienet_test (sdk) - if: ${{ matrix.test.use-zombienet-sdk }} + - name: zombienet_test uses: ./.github/actions/zombienet-sdk with: test-filter: ${{ matrix.test.test-filter }} diff --git a/.github/zombienet-env b/.github/zombienet-env index ef24cc6c44af8..f48a7a0da661b 100644 --- a/.github/zombienet-env +++ b/.github/zombienet-env @@ -1,14 +1,3 @@ -# zombienet settings -ZOMBIENET_PROVIDER=native -ZOMBIENET_IMAGE_FOR_NATIVE=docker.io/paritytech/zombienet:v1.3.133 -ZOMBIENET_DEFAULT_RUNNER_FOR_NATIVE=parity-zombienet-native-default -ZOMBIENET_LARGE_RUNNER_FOR_NATIVE=parity-zombienet-native-large -ZOMBIENET_DEFAULT_RUNNER_FOR_NATIVE_PERSISTENT=parity-zombienet-native-default-persistent -ZOMBIENET_LARGE_RUNNER_FOR_NATIVE_PERSISTENT=parity-zombienet-native-large-persistent -ZOMBIENET_IMAGE_FOR_K8S=docker.io/paritytech/zombienet:v1.3.133 -ZOMBIENET_RUNNER_FOR_K8S=parity-zombienet -DEBUG=zombie,zombie::network-node,zombie::kube::client::logs - # zombienet-sdk settings ZOMBIE_PROVIDER=native ZOMBIENET_SDK_IMAGE_FOR_NATIVE=docker.io/paritytech/ci-unified:bullseye-1.84.1-2025-01-28-v202502131220 diff --git a/.github/zombienet-flaky-tests b/.github/zombienet-flaky-tests index 6caa3a8c58eff..8779c9b98b4c8 100644 --- a/.github/zombienet-flaky-tests +++ b/.github/zombienet-flaky-tests @@ -2,7 +2,6 @@ zombienet-polkadot-coretime-revenue:8944 zombienet-polkadot-elastic-scaling-slot-based-12cores:8945 zombienet-polkadot-disputes-slashing:8946 zombienet-polkadot-functional-spam-statement-distribution-requests:8947 -zombienet-polkadot-misc-0001-parachains-paritydb:8951 zombienet-polkadot-functional-duplicate-collations:8950 zombienet-substrate-0002-validators-warp-sync:8871 zombienet-cumulus-0009-elastic_scaling_pov_recovery:8986 diff --git a/.github/zombienet-tests/zombienet_cumulus_tests.yml b/.github/zombienet-tests/zombienet_cumulus_tests.yml index 68b8e20a9a7c3..ed1d1a6c60dc4 100644 --- a/.github/zombienet-tests/zombienet_cumulus_tests.yml +++ b/.github/zombienet-tests/zombienet_cumulus_tests.yml @@ -2,13 +2,13 @@ test-filter: "zombie_ci::sync_blocks::sync_blocks_from_tip_without_connected_collator" runner-type: "default" cumulus-image: "test-parachain" - use-zombienet-sdk: true + - job-name: "zombienet-cumulus-0002-pov_recovery" test-filter: "zombie_ci::pov_recovery::pov_recovery" runner-type: "default" cumulus-image: "test-parachain" - use-zombienet-sdk: true + - job-name: "zombienet-cumulus-0003-full_node_catching_up" test-filter: "zombie_ci::full_node_catching_up::full_node_catching_up" @@ -20,31 +20,31 @@ runner-type: "default" cumulus-image: "test-parachain" needs-wasm-binary: true - use-zombienet-sdk: true + - job-name: "zombienet-cumulus-0005-migrate_solo_to_para" test-filter: "zombie_ci::migrate_solo::migrate_solo_to_para" runner-type: "default" cumulus-image: "test-parachain" - use-zombienet-sdk: true + - job-name: "zombienet-cumulus-0006-rpc_collator_builds_blocks" test-filter: "zombie_ci::rpc_collator_build_blocks::rpc_collator_builds_blocks" runner-type: "large" cumulus-image: "test-parachain" - use-zombienet-sdk: true + - job-name: "zombienet-cumulus-0007-full_node_warp_sync" test-filter: "zombie_ci::full_node_warp_sync::full_node_warp_sync" runner-type: "large" cumulus-image: "test-parachain" - use-zombienet-sdk: true + - job-name: "zombienet-cumulus-0008-elastic_authoring" test-filter: "zombie_ci::elastic_scaling::slot_based_authoring::elastic_scaling_slot_based_authoring" runner-type: "default" cumulus-image: "test-parachain" - use-zombienet-sdk: true + # Disabled, occasionally fails # See https://github.com/paritytech/polkadot-sdk/issues/8986 @@ -52,7 +52,7 @@ test-filter: "zombie_ci::elastic_scaling::pov_recovery::elastic_scaling_pov_recovery" runner-type: "default" cumulus-image: "test-parachain" - use-zombienet-sdk: true + # Disabled, occasionally fails. # See https://github.com/paritytech/polkadot-sdk/issues/8999 @@ -60,30 +60,30 @@ test-filter: "zombie_ci::elastic_scaling::multiple_blocks_per_slot::elastic_scaling_multiple_blocks_per_slot" runner-type: "default" cumulus-image: "test-parachain" - use-zombienet-sdk: true + - job-name: "zombienet-cumulus-0011-dht-bootnodes" test-filter: "zombie_ci::bootnodes::dht_bootnodes_test" runner-type: "default" cumulus-image: "polkadot-parachain-debug" - use-zombienet-sdk: true + - job-name: "zombienet-cumulus-0013-elastic_scaling_slot_based_rp_offset" test-filter: "zombie_ci::elastic_scaling::slot_based_rp_offset::elastic_scaling_slot_based_relay_parent_offset_test" runner-type: "default" cumulus-image: "test-parachain" - use-zombienet-sdk: true + - job-name: "zombienet-cumulus-0014-elastic_scaling_upgrade_to_3_cores" test-filter: "zombie_ci::elastic_scaling::upgrade_to_3_cores::elastic_scaling_upgrade_to_3_cores" runner-type: "default" cumulus-image: "test-parachain" - use-zombienet-sdk: true + needs-wasm-binary: true - job-name: "zombienet-cumulus-0015-parachain-runtime-upgrade" test-filter: "zombie_ci::parachain_runtime_upgrade_slot_duration_18s::parachain_runtime_upgrade_slot_duration_18s" runner-type: "default" cumulus-image: "test-parachain" - use-zombienet-sdk: true + needs-wasm-binary: true diff --git a/.github/zombienet-tests/zombienet_parachain-template_tests.yml b/.github/zombienet-tests/zombienet_parachain-template_tests.yml index 5c99d5e4c5d20..ac4eb9abd8de8 100644 --- a/.github/zombienet-tests/zombienet_parachain-template_tests.yml +++ b/.github/zombienet-tests/zombienet_parachain-template_tests.yml @@ -2,16 +2,16 @@ test-filter: "smoke::minimal_template_block_production_test" runner-type: "default" cumulus-image: "test-parachain" - use-zombienet-sdk: true + - job-name: "zombienet-parachain-template-0002-parachain_template_block_production" test-filter: "smoke::parachain_template_block_production_test" runner-type: "default" cumulus-image: "test-parachain" - use-zombienet-sdk: true + - job-name: "zombienet-parachain-template-0003-solochain_template_block_production" test-filter: "smoke::solochain_template_block_production_test" runner-type: "default" cumulus-image: "test-parachain" - use-zombienet-sdk: true + diff --git a/.github/zombienet-tests/zombienet_polkadot_tests.yml b/.github/zombienet-tests/zombienet_polkadot_tests.yml index 79c2900cd6fca..dcb4bbd032024 100644 --- a/.github/zombienet-tests/zombienet_polkadot_tests.yml +++ b/.github/zombienet-tests/zombienet_polkadot_tests.yml @@ -2,42 +2,42 @@ - job-name: "zombienet-polkadot-functional-0001-parachains-pvf" test-filter: "functional::parachains_pvf::parachains_pvf_preparation_and_execution_test" runner-type: "default" - use-zombienet-sdk: true + - job-name: "zombienet-polkadot-functional-0002-parachains-disputes" test-filter: "functional::parachains_disputes::parachains_disputes_test" runner-type: "default" - use-zombienet-sdk: true + - job-name: "zombienet-polkadot-functional-0003-beefy-and-mmr" test-filter: "functional::beefy_and_mmr::beefy_and_mmr_test" runner-type: "large" - use-zombienet-sdk: true + - job-name: "zombienet-polkadot-functional-0004-parachains-disputes-garbage-candidate" test-filter: "functional::parachains_disputes_garbage_candidate::parachains_disputes_garbage_candidate_test" runner-type: "default" - use-zombienet-sdk: true + - job-name: "zombienet-polkadot-functional-0006-parachains-max-tranche0" test-filter: "functional::parachains_max_tranche0::parachains_max_tranche0_test" runner-type: "default" - use-zombienet-sdk: true + - job-name: "zombienet-polkadot-functional-0007-dispute-freshly-finalized" test-filter: "functional::dispute_freshly_finalized::dispute_freshly_finalized_test" runner-type: "default" - use-zombienet-sdk: true + - job-name: "zombienet-polkadot-functional-0013-systematic-chunk-recovery" test-filter: "functional::systematic_chunk_recovery::systematic_chunk_recovery_test" runner-type: "default" - use-zombienet-sdk: true + - job-name: "zombienet-polkadot-functional-0014-chunk-fetching-network-compatibility" test-filter: "functional::chunk_fetching_network_compatibility::chunk_fetching_network_compatibility_test" runner-type: "default" - use-zombienet-sdk: true + additional-setup: | BIN_DIR="$(pwd)/bin_old" mkdir -p $BIN_DIR @@ -63,41 +63,40 @@ - job-name: "zombienet-polkadot-functional-0015-coretime-shared-core" test-filter: "functional::coretime_shared_core::coretime_shared_core_test" runner-type: "large" - use-zombienet-sdk: true + - job-name: "zombienet-polkadot-functional-0019-coretime-collation-fetching-fairness" test-filter: "functional::coretime_collation_fetching_fairness::coretime_collation_fetching_fairness_test" runner-type: "default" - use-zombienet-sdk: true + # Smoke tests using traditional zombienet - job-name: "zombienet-polkadot-smoke-0001-parachains-smoke-test" test-filter: "smoke::parachains_smoke::parachains_smoke_test" runner-type: "default" - use-zombienet-sdk: true + - job-name: "zombienet-polkadot-smoke-0003-deregister-register-validator" test-filter: "smoke::deregister_register_validator::deregister_register_validator_smoke_test" runner-type: "default" - use-zombienet-sdk: true + - job-name: "zombienet-polkadot-smoke-0004-coretime-smoke-test" test-filter: "smoke::coretime_smoke::coretime_smoke_test" runner-type: "default" - use-zombienet-sdk: true + - job-name: "zombienet-polkadot-smoke-0005-precompile-pvf-smoke" test-filter: "smoke::precompile_pvf_smoke::precompile_pvf_smoke_test" runner-type: "default" - use-zombienet-sdk: true + # Misc tests using traditional zombienet # TODO: Disabled, occasionally (1 on ~50-70 runs) fails - job-name: "zombienet-polkadot-misc-0001-parachains-paritydb" - test-definition: "0001-paritydb.zndsl" - local-dir: "./polkadot/zombienet_tests/misc" - runner-type: "default" - use-zombienet-sdk: false + test-filter: "misc::paritydb::paritydb_test" + runner-type: "large" + # TODO: needs to resolve how to pass the GH_TOKEN to pods # - job-name: "zombienet-polkadot-misc-0002-upgrade-node" @@ -110,84 +109,83 @@ # use-zombienet-sdk: false # Malus tests using traditional zombienet -- job-name: "zombienet-polkadot-malus-0001-dispute-valid" - test-definition: "0001-dispute-valid-block.zndsl" - local-dir: "./polkadot/node/malus/integrationtests" +- job-name: "zombienet-polkadot-misc-malus-0002-dispute-valid" + test-filter: "misc::malus_dispute_valid_block::malus_dispute_valid_block_test" runner-type: "default" - use-zombienet-sdk: false + # SDK tests using zombienet-sdk # TODO: Disabled - job-name: "zombienet-polkadot-coretime-revenue" test-filter: "smoke::coretime_revenue::coretime_revenue_test" runner-type: "default" - use-zombienet-sdk: true + cumulus-image: "colander" - job-name: "zombienet-polkadot-elastic-scaling-slot-based-3cores" test-filter: "elastic_scaling::slot_based_3cores::slot_based_3cores_test" runner-type: "large" - use-zombienet-sdk: true + cumulus-image: "test-parachain" # TODO: Disabled, fails very often with zombienet native provider - job-name: "zombienet-polkadot-elastic-scaling-slot-based-12cores" test-filter: "elastic_scaling::slot_based_12cores::slot_based_12cores_test" runner-type: "default" - use-zombienet-sdk: true + cumulus-image: "test-parachain" - job-name: "zombienet-polkadot-elastic-scaling-doesnt-break-parachains" test-filter: "elastic_scaling::doesnt_break_parachains::doesnt_break_parachains_test" runner-type: "default" - use-zombienet-sdk: true + - job-name: "zombienet-polkadot-elastic-scaling-basic-3cores" test-filter: "elastic_scaling::basic_3cores::basic_3cores_test" runner-type: "default" - use-zombienet-sdk: true + cumulus-image: "colander" - job-name: "zombienet-polkadot-functional-sync-backing" test-filter: "functional::sync_backing::sync_backing_test" runner-type: "default" - use-zombienet-sdk: true + cumulus-image: "test-parachain" - job-name: "zombienet-polkadot-functional-async-backing-6-seconds-rate" test-filter: "functional::async_backing_6_seconds_rate::async_backing_6_seconds_rate_test" runner-type: "default" - use-zombienet-sdk: true + # TODO: Disabled, occasionally (1 on ~50-100 runs) fails - job-name: "zombienet-polkadot-functional-duplicate-collations" test-filter: "functional::duplicate_collations::duplicate_collations_test" runner-type: "default" - use-zombienet-sdk: true + # TODO: Disabled, occasionally (2 on ~50-70 runs) fails - job-name: "zombienet-polkadot-disputes-slashing" test-filter: "disabling::slashing" runner-type: "default" - use-zombienet-sdk: true + # TODO: Disabled, occasionally (1 on ~50-100 runs) fails - job-name: "zombienet-polkadot-functional-spam-statement-distribution-requests" test-filter: "functional::spam_statement_distribution_requests::spam_statement_distribution_requests_test" runner-type: "large" - use-zombienet-sdk: true + cumulus-image: "colander" - job-name: "zombienet-polkadot-approval-voting-coalescing" test-filter: "functional::approval_voting_coalescing::approval_voting_coalescing_test" runner-type: "default" - use-zombienet-sdk: true + cumulus-image: "colander" - job-name: "zombienet-polkadot-approved-peer-mixed-validators" test-filter: "functional::approved_peer_mixed_validators::approved_peer_mixed_validators_test" runner-type: "default" - use-zombienet-sdk: true + cumulus-image: "colander" additional-setup: | BIN_DIR="$(pwd)/bin_old" @@ -214,24 +212,24 @@ - job-name: "zombienet-polkadot-functional-validator-disabling" test-filter: "functional::validator_disabling::validator_disabling_test" runner-type: "large" - use-zombienet-sdk: true + - job-name: "zombienet-polkadot-dispute-old-finalized" test-filter: "functional::dispute_old_finalized::dispute_old_finalized" runner-type: "default" - use-zombienet-sdk: true + - job-name: "zombienet-polkadot-shared-core-idle-parachain" test-filter: "functional::shared_core_idle_parachain::shared_core_idle_parachain_test" runner-type: "default" - use-zombienet-sdk: true + - job-name: "zombienet-polkadot-collators-basic-reputation-persistence" test-filter: "functional::collators_reputation_persistence" runner-type: "default" - use-zombienet-sdk: true + - job-name: "zombienet-polkadot-coretime-partitioning" test-filter: "functional::coretime_partitioning::coretime_assignment_boundary_test" runner-type: "default" - use-zombienet-sdk: true + diff --git a/.github/zombienet-tests/zombienet_substrate_tests.yml b/.github/zombienet-tests/zombienet_substrate_tests.yml index 170c2bdf90d78..adefa462b96b6 100644 --- a/.github/zombienet-tests/zombienet_substrate_tests.yml +++ b/.github/zombienet-tests/zombienet_substrate_tests.yml @@ -1,20 +1,20 @@ - job-name: "zombienet-substrate-0000-block-building" test-filter: "zombie_ci::block_building::block_building_test" runner-type: "default" - use-zombienet-sdk: true + - job-name: "zombienet-substrate-0001-basic-warp-sync" test-filter: "zombie_ci::basic_warp_sync::basic_warp_sync" runner-type: "default" - use-zombienet-sdk: true + # TODO: Disabled, fails 1 in 50 runs - job-name: "zombienet-substrate-0002-validators-warp-sync" test-filter: "zombie_ci::validators_warp_sync::validators_warp_sync" runner-type: "default" - use-zombienet-sdk: true + - job-name: "zombienet-substrate-0003-block-building-warp-sync" test-filter: "zombie_ci::block_building_warp_sync::block_building_warp_sync" runner-type: "default" - use-zombienet-sdk: true + diff --git a/polkadot/node/malus/integrationtests/0001-dispute-valid-block.toml b/polkadot/node/malus/integrationtests/0001-dispute-valid-block.toml deleted file mode 100644 index fe1836bd71e5f..0000000000000 --- a/polkadot/node/malus/integrationtests/0001-dispute-valid-block.toml +++ /dev/null @@ -1,42 +0,0 @@ -[settings] -timeout = 1000 - -[relaychain.genesis.runtimeGenesis.patch.configuration.config.scheduler_params] - max_validators_per_core = 1 - -[relaychain] -default_image = "{{ZOMBIENET_INTEGRATION_TEST_IMAGE}}" -chain = "westend-local" -command = "polkadot" - - [[relaychain.nodes]] - name = "alice" - validator = true - extra_args = [ "--alice", "-lparachain=debug" ] - - [[relaychain.nodes]] - name = "bob" - validator = true - extra_args = [ "--bob", "-lparachain=debug" ] - - [[relaychain.nodes]] - name = "charlie" - validator = true - extra_args = [ "--charlie", "-lparachain=debug" ] - - [[relaychain.nodes]] - name = "dave" - validator = true - command = "malus dispute-ancestor" - extra_args = ["--dave", "-lparachain=debug"] - image = "{{MALUS_IMAGE}}" - autoConnectApi = false - -[[parachains]] -id = 100 - - [parachains.collator] - name = "collator01" - image = "{{COL_IMAGE}}" - command = "adder-collator" - args = ["-lparachain=debug"] diff --git a/polkadot/node/malus/integrationtests/0001-dispute-valid-block.zndsl b/polkadot/node/malus/integrationtests/0001-dispute-valid-block.zndsl deleted file mode 100644 index 737cd4ebd521d..0000000000000 --- a/polkadot/node/malus/integrationtests/0001-dispute-valid-block.zndsl +++ /dev/null @@ -1,29 +0,0 @@ -Description: Disputes -Network: ./0001-dispute-valid-block.toml -Creds: config - - -alice: is up -bob: is up -charlie: is up -dave: is up -alice: reports node_roles is 4 -bob: reports node_roles is 4 -alice: reports sub_libp2p_is_major_syncing is 0 -alice: reports block height is at least 2 within 15 seconds -alice: reports peers count is at least 2 -bob: reports block height is at least 2 -bob: reports peers count is at least 2 -charlie: reports block height is at least 2 -charlie: reports peers count is at least 2 -alice: reports polkadot_parachain_candidate_disputes_total is at least 1 within 250 seconds -bob: reports polkadot_parachain_candidate_disputes_total is at least 1 within 90 seconds -charlie: reports polkadot_parachain_candidate_disputes_total is at least 1 within 90 seconds -alice: reports polkadot_parachain_candidate_dispute_votes{validity="valid"} is at least 1 within 90 seconds -bob: reports polkadot_parachain_candidate_dispute_votes{validity="valid"} is at least 2 within 90 seconds -charlie: reports polkadot_parachain_candidate_dispute_votes{validity="valid"} is at least 2 within 90 seconds -alice: reports polkadot_parachain_candidate_dispute_concluded{validity="valid"} is at least 1 within 90 seconds -alice: reports polkadot_parachain_candidate_dispute_concluded{validity="invalid"} is 0 within 90 seconds -bob: reports polkadot_parachain_candidate_dispute_concluded{validity="valid"} is at least 1 within 90 seconds -charlie: reports polkadot_parachain_candidate_dispute_concluded{validity="valid"} is at least 1 within 90 seconds -charlie: reports polkadot_parachain_candidate_dispute_concluded{validity="valid"} is at least 1 within 90 seconds diff --git a/polkadot/zombienet-sdk-tests/tests/functional/beefy_and_mmr.rs b/polkadot/zombienet-sdk-tests/tests/functional/beefy_and_mmr.rs index 6e0b0c2f67307..781beb95a794b 100644 --- a/polkadot/zombienet-sdk-tests/tests/functional/beefy_and_mmr.rs +++ b/polkadot/zombienet-sdk-tests/tests/functional/beefy_and_mmr.rs @@ -5,8 +5,8 @@ //! be stopped and resumed. use crate::utils::{ - check_metrics, env_or_default, initialize_network, MetricCheckSetup, INTEGRATION_IMAGE_ENV, - NODE_ROLES_METRIC, + assert_nodes_are_validators, check_metrics, env_or_default, initialize_network, + MetricCheckSetup, INTEGRATION_IMAGE_ENV, }; use anyhow::anyhow; use futures::future::try_join_all; @@ -29,11 +29,13 @@ async fn beefy_and_mmr_test() -> Result<(), anyhow::Error> { let network = initialize_network(config).await?; let validator_nodes = network.relaychain().nodes(); - // let _ = tokio::time::sleep(std::time::Duration::from_secs(3600)).await; + + // Check authority status + log::info!("Checking validator node roles"); + assert_nodes_are_validators(&validator_nodes).await?; + log::info!("All validators confirmed as authorities"); let metric_checks: Vec = vec![ - // All nodes are validators - (NODE_ROLES_METRIC, Box::new(|v| v == 4.0), 0), // BEEFY sanity checks. ("substrate_beefy_validator_set_id", Box::new(|v| v == 0.0), 0), // Verify voting happens and 1st mandatory block is finalized within 1st session. diff --git a/polkadot/zombienet-sdk-tests/tests/functional/chunk_fetching_network_compatibility.rs b/polkadot/zombienet-sdk-tests/tests/functional/chunk_fetching_network_compatibility.rs index 945f96fb711a7..5ecaf926cbf25 100644 --- a/polkadot/zombienet-sdk-tests/tests/functional/chunk_fetching_network_compatibility.rs +++ b/polkadot/zombienet-sdk-tests/tests/functional/chunk_fetching_network_compatibility.rs @@ -6,12 +6,12 @@ //! with the same old version. use crate::utils::{ - check_log_lines, check_metrics, env_or_default, initialize_network, MetricCheckSetup, - APPROVAL_CHECKING_FINALITY_LAG_METRIC, APPROVAL_NO_SHOWS_TOTAL_METRIC, - AVAILABILITY_RECOVERY_RECOVERIES_FINISHED, BLOCK_HEIGHT_FINALIZED_METRIC, COL_IMAGE_ENV, - DATA_RECOVERY_CHUNKS_PATTERN, DATA_RECOVERY_FROM_SYSTEMATIC_CHUNKS_COMPLETE_PATTERN, + assert_nodes_are_validators, check_log_lines, check_metrics, env_or_default, + initialize_network, MetricCheckSetup, APPROVAL_CHECKING_FINALITY_LAG_METRIC, + APPROVAL_NO_SHOWS_TOTAL_METRIC, AVAILABILITY_RECOVERY_RECOVERIES_FINISHED, + BLOCK_HEIGHT_FINALIZED_METRIC, COL_IMAGE_ENV, DATA_RECOVERY_CHUNKS_PATTERN, + DATA_RECOVERY_FROM_SYSTEMATIC_CHUNKS_COMPLETE_PATTERN, DATA_RECOVERY_FROM_SYSTEMATIC_CHUNKS_NOT_POSSIBLE_PATTERN, INTEGRATION_IMAGE_ENV, - NODE_ROLES_METRIC, }; use anyhow::anyhow; use cumulus_zombienet_sdk_helpers::assert_para_throughput; @@ -36,12 +36,7 @@ async fn chunk_fetching_network_compatibility_test() -> Result<(), anyhow::Error // Check authority status log::info!("Checking validator node roles"); - for validator in &validator_nodes { - validator - .wait_metric_with_timeout(NODE_ROLES_METRIC, |v| v == 4.0, 60u64) - .await - .map_err(|e| anyhow!("Validator {} role check failed: {e}", validator.name()))?; - } + assert_nodes_are_validators(&validator_nodes).await?; log::info!("All validators confirmed as authorities"); // Check that all parachains produce at least 5 blocks within 1 session and 5 blocks (RC) diff --git a/polkadot/zombienet-sdk-tests/tests/functional/coretime_collation_fetching_fairness.rs b/polkadot/zombienet-sdk-tests/tests/functional/coretime_collation_fetching_fairness.rs index 49c4731375740..cadea914311f0 100644 --- a/polkadot/zombienet-sdk-tests/tests/functional/coretime_collation_fetching_fairness.rs +++ b/polkadot/zombienet-sdk-tests/tests/functional/coretime_collation_fetching_fairness.rs @@ -6,8 +6,8 @@ //! verify that the block production respect the proportion. use crate::utils::{ - create_force_register_call, env_or_default, fetch_header_and_validation_code, - initialize_network, COL_IMAGE_ENV, INTEGRATION_IMAGE_ENV, NODE_ROLES_METRIC, + assert_nodes_are_validators, create_force_register_call, env_or_default, + fetch_header_and_validation_code, initialize_network, COL_IMAGE_ENV, INTEGRATION_IMAGE_ENV, }; use anyhow::anyhow; use cumulus_zombienet_sdk_helpers::{ @@ -43,12 +43,7 @@ async fn coretime_collation_fetching_fairness_test() -> Result<(), anyhow::Error // Check authority status log::info!("Checking validator node roles"); - for validator in &validator_nodes { - validator - .wait_metric_with_timeout(NODE_ROLES_METRIC, |v| v == 4.0, 60u64) - .await - .map_err(|e| anyhow!("Validator {} role check failed: {e}", validator.name()))?; - } + assert_nodes_are_validators(&validator_nodes).await?; log::info!("All validators confirmed as authorities"); log::info!("Register paras"); diff --git a/polkadot/zombienet-sdk-tests/tests/functional/dispute_freshly_finalized.rs b/polkadot/zombienet-sdk-tests/tests/functional/dispute_freshly_finalized.rs index 757038cb03cf9..92424fbf2b7d1 100644 --- a/polkadot/zombienet-sdk-tests/tests/functional/dispute_freshly_finalized.rs +++ b/polkadot/zombienet-sdk-tests/tests/functional/dispute_freshly_finalized.rs @@ -8,9 +8,9 @@ //! candidates and verifies that disputes are properly concluded. use crate::utils::{ - check_metrics, env_or_default, initialize_network, MetricCheckSetup, - APPROVAL_CHECKING_FINALITY_LAG_METRIC, COL_IMAGE_ENV, INTEGRATION_IMAGE_ENV, MALUS_IMAGE_ENV, - NODE_ROLES_METRIC, + assert_nodes_are_validators, check_metrics, env_or_default, initialize_network, + MetricCheckSetup, APPROVAL_CHECKING_FINALITY_LAG_METRIC, COL_IMAGE_ENV, INTEGRATION_IMAGE_ENV, + MALUS_IMAGE_ENV, }; use anyhow::anyhow; @@ -47,12 +47,7 @@ async fn dispute_freshly_finalized_test() -> Result<(), anyhow::Error> { // Check authority status log::info!("Checking validator node roles"); - for validator in &validator_nodes { - validator - .wait_metric_with_timeout(NODE_ROLES_METRIC, |v| v == 4.0, 60u64) - .await - .map_err(|e| anyhow!("Validator {} role check failed: {e}", validator.name()))?; - } + assert_nodes_are_validators(&validator_nodes).await?; log::info!("All validators confirmed as authorities"); // Ensure parachain is registered diff --git a/polkadot/zombienet-sdk-tests/tests/functional/parachains_disputes.rs b/polkadot/zombienet-sdk-tests/tests/functional/parachains_disputes.rs index cff78fdfa99e8..421886898e212 100644 --- a/polkadot/zombienet-sdk-tests/tests/functional/parachains_disputes.rs +++ b/polkadot/zombienet-sdk-tests/tests/functional/parachains_disputes.rs @@ -7,8 +7,8 @@ //! configured with high needed_approvals (8) and max_approval_coalesce_count (5). use crate::utils::{ - env_or_default, initialize_network, COL_IMAGE_ENV, INTEGRATION_IMAGE_ENV, MALUS_IMAGE_ENV, - NODE_ROLES_METRIC, + assert_nodes_are_validators, env_or_default, initialize_network, COL_IMAGE_ENV, + INTEGRATION_IMAGE_ENV, MALUS_IMAGE_ENV, }; use anyhow::anyhow; use cumulus_zombienet_sdk_helpers::assert_para_throughput; @@ -30,17 +30,11 @@ async fn parachains_disputes_test() -> Result<(), anyhow::Error> { let config = build_network_config()?; let network = initialize_network(config).await?; - let all_validators = [&MALUS_VALIDATORS[..], &HONEST_VALIDATORS[..]].concat(); + let validator_nodes = network.relaychain().nodes(); // Check authority status log::info!("Checking validator node roles"); - for name in &all_validators { - let validator = network.get_node(*name)?; - validator - .wait_metric_with_timeout(NODE_ROLES_METRIC, |v| v == 4.0, 60u64) - .await - .map_err(|e| anyhow!("Validator {name} role check failed: {e}"))?; - } + assert_nodes_are_validators(&validator_nodes).await?; log::info!("All validators confirmed as authorities"); // Get a relay client for parachain throughput checks @@ -89,8 +83,7 @@ async fn parachains_disputes_test() -> Result<(), anyhow::Error> { .await?; log::info!("Check lag - approval"); - for name in &all_validators { - let validator = network.get_node(*name)?; + for validator in &validator_nodes { validator .wait_metric_with_timeout( "polkadot_parachain_approval_checking_finality_lag", @@ -101,7 +94,7 @@ async fn parachains_disputes_test() -> Result<(), anyhow::Error> { .map_err(|e| { anyhow!( "Validator {} polkadot_parachain_approval_checking_finality_lag: {}", - name, + validator.name(), e ) })?; @@ -109,8 +102,7 @@ async fn parachains_disputes_test() -> Result<(), anyhow::Error> { log::info!("All validators passed the lag - approval check"); log::info!("Check lag - dispute conclusion"); - for name in &all_validators { - let validator = network.get_node(*name)?; + for validator in &validator_nodes { validator .wait_metric_with_timeout( "polkadot_parachain_disputes_finality_lag", @@ -119,7 +111,11 @@ async fn parachains_disputes_test() -> Result<(), anyhow::Error> { ) .await .map_err(|e| { - anyhow!("Validator {} polkadot_parachain_disputes_finality_lag: {}", name, e) + anyhow!( + "Validator {} polkadot_parachain_disputes_finality_lag: {}", + validator.name(), + e + ) })?; } log::info!("All validators passed the lag - dispute conclusion check"); diff --git a/polkadot/zombienet-sdk-tests/tests/functional/parachains_disputes_garbage_candidate.rs b/polkadot/zombienet-sdk-tests/tests/functional/parachains_disputes_garbage_candidate.rs index 7e27c9255aeff..6d24ca1b60ec1 100644 --- a/polkadot/zombienet-sdk-tests/tests/functional/parachains_disputes_garbage_candidate.rs +++ b/polkadot/zombienet-sdk-tests/tests/functional/parachains_disputes_garbage_candidate.rs @@ -7,8 +7,8 @@ //! block. use crate::utils::{ - env_or_default, initialize_network, COL_IMAGE_ENV, INTEGRATION_IMAGE_ENV, MALUS_IMAGE_ENV, - NODE_ROLES_METRIC, + assert_nodes_are_validators, env_or_default, initialize_network, COL_IMAGE_ENV, + INTEGRATION_IMAGE_ENV, MALUS_IMAGE_ENV, }; use anyhow::anyhow; use cumulus_zombienet_sdk_helpers::assert_para_throughput; @@ -32,17 +32,11 @@ async fn parachains_disputes_garbage_candidate_test() -> Result<(), anyhow::Erro let config = build_network_config()?; let network = initialize_network(config).await?; - let all_validators = [&MALUS_VALIDATORS[..], &HONEST_VALIDATORS[..]].concat(); + let validator_nodes = network.relaychain().nodes(); // Check authority status log::info!("Checking validator node roles"); - for name in &all_validators { - let validator = network.get_node(*name)?; - validator - .wait_metric_with_timeout(NODE_ROLES_METRIC, |v| v == 4.0, 60u64) - .await - .map_err(|e| anyhow!("Validator {} role check failed: {}", name, e))?; - } + assert_nodes_are_validators(&validator_nodes).await?; log::info!("All validators confirmed as authorities"); // Get a relay client for parachain throughput checks diff --git a/polkadot/zombienet-sdk-tests/tests/functional/parachains_max_tranche0.rs b/polkadot/zombienet-sdk-tests/tests/functional/parachains_max_tranche0.rs index 955fb5825abc7..bef001f544d0d 100644 --- a/polkadot/zombienet-sdk-tests/tests/functional/parachains_max_tranche0.rs +++ b/polkadot/zombienet-sdk-tests/tests/functional/parachains_max_tranche0.rs @@ -9,8 +9,8 @@ //! to ensure most approvals come from tranche0. use crate::utils::{ - env_or_default, initialize_network, APPROVAL_CHECKING_FINALITY_LAG_METRIC, COL_IMAGE_ENV, - INTEGRATION_IMAGE_ENV, NODE_ROLES_METRIC, + assert_nodes_are_validators, env_or_default, initialize_network, + APPROVAL_CHECKING_FINALITY_LAG_METRIC, COL_IMAGE_ENV, INTEGRATION_IMAGE_ENV, }; use anyhow::anyhow; use cumulus_zombienet_sdk_helpers::assert_para_throughput; @@ -41,16 +41,11 @@ async fn parachains_max_tranche0_test() -> Result<(), anyhow::Error> { let config = build_network_config()?; let network = initialize_network(config).await?; + let validator_nodes = network.relaychain().nodes(); // Check authority status log::info!("Checking validator node roles"); - for i in 0..NUM_VALIDATORS { - let validator = network.get_node(format!("some-validator-{i}"))?; - validator - .wait_metric_with_timeout(NODE_ROLES_METRIC, |v| v == 4.0, 60u64) - .await - .map_err(|e| anyhow!("Validator {} role check failed: {}", i, e))?; - } + assert_nodes_are_validators(&validator_nodes).await?; log::info!("All validators confirmed as authorities"); // Get a relay client for parachain throughput checks diff --git a/polkadot/zombienet-sdk-tests/tests/functional/parachains_pvf.rs b/polkadot/zombienet-sdk-tests/tests/functional/parachains_pvf.rs index 7692afd90c7f7..3f414140112a0 100644 --- a/polkadot/zombienet-sdk-tests/tests/functional/parachains_pvf.rs +++ b/polkadot/zombienet-sdk-tests/tests/functional/parachains_pvf.rs @@ -7,8 +7,8 @@ //! It sets up a network with 8 validators and 8 parachains, use crate::utils::{ - env_or_default, initialize_network, BLOCK_HEIGHT_FINALIZED_METRIC, COL_IMAGE_ENV, - INTEGRATION_IMAGE_ENV, NODE_ROLES_METRIC, + assert_nodes_are_validators, env_or_default, initialize_network, BLOCK_HEIGHT_FINALIZED_METRIC, + COL_IMAGE_ENV, INTEGRATION_IMAGE_ENV, }; use anyhow::anyhow; use cumulus_zombienet_sdk_helpers::assert_para_throughput; @@ -29,16 +29,11 @@ async fn parachains_pvf_preparation_and_execution_test() -> Result<(), anyhow::E let config = build_network_config()?; let network = initialize_network(config).await?; + let validator_nodes = network.relaychain().nodes(); // Check authority status log::info!("Checking validator node roles"); - for name in VALIDATORS { - let validator = network.get_node(name)?; - validator - .wait_metric_with_timeout(NODE_ROLES_METRIC, |v| v == 4.0, 60u64) - .await - .map_err(|e| anyhow!("Validator {} role check failed: {}", name, e))?; - } + assert_nodes_are_validators(&validator_nodes).await?; log::info!("All validators confirmed as authorities"); // Get a relay client for parachain throughput checks diff --git a/polkadot/zombienet-sdk-tests/tests/functional/systematic_chunk_recovery.rs b/polkadot/zombienet-sdk-tests/tests/functional/systematic_chunk_recovery.rs index d0f4b04e08b99..76fdf205685fe 100644 --- a/polkadot/zombienet-sdk-tests/tests/functional/systematic_chunk_recovery.rs +++ b/polkadot/zombienet-sdk-tests/tests/functional/systematic_chunk_recovery.rs @@ -6,12 +6,12 @@ //! chunk mapping feature and check systematic chunk recovery. use crate::utils::{ - check_log_lines, check_metrics, env_or_default, initialize_network, MetricCheckSetup, - APPROVAL_CHECKING_FINALITY_LAG_METRIC, APPROVAL_NO_SHOWS_TOTAL_METRIC, - AVAILABILITY_RECOVERY_RECOVERIES_FINISHED, BLOCK_HEIGHT_FINALIZED_METRIC, COL_IMAGE_ENV, - DATA_RECOVERY_CHUNKS_PATTERN, DATA_RECOVERY_FROM_SYSTEMATIC_CHUNKS_COMPLETE_PATTERN, + assert_nodes_are_validators, check_log_lines, check_metrics, env_or_default, + initialize_network, MetricCheckSetup, APPROVAL_CHECKING_FINALITY_LAG_METRIC, + APPROVAL_NO_SHOWS_TOTAL_METRIC, AVAILABILITY_RECOVERY_RECOVERIES_FINISHED, + BLOCK_HEIGHT_FINALIZED_METRIC, COL_IMAGE_ENV, DATA_RECOVERY_CHUNKS_PATTERN, + DATA_RECOVERY_FROM_SYSTEMATIC_CHUNKS_COMPLETE_PATTERN, DATA_RECOVERY_FROM_SYSTEMATIC_CHUNKS_NOT_POSSIBLE_PATTERN, INTEGRATION_IMAGE_ENV, - NODE_ROLES_METRIC, }; use anyhow::anyhow; use cumulus_zombienet_sdk_helpers::{ @@ -38,20 +38,11 @@ async fn systematic_chunk_recovery_test() -> Result<(), anyhow::Error> { let config = build_network_config()?; let network = initialize_network(config).await?; + let mut validator_nodes = network.relaychain().nodes(); // Check authority status log::info!("Checking validator node roles"); - let validators: Vec = (0..3).map(|i| format!("validator-{i}")).collect(); - let validators_names = - [vec!["alice"], validators.iter().map(|x| x.as_str()).collect()].concat(); - - for name in validators_names { - let validator = network.get_node(name)?; - validator - .wait_metric_with_timeout(NODE_ROLES_METRIC, |v| v == 4.0, 60u64) - .await - .map_err(|e| anyhow!("Validator {name} role check failed: {e}"))?; - } + assert_nodes_are_validators(&validator_nodes).await?; log::info!("All validators confirmed as authorities"); // Get a relay client for parachain throughput checks @@ -64,10 +55,8 @@ async fn systematic_chunk_recovery_test() -> Result<(), anyhow::Error> { assert_para_throughput(&alice_client, 5, para_throughput).await?; log::info!("All parachains producing blocks"); - let mut validator_nodes = vec![]; - for name in validators { - validator_nodes.push(network.get_node(name)?); - } + // remove alice and use the others validators for the rest of the checks. + validator_nodes.retain(|n| n.name() != "alice"); let metric_checks: Vec = vec![ (BLOCK_HEIGHT_FINALIZED_METRIC, Box::new(|v| v >= 30.0), 400), diff --git a/polkadot/zombienet-sdk-tests/tests/lib.rs b/polkadot/zombienet-sdk-tests/tests/lib.rs index b04a24cc3cb93..23bf34dad564e 100644 --- a/polkadot/zombienet-sdk-tests/tests/lib.rs +++ b/polkadot/zombienet-sdk-tests/tests/lib.rs @@ -7,6 +7,8 @@ mod elastic_scaling; #[cfg(feature = "zombie-ci")] mod functional; #[cfg(feature = "zombie-ci")] +mod misc; +#[cfg(feature = "zombie-ci")] mod parachains; #[cfg(feature = "zombie-ci")] mod smoke; diff --git a/polkadot/zombienet-sdk-tests/tests/misc/malus_dispute_valid_block.rs b/polkadot/zombienet-sdk-tests/tests/misc/malus_dispute_valid_block.rs new file mode 100644 index 0000000000000..316116c8a4ed2 --- /dev/null +++ b/polkadot/zombienet-sdk-tests/tests/misc/malus_dispute_valid_block.rs @@ -0,0 +1,108 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +//! Misc malus +//! +//! Integration test for malus node. + +use crate::utils::{ + assert_nodes_are_validators, check_metrics, env_or_default, initialize_network, + MetricCheckSetup, BLOCK_HEIGHT_FINALIZED_METRIC, COL_IMAGE_ENV, INTEGRATION_IMAGE_ENV, + MALUS_IMAGE_ENV, +}; +use anyhow::anyhow; +use zombienet_sdk::{NetworkConfig, NetworkConfigBuilder, NetworkNode}; + +#[tokio::test(flavor = "multi_thread")] +async fn malus_dispute_valid_block_test() -> Result<(), anyhow::Error> { + let _ = env_logger::try_init_from_env( + env_logger::Env::default().filter_or(env_logger::DEFAULT_FILTER_ENV, "info"), + ); + + let config = build_network_config()?; + let network = initialize_network(config).await?; + + let validator_nodes = network.relaychain().nodes(); + + // Check authority status + log::info!("Checking validator node roles"); + assert_nodes_are_validators(&validator_nodes).await?; + log::info!("All validators confirmed as authorities"); + + let honest_validators: Vec<&NetworkNode> = + validator_nodes.into_iter().filter(|n| n.name() != "malus").collect(); + let metric_checks: Vec = vec![ + ("sub_libp2p_is_major_syncing", Box::new(|v| v == 0.0), 0), + (BLOCK_HEIGHT_FINALIZED_METRIC, Box::new(|v| v >= 2.0), 30), + ("sub_libp2p_peers_count", Box::new(|v| v >= 2.0), 0), + ( + "polkadot_parachain_candidate_dispute_votes{validity=\"valid\"}", + Box::new(|v| v >= 2.0), + 90, + ), + ( + "polkadot_parachain_candidate_dispute_concluded{validity=\"valid\"}", + Box::new(|v| v >= 1.0), + 90, + ), + ( + "polkadot_parachain_candidate_dispute_concluded{validity=\"invalid\"}", + Box::new(|v| v == 0.0), + 90, + ), + ]; + + check_metrics(&honest_validators, &metric_checks).await?; + + log::info!("Test finished successfully"); + Ok(()) +} + +fn build_network_config() -> Result { + let images = zombienet_sdk::environment::get_images_from_env(); + let polkadot_image = env_or_default(INTEGRATION_IMAGE_ENV, images.polkadot.as_str()); + let col_image = env_or_default(COL_IMAGE_ENV, images.cumulus.as_str()); + let malus_image = env_or_default(MALUS_IMAGE_ENV, images.cumulus.as_str()); + + NetworkConfigBuilder::new() + .with_relaychain(|r| { + r.with_chain("rococo-local") + .with_default_command("polkadot") + .with_default_image(polkadot_image.as_str()) + .with_default_args(vec!["-lparachain=debug".into()]) + .with_default_resources(|r| { + r.with_limit_memory("4G") + .with_limit_cpu("2") + .with_request_memory("2G") + .with_request_cpu("1") + }) + .with_node_group(|g| g.with_count(3).with_base_node(|n| n.with_name("validator"))) + // Add malus validator + .with_validator(|node| { + node.with_name("malus") + .with_image(malus_image.as_str()) + .with_command("malus") + .with_subcommand("dispute-ancestor") + .with_args(vec![ + "-lparachain=debug,MALUS=trace".into(), + "--insecure-validator-i-know-what-i-do".into(), + ]) + }) + }) + .with_parachain(|p| { + p.with_id(100) + .cumulus_based(false) + .with_default_image(col_image.as_str()) + .with_default_command("adder-collator") + .with_collator(|n| n.with_name("collator")) + }) + .with_global_settings(|global_settings| match std::env::var("ZOMBIENET_SDK_BASE_DIR") { + Ok(val) => global_settings.with_base_dir(val), + _ => global_settings, + }) + .build() + .map_err(|e| { + let errs = e.into_iter().map(|e| e.to_string()).collect::>().join(" "); + anyhow!("config errs: {errs}") + }) +} diff --git a/polkadot/zombienet-sdk-tests/tests/misc/mod.rs b/polkadot/zombienet-sdk-tests/tests/misc/mod.rs new file mode 100644 index 0000000000000..7ef7d44822a67 --- /dev/null +++ b/polkadot/zombienet-sdk-tests/tests/misc/mod.rs @@ -0,0 +1,5 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +mod malus_dispute_valid_block; +mod paritydb; diff --git a/polkadot/zombienet-sdk-tests/tests/misc/paritydb.rs b/polkadot/zombienet-sdk-tests/tests/misc/paritydb.rs new file mode 100644 index 0000000000000..2258f985d5d3a --- /dev/null +++ b/polkadot/zombienet-sdk-tests/tests/misc/paritydb.rs @@ -0,0 +1,161 @@ +// Copyright (C) Parity Technologies (UK) Ltd. +// SPDX-License-Identifier: Apache-2.0 + +//! Misc ParityDb +//! +//! This test verifies that parachains make progress with paritydb. + +use crate::utils::{ + assert_nodes_are_validators, check_metrics, env_or_default, initialize_network, + MetricCheckSetup, APPROVAL_CHECKING_FINALITY_LAG_METRIC, COL_IMAGE_ENV, INTEGRATION_IMAGE_ENV, +}; +use anyhow::anyhow; +use cumulus_zombienet_sdk_helpers::assert_para_throughput; +use log::{info, trace}; +use polkadot_primitives::Id as ParaId; +use serde_json::json; +use std::{ops::Range, path::PathBuf}; +use zombienet_sdk::{ + subxt::{OnlineClient, PolkadotConfig}, + NetworkConfig, NetworkConfigBuilder, RunScriptOptions, +}; + +const PARAS: [u32; 10] = [2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009]; + +#[tokio::test(flavor = "multi_thread")] +async fn paritydb_test() -> Result<(), anyhow::Error> { + let _ = env_logger::try_init_from_env( + env_logger::Env::default().filter_or(env_logger::DEFAULT_FILTER_ENV, "info"), + ); + + let config = build_network_config()?; + let network = initialize_network(config).await?; + + let validator_nodes = network.relaychain().nodes(); + + info!("Running script to ensure we are using parityDb"); + let script_path = create_script().await?; + + for validator in &validator_nodes { + let res = validator.run_script(RunScriptOptions::new(&script_path)).await?; + assert!(res.is_ok(), "{}", format!("node {} is not using paritydb", validator.name())); + } + info!("All nodes are using parityDb"); + + let relay_node = validator_nodes + .first() + .ok_or(anyhow!("Relaychain should have at least one node"))?; + let relay_client: OnlineClient = relay_node.wait_client().await?; + + // Check authority status + log::info!("Checking validator node roles"); + assert_nodes_are_validators(&validator_nodes).await?; + log::info!("All validators confirmed as authorities"); + + // Check that all parachains produce at least 5 blocks within 1 session and 5 blocks (RC) + log::info!("Checking parachain block production (all paras registered at genesis)"); + let para_throughput: [(ParaId, Range); 10] = PARAS.map(|id| (ParaId::from(id), 2..6)); + assert_para_throughput(&relay_client, 5, para_throughput).await?; + log::info!("All parachains producing blocks"); + + log::info!("Check lag - approval / dispute conclusion."); + let metric_checks: Vec = vec![ + (APPROVAL_CHECKING_FINALITY_LAG_METRIC, Box::new(|v| v <= 2.0), 0), + ("polkadot_parachain_candidate_disputes_total", Box::new(|v| v == 0.0), 0), + ]; + + check_metrics(&validator_nodes, &metric_checks).await?; + + log::info!("Test finished successfully"); + Ok(()) +} + +async fn create_script() -> Result { + // Create test script if it doesn't exist + let script_path = PathBuf::from("./test_script.sh"); + if !script_path.exists() { + trace!("Creating test_script.sh..."); + tokio::fs::write( + &script_path, + r#"#!/bin/bash + # at first check path that works for native provider + DIR=./data/chains/rococo_local_testnet/paritydb/full + if [ ! -d $DIR ] ; then + # check k8s provider + DIR=/data/chains/rococo_local_testnet/paritydb/full + fi + ls $DIR 2> /dev/null + "#, + ) + .await?; + } + Ok(script_path) +} + +fn build_network_config() -> Result { + let images = zombienet_sdk::environment::get_images_from_env(); + let polkadot_image = env_or_default(INTEGRATION_IMAGE_ENV, images.polkadot.as_str()); + let col_image = env_or_default(COL_IMAGE_ENV, images.cumulus.as_str()); + + let mut builder = NetworkConfigBuilder::new().with_relaychain(|r| { + r.with_chain("rococo-local") + .with_default_command("polkadot") + .with_default_image(polkadot_image.as_str()) + .with_default_args(vec![ + "-lparachain=debug,runtime=debug".into(), + "--db=paritydb".into(), + ]) + .with_genesis_overrides(json!({ + "patch": { + "configuration": { + "config": { + "needed_approvals": 3, + "scheduler_params": { + "max_validators_per_core": 1 + } + } + } + } + })) + .with_default_resources(|r| { + r.with_limit_memory("4G") + .with_limit_cpu("2") + .with_request_memory("2G") + .with_request_cpu("1") + }) + .with_node_group(|g| g.with_count(10).with_base_node(|n| n.with_name("validator"))) + }); + + builder = PARAS.into_iter().fold(builder, |acc, para_id| { + acc.with_parachain(|p| { + let pov_size = 10000*(para_id-1999); + let pvf_complexity = para_id - 1999; + + p.with_id(para_id) + .cumulus_based(false) + .with_default_image(col_image.as_str()) + .with_default_command("undying-collator") + .with_default_args(vec![ + "-lruntime=debug,parachain=trace".into(), + format!("--pov-size={pov_size}").as_str().into(), + "--pvf-complexity=1".into(), + ]) + .with_genesis_state_generator( + format!("undying-collator export-genesis-state --pov-size={pov_size} --pvf-complexity={pvf_complexity}").as_str(), + ) + .with_collator(|n| n.with_name(&format!("collator-{para_id}"))) + }) + }); + + builder = builder.with_global_settings(|global_settings| { + match std::env::var("ZOMBIENET_SDK_BASE_DIR") { + Ok(val) => global_settings.with_base_dir(val), + _ => global_settings, + } + }); + + builder.build().map_err(|e| { + let errs = e.into_iter().map(|e| e.to_string()).collect::>().join(" "); + anyhow!("config errs: {errs}") + }) +} diff --git a/polkadot/zombienet-sdk-tests/tests/utils.rs b/polkadot/zombienet-sdk-tests/tests/utils.rs index d128c7dd84002..b9ad8731f2abf 100644 --- a/polkadot/zombienet-sdk-tests/tests/utils.rs +++ b/polkadot/zombienet-sdk-tests/tests/utils.rs @@ -132,3 +132,14 @@ pub fn create_force_register_call( calls } + +/// Check if all the nodes are validators (node_roles == 4.0) +pub async fn assert_nodes_are_validators(nodes: &[&NetworkNode]) -> Result<(), anyhow::Error> { + for node in nodes { + node.wait_metric_with_timeout(NODE_ROLES_METRIC, |v| v == 4.0, 60u64) + .await + .map_err(|e| anyhow!("Validator {} role check failed: {e}", node.name()))?; + } + + Ok(()) +} diff --git a/polkadot/zombienet_tests/misc/0001-check_paritydb.sh b/polkadot/zombienet_tests/misc/0001-check_paritydb.sh deleted file mode 100644 index 7679ec3135e05..0000000000000 --- a/polkadot/zombienet_tests/misc/0001-check_paritydb.sh +++ /dev/null @@ -1,7 +0,0 @@ -# at first check path that works for native provider -DIR=./data/chains/rococo_local_testnet/paritydb/full -if [ ! -d $DIR ] ; then - # check k8s provider - DIR=/data/chains/rococo_local_testnet/paritydb/full -fi -ls $DIR 2> /dev/null diff --git a/polkadot/zombienet_tests/misc/0001-paritydb.toml b/polkadot/zombienet_tests/misc/0001-paritydb.toml deleted file mode 100644 index b3ce2081b1119..0000000000000 --- a/polkadot/zombienet_tests/misc/0001-paritydb.toml +++ /dev/null @@ -1,41 +0,0 @@ -[settings] -timeout = 1000 -bootnode = true - -[relaychain.genesis.runtimeGenesis.patch.configuration.config] - needed_approvals = 3 - -[relaychain.genesis.runtimeGenesis.patch.configuration.config.scheduler_params] - max_validators_per_core = 1 - -[relaychain] -default_image = "{{ZOMBIENET_INTEGRATION_TEST_IMAGE}}" -chain = "rococo-local" -default_command = "polkadot" - -[relaychain.default_resources] -limits = { memory = "4G", cpu = "2" } -requests = { memory = "2G", cpu = "1" } - - [[relaychain.node_groups]] - name = "validator" - count = 10 - args = ["-lparachain=debug", "--db=paritydb"] - -{% for id in range(2000,2010) %} -[[parachains]] -id = {{id}} -addToGenesis = true -genesis_state_generator = "undying-collator export-genesis-state --pov-size={{10000*(id-1999)}} --pvf-complexity={{id - 1999}}" - [parachains.collator] - name = "collator" - image = "{{COL_IMAGE}}" - command = "undying-collator" - args = ["-lparachain=debug", "--pov-size={{10000*(id-1999)}}", "--parachain-id={{id}}", "--pvf-complexity={{id - 1999}}"] - -{% endfor %} - -[types.Header] -number = "u64" -parent_hash = "Hash" -post_state = "Hash" diff --git a/polkadot/zombienet_tests/misc/0001-paritydb.zndsl b/polkadot/zombienet_tests/misc/0001-paritydb.zndsl deleted file mode 100644 index e0260cb9fdde1..0000000000000 --- a/polkadot/zombienet_tests/misc/0001-paritydb.zndsl +++ /dev/null @@ -1,68 +0,0 @@ -Description: Check that paritydb works without affecting finality lag and block production. -Network: ./0001-paritydb.toml -Creds: config - -# Check if we are using ParityDB. -validator: log line contains "Database: ParityDb" -validator: run ./0001-check_paritydb.sh within 60 seconds - -# Check authority status and peers. -validator-0: reports node_roles is 4 -validator-1: reports node_roles is 4 -validator-2: reports node_roles is 4 -validator-3: reports node_roles is 4 -validator-4: reports node_roles is 4 -validator-5: reports node_roles is 4 -validator-6: reports node_roles is 4 -validator-7: reports node_roles is 4 -validator-8: reports node_roles is 4 -validator-9: reports node_roles is 4 - -# Ensure parachains are registered. -validator-0: parachain 2000 is registered within 20 seconds -validator-0: parachain 2001 is registered -validator-0: parachain 2002 is registered -validator-0: parachain 2003 is registered -validator-0: parachain 2004 is registered -validator-0: parachain 2005 is registered -validator-0: parachain 2006 is registered -validator-0: parachain 2007 is registered -validator-0: parachain 2008 is registered -validator-0: parachain 2009 is registered - -# Ensure parachains made some progress. -validator-0: parachain 2000 block height is at least 3 within 60 seconds -validator-0: parachain 2001 block height is at least 3 within 60 seconds -validator-0: parachain 2002 block height is at least 3 within 60 seconds -validator-0: parachain 2003 block height is at least 3 within 60 seconds -validator-0: parachain 2004 block height is at least 3 within 60 seconds -validator-0: parachain 2005 block height is at least 3 within 60 seconds -validator-0: parachain 2006 block height is at least 3 within 60 seconds -validator-0: parachain 2007 block height is at least 3 within 60 seconds -validator-0: parachain 2008 block height is at least 3 within 60 seconds -validator-0: parachain 2009 block height is at least 3 within 60 seconds - -# Check lag - approval -validator-0: reports polkadot_parachain_approval_checking_finality_lag <= 1 -validator-1: reports polkadot_parachain_approval_checking_finality_lag <= 1 -validator-2: reports polkadot_parachain_approval_checking_finality_lag <= 1 -validator-3: reports polkadot_parachain_approval_checking_finality_lag <= 1 -validator-4: reports polkadot_parachain_approval_checking_finality_lag <= 1 -validator-5: reports polkadot_parachain_approval_checking_finality_lag <= 1 -validator-6: reports polkadot_parachain_approval_checking_finality_lag <= 1 -validator-7: reports polkadot_parachain_approval_checking_finality_lag <= 1 -validator-8: reports polkadot_parachain_approval_checking_finality_lag <= 1 -validator-9: reports polkadot_parachain_approval_checking_finality_lag <= 1 - -# Check lag - dispute conclusion -validator-0: reports polkadot_parachain_candidate_disputes_total is 0 -validator-1: reports polkadot_parachain_candidate_disputes_total is 0 -validator-2: reports polkadot_parachain_candidate_disputes_total is 0 -validator-3: reports polkadot_parachain_candidate_disputes_total is 0 -validator-4: reports polkadot_parachain_candidate_disputes_total is 0 -validator-5: reports polkadot_parachain_candidate_disputes_total is 0 -validator-6: reports polkadot_parachain_candidate_disputes_total is 0 -validator-7: reports polkadot_parachain_candidate_disputes_total is 0 -validator-8: reports polkadot_parachain_candidate_disputes_total is 0 -validator-9: reports polkadot_parachain_candidate_disputes_total is 0 -