-
Notifications
You must be signed in to change notification settings - Fork 2.6k
try-runtime-cli: execute-block
& create-snapshot
tests
#14343
Changes from 18 commits
4bb74f2
cb9720c
2644c25
64ed955
aa7e6a7
2989dfc
af1cfde
c1d5b80
c3a964d
e7a54ab
d3a9ca9
6ce396e
7d274e6
f439f28
84a27de
7581859
8fc182a
b7c157b
f1c77b4
08b881c
e78e7e4
4e3e29b
2c689d5
daab1cc
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
// This file is part of Substrate. | ||
|
||
// Copyright (C) Parity Technologies (UK) Ltd. | ||
// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 | ||
|
||
// This program is free software: you can redistribute it and/or modify | ||
// it under the terms of the GNU General Public License as published by | ||
// the Free Software Foundation, either version 3 of the License, or | ||
// (at your option) any later version. | ||
|
||
// This program is distributed in the hope that it will be useful, | ||
// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
// GNU General Public License for more details. | ||
|
||
// You should have received a copy of the GNU General Public License | ||
// along with this program. If not, see <https://www.gnu.org/licenses/>. | ||
|
||
#![cfg(unix)] | ||
#[cfg(feature = "try-runtime")] | ||
mod tests { | ||
Szegoo marked this conversation as resolved.
Show resolved
Hide resolved
|
||
use assert_cmd::cargo::cargo_bin; | ||
use node_primitives::Hash; | ||
use regex::Regex; | ||
use std::{ | ||
path::{Path, PathBuf}, | ||
process, | ||
time::Duration, | ||
}; | ||
use substrate_cli_test_utils as common; | ||
use tokio::process::{Child, Command}; | ||
|
||
#[tokio::test] | ||
async fn create_snapshot_works() { | ||
// Build substrate so binaries used in the test use the latest code. | ||
common::build_substrate(&["--features=try-runtime"]); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I now understood why we have to build again. Just very annoying and slow… There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. That would be great. It does take quite some time to run all of these tests. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Yea that would be a follow up as well; debug that |
||
|
||
let temp_dir = tempfile::Builder::new() | ||
.prefix("try-runtime-cli-test-dir") | ||
.tempdir() | ||
.expect("Failed to create a tempdir"); | ||
let snap_file_path = temp_dir.path().join("snapshot.snap"); | ||
|
||
common::run_with_timeout(Duration::from_secs(60), async move { | ||
fn create_snapshot(ws_url: &str, snap_file: &PathBuf, at: Hash) -> Child { | ||
Command::new(cargo_bin("substrate")) | ||
.stdout(process::Stdio::piped()) | ||
.stderr(process::Stdio::piped()) | ||
.args(&["try-runtime", "--runtime=existing"]) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. FYI, the need for There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. wdyt about |
||
.args(&["create-snapshot", format!("--uri={}", ws_url).as_str()]) | ||
.arg(snap_file) | ||
.args(&["--at", format!("{:?}", at).as_str()]) | ||
.kill_on_drop(true) | ||
.spawn() | ||
.unwrap() | ||
} | ||
|
||
// Start a node and wait for it to begin finalizing blocks | ||
let mut node = common::KillChildOnDrop(common::start_node()); | ||
let ws_url = common::extract_info_from_output(node.stderr.take().unwrap()).0.ws_url; | ||
common::wait_n_finalized_blocks(3, &ws_url).await; | ||
|
||
let block_number = 2; | ||
let block_hash = common::block_hash(block_number, &ws_url).await.unwrap(); | ||
|
||
// Try to create a snapshot. | ||
let mut snapshot_creation = create_snapshot(&ws_url, &snap_file_path, block_hash); | ||
|
||
let re = Regex::new(r#".*writing snapshot of (\d+) bytes to .*"#).unwrap(); | ||
let matched = | ||
common::wait_for_stream_pattern_match(snapshot_creation.stderr.take().unwrap(), re) | ||
.await; | ||
|
||
// Assert that the snapshot creation succeded. | ||
assert!(matched.is_ok(), "Failed to create snapshot"); | ||
|
||
let snapshot_is_on_disk = Path::new(&snap_file_path).exists(); | ||
Szegoo marked this conversation as resolved.
Show resolved
Hide resolved
|
||
assert!(snapshot_is_on_disk, "Snapshot was not written to disk"); | ||
Szegoo marked this conversation as resolved.
Show resolved
Hide resolved
|
||
}) | ||
.await; | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
// This file is part of Substrate. | ||
|
||
// Copyright (C) Parity Technologies (UK) Ltd. | ||
// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0 | ||
|
||
// This program is free software: you can redistribute it and/or modify | ||
// it under the terms of the GNU General Public License as published by | ||
// the Free Software Foundation, either version 3 of the License, or | ||
// (at your option) any later version. | ||
|
||
// This program is distributed in the hope that it will be useful, | ||
// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
// GNU General Public License for more details. | ||
|
||
// You should have received a copy of the GNU General Public License | ||
// along with this program. If not, see <https://www.gnu.org/licenses/>. | ||
|
||
#![cfg(unix)] | ||
#[cfg(feature = "try-runtime")] | ||
mod tests { | ||
Szegoo marked this conversation as resolved.
Show resolved
Hide resolved
|
||
use assert_cmd::cargo::cargo_bin; | ||
use node_primitives::Hash; | ||
use regex::Regex; | ||
use std::{process, time::Duration}; | ||
use substrate_cli_test_utils as common; | ||
use tokio::process::{Child, Command}; | ||
|
||
#[tokio::test] | ||
async fn block_execution_works() { | ||
// Build substrate so binaries used in the test use the latest code. | ||
common::build_substrate(&["--features=try-runtime"]); | ||
|
||
common::run_with_timeout(Duration::from_secs(60), async move { | ||
fn execute_block(ws_url: &str, at: Hash) -> Child { | ||
Command::new(cargo_bin("substrate")) | ||
.stdout(process::Stdio::piped()) | ||
.stderr(process::Stdio::piped()) | ||
.args(&["try-runtime", "--runtime=existing"]) | ||
.args(&["execute-block"]) | ||
.args(&["live", format!("--uri={}", ws_url).as_str()]) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This will only execute the latest block. Would be interesting if you also think about incorporating Same applies to the other one as well. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Sure, I will do that. |
||
.args(&["--at", format!("{:?}", at).as_str()]) | ||
.kill_on_drop(true) | ||
.spawn() | ||
.unwrap() | ||
} | ||
|
||
// Start a node and wait for it to begin finalizing blocks | ||
let mut node = common::KillChildOnDrop(common::start_node()); | ||
let ws_url = common::extract_info_from_output(node.stderr.take().unwrap()).0.ws_url; | ||
common::wait_n_finalized_blocks(3, &ws_url).await; | ||
|
||
let block_number = 1; | ||
let block_hash = common::block_hash(block_number, &ws_url).await.unwrap(); | ||
|
||
// Try to execute the block. | ||
let mut block_execution = execute_block(&ws_url, block_hash); | ||
|
||
let expected_output = format!(r#".*Block #{} successfully executed"#, block_number); | ||
let re = Regex::new(expected_output.as_str()).unwrap(); | ||
let matched = | ||
common::wait_for_stream_pattern_match(block_execution.stderr.take().unwrap(), re) | ||
.await; | ||
|
||
// Assert that the block-execution process has executed a block. | ||
assert!(matched.is_ok()); | ||
}) | ||
.await; | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just some ideas, we could do stuff here like:
Probably most of it in JSON, so we can render it eventually (like chopsticks already does for state changes).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Should this be done in this PR?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No. Just some ideas for the future 😄