From 9cb1f92c21ae9db9dbe52f86a57465e4c90c1141 Mon Sep 17 00:00:00 2001 From: Yuval Kogman Date: Mon, 20 Jan 2025 00:08:07 +0100 Subject: [PATCH] send SIGINT instead of SIGKILL in e2e test When running a llvm-cov instrumented payjoin-cli in the e2e test, using calling .kill() on the tokio::process::Child sends a SIGKILL, which terminates the process immediately, causing the coverage measurements to not be written. The payjoin-cli resume command already has an interrupt handler, so sending SIGINT instead makes it exit gracefully. --- Cargo-minimal.lock | 23 +++++++++++++++++++++++ Cargo-recent.lock | 23 +++++++++++++++++++++++ payjoin-cli/Cargo.toml | 1 + payjoin-cli/tests/e2e.rs | 19 +++++++++++++------ 4 files changed, 60 insertions(+), 6 deletions(-) diff --git a/Cargo-minimal.lock b/Cargo-minimal.lock index 4e51a2bcc..d9921c71e 100644 --- a/Cargo-minimal.lock +++ b/Cargo-minimal.lock @@ -1353,6 +1353,15 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + [[package]] name = "mime" version = "0.3.17" @@ -1409,6 +1418,19 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset", + "pin-utils", +] + [[package]] name = "nom" version = "7.1.3" @@ -1620,6 +1642,7 @@ dependencies = [ "hyper-rustls", "hyper-util", "log", + "nix", "ohttp-relay", "once_cell", "payjoin", diff --git a/Cargo-recent.lock b/Cargo-recent.lock index 4e51a2bcc..d9921c71e 100644 --- a/Cargo-recent.lock +++ b/Cargo-recent.lock @@ -1353,6 +1353,15 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + [[package]] name = "mime" version = "0.3.17" @@ -1409,6 +1418,19 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset", + "pin-utils", +] + [[package]] name = "nom" version = "7.1.3" @@ -1620,6 +1642,7 @@ dependencies = [ "hyper-rustls", "hyper-util", "log", + "nix", "ohttp-relay", "once_cell", "payjoin", diff --git a/payjoin-cli/Cargo.toml b/payjoin-cli/Cargo.toml index 672481b31..b0aba6d3e 100644 --- a/payjoin-cli/Cargo.toml +++ b/payjoin-cli/Cargo.toml @@ -50,6 +50,7 @@ url = { version = "2.3.1", features = ["serde"] } [dev-dependencies] bitcoind = { version = "0.36.0", features = ["0_21_2"] } http = "1" +nix = "0.26.4" ohttp-relay = { version = "0.0.9", features = ["_test-util"] } once_cell = "1" payjoin-directory = { path = "../payjoin-directory", features = ["_danger-local-https"] } diff --git a/payjoin-cli/tests/e2e.rs b/payjoin-cli/tests/e2e.rs index bad79fb6f..f86690b6d 100644 --- a/payjoin-cli/tests/e2e.rs +++ b/payjoin-cli/tests/e2e.rs @@ -6,11 +6,18 @@ mod e2e { use bitcoincore_rpc::json::AddressType; use bitcoind::bitcoincore_rpc::RpcApi; use log::{log_enabled, Level}; + use nix::sys::signal::{kill, Signal}; + use nix::unistd::Pid; use payjoin::bitcoin::Amount; use tokio::fs; use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader}; use tokio::process::Command; + fn sigint(child: &tokio::process::Child) -> nix::Result<()> { + let pid = child.id().expect("Failed to get child PID"); + kill(Pid::from_raw(pid as i32), Signal::SIGINT) + } + const RECEIVE_SATS: &str = "54321"; #[cfg(not(feature = "v2"))] @@ -139,8 +146,8 @@ mod e2e { let timeout = tokio::time::Duration::from_secs(10); let payjoin_sent = tokio::time::timeout(timeout, rx.recv()).await; - cli_receiver.kill().await.expect("Failed to kill payjoin-cli"); - cli_sender.kill().await.expect("Failed to kill payjoin-cli"); + sigint(&cli_receiver).expect("Failed to kill payjoin-cli"); + sigint(&cli_sender).expect("Failed to kill payjoin-cli"); payjoin_sent }) .await; @@ -373,7 +380,7 @@ mod e2e { } log::debug!("Got bip21 {}", &bip21); - cli_receiver.kill().await.expect("Failed to kill payjoin-cli"); + sigint(&cli_receiver).expect("Failed to kill payjoin-cli"); bip21 } @@ -402,7 +409,7 @@ mod e2e { let timeout = tokio::time::Duration::from_secs(35); let fallback_sent = tokio::time::timeout(timeout, rx.recv()).await?; - cli_sender.kill().await.expect("Failed to kill payjoin-cli initial sender"); + sigint(&cli_sender).expect("Failed to kill payjoin-cli initial sender"); assert!(fallback_sent.unwrap_or(false), "Fallback send was not detected"); Ok(()) @@ -434,7 +441,7 @@ mod e2e { let timeout = tokio::time::Duration::from_secs(10); let response_successful = tokio::time::timeout(timeout, rx.recv()).await?; - cli_receive_resumer.kill().await.expect("Failed to kill payjoin-cli"); + sigint(&cli_receive_resumer).expect("Failed to kill payjoin-cli"); assert!(response_successful.unwrap_or(false), "Did not respond with Payjoin PSBT"); Ok(()) @@ -466,7 +473,7 @@ mod e2e { let timeout = tokio::time::Duration::from_secs(10); let payjoin_sent = tokio::time::timeout(timeout, rx.recv()).await?; - cli_send_resumer.kill().await.expect("Failed to kill payjoin-cli"); + sigint(&cli_send_resumer).expect("Failed to kill payjoin-cli"); assert!(payjoin_sent.unwrap_or(false), "Payjoin send was not detected"); Ok(())