mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-07-20 08:05:41 +00:00
[staking miner]: add CLI tests + fix --version (#5024)
* staking miner: add CLI tests * cargo fmt * fix bad merge * Update utils/staking-miner/Cargo.toml Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> * grumbles: derive PartialEq only for tests * make test `--version` a integration tests Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com>
This commit is contained in:
Generated
+1
@@ -10735,6 +10735,7 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
|
|||||||
name = "staking-miner"
|
name = "staking-miner"
|
||||||
version = "0.9.17"
|
version = "0.9.17"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"assert_cmd",
|
||||||
"clap",
|
"clap",
|
||||||
"frame-election-provider-support",
|
"frame-election-provider-support",
|
||||||
"frame-support",
|
"frame-support",
|
||||||
|
|||||||
@@ -44,4 +44,4 @@ westend-runtime = { path = "../../runtime/westend" }
|
|||||||
sub-tokens = { git = "https://github.com/paritytech/substrate-debug-kit", branch = "master" }
|
sub-tokens = { git = "https://github.com/paritytech/substrate-debug-kit", branch = "master" }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
sp-version = { git = "https://github.com/paritytech/substrate", branch = "master" }
|
assert_cmd = "2.0.2"
|
||||||
|
|||||||
@@ -277,6 +277,7 @@ impl<T: EPM::Config> std::fmt::Display for Error<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Parser)]
|
#[derive(Debug, Clone, Parser)]
|
||||||
|
#[cfg_attr(test, derive(PartialEq))]
|
||||||
enum Command {
|
enum Command {
|
||||||
/// Monitor for the phase being signed, then compute.
|
/// Monitor for the phase being signed, then compute.
|
||||||
Monitor(MonitorConfig),
|
Monitor(MonitorConfig),
|
||||||
@@ -287,7 +288,8 @@ enum Command {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Parser)]
|
#[derive(Debug, Clone, Parser)]
|
||||||
enum Solvers {
|
#[cfg_attr(test, derive(PartialEq))]
|
||||||
|
enum Solver {
|
||||||
SeqPhragmen {
|
SeqPhragmen {
|
||||||
#[clap(long, default_value = "10")]
|
#[clap(long, default_value = "10")]
|
||||||
iterations: usize,
|
iterations: usize,
|
||||||
@@ -306,6 +308,7 @@ frame_support::parameter_types! {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Parser)]
|
#[derive(Debug, Clone, Parser)]
|
||||||
|
#[cfg_attr(test, derive(PartialEq))]
|
||||||
struct MonitorConfig {
|
struct MonitorConfig {
|
||||||
/// They type of event to listen to.
|
/// They type of event to listen to.
|
||||||
///
|
///
|
||||||
@@ -317,10 +320,11 @@ struct MonitorConfig {
|
|||||||
|
|
||||||
/// The solver algorithm to use.
|
/// The solver algorithm to use.
|
||||||
#[clap(subcommand)]
|
#[clap(subcommand)]
|
||||||
solver: Solvers,
|
solver: Solver,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Parser)]
|
#[derive(Debug, Clone, Parser)]
|
||||||
|
#[cfg_attr(test, derive(PartialEq))]
|
||||||
struct EmergencySolutionConfig {
|
struct EmergencySolutionConfig {
|
||||||
/// The block hash at which scraping happens. If none is provided, the latest head is used.
|
/// The block hash at which scraping happens. If none is provided, the latest head is used.
|
||||||
#[clap(long)]
|
#[clap(long)]
|
||||||
@@ -328,13 +332,14 @@ struct EmergencySolutionConfig {
|
|||||||
|
|
||||||
/// The solver algorithm to use.
|
/// The solver algorithm to use.
|
||||||
#[clap(subcommand)]
|
#[clap(subcommand)]
|
||||||
solver: Solvers,
|
solver: Solver,
|
||||||
|
|
||||||
/// The number of top backed winners to take. All are taken, if not provided.
|
/// The number of top backed winners to take. All are taken, if not provided.
|
||||||
take: Option<usize>,
|
take: Option<usize>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Parser)]
|
#[derive(Debug, Clone, Parser)]
|
||||||
|
#[cfg_attr(test, derive(PartialEq))]
|
||||||
struct DryRunConfig {
|
struct DryRunConfig {
|
||||||
/// The block hash at which scraping happens. If none is provided, the latest head is used.
|
/// The block hash at which scraping happens. If none is provided, the latest head is used.
|
||||||
#[clap(long)]
|
#[clap(long)]
|
||||||
@@ -342,7 +347,7 @@ struct DryRunConfig {
|
|||||||
|
|
||||||
/// The solver algorithm to use.
|
/// The solver algorithm to use.
|
||||||
#[clap(subcommand)]
|
#[clap(subcommand)]
|
||||||
solver: Solvers,
|
solver: Solver,
|
||||||
|
|
||||||
/// Force create a new snapshot, else expect one to exist onchain.
|
/// Force create a new snapshot, else expect one to exist onchain.
|
||||||
#[clap(long)]
|
#[clap(long)]
|
||||||
@@ -350,7 +355,9 @@ struct DryRunConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Parser)]
|
#[derive(Debug, Clone, Parser)]
|
||||||
struct SharedConfig {
|
#[cfg_attr(test, derive(PartialEq))]
|
||||||
|
#[clap(author, version, about)]
|
||||||
|
struct Opt {
|
||||||
/// The `ws` node to connect to.
|
/// The `ws` node to connect to.
|
||||||
#[clap(long, short, default_value = DEFAULT_URI, env = "URI")]
|
#[clap(long, short, default_value = DEFAULT_URI, env = "URI")]
|
||||||
uri: String,
|
uri: String,
|
||||||
@@ -364,13 +371,6 @@ struct SharedConfig {
|
|||||||
/// configured, it might re-try and lose funds through transaction fees/deposits.
|
/// configured, it might re-try and lose funds through transaction fees/deposits.
|
||||||
#[clap(long, short, env = "SEED")]
|
#[clap(long, short, env = "SEED")]
|
||||||
seed_or_path: String,
|
seed_or_path: String,
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Clone, Parser)]
|
|
||||||
struct Opt {
|
|
||||||
/// The `ws` node to connect to.
|
|
||||||
#[clap(flatten)]
|
|
||||||
shared: SharedConfig,
|
|
||||||
|
|
||||||
#[clap(subcommand)]
|
#[clap(subcommand)]
|
||||||
command: Command,
|
command: Command,
|
||||||
@@ -433,7 +433,7 @@ where
|
|||||||
|
|
||||||
/// Mine a solution with the given `solver`.
|
/// Mine a solution with the given `solver`.
|
||||||
fn mine_with<T>(
|
fn mine_with<T>(
|
||||||
solver: &Solvers,
|
solver: &Solver,
|
||||||
ext: &mut Ext,
|
ext: &mut Ext,
|
||||||
do_feasibility: bool,
|
do_feasibility: bool,
|
||||||
) -> Result<(EPM::RawSolution<EPM::SolutionOf<T>>, u32), Error<T>>
|
) -> Result<(EPM::RawSolution<EPM::SolutionOf<T>>, u32), Error<T>>
|
||||||
@@ -444,7 +444,7 @@ where
|
|||||||
use frame_election_provider_support::{PhragMMS, SequentialPhragmen};
|
use frame_election_provider_support::{PhragMMS, SequentialPhragmen};
|
||||||
|
|
||||||
match solver {
|
match solver {
|
||||||
Solvers::SeqPhragmen { iterations } => {
|
Solver::SeqPhragmen { iterations } => {
|
||||||
BalanceIterations::set(*iterations);
|
BalanceIterations::set(*iterations);
|
||||||
mine_solution::<
|
mine_solution::<
|
||||||
T,
|
T,
|
||||||
@@ -455,7 +455,7 @@ where
|
|||||||
>,
|
>,
|
||||||
>(ext, do_feasibility)
|
>(ext, do_feasibility)
|
||||||
},
|
},
|
||||||
Solvers::PhragMMS { iterations } => {
|
Solver::PhragMMS { iterations } => {
|
||||||
BalanceIterations::set(*iterations);
|
BalanceIterations::set(*iterations);
|
||||||
mine_solution::<
|
mine_solution::<
|
||||||
T,
|
T,
|
||||||
@@ -530,11 +530,11 @@ pub(crate) async fn check_versions<T: frame_system::Config + EPM::Config>(
|
|||||||
async fn main() {
|
async fn main() {
|
||||||
fmt().with_env_filter(EnvFilter::from_default_env()).init();
|
fmt().with_env_filter(EnvFilter::from_default_env()).init();
|
||||||
|
|
||||||
let Opt { shared, command } = Opt::parse();
|
let Opt { uri, seed_or_path, command } = Opt::parse();
|
||||||
log::debug!(target: LOG_TARGET, "attempting to connect to {:?}", shared.uri);
|
log::debug!(target: LOG_TARGET, "attempting to connect to {:?}", uri);
|
||||||
|
|
||||||
let rpc = loop {
|
let rpc = loop {
|
||||||
match SharedRpcClient::new(&shared.uri).await {
|
match SharedRpcClient::new(&uri).await {
|
||||||
Ok(client) => break client,
|
Ok(client) => break client,
|
||||||
Err(why) => {
|
Err(why) => {
|
||||||
log::warn!(
|
log::warn!(
|
||||||
@@ -597,7 +597,7 @@ async fn main() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let signer_account = any_runtime! {
|
let signer_account = any_runtime! {
|
||||||
signer::signer_uri_from_string::<Runtime>(&shared.seed_or_path, &rpc)
|
signer::signer_uri_from_string::<Runtime>(&seed_or_path, &rpc)
|
||||||
.await
|
.await
|
||||||
.expect("Provided account is invalid, terminating.")
|
.expect("Provided account is invalid, terminating.")
|
||||||
};
|
};
|
||||||
@@ -644,4 +644,89 @@ mod tests {
|
|||||||
assert_eq!(polkadot_version.spec_name, "polkadot".into());
|
assert_eq!(polkadot_version.spec_name, "polkadot".into());
|
||||||
assert_eq!(kusama_version.spec_name, "kusama".into());
|
assert_eq!(kusama_version.spec_name, "kusama".into());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn cli_monitor_works() {
|
||||||
|
let opt = Opt::try_parse_from([
|
||||||
|
env!("CARGO_PKG_NAME"),
|
||||||
|
"--uri",
|
||||||
|
"hi",
|
||||||
|
"--seed-or-path",
|
||||||
|
"//Alice",
|
||||||
|
"monitor",
|
||||||
|
"--listen",
|
||||||
|
"head",
|
||||||
|
"seq-phragmen",
|
||||||
|
])
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
opt,
|
||||||
|
Opt {
|
||||||
|
uri: "hi".to_string(),
|
||||||
|
seed_or_path: "//Alice".to_string(),
|
||||||
|
command: Command::Monitor(MonitorConfig {
|
||||||
|
listen: "head".to_string(),
|
||||||
|
solver: Solver::SeqPhragmen { iterations: 10 }
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn cli_dry_run_works() {
|
||||||
|
let opt = Opt::try_parse_from([
|
||||||
|
env!("CARGO_PKG_NAME"),
|
||||||
|
"--uri",
|
||||||
|
"hi",
|
||||||
|
"--seed-or-path",
|
||||||
|
"//Alice",
|
||||||
|
"dry-run",
|
||||||
|
"phrag-mms",
|
||||||
|
])
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
opt,
|
||||||
|
Opt {
|
||||||
|
uri: "hi".to_string(),
|
||||||
|
seed_or_path: "//Alice".to_string(),
|
||||||
|
command: Command::DryRun(DryRunConfig {
|
||||||
|
at: None,
|
||||||
|
solver: Solver::PhragMMS { iterations: 10 },
|
||||||
|
force_snapshot: false,
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn cli_emergency_works() {
|
||||||
|
let opt = Opt::try_parse_from([
|
||||||
|
env!("CARGO_PKG_NAME"),
|
||||||
|
"--uri",
|
||||||
|
"hi",
|
||||||
|
"--seed-or-path",
|
||||||
|
"//Alice",
|
||||||
|
"emergency-solution",
|
||||||
|
"99",
|
||||||
|
"phrag-mms",
|
||||||
|
"--iterations",
|
||||||
|
"1337",
|
||||||
|
])
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
opt,
|
||||||
|
Opt {
|
||||||
|
uri: "hi".to_string(),
|
||||||
|
seed_or_path: "//Alice".to_string(),
|
||||||
|
command: Command::EmergencySolution(EmergencySolutionConfig {
|
||||||
|
take: Some(99),
|
||||||
|
at: None,
|
||||||
|
solver: Solver::PhragMMS { iterations: 1337 }
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
use assert_cmd::{cargo::cargo_bin, Command};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn cli_version_works() {
|
||||||
|
let crate_name = env!("CARGO_PKG_NAME");
|
||||||
|
let output = Command::new(cargo_bin(crate_name)).arg("--version").output().unwrap();
|
||||||
|
|
||||||
|
assert!(output.status.success(), "command returned with non-success exit code");
|
||||||
|
let version = String::from_utf8_lossy(&output.stdout).trim().to_owned();
|
||||||
|
|
||||||
|
assert_eq!(version, format!("{} {}", crate_name, env!("CARGO_PKG_VERSION")));
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user