From 10d77e23405172166b3feb8b25b38ee6cc01cd1c Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Tue, 12 May 2026 12:57:34 +0300 Subject: [PATCH 01/30] simplexup: add cargo-nextest installation --- simplexup/simplexup | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/simplexup/simplexup b/simplexup/simplexup index 4947901..ef27f83 100755 --- a/simplexup/simplexup +++ b/simplexup/simplexup @@ -4,6 +4,7 @@ set -eo pipefail # NOTE: if you make modifications to this script, please increment the version number. # WARNING: the SemVer pattern: major.minor.patch must be followed as we use it to determine if the script is up to date. SIMPLEXUP_INSTALLER_VERSION="0.0.4" +NEXTEST_VERSION="0.9.133" BASE_DIR=${XDG_CONFIG_HOME:-$HOME} SIMPLEX_DIR=${SIMPLEX_DIR:-"$BASE_DIR/.simplex"} @@ -63,6 +64,9 @@ main() { LATEST_TAG=$(latest_tag) SIMPLEX_VERSION=${SIMPLEX_VERSION:-$LATEST_TAG} + # Install default version of nextest for simplex + install_nextest_version "$NEXTEST_VERSION" + # Check if the requested version exists if [[ "${SIMPLEX_VERSION}" != "${LATEST_TAG}" ]]; then validate_tag_version "${SIMPLEX_VERSION}" "${SIMPLEX_REPO}" @@ -601,6 +605,26 @@ install_simplex_from_commit() { rm -rf "${tmp_dir}" } +install_nextest_version() { + local nextest_version=$1 + + # Check if cargo-nextest is already installed and matches the required version + say "Installing cargo-nextest version..." + if check_cmd cargo-nextest --no-pager; then + local current_version + current_version=$(cargo nextest show-config version --no-pager | head -n 1 | awk '{print $4}') + + if [[ "$current_version" == "$nextest_version" ]]; then + say "cargo-nextest $nextest_version is already installed, skipping installation." + return 0 + fi + fi + + say "Installing cargo-nextest version $nextest_version..." + ensure cargo install cargo-nextest --version "$nextest_version" --locked --force + return 0 +} + # Form a comma separated list with 'and' for user experience form_str_list() { local STR_LIST=("$@") From 8eabcb94862db5becd48f1e59a29f96d7ab299a7 Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Tue, 12 May 2026 17:27:34 +0300 Subject: [PATCH 02/30] cli: migrate from `cargo test` to `cargo nextest` --- crates/cli/src/commands/test.rs | 65 ++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 29 deletions(-) diff --git a/crates/cli/src/commands/test.rs b/crates/cli/src/commands/test.rs index dd6cdca..1234f1a 100644 --- a/crates/cli/src/commands/test.rs +++ b/crates/cli/src/commands/test.rs @@ -2,11 +2,15 @@ use std::path::PathBuf; use std::process::Stdio; use smplx_sdk::global::Verbosity; -use smplx_test::{SMPLX_TEST_MARKER, TestConfig}; +use smplx_test::TestConfig; use super::core::{TestArguments, TestFlags}; use super::error::CommandError; +// TODO: it's impossible to insert "_smplx_test" constant value in concat macro, remove or reuse constant +/// Nextest dsl variable to filter and use only simplex tests +const SMPLX_DSL_TEST_MARKER: &str = concat!("test(/", "_smplx_test", "$/)"); + pub struct Test {} impl Test { @@ -54,9 +58,10 @@ impl Test { flags: &TestFlags, ) -> std::process::Command { let mut cargo_test_command = std::process::Command::new("cargo"); - cargo_test_command.arg("test"); + cargo_test_command.arg("nextest"); + cargo_test_command.arg("run"); - cargo_test_command.args(Self::build_cargo_test_args(args, flags)); + cargo_test_command.args(Self::build_cargo_nextest_args(args, flags)); cargo_test_command.args(Self::build_test_bin_args(args, flags)); cargo_test_command @@ -68,55 +73,57 @@ impl Test { cargo_test_command } - fn build_cargo_test_args(args: &TestArguments, flags: &TestFlags) -> Vec { + fn build_cargo_nextest_args(args: &TestArguments, flags: &TestFlags) -> Vec { let mut cargo_test_args = Vec::new(); - if let Some(target) = &args.target { - cargo_test_args.push("--test".into()); - cargo_test_args.push(target.clone()); + if args.filters.is_empty() { + cargo_test_args.push("--filterset".into()); + + if let Some(target) = &args.target { + cargo_test_args.push(format!("binary({target}) and {SMPLX_DSL_TEST_MARKER}")); + } else { + cargo_test_args.push(SMPLX_DSL_TEST_MARKER.into()); + } + } else { + cargo_test_args.extend(args.filters.iter().cloned()); } if flags.no_fail_fast { cargo_test_args.push("--no-fail-fast".into()); } + if flags.nocapture { + cargo_test_args.push("--nocapture".into()); + } + if flags.quiet { + cargo_test_args.push("--cargo-quiet".into()); + } + if flags.verbose != 0 { + cargo_test_args.push("--verbose".into()); + cargo_test_args.push("--cargo-verbose".into()); + } cargo_test_args } - fn build_test_bin_args(args: &TestArguments, flags: &TestFlags) -> Vec { + fn build_test_bin_args(_args: &TestArguments, flags: &TestFlags) -> Vec { let mut test_bin_args = Vec::new(); - test_bin_args.push("--".into()); - - // TODO: custom filters may run non-simplex tests due to cargo limitations. Figure out how to fix this - if args.filters.is_empty() { - test_bin_args.push(SMPLX_TEST_MARKER.to_string()); - } else { - test_bin_args.extend(args.filters.iter().cloned()); - } - test_bin_args.extend(Self::build_test_bin_flags(flags)); + if !test_bin_args.is_empty() { + test_bin_args.insert(0, "--".into()); + } test_bin_args } fn build_test_bin_flags(flags: &TestFlags) -> Vec { - let mut test_bin_args = Vec::new(); + let mut test_bin_flags = Vec::new(); - if flags.nocapture { - test_bin_args.push("--nocapture".into()); - } - if flags.show_output { - test_bin_args.push("--show-output".into()); - } if flags.ignored { - test_bin_args.push("--ignored".into()); - } - if flags.quiet { - test_bin_args.push("--quiet".into()); + test_bin_flags.push("--ignored".into()); } - test_bin_args + test_bin_flags } fn get_test_config_cache_name() -> Result { From 681de6455625c14188488c783f51473531b499e0 Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Thu, 14 May 2026 10:17:25 +0300 Subject: [PATCH 03/30] cli: add formal nextest version check fix simplexup version check commands --- Cargo.lock | 5 +++-- crates/cli/Cargo.toml | 1 + crates/cli/src/commands/error.rs | 23 +++++++++++++++++++++++ crates/test/src/config.rs | 10 ++++++++++ simplexup/simplexup | 4 ++-- 5 files changed, 39 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 153444d..5322cc4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1174,9 +1174,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "serde" @@ -1319,6 +1319,7 @@ dependencies = [ "ctrlc", "dotenvy", "minreq", + "semver", "serde", "serde_json", "smplx-build", diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index a558313..dc2b104 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -31,3 +31,4 @@ clap = { version = "4", features = ["derive", "env"] } toml_edit = { version = "0.23.9" } ctrlc = { version = "3.5.2", features = ["termination"] } serde_json = { version = "1.0.149" } +semver = { version = "1.0.28" } diff --git a/crates/cli/src/commands/error.rs b/crates/cli/src/commands/error.rs index b9f3d19..f2c1235 100644 --- a/crates/cli/src/commands/error.rs +++ b/crates/cli/src/commands/error.rs @@ -20,6 +20,9 @@ pub enum CommandError { #[error(transparent)] Clean(#[from] CleanError), + #[error(transparent)] + NextestVersionCheck(#[from] NextestVersionCheckError), + #[error("IO error: {0}")] Io(#[from] std::io::Error), @@ -65,3 +68,23 @@ pub enum CleanError { #[error("Failed to remove file '{1}': {0}")] RemoveFile(std::io::Error, PathBuf), } + +#[derive(thiserror::Error, Debug)] +pub enum NextestVersionCheckError { + #[error("Nextest is not installed. Please run `simplexup` to install.")] + NextestNotInstalled, + + #[error("Failed to parse nextest version string '{0}': {1}")] + NextestVersionParseError(String, semver::Error), + + #[error("Failed to parse the required version bound '{0}': {1}")] + NextestVersionReqParseError(String, semver::Error), + + #[error( + "Your nextest version {current_version} does not meet the requirement: {required_bound}. Please run `simplexup` to install." + )] + UnsupportedNextestVersion { + current_version: String, + required_bound: String, + }, +} diff --git a/crates/test/src/config.rs b/crates/test/src/config.rs index bacb551..d743f2f 100644 --- a/crates/test/src/config.rs +++ b/crates/test/src/config.rs @@ -14,6 +14,7 @@ use super::error::TestError; pub const TEST_ENV_NAME: &str = "SIMPLEX_TEST_ENV"; pub const DEFAULT_TEST_MNEMONIC: &str = "exist carry drive collect lend cereal occur much tiger just involve mean"; pub const DEFAULT_BITCOINS: u64 = 10_000_000; +const DEFAULT_NEXTEST_SEMVER_REQUIREMENT: &str = "=0.9.133"; #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(default)] @@ -23,6 +24,9 @@ pub struct TestConfig { pub esplora: Option, pub rpc: Option, pub verbosity: Verbosity, + #[doc(hidden)] + #[serde(skip, default = "get_default_nextest_semver_requirement")] + pub nextest_semver_requirement: String, } #[derive(Debug, Default, Clone, Serialize, Deserialize)] @@ -81,6 +85,12 @@ impl Default for TestConfig { esplora: None, rpc: None, verbosity: Verbosity::None, + nextest_semver_requirement: get_default_nextest_semver_requirement(), } } } + +#[inline] +fn get_default_nextest_semver_requirement() -> String { + DEFAULT_NEXTEST_SEMVER_REQUIREMENT.into() +} diff --git a/simplexup/simplexup b/simplexup/simplexup index ef27f83..ce51ca9 100755 --- a/simplexup/simplexup +++ b/simplexup/simplexup @@ -610,9 +610,9 @@ install_nextest_version() { # Check if cargo-nextest is already installed and matches the required version say "Installing cargo-nextest version..." - if check_cmd cargo-nextest --no-pager; then + if check_cmd cargo-nextest nextest; then local current_version - current_version=$(cargo nextest show-config version --no-pager | head -n 1 | awk '{print $4}') + current_version=$(cargo nextest show-config version | head -n 1 | awk '{print $4}') if [[ "$current_version" == "$nextest_version" ]]; then say "cargo-nextest $nextest_version is already installed, skipping installation." From 78dc70cb72806491f6d5031776f5efe84b50f2d1 Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Mon, 18 May 2026 18:37:05 +0300 Subject: [PATCH 04/30] cli: change dependency from `cargo nextest` to local `smplx-nextest` installation * edit simplexup to install local binary version * add one more verbosity level for additional cargo verbosity * fix todo for const variable --- README.md | 2 +- crates/cli/src/commands/test.rs | 12 +++++--- crates/sdk/src/global.rs | 2 +- crates/test/src/macros/core.rs | 9 +++++- simplexup/simplexup | 53 ++++++++++++++++++++++++--------- 5 files changed, 57 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 208bb79..1a0fac5 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ rpc_password = "password" [test] mnemonic = "exist carry drive collect lend cereal occur much tiger just involve mean" bitcoins = 10_000_000 -verbosity = 0 # 0 - none, 1 - debug, 2 - trace +verbosity = 0 # 0 - none, 1 - debug, 2 - trace, 3 - trace + additional cargo verbose output [test.esplora] url = "" diff --git a/crates/cli/src/commands/test.rs b/crates/cli/src/commands/test.rs index 1234f1a..3263372 100644 --- a/crates/cli/src/commands/test.rs +++ b/crates/cli/src/commands/test.rs @@ -2,14 +2,13 @@ use std::path::PathBuf; use std::process::Stdio; use smplx_sdk::global::Verbosity; -use smplx_test::TestConfig; +use smplx_test::{TestConfig, smplx_test_marker}; use super::core::{TestArguments, TestFlags}; use super::error::CommandError; -// TODO: it's impossible to insert "_smplx_test" constant value in concat macro, remove or reuse constant /// Nextest dsl variable to filter and use only simplex tests -const SMPLX_DSL_TEST_MARKER: &str = concat!("test(/", "_smplx_test", "$/)"); +const SMPLX_DSL_TEST_MARKER: &str = concat!("test(/", smplx_test_marker!(), "$/)"); pub struct Test {} @@ -57,7 +56,7 @@ impl Test { args: &TestArguments, flags: &TestFlags, ) -> std::process::Command { - let mut cargo_test_command = std::process::Command::new("cargo"); + let mut cargo_test_command = std::process::Command::new("smplx-nextest"); cargo_test_command.arg("nextest"); cargo_test_command.arg("run"); @@ -100,6 +99,11 @@ impl Test { if flags.verbose != 0 { cargo_test_args.push("--verbose".into()); cargo_test_args.push("--cargo-verbose".into()); + + // `-vvv` verbosity level + if flags.verbose == Verbosity::MAX_VERBOSITY_LEVEL { + cargo_test_args.push("--cargo-verbose".into()); + } } cargo_test_args diff --git a/crates/sdk/src/global.rs b/crates/sdk/src/global.rs index f578267..3b9337e 100644 --- a/crates/sdk/src/global.rs +++ b/crates/sdk/src/global.rs @@ -26,7 +26,7 @@ pub enum Verbosity { impl Verbosity { /// The maximum allowed verbosity level. - pub const MAX_VERBOSITY_LEVEL: u8 = 2; + pub const MAX_VERBOSITY_LEVEL: u8 = 3; /// Creates a `Verbosity` instance from the number of verbosity flags provided (e.g., -v, -vv). #[must_use] diff --git a/crates/test/src/macros/core.rs b/crates/test/src/macros/core.rs index 8541145..c6ecbba 100644 --- a/crates/test/src/macros/core.rs +++ b/crates/test/src/macros/core.rs @@ -3,7 +3,14 @@ use syn::parse::Parser; use crate::TEST_ENV_NAME; -pub const SMPLX_TEST_MARKER: &str = "_smplx_test"; +#[macro_export] +macro_rules! smplx_test_marker { + () => { + "_smplx_test" + }; +} + +pub const SMPLX_TEST_MARKER: &str = smplx_test_marker!(); type AttributeArgs = syn::punctuated::Punctuated; diff --git a/simplexup/simplexup b/simplexup/simplexup index ce51ca9..8c1b7d9 100755 --- a/simplexup/simplexup +++ b/simplexup/simplexup @@ -5,6 +5,7 @@ set -eo pipefail # WARNING: the SemVer pattern: major.minor.patch must be followed as we use it to determine if the script is up to date. SIMPLEXUP_INSTALLER_VERSION="0.0.4" NEXTEST_VERSION="0.9.133" +BINSTALL_VERSION="1.19.1" BASE_DIR=${XDG_CONFIG_HOME:-$HOME} SIMPLEX_DIR=${SIMPLEX_DIR:-"$BASE_DIR/.simplex"} @@ -15,14 +16,17 @@ SIMPLEX_BIN_PATH="$SIMPLEX_BIN_DIR/simplexup" SIMPLEXUP_IGNORE_VERIFICATION=false DEFAULT_SIMPLEX_REPO="BlockstreamResearch/smplx" +SMPLX_NEXTEST_NAME="smplx-nextest" +SMPLX_BIN_NAME="simplex" DEP_BINS=(elementsd electrs) -BINS=(simplex "${DEP_BINS[@]}") +BINS=("${SMPLX_BIN_NAME}" "${SMPLX_NEXTEST_NAME}" "${DEP_BINS[@]}") HASH_NAMES=() HASH_VALUES=() main() { need_cmd git need_cmd curl + need_cmd cargo while [[ -n $1 ]]; do case $1 in @@ -64,9 +68,6 @@ main() { LATEST_TAG=$(latest_tag) SIMPLEX_VERSION=${SIMPLEX_VERSION:-$LATEST_TAG} - # Install default version of nextest for simplex - install_nextest_version "$NEXTEST_VERSION" - # Check if the requested version exists if [[ "${SIMPLEX_VERSION}" != "${LATEST_TAG}" ]]; then validate_tag_version "${SIMPLEX_VERSION}" "${SIMPLEX_REPO}" @@ -86,7 +87,12 @@ main() { version_dir="${SIMPLEX_VERSIONS_DIR}/${SIMPLEX_VERSION}" ensure mkdir -p "$version_dir" - local BINS_TO_DOWNLOAD=("${BINS[@]}") + # Install `cargo-binstall` for installing various binaries from the internet + install_binstall_version "$BINSTALL_VERSION" + # Install default version of `nextest` for simplex + install_nextest_binary "$NEXTEST_VERSION" "$version_dir" + + local BINS_TO_DOWNLOAD=("${SMPLX_BIN_NAME}" "${DEP_BINS[@]}") if [[ -n "$SIMPLEX_COMMIT" ]]; then local author="$(echo "${SIMPLEX_REPO}" | cut -d'/' -f1 -)" @@ -599,29 +605,48 @@ install_simplex_from_commit() { say "Installing Simplex version $simplex_version" ensure cargo build --release --manifest-path "${tmp_dir}/Cargo.toml" - ensure mv "${tmp_dir}/target/release/simplex" "${out_dir}/simplex" + ensure mv "${tmp_dir}/target/release/${SMPLX_BIN_NAME}" "${out_dir}/${SMPLX_BIN_NAME}" say "Removing temporary directory..." rm -rf "${tmp_dir}" } -install_nextest_version() { +install_nextest_binary() { local nextest_version=$1 + local install_dir=$2 - # Check if cargo-nextest is already installed and matches the required version - say "Installing cargo-nextest version..." - if check_cmd cargo-nextest nextest; then + # Check if smplx-nextest is already installed and matches the required version + say "Checking ${SMPLX_NEXTEST_NAME} version..." + local smplx_nextest_bin_full_path="${install_dir}/${SMPLX_NEXTEST_NAME}" + if check_cmd "${smplx_nextest_bin_full_path}" nextest; then local current_version - current_version=$(cargo nextest show-config version | head -n 1 | awk '{print $4}') + current_version=$(${SMPLX_NEXTEST_NAME} nextest show-config version | head -n 1 | awk '{print $4}') if [[ "$current_version" == "$nextest_version" ]]; then - say "cargo-nextest $nextest_version is already installed, skipping installation." + say "${SMPLX_NEXTEST_NAME} $nextest_version is already installed, skipping installation." return 0 fi fi - say "Installing cargo-nextest version $nextest_version..." - ensure cargo install cargo-nextest --version "$nextest_version" --locked --force + + say "Installing ${SMPLX_NEXTEST_NAME} version ${nextest_version} into ${install_dir}..." + ensure cargo binstall cargo-nextest@"${nextest_version}" --only-signed --install-path "${install_dir}" --no-track --force --min-tls-version 1.3 -y + mv "${install_dir}/cargo-nextest" "${smplx_nextest_bin_full_path}" + return 0 +} + +install_binstall_version() { + local binstall_version=$1 + + # Check if cargo-binstall is already installed + say "Checking cargo-binstall version..." + if check_cmd cargo-binstall; then + say "cargo-binstall $binstall_version is already installed, skipping installation." + return 0 + fi + + say "Installing cargo-binstall version $binstall_version..." + ensure cargo install cargo-binstall --version "$binstall_version" --locked --force return 0 } From e2a0a63ec3aa04366456887d7901dfd4ac362ef6 Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Tue, 19 May 2026 16:31:27 +0300 Subject: [PATCH 05/30] cli: edit namings in `commands/test.rs` for building `smplx-nextest` command --- crates/cli/src/commands/test.rs | 46 ++++++++++++++++----------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/crates/cli/src/commands/test.rs b/crates/cli/src/commands/test.rs index 3263372..710c3dc 100644 --- a/crates/cli/src/commands/test.rs +++ b/crates/cli/src/commands/test.rs @@ -8,7 +8,7 @@ use super::core::{TestArguments, TestFlags}; use super::error::CommandError; /// Nextest dsl variable to filter and use only simplex tests -const SMPLX_DSL_TEST_MARKER: &str = concat!("test(/", smplx_test_marker!(), "$/)"); +const SMPLX_NEXTEST_DSL_TEST_MARKER: &str = concat!("test(/", smplx_test_marker!(), "$/)"); pub struct Test {} @@ -31,9 +31,9 @@ impl Test { config.to_file(&cache_path)?; - let mut cargo_test_command = Self::build_cargo_test_command(&cache_path, args, flags); + let mut cargo_nextest_command = Self::build_cargo_nextest_command(&cache_path, args, flags); - let output = cargo_test_command.output()?; + let output = cargo_nextest_command.output()?; match output.status.code() { Some(code) => { @@ -51,62 +51,62 @@ impl Test { Ok(()) } - fn build_cargo_test_command( + fn build_cargo_nextest_command( cache_path: &PathBuf, args: &TestArguments, flags: &TestFlags, ) -> std::process::Command { - let mut cargo_test_command = std::process::Command::new("smplx-nextest"); - cargo_test_command.arg("nextest"); - cargo_test_command.arg("run"); + let mut cargo_nextest_command = std::process::Command::new("smplx-nextest"); + cargo_nextest_command.arg("nextest"); + cargo_nextest_command.arg("run"); - cargo_test_command.args(Self::build_cargo_nextest_args(args, flags)); - cargo_test_command.args(Self::build_test_bin_args(args, flags)); + cargo_nextest_command.args(Self::build_cargo_nextest_args(args, flags)); + cargo_nextest_command.args(Self::build_test_bin_args(args, flags)); - cargo_test_command + cargo_nextest_command .env(smplx_test::TEST_ENV_NAME, cache_path) .stdin(Stdio::inherit()) .stderr(Stdio::inherit()) .stdout(Stdio::inherit()); - cargo_test_command + cargo_nextest_command } fn build_cargo_nextest_args(args: &TestArguments, flags: &TestFlags) -> Vec { - let mut cargo_test_args = Vec::new(); + let mut cargo_nextest_args = Vec::new(); if args.filters.is_empty() { - cargo_test_args.push("--filterset".into()); + cargo_nextest_args.push("--filterset".into()); if let Some(target) = &args.target { - cargo_test_args.push(format!("binary({target}) and {SMPLX_DSL_TEST_MARKER}")); + cargo_nextest_args.push(format!("binary({target}) and {SMPLX_NEXTEST_DSL_TEST_MARKER}")); } else { - cargo_test_args.push(SMPLX_DSL_TEST_MARKER.into()); + cargo_nextest_args.push(SMPLX_NEXTEST_DSL_TEST_MARKER.into()); } } else { - cargo_test_args.extend(args.filters.iter().cloned()); + cargo_nextest_args.extend(args.filters.iter().cloned()); } if flags.no_fail_fast { - cargo_test_args.push("--no-fail-fast".into()); + cargo_nextest_args.push("--no-fail-fast".into()); } if flags.nocapture { - cargo_test_args.push("--nocapture".into()); + cargo_nextest_args.push("--nocapture".into()); } if flags.quiet { - cargo_test_args.push("--cargo-quiet".into()); + cargo_nextest_args.push("--cargo-quiet".into()); } if flags.verbose != 0 { - cargo_test_args.push("--verbose".into()); - cargo_test_args.push("--cargo-verbose".into()); + cargo_nextest_args.push("--verbose".into()); + cargo_nextest_args.push("--cargo-verbose".into()); // `-vvv` verbosity level if flags.verbose == Verbosity::MAX_VERBOSITY_LEVEL { - cargo_test_args.push("--cargo-verbose".into()); + cargo_nextest_args.push("--cargo-verbose".into()); } } - cargo_test_args + cargo_nextest_args } fn build_test_bin_args(_args: &TestArguments, flags: &TestFlags) -> Vec { From 5c3dddb25831be48c9d98271ccb1e6d534c14d29 Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Tue, 19 May 2026 16:47:04 +0300 Subject: [PATCH 06/30] remove leftover semver check arguments --- Cargo.lock | 1 - crates/cli/Cargo.toml | 1 - crates/cli/src/commands/error.rs | 23 ----------------------- crates/test/src/config.rs | 10 ---------- 4 files changed, 35 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5322cc4..f658163 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1319,7 +1319,6 @@ dependencies = [ "ctrlc", "dotenvy", "minreq", - "semver", "serde", "serde_json", "smplx-build", diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index dc2b104..a558313 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -31,4 +31,3 @@ clap = { version = "4", features = ["derive", "env"] } toml_edit = { version = "0.23.9" } ctrlc = { version = "3.5.2", features = ["termination"] } serde_json = { version = "1.0.149" } -semver = { version = "1.0.28" } diff --git a/crates/cli/src/commands/error.rs b/crates/cli/src/commands/error.rs index f2c1235..b9f3d19 100644 --- a/crates/cli/src/commands/error.rs +++ b/crates/cli/src/commands/error.rs @@ -20,9 +20,6 @@ pub enum CommandError { #[error(transparent)] Clean(#[from] CleanError), - #[error(transparent)] - NextestVersionCheck(#[from] NextestVersionCheckError), - #[error("IO error: {0}")] Io(#[from] std::io::Error), @@ -68,23 +65,3 @@ pub enum CleanError { #[error("Failed to remove file '{1}': {0}")] RemoveFile(std::io::Error, PathBuf), } - -#[derive(thiserror::Error, Debug)] -pub enum NextestVersionCheckError { - #[error("Nextest is not installed. Please run `simplexup` to install.")] - NextestNotInstalled, - - #[error("Failed to parse nextest version string '{0}': {1}")] - NextestVersionParseError(String, semver::Error), - - #[error("Failed to parse the required version bound '{0}': {1}")] - NextestVersionReqParseError(String, semver::Error), - - #[error( - "Your nextest version {current_version} does not meet the requirement: {required_bound}. Please run `simplexup` to install." - )] - UnsupportedNextestVersion { - current_version: String, - required_bound: String, - }, -} diff --git a/crates/test/src/config.rs b/crates/test/src/config.rs index d743f2f..bacb551 100644 --- a/crates/test/src/config.rs +++ b/crates/test/src/config.rs @@ -14,7 +14,6 @@ use super::error::TestError; pub const TEST_ENV_NAME: &str = "SIMPLEX_TEST_ENV"; pub const DEFAULT_TEST_MNEMONIC: &str = "exist carry drive collect lend cereal occur much tiger just involve mean"; pub const DEFAULT_BITCOINS: u64 = 10_000_000; -const DEFAULT_NEXTEST_SEMVER_REQUIREMENT: &str = "=0.9.133"; #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(default)] @@ -24,9 +23,6 @@ pub struct TestConfig { pub esplora: Option, pub rpc: Option, pub verbosity: Verbosity, - #[doc(hidden)] - #[serde(skip, default = "get_default_nextest_semver_requirement")] - pub nextest_semver_requirement: String, } #[derive(Debug, Default, Clone, Serialize, Deserialize)] @@ -85,12 +81,6 @@ impl Default for TestConfig { esplora: None, rpc: None, verbosity: Verbosity::None, - nextest_semver_requirement: get_default_nextest_semver_requirement(), } } } - -#[inline] -fn get_default_nextest_semver_requirement() -> String { - DEFAULT_NEXTEST_SEMVER_REQUIREMENT.into() -} From 4b8d1c22b3eb0ed3b5f6403ad4668432616644f9 Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Thu, 21 May 2026 10:47:55 +0300 Subject: [PATCH 07/30] cli: move forming of flags to separate function --- crates/cli/src/commands/test.rs | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/crates/cli/src/commands/test.rs b/crates/cli/src/commands/test.rs index 710c3dc..fda0aa0 100644 --- a/crates/cli/src/commands/test.rs +++ b/crates/cli/src/commands/test.rs @@ -87,26 +87,37 @@ impl Test { cargo_nextest_args.extend(args.filters.iter().cloned()); } + cargo_nextest_args.extend(Self::build_cargo_nextest_flags(flags)); + + cargo_nextest_args + } + + fn build_cargo_nextest_flags(flags: &TestFlags) -> Vec { + let mut cargo_nextest_flags = Vec::new(); + if flags.no_fail_fast { - cargo_nextest_args.push("--no-fail-fast".into()); + cargo_nextest_flags.push("--no-fail-fast".into()); } + if flags.nocapture { - cargo_nextest_args.push("--nocapture".into()); + cargo_nextest_flags.push("--nocapture".into()); } + if flags.quiet { - cargo_nextest_args.push("--cargo-quiet".into()); + cargo_nextest_flags.push("--cargo-quiet".into()); } + if flags.verbose != 0 { - cargo_nextest_args.push("--verbose".into()); - cargo_nextest_args.push("--cargo-verbose".into()); + cargo_nextest_flags.push("--verbose".into()); + cargo_nextest_flags.push("--cargo-verbose".into()); // `-vvv` verbosity level if flags.verbose == Verbosity::MAX_VERBOSITY_LEVEL { - cargo_nextest_args.push("--cargo-verbose".into()); + cargo_nextest_flags.push("--cargo-verbose".into()); } } - cargo_nextest_args + cargo_nextest_flags } fn build_test_bin_args(_args: &TestArguments, flags: &TestFlags) -> Vec { From 61175ddf10f6ecc7c1906a3a1f4a5279dc7394e4 Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Thu, 21 May 2026 10:49:52 +0300 Subject: [PATCH 08/30] simplexup: add newlines --- simplexup/simplexup | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/simplexup/simplexup b/simplexup/simplexup index 8c1b7d9..bc44e85 100755 --- a/simplexup/simplexup +++ b/simplexup/simplexup @@ -618,6 +618,7 @@ install_nextest_binary() { # Check if smplx-nextest is already installed and matches the required version say "Checking ${SMPLX_NEXTEST_NAME} version..." local smplx_nextest_bin_full_path="${install_dir}/${SMPLX_NEXTEST_NAME}" + if check_cmd "${smplx_nextest_bin_full_path}" nextest; then local current_version current_version=$(${SMPLX_NEXTEST_NAME} nextest show-config version | head -n 1 | awk '{print $4}') @@ -628,10 +629,10 @@ install_nextest_binary() { fi fi - say "Installing ${SMPLX_NEXTEST_NAME} version ${nextest_version} into ${install_dir}..." ensure cargo binstall cargo-nextest@"${nextest_version}" --only-signed --install-path "${install_dir}" --no-track --force --min-tls-version 1.3 -y mv "${install_dir}/cargo-nextest" "${smplx_nextest_bin_full_path}" + return 0 } @@ -647,6 +648,7 @@ install_binstall_version() { say "Installing cargo-binstall version $binstall_version..." ensure cargo install cargo-binstall --version "$binstall_version" --locked --force + return 0 } From 05add0175fb3626ffab07003fba472c04ec61f50 Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Thu, 21 May 2026 11:04:11 +0300 Subject: [PATCH 09/30] simplexup: simplify version retrieval for comparison --- simplexup/simplexup | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simplexup/simplexup b/simplexup/simplexup index bc44e85..6e7193b 100755 --- a/simplexup/simplexup +++ b/simplexup/simplexup @@ -621,7 +621,7 @@ install_nextest_binary() { if check_cmd "${smplx_nextest_bin_full_path}" nextest; then local current_version - current_version=$(${SMPLX_NEXTEST_NAME} nextest show-config version | head -n 1 | awk '{print $4}') + current_version=$(${SMPLX_NEXTEST_NAME} --version | head -n 1 | awk '{print $2}') if [[ "$current_version" == "$nextest_version" ]]; then say "${SMPLX_NEXTEST_NAME} $nextest_version is already installed, skipping installation." From 5c61739b5b1e62ae98507fc9c05992ef0b914c44 Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Thu, 21 May 2026 13:58:36 +0300 Subject: [PATCH 10/30] cli: move bin args building to one function --- crates/cli/src/commands/test.rs | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/crates/cli/src/commands/test.rs b/crates/cli/src/commands/test.rs index fda0aa0..bde5534 100644 --- a/crates/cli/src/commands/test.rs +++ b/crates/cli/src/commands/test.rs @@ -61,7 +61,7 @@ impl Test { cargo_nextest_command.arg("run"); cargo_nextest_command.args(Self::build_cargo_nextest_args(args, flags)); - cargo_nextest_command.args(Self::build_test_bin_args(args, flags)); + cargo_nextest_command.args(Self::build_test_bin_flags(flags)); cargo_nextest_command .env(smplx_test::TEST_ENV_NAME, cache_path) @@ -120,10 +120,13 @@ impl Test { cargo_nextest_flags } - fn build_test_bin_args(_args: &TestArguments, flags: &TestFlags) -> Vec { + fn build_test_bin_flags(flags: &TestFlags) -> Vec { let mut test_bin_args = Vec::new(); - test_bin_args.extend(Self::build_test_bin_flags(flags)); + if flags.ignored { + test_bin_args.push("--ignored".into()); + } + if !test_bin_args.is_empty() { test_bin_args.insert(0, "--".into()); } @@ -131,16 +134,6 @@ impl Test { test_bin_args } - fn build_test_bin_flags(flags: &TestFlags) -> Vec { - let mut test_bin_flags = Vec::new(); - - if flags.ignored { - test_bin_flags.push("--ignored".into()); - } - - test_bin_flags - } - fn get_test_config_cache_name() -> Result { const TARGET_DIR_NAME: &str = "target"; const SIMPLEX_CACHE_DIR_NAME: &str = "simplex"; From 146d050b4d599e24af2d40eae93242fd856ae591 Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Mon, 25 May 2026 15:07:02 +0300 Subject: [PATCH 11/30] simplexup: bump version from 0.0.4 to 0.0.5 --- simplexup/simplexup | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/simplexup/simplexup b/simplexup/simplexup index 6e7193b..9aaf1f3 100755 --- a/simplexup/simplexup +++ b/simplexup/simplexup @@ -3,7 +3,7 @@ set -eo pipefail # NOTE: if you make modifications to this script, please increment the version number. # WARNING: the SemVer pattern: major.minor.patch must be followed as we use it to determine if the script is up to date. -SIMPLEXUP_INSTALLER_VERSION="0.0.4" +SIMPLEXUP_INSTALLER_VERSION="0.0.5" NEXTEST_VERSION="0.9.133" BINSTALL_VERSION="1.19.1" From ee19246321300e68e09c4062c4d2d9b39c4c8a09 Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Mon, 25 May 2026 15:57:58 +0300 Subject: [PATCH 12/30] simplexup: add version check in cargo-binstall --- simplexup/simplexup | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/simplexup/simplexup b/simplexup/simplexup index 9aaf1f3..4772b87 100755 --- a/simplexup/simplexup +++ b/simplexup/simplexup @@ -17,6 +17,7 @@ SIMPLEXUP_IGNORE_VERIFICATION=false DEFAULT_SIMPLEX_REPO="BlockstreamResearch/smplx" SMPLX_NEXTEST_NAME="smplx-nextest" +CARGO_BINSTALL_NAME="cargo-binstall" SMPLX_BIN_NAME="simplex" DEP_BINS=(elementsd electrs) BINS=("${SMPLX_BIN_NAME}" "${SMPLX_NEXTEST_NAME}" "${DEP_BINS[@]}") @@ -621,7 +622,7 @@ install_nextest_binary() { if check_cmd "${smplx_nextest_bin_full_path}" nextest; then local current_version - current_version=$(${SMPLX_NEXTEST_NAME} --version | head -n 1 | awk '{print $2}') + current_version=$(${smplx_nextest_bin_full_path} --version | head -n 1 | awk '{print $2}') if [[ "$current_version" == "$nextest_version" ]]; then say "${SMPLX_NEXTEST_NAME} $nextest_version is already installed, skipping installation." @@ -630,7 +631,7 @@ install_nextest_binary() { fi say "Installing ${SMPLX_NEXTEST_NAME} version ${nextest_version} into ${install_dir}..." - ensure cargo binstall cargo-nextest@"${nextest_version}" --only-signed --install-path "${install_dir}" --no-track --force --min-tls-version 1.3 -y + ensure "${CARGO_BINSTALL_NAME}" cargo-nextest@"${nextest_version}" --only-signed --install-path "${install_dir}" --no-track --force --min-tls-version 1.3 -y mv "${install_dir}/cargo-nextest" "${smplx_nextest_bin_full_path}" return 0 @@ -639,15 +640,20 @@ install_nextest_binary() { install_binstall_version() { local binstall_version=$1 - # Check if cargo-binstall is already installed - say "Checking cargo-binstall version..." - if check_cmd cargo-binstall; then - say "cargo-binstall $binstall_version is already installed, skipping installation." - return 0 + # Check if cargo-binstall is already installed and matches the required version + say "Checking ${CARGO_BINSTALL_NAME} version..." + if check_cmd ${CARGO_BINSTALL_NAME}; then + local current_version + current_version=$(${CARGO_BINSTALL_NAME} -V | head -n 1 | awk '{print $1}') + + if [[ "$current_version" == "$binstall_version" ]]; then + say "${CARGO_BINSTALL_NAME} ${binstall_version} is already installed, skipping installation." + return 0 + fi fi - say "Installing cargo-binstall version $binstall_version..." - ensure cargo install cargo-binstall --version "$binstall_version" --locked --force + say "Installing ${CARGO_BINSTALL_NAME} version $binstall_version..." + ensure cargo install "${CARGO_BINSTALL_NAME}" --version "$binstall_version" --locked --force return 0 } From ee104a430afa7e76c95585c08b4d824adcc9749c Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Mon, 25 May 2026 16:15:52 +0300 Subject: [PATCH 13/30] simplexup: remove cargo-binstall --- simplexup/simplexup | 30 +++--------------------------- 1 file changed, 3 insertions(+), 27 deletions(-) diff --git a/simplexup/simplexup b/simplexup/simplexup index 4772b87..7e46ac5 100755 --- a/simplexup/simplexup +++ b/simplexup/simplexup @@ -5,7 +5,6 @@ set -eo pipefail # WARNING: the SemVer pattern: major.minor.patch must be followed as we use it to determine if the script is up to date. SIMPLEXUP_INSTALLER_VERSION="0.0.5" NEXTEST_VERSION="0.9.133" -BINSTALL_VERSION="1.19.1" BASE_DIR=${XDG_CONFIG_HOME:-$HOME} SIMPLEX_DIR=${SIMPLEX_DIR:-"$BASE_DIR/.simplex"} @@ -17,7 +16,6 @@ SIMPLEXUP_IGNORE_VERIFICATION=false DEFAULT_SIMPLEX_REPO="BlockstreamResearch/smplx" SMPLX_NEXTEST_NAME="smplx-nextest" -CARGO_BINSTALL_NAME="cargo-binstall" SMPLX_BIN_NAME="simplex" DEP_BINS=(elementsd electrs) BINS=("${SMPLX_BIN_NAME}" "${SMPLX_NEXTEST_NAME}" "${DEP_BINS[@]}") @@ -88,8 +86,6 @@ main() { version_dir="${SIMPLEX_VERSIONS_DIR}/${SIMPLEX_VERSION}" ensure mkdir -p "$version_dir" - # Install `cargo-binstall` for installing various binaries from the internet - install_binstall_version "$BINSTALL_VERSION" # Install default version of `nextest` for simplex install_nextest_binary "$NEXTEST_VERSION" "$version_dir" @@ -631,29 +627,9 @@ install_nextest_binary() { fi say "Installing ${SMPLX_NEXTEST_NAME} version ${nextest_version} into ${install_dir}..." - ensure "${CARGO_BINSTALL_NAME}" cargo-nextest@"${nextest_version}" --only-signed --install-path "${install_dir}" --no-track --force --min-tls-version 1.3 -y - mv "${install_dir}/cargo-nextest" "${smplx_nextest_bin_full_path}" - - return 0 -} - -install_binstall_version() { - local binstall_version=$1 - - # Check if cargo-binstall is already installed and matches the required version - say "Checking ${CARGO_BINSTALL_NAME} version..." - if check_cmd ${CARGO_BINSTALL_NAME}; then - local current_version - current_version=$(${CARGO_BINSTALL_NAME} -V | head -n 1 | awk '{print $1}') - - if [[ "$current_version" == "$binstall_version" ]]; then - say "${CARGO_BINSTALL_NAME} ${binstall_version} is already installed, skipping installation." - return 0 - fi - fi - - say "Installing ${CARGO_BINSTALL_NAME} version $binstall_version..." - ensure cargo install "${CARGO_BINSTALL_NAME}" --version "$binstall_version" --locked --force + ensure cargo install cargo-nextest --version "${nextest_version}" --root "${install_dir}" --locked --force + ensure mv "${install_dir}/bin/cargo-nextest" "${smplx_nextest_bin_full_path}" + rm -rf "${install_dir}/bin" return 0 } From c061e4fc54f776fb61caa248e6b7f7d22930fb26 Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Tue, 26 May 2026 12:33:20 +0300 Subject: [PATCH 14/30] cli: add nextest dsl test maker enabled by default --- crates/cli/src/commands/test.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/crates/cli/src/commands/test.rs b/crates/cli/src/commands/test.rs index bde5534..8b08633 100644 --- a/crates/cli/src/commands/test.rs +++ b/crates/cli/src/commands/test.rs @@ -75,16 +75,16 @@ impl Test { fn build_cargo_nextest_args(args: &TestArguments, flags: &TestFlags) -> Vec { let mut cargo_nextest_args = Vec::new(); - if args.filters.is_empty() { - cargo_nextest_args.push("--filterset".into()); + if !args.filters.is_empty() { + cargo_nextest_args.extend(args.filters.iter().cloned()); + } - if let Some(target) = &args.target { - cargo_nextest_args.push(format!("binary({target}) and {SMPLX_NEXTEST_DSL_TEST_MARKER}")); - } else { - cargo_nextest_args.push(SMPLX_NEXTEST_DSL_TEST_MARKER.into()); - } + cargo_nextest_args.push("--filterset".into()); + + if let Some(target) = &args.target { + cargo_nextest_args.push(format!("binary({target}) and {SMPLX_NEXTEST_DSL_TEST_MARKER}")); } else { - cargo_nextest_args.extend(args.filters.iter().cloned()); + cargo_nextest_args.push(SMPLX_NEXTEST_DSL_TEST_MARKER.into()); } cargo_nextest_args.extend(Self::build_cargo_nextest_flags(flags)); From e2ff6777a2ba235d47f3055baa900e55950726a7 Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Tue, 26 May 2026 18:20:17 +0300 Subject: [PATCH 15/30] cli: add --no-simplex flag * rename --nocapture to --no-capture --- crates/cli/src/commands/core.rs | 7 +++++-- crates/cli/src/commands/test.rs | 14 ++++++++++---- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/crates/cli/src/commands/core.rs b/crates/cli/src/commands/core.rs index 41a542a..af0d19a 100644 --- a/crates/cli/src/commands/core.rs +++ b/crates/cli/src/commands/core.rs @@ -40,8 +40,8 @@ pub struct TestArguments { #[derive(Debug, Args, Clone)] pub struct TestFlags { /// Show output from successful tests - #[arg(long)] - pub nocapture: bool, + #[arg(long = "no-capture")] + pub no_capture: bool, /// Show grouped output after the test completion #[arg(long = "show-output")] pub show_output: bool, @@ -57,4 +57,7 @@ pub struct TestFlags { /// Display one character per test instead of one line #[arg(short = 'q', long)] pub quiet: bool, + /// Run tests without including simplex ones + #[arg(long = "no-simplex")] + pub no_simplex: bool, } diff --git a/crates/cli/src/commands/test.rs b/crates/cli/src/commands/test.rs index 8b08633..8a26e42 100644 --- a/crates/cli/src/commands/test.rs +++ b/crates/cli/src/commands/test.rs @@ -81,10 +81,16 @@ impl Test { cargo_nextest_args.push("--filterset".into()); + let dsl_marker = if flags.no_simplex { + format!("not {SMPLX_NEXTEST_DSL_TEST_MARKER}") + } else { + SMPLX_NEXTEST_DSL_TEST_MARKER.into() + }; + if let Some(target) = &args.target { - cargo_nextest_args.push(format!("binary({target}) and {SMPLX_NEXTEST_DSL_TEST_MARKER}")); + cargo_nextest_args.push(format!("binary({target}) and {dsl_marker}")); } else { - cargo_nextest_args.push(SMPLX_NEXTEST_DSL_TEST_MARKER.into()); + cargo_nextest_args.push(dsl_marker); } cargo_nextest_args.extend(Self::build_cargo_nextest_flags(flags)); @@ -99,8 +105,8 @@ impl Test { cargo_nextest_flags.push("--no-fail-fast".into()); } - if flags.nocapture { - cargo_nextest_flags.push("--nocapture".into()); + if flags.no_capture { + cargo_nextest_flags.push("--no-capture".into()); } if flags.quiet { From 174b46944ae4938e773019979c15ed984b0da6f9 Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Wed, 27 May 2026 10:53:31 +0300 Subject: [PATCH 16/30] cli: add alias (nocapture) for no-capture flag in tests --- .github/workflows/fixtures.yml | 2 +- crates/cli/src/commands/core.rs | 2 +- examples/basic/README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/fixtures.yml b/.github/workflows/fixtures.yml index aaa77f5..abc473f 100644 --- a/.github/workflows/fixtures.yml +++ b/.github/workflows/fixtures.yml @@ -77,7 +77,7 @@ jobs: - name: Test run: | cd ${{ matrix.build-dir }} - simplex test --nocapture + simplex test --no-capture lint-checks: runs-on: ubuntu-latest diff --git a/crates/cli/src/commands/core.rs b/crates/cli/src/commands/core.rs index af0d19a..8dcc052 100644 --- a/crates/cli/src/commands/core.rs +++ b/crates/cli/src/commands/core.rs @@ -40,7 +40,7 @@ pub struct TestArguments { #[derive(Debug, Args, Clone)] pub struct TestFlags { /// Show output from successful tests - #[arg(long = "no-capture")] + #[arg(long = "no-capture", alias = "nocapture")] pub no_capture: bool, /// Show grouped output after the test completion #[arg(long = "show-output")] diff --git a/examples/basic/README.md b/examples/basic/README.md index d1f1668..8357272 100644 --- a/examples/basic/README.md +++ b/examples/basic/README.md @@ -33,7 +33,7 @@ Please note that this new module gets declared in the `lib.rs` file. Once the artifacts are generated, let's run Simplex test "basic_test" inside `basic_test.rs`: ```bash -simplex test basic_test --nocapture +simplex test basic_test --no-capture ``` You will see the test passing. From e2809213bc8f8c550fe7cf1a2dcce6b8d30ca1f4 Mon Sep 17 00:00:00 2001 From: Artem Chystiakov <47551140+Arvolear@users.noreply.github.com> Date: Wed, 27 May 2026 13:59:32 +0300 Subject: [PATCH 17/30] Update crates/cli/src/commands/core.rs --- crates/cli/src/commands/core.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/cli/src/commands/core.rs b/crates/cli/src/commands/core.rs index 8dcc052..3438ca1 100644 --- a/crates/cli/src/commands/core.rs +++ b/crates/cli/src/commands/core.rs @@ -57,7 +57,7 @@ pub struct TestFlags { /// Display one character per test instead of one line #[arg(short = 'q', long)] pub quiet: bool, - /// Run tests without including simplex ones + /// Run non-simplex tests (may be used for running unit tests) #[arg(long = "no-simplex")] pub no_simplex: bool, } From 473a49e911f385e11b4bb550718b98e7a5564001 Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Thu, 28 May 2026 17:37:24 +0300 Subject: [PATCH 18/30] cli: remove -vvv option add no-capture to -v and -vv options --- crates/cli/src/commands/core.rs | 3 --- crates/cli/src/commands/test.rs | 11 +---------- crates/sdk/src/global.rs | 2 +- 3 files changed, 2 insertions(+), 14 deletions(-) diff --git a/crates/cli/src/commands/core.rs b/crates/cli/src/commands/core.rs index 3438ca1..8eba930 100644 --- a/crates/cli/src/commands/core.rs +++ b/crates/cli/src/commands/core.rs @@ -39,9 +39,6 @@ pub struct TestArguments { #[allow(clippy::struct_excessive_bools)] #[derive(Debug, Args, Clone)] pub struct TestFlags { - /// Show output from successful tests - #[arg(long = "no-capture", alias = "nocapture")] - pub no_capture: bool, /// Show grouped output after the test completion #[arg(long = "show-output")] pub show_output: bool, diff --git a/crates/cli/src/commands/test.rs b/crates/cli/src/commands/test.rs index 8a26e42..eaec5e6 100644 --- a/crates/cli/src/commands/test.rs +++ b/crates/cli/src/commands/test.rs @@ -105,22 +105,13 @@ impl Test { cargo_nextest_flags.push("--no-fail-fast".into()); } - if flags.no_capture { - cargo_nextest_flags.push("--no-capture".into()); - } - if flags.quiet { cargo_nextest_flags.push("--cargo-quiet".into()); } if flags.verbose != 0 { cargo_nextest_flags.push("--verbose".into()); - cargo_nextest_flags.push("--cargo-verbose".into()); - - // `-vvv` verbosity level - if flags.verbose == Verbosity::MAX_VERBOSITY_LEVEL { - cargo_nextest_flags.push("--cargo-verbose".into()); - } + cargo_nextest_flags.push("--no-capture".into()); } cargo_nextest_flags diff --git a/crates/sdk/src/global.rs b/crates/sdk/src/global.rs index 3b9337e..f578267 100644 --- a/crates/sdk/src/global.rs +++ b/crates/sdk/src/global.rs @@ -26,7 +26,7 @@ pub enum Verbosity { impl Verbosity { /// The maximum allowed verbosity level. - pub const MAX_VERBOSITY_LEVEL: u8 = 3; + pub const MAX_VERBOSITY_LEVEL: u8 = 2; /// Creates a `Verbosity` instance from the number of verbosity flags provided (e.g., -v, -vv). #[must_use] From 2209a5b937622f012795184e353b69ce279973d2 Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Thu, 28 May 2026 18:46:00 +0300 Subject: [PATCH 19/30] simplexup: remove `cargo install` dependency * add downloading and packing of cargo-nextest into attested zip * adapt simplexup --- .github/workflows/release.yml | 14 ++++++++++++-- simplexup/simplexup | 35 ++--------------------------------- 2 files changed, 14 insertions(+), 35 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index a9db3ff..5560d5d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -33,6 +33,7 @@ jobs: attestation: linux-x86_64.attestation.txt elementsd_target: "x86_64-linux-gnu" electrs_target: "linux" + nextest_target: "x86_64-unknown-linux-gnu" - target: aarch64-apple-darwin os: macos-latest @@ -40,6 +41,7 @@ jobs: attestation: darwin-arm64.attestation.txt elementsd_target: "arm64-apple-darwin" electrs_target: "macos" + nextest_target: "universal-apple-darwin" steps: - name: Checkout uses: actions/checkout@v6 @@ -65,21 +67,29 @@ jobs: cargo build --target $TARGET --profile $RUST_PROFILE --bins mv $OUT_DIR/${{ env.RUST_PROFILE }}/simplex simplex - - name: Download elementsd and electrs + - name: Download nextest, elementsd and electrs env: + NEXTEST_VERSION: "0.9.137" ELEMENTSD_VERSION: "23.3.1" ELEMENTSD_TARGET: ${{ matrix.elementsd_target }} ELECTRS_TARGET: ${{ matrix.electrs_target }} + NEXTEST_TARGET: ${{ matrix.nextest_target }} run: | ELEMENTSD_FILENAME="elements-${ELEMENTSD_VERSION}-${ELEMENTSD_TARGET}.tar.gz" ELECTRS_FILENAME="electrs_${ELECTRS_TARGET}_esplora_027e38d3ebc2f85b28ae76f8f3448438ee4fc7b1_liquid.zip" - + NEXTEST_FILENAME="cargo-nextest-${NEXTEST_VERSION}-${NEXTEST_TARGET}.tar.gz" + curl -Ls "https://github.com/ElementsProject/elements/releases/download/elements-${ELEMENTSD_VERSION}/${ELEMENTSD_FILENAME}" -o ${ELEMENTSD_FILENAME} tar -xzf ${ELEMENTSD_FILENAME} && rm ${ELEMENTSD_FILENAME} mv elements-${ELEMENTSD_VERSION}/bin/elementsd elementsd + rm -rf elements-${ELEMENTSD_VERSION} curl -Ls "https://github.com/RCasatta/electrsd/releases/download/electrs_releases/${ELECTRS_FILENAME}" -o ${ELECTRS_FILENAME} unzip ${ELECTRS_FILENAME} && rm ${ELECTRS_FILENAME} + + curl -Ls "https://github.com/nextest-rs/nextest/releases/download/cargo-nextest-${NEXTEST_VERSION}/${NEXTEST_FILENAME}" -o ${NEXTEST_FILENAME} + tar -xzf ${NEXTEST_FILENAME} && rm ${NEXTEST_FILENAME} + mv cargo-nextest smplx-nextest - name: Sign elementsd binary run: | diff --git a/simplexup/simplexup b/simplexup/simplexup index 7e46ac5..4bcaeb3 100755 --- a/simplexup/simplexup +++ b/simplexup/simplexup @@ -4,7 +4,6 @@ set -eo pipefail # NOTE: if you make modifications to this script, please increment the version number. # WARNING: the SemVer pattern: major.minor.patch must be followed as we use it to determine if the script is up to date. SIMPLEXUP_INSTALLER_VERSION="0.0.5" -NEXTEST_VERSION="0.9.133" BASE_DIR=${XDG_CONFIG_HOME:-$HOME} SIMPLEX_DIR=${SIMPLEX_DIR:-"$BASE_DIR/.simplex"} @@ -15,10 +14,9 @@ SIMPLEX_BIN_PATH="$SIMPLEX_BIN_DIR/simplexup" SIMPLEXUP_IGNORE_VERIFICATION=false DEFAULT_SIMPLEX_REPO="BlockstreamResearch/smplx" -SMPLX_NEXTEST_NAME="smplx-nextest" SMPLX_BIN_NAME="simplex" -DEP_BINS=(elementsd electrs) -BINS=("${SMPLX_BIN_NAME}" "${SMPLX_NEXTEST_NAME}" "${DEP_BINS[@]}") +DEP_BINS=(elementsd electrs smplx-nextest) +BINS=("${SMPLX_BIN_NAME}" "${DEP_BINS[@]}") HASH_NAMES=() HASH_VALUES=() @@ -86,9 +84,6 @@ main() { version_dir="${SIMPLEX_VERSIONS_DIR}/${SIMPLEX_VERSION}" ensure mkdir -p "$version_dir" - # Install default version of `nextest` for simplex - install_nextest_binary "$NEXTEST_VERSION" "$version_dir" - local BINS_TO_DOWNLOAD=("${SMPLX_BIN_NAME}" "${DEP_BINS[@]}") if [[ -n "$SIMPLEX_COMMIT" ]]; then @@ -608,32 +603,6 @@ install_simplex_from_commit() { rm -rf "${tmp_dir}" } -install_nextest_binary() { - local nextest_version=$1 - local install_dir=$2 - - # Check if smplx-nextest is already installed and matches the required version - say "Checking ${SMPLX_NEXTEST_NAME} version..." - local smplx_nextest_bin_full_path="${install_dir}/${SMPLX_NEXTEST_NAME}" - - if check_cmd "${smplx_nextest_bin_full_path}" nextest; then - local current_version - current_version=$(${smplx_nextest_bin_full_path} --version | head -n 1 | awk '{print $2}') - - if [[ "$current_version" == "$nextest_version" ]]; then - say "${SMPLX_NEXTEST_NAME} $nextest_version is already installed, skipping installation." - return 0 - fi - fi - - say "Installing ${SMPLX_NEXTEST_NAME} version ${nextest_version} into ${install_dir}..." - ensure cargo install cargo-nextest --version "${nextest_version}" --root "${install_dir}" --locked --force - ensure mv "${install_dir}/bin/cargo-nextest" "${smplx_nextest_bin_full_path}" - rm -rf "${install_dir}/bin" - - return 0 -} - # Form a comma separated list with 'and' for user experience form_str_list() { local STR_LIST=("$@") From 8b4907640090ac6b954176f42855cb007ecbd166 Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Thu, 28 May 2026 19:51:42 +0300 Subject: [PATCH 20/30] cli: add `test-threads` flag --- crates/cli/src/commands/core.rs | 3 +++ crates/cli/src/commands/test.rs | 3 +++ 2 files changed, 6 insertions(+) diff --git a/crates/cli/src/commands/core.rs b/crates/cli/src/commands/core.rs index 8eba930..c9a72af 100644 --- a/crates/cli/src/commands/core.rs +++ b/crates/cli/src/commands/core.rs @@ -34,6 +34,9 @@ pub struct TestArguments { /// Integration test target to run #[arg(long = "target")] pub target: Option, + /// Number of tests to run simultaneously + #[arg(long = "test-threads", default_value_t = 1)] + pub test_threads: usize, } #[allow(clippy::struct_excessive_bools)] diff --git a/crates/cli/src/commands/test.rs b/crates/cli/src/commands/test.rs index eaec5e6..b2e4368 100644 --- a/crates/cli/src/commands/test.rs +++ b/crates/cli/src/commands/test.rs @@ -93,6 +93,9 @@ impl Test { cargo_nextest_args.push(dsl_marker); } + cargo_nextest_args.push("--test-threads".into()); + cargo_nextest_args.push(args.test_threads.to_string()); + cargo_nextest_args.extend(Self::build_cargo_nextest_flags(flags)); cargo_nextest_args From bf05e350a3046fd1e2d78d7dd8a3450996341b6b Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Thu, 28 May 2026 19:53:09 +0300 Subject: [PATCH 21/30] ci: add smplx-nextest binaries name to zip packing and attestation --- .github/workflows/release.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5560d5d..3cd7eff 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -105,6 +105,7 @@ jobs: simplex elementsd electrs + smplx-nextest - name: Record attestation URL env: @@ -115,7 +116,7 @@ jobs: - name: Archive binaries env: ARCHIVE: simplex-${{ github.event.inputs.tag || github.ref_name }}-${{ matrix.archive }} - run: tar czf ${ARCHIVE} simplex elementsd electrs + run: tar czf ${ARCHIVE} simplex elementsd electrs smplx-nextest - name: Upload build artifacts uses: actions/upload-artifact@v6 From 921b0de9064e56fc095b948286c9741dfa04c0a4 Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Thu, 28 May 2026 20:00:28 +0300 Subject: [PATCH 22/30] ci: fix verbosity in fixtures.yml --- .github/workflows/fixtures.yml | 2 +- examples/basic/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/fixtures.yml b/.github/workflows/fixtures.yml index abc473f..da82abc 100644 --- a/.github/workflows/fixtures.yml +++ b/.github/workflows/fixtures.yml @@ -77,7 +77,7 @@ jobs: - name: Test run: | cd ${{ matrix.build-dir }} - simplex test --no-capture + simplex test -v lint-checks: runs-on: ubuntu-latest diff --git a/examples/basic/README.md b/examples/basic/README.md index 8357272..91d881b 100644 --- a/examples/basic/README.md +++ b/examples/basic/README.md @@ -33,7 +33,7 @@ Please note that this new module gets declared in the `lib.rs` file. Once the artifacts are generated, let's run Simplex test "basic_test" inside `basic_test.rs`: ```bash -simplex test basic_test --no-capture +simplex test basic_test -v ``` You will see the test passing. From cbefe0a8cec82e4877b1b6479a6f6ee6ad0766d2 Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Fri, 29 May 2026 12:15:53 +0300 Subject: [PATCH 23/30] cli: divide verbose flag into 2 * edit quiet flag description --- crates/cli/src/commands/core.rs | 2 +- crates/cli/src/commands/test.rs | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/crates/cli/src/commands/core.rs b/crates/cli/src/commands/core.rs index c9a72af..e6b00dc 100644 --- a/crates/cli/src/commands/core.rs +++ b/crates/cli/src/commands/core.rs @@ -54,7 +54,7 @@ pub struct TestFlags { /// Verbosity level for test output (-v for debug, -vv for trace) #[arg(short = 'v', long, action = clap::ArgAction::Count)] pub verbose: u8, - /// Display one character per test instead of one line + /// Do not print cargo log messages #[arg(short = 'q', long)] pub quiet: bool, /// Run non-simplex tests (may be used for running unit tests) diff --git a/crates/cli/src/commands/test.rs b/crates/cli/src/commands/test.rs index b2e4368..1afe1a9 100644 --- a/crates/cli/src/commands/test.rs +++ b/crates/cli/src/commands/test.rs @@ -112,8 +112,11 @@ impl Test { cargo_nextest_flags.push("--cargo-quiet".into()); } - if flags.verbose != 0 { + if flags.show_output { cargo_nextest_flags.push("--verbose".into()); + } + + if flags.verbose != 0 { cargo_nextest_flags.push("--no-capture".into()); } From 3b1ee7d0d358526600290144559fea148a5c3a18 Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Fri, 29 May 2026 13:07:56 +0300 Subject: [PATCH 24/30] cli: add test-threads flag ignoring when no-capture set --- crates/cli/src/commands/test.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/crates/cli/src/commands/test.rs b/crates/cli/src/commands/test.rs index 1afe1a9..2aaad3a 100644 --- a/crates/cli/src/commands/test.rs +++ b/crates/cli/src/commands/test.rs @@ -93,8 +93,11 @@ impl Test { cargo_nextest_args.push(dsl_marker); } - cargo_nextest_args.push("--test-threads".into()); - cargo_nextest_args.push(args.test_threads.to_string()); + // `--test-threads` flag is ignored by nextest when `--no-capture` is enabled + if flags.verbose == 0 { + cargo_nextest_args.push("--test-threads".into()); + cargo_nextest_args.push(args.test_threads.to_string()); + } cargo_nextest_args.extend(Self::build_cargo_nextest_flags(flags)); From 43d73819f34a74bc5ce7e8c62a41bbb90bca80c3 Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Fri, 29 May 2026 14:14:27 +0300 Subject: [PATCH 25/30] cli: limit test-threads flag to non-zero values --- crates/cli/src/commands/core.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/cli/src/commands/core.rs b/crates/cli/src/commands/core.rs index e6b00dc..b5cdca8 100644 --- a/crates/cli/src/commands/core.rs +++ b/crates/cli/src/commands/core.rs @@ -35,8 +35,8 @@ pub struct TestArguments { #[arg(long = "target")] pub target: Option, /// Number of tests to run simultaneously - #[arg(long = "test-threads", default_value_t = 1)] - pub test_threads: usize, + #[arg(long = "test-threads", default_value_t = std::num::NonZeroUsize::new(1).unwrap())] + pub test_threads: std::num::NonZeroUsize, } #[allow(clippy::struct_excessive_bools)] From d147feb8fb55dd22cfcf76db131d6b41200de372 Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Fri, 29 May 2026 15:05:30 +0300 Subject: [PATCH 26/30] cli: add drop contexts, so memory can be gracefully cleaned on normal shutdown --- crates/cli/src/commands/regtest.rs | 4 ++-- crates/regtest/src/client.rs | 6 ++++++ crates/test/src/context.rs | 8 ++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/crates/cli/src/commands/regtest.rs b/crates/cli/src/commands/regtest.rs index fb7f35c..13700e5 100644 --- a/crates/cli/src/commands/regtest.rs +++ b/crates/cli/src/commands/regtest.rs @@ -17,7 +17,7 @@ impl Regtest { /// # Panics /// Panics if setting the Ctrl-C handler fails, or if required RPC authentication credentials cannot be unwrapped. pub fn run(config: &RegtestConfig) -> Result<(), CommandError> { - let (mut client, signer) = RegtestRunner::from_config(config)?; + let (client, signer) = RegtestRunner::from_config(config)?; let running = Arc::new(AtomicBool::new(true)); let r = running.clone(); @@ -41,6 +41,6 @@ impl Regtest { while running.load(Ordering::SeqCst) {} - Ok(client.kill()?) + Ok(()) } } diff --git a/crates/regtest/src/client.rs b/crates/regtest/src/client.rs index dced9cb..aa1ab76 100644 --- a/crates/regtest/src/client.rs +++ b/crates/regtest/src/client.rs @@ -142,3 +142,9 @@ impl RegtestClient { ElectrsD::with_conf(bin_path.as_ref(), elementsd, &conf).unwrap() } } + +impl Drop for RegtestClient { + fn drop(&mut self) { + let _ = self.kill(); + } +} diff --git a/crates/test/src/context.rs b/crates/test/src/context.rs index 3a8e4c6..58b6f6d 100644 --- a/crates/test/src/context.rs +++ b/crates/test/src/context.rs @@ -162,6 +162,14 @@ impl TestContext { } } +impl Drop for TestContext { + fn drop(&mut self) { + if let Some(x) = &mut self._client { + let _ = x.kill(); + } + } +} + #[cfg(test)] mod tests { use std::fs; From 7fdea367b1c9485e0b1551362c679015d8293964 Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Fri, 29 May 2026 15:12:45 +0300 Subject: [PATCH 27/30] cli: correct show_output description --- crates/cli/src/commands/core.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/cli/src/commands/core.rs b/crates/cli/src/commands/core.rs index b5cdca8..dc35939 100644 --- a/crates/cli/src/commands/core.rs +++ b/crates/cli/src/commands/core.rs @@ -21,7 +21,7 @@ pub enum Command { }, /// Generates the simplicity contracts artifacts Build, - /// Clean Simplex artifacts in the current directory + /// Cleans Simplex artifacts in the current directory Clean, } @@ -42,7 +42,7 @@ pub struct TestArguments { #[allow(clippy::struct_excessive_bools)] #[derive(Debug, Args, Clone)] pub struct TestFlags { - /// Show grouped output after the test completion + /// Show detailed output about running tests #[arg(long = "show-output")] pub show_output: bool, /// Run ignored tests From f0306060c4a33e7415ca84c93d30ad1febf00770 Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Fri, 29 May 2026 16:58:33 +0300 Subject: [PATCH 28/30] fix lints --- README.md | 2 +- crates/cli/src/commands/regtest.rs | 1 + crates/cli/src/commands/test.rs | 16 +++++++--------- simplexup/simplexup | 3 ++- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 1a0fac5..208bb79 100644 --- a/README.md +++ b/README.md @@ -67,7 +67,7 @@ rpc_password = "password" [test] mnemonic = "exist carry drive collect lend cereal occur much tiger just involve mean" bitcoins = 10_000_000 -verbosity = 0 # 0 - none, 1 - debug, 2 - trace, 3 - trace + additional cargo verbose output +verbosity = 0 # 0 - none, 1 - debug, 2 - trace [test.esplora] url = "" diff --git a/crates/cli/src/commands/regtest.rs b/crates/cli/src/commands/regtest.rs index 13700e5..f9f9ca7 100644 --- a/crates/cli/src/commands/regtest.rs +++ b/crates/cli/src/commands/regtest.rs @@ -17,6 +17,7 @@ impl Regtest { /// # Panics /// Panics if setting the Ctrl-C handler fails, or if required RPC authentication credentials cannot be unwrapped. pub fn run(config: &RegtestConfig) -> Result<(), CommandError> { + // The client will be killed automatically via the Drop trait implementation let (client, signer) = RegtestRunner::from_config(config)?; let running = Arc::new(AtomicBool::new(true)); diff --git a/crates/cli/src/commands/test.rs b/crates/cli/src/commands/test.rs index 2aaad3a..9d7ba48 100644 --- a/crates/cli/src/commands/test.rs +++ b/crates/cli/src/commands/test.rs @@ -93,18 +93,12 @@ impl Test { cargo_nextest_args.push(dsl_marker); } - // `--test-threads` flag is ignored by nextest when `--no-capture` is enabled - if flags.verbose == 0 { - cargo_nextest_args.push("--test-threads".into()); - cargo_nextest_args.push(args.test_threads.to_string()); - } - - cargo_nextest_args.extend(Self::build_cargo_nextest_flags(flags)); + cargo_nextest_args.extend(Self::build_cargo_nextest_flags(args, flags)); cargo_nextest_args } - fn build_cargo_nextest_flags(flags: &TestFlags) -> Vec { + fn build_cargo_nextest_flags(args: &TestArguments, flags: &TestFlags) -> Vec { let mut cargo_nextest_flags = Vec::new(); if flags.no_fail_fast { @@ -119,7 +113,11 @@ impl Test { cargo_nextest_flags.push("--verbose".into()); } - if flags.verbose != 0 { + if flags.verbose == 0 { + // `--test-threads` flag is ignored by nextest when `--no-capture` is enabled + cargo_nextest_flags.push("--test-threads".into()); + cargo_nextest_flags.push(args.test_threads.to_string()); + } else { cargo_nextest_flags.push("--no-capture".into()); } diff --git a/simplexup/simplexup b/simplexup/simplexup index 4bcaeb3..532a109 100755 --- a/simplexup/simplexup +++ b/simplexup/simplexup @@ -23,7 +23,6 @@ HASH_VALUES=() main() { need_cmd git need_cmd curl - need_cmd cargo while [[ -n $1 ]]; do case $1 in @@ -585,6 +584,8 @@ download() { } install_simplex_from_commit() { + need_cmd cargo + local commit=$1 local author=$2 local repo_url=$3 From 8b8d3cee0ca498e2b79ae45f8bea059d66b74437 Mon Sep 17 00:00:00 2001 From: Illia Kripaka Date: Mon, 1 Jun 2026 17:36:14 +0300 Subject: [PATCH 29/30] cli: add a warning when `test-threads` is ignored and `-v` is set --- crates/cli/src/commands/core.rs | 4 ++-- crates/cli/src/commands/test.rs | 10 +++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/crates/cli/src/commands/core.rs b/crates/cli/src/commands/core.rs index dc35939..52d96da 100644 --- a/crates/cli/src/commands/core.rs +++ b/crates/cli/src/commands/core.rs @@ -35,8 +35,8 @@ pub struct TestArguments { #[arg(long = "target")] pub target: Option, /// Number of tests to run simultaneously - #[arg(long = "test-threads", default_value_t = std::num::NonZeroUsize::new(1).unwrap())] - pub test_threads: std::num::NonZeroUsize, + #[arg(long = "test-threads")] + pub test_threads: Option, } #[allow(clippy::struct_excessive_bools)] diff --git a/crates/cli/src/commands/test.rs b/crates/cli/src/commands/test.rs index 9d7ba48..fef801b 100644 --- a/crates/cli/src/commands/test.rs +++ b/crates/cli/src/commands/test.rs @@ -9,6 +9,7 @@ use super::error::CommandError; /// Nextest dsl variable to filter and use only simplex tests const SMPLX_NEXTEST_DSL_TEST_MARKER: &str = concat!("test(/", smplx_test_marker!(), "$/)"); +const DEFAULT_THREADS_NUMBER: usize = 1; pub struct Test {} @@ -116,8 +117,15 @@ impl Test { if flags.verbose == 0 { // `--test-threads` flag is ignored by nextest when `--no-capture` is enabled cargo_nextest_flags.push("--test-threads".into()); - cargo_nextest_flags.push(args.test_threads.to_string()); + cargo_nextest_flags.push( + args.test_threads + .unwrap_or(std::num::NonZeroUsize::new(DEFAULT_THREADS_NUMBER).unwrap()) + .to_string(), + ); } else { + if args.test_threads.is_some() { + println!("warning: --test-threads is ignored when -v or -vv is provided"); + } cargo_nextest_flags.push("--no-capture".into()); } From 33c2375fc477007d0e7c87e9129e830087697f48 Mon Sep 17 00:00:00 2001 From: Artem Chystiakov <47551140+Arvolear@users.noreply.github.com> Date: Mon, 1 Jun 2026 18:42:28 +0300 Subject: [PATCH 30/30] Apply suggestion from @Arvolear --- crates/cli/src/commands/test.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/crates/cli/src/commands/test.rs b/crates/cli/src/commands/test.rs index fef801b..bb62452 100644 --- a/crates/cli/src/commands/test.rs +++ b/crates/cli/src/commands/test.rs @@ -126,6 +126,7 @@ impl Test { if args.test_threads.is_some() { println!("warning: --test-threads is ignored when -v or -vv is provided"); } + cargo_nextest_flags.push("--no-capture".into()); }