From 8dd331ee390bb3ad3a604a26bec46c0e9216e936 Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Wed, 15 Jan 2020 15:08:45 -0500 Subject: [PATCH] Run with mutagen on travis. Sadly our test coverage isn't very good and I had to hunt for functions to mutate where we fail tests on every mutation mutagen creates, but committing the framework is a start. --- .travis.yml | 12 ++++++++++-- lightning/Cargo.toml | 6 +++++- lightning/src/lib.rs | 7 +++++++ lightning/src/ln/channel.rs | 4 ++++ 4 files changed, 26 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 557170ff6..85408e826 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,7 @@ language: rust rust: - stable - - beta + - nightly # 1.22.0 is MSRV for rust-lightning in general: - 1.22.0 # 1.34.2 is Debian stable, and we use it to run fuzzing on: @@ -15,7 +15,7 @@ before_install: - sudo apt-get install -y binutils-dev libunwind8-dev libcurl4-openssl-dev libelf-dev libdw-dev cmake gcc binutils-dev libiberty-dev script: - # Support lightning-net-tokio only on Rust stable, beta, and 1.39.0 + # Support lightning-net-tokio only on Rust stable, nightly, and 1.39.0 - if [ "$(rustup show | grep default | grep '1.39.0')" != "" ]; then export BUILD_NET_TOKIO=1; fi - if [ "$(rustup show | grep default | grep '1\.')" == "" ]; then export BUILD_NET_TOKIO=1; fi # Build the appropriate workspace(s) @@ -27,6 +27,14 @@ script: - if [ "$BUILD_NET_TOKIO" != "1" ]; then RUSTFLAGS="-C link-dead-code" cargo test --verbose -p lightning; fi # Run lightning workspace fuzz tests for Rust 1.34.2 - if [ "$(rustup show | grep default | grep 1.34.2)" != "" ]; then cd fuzz && cargo test --verbose && ./travis-fuzz.sh; fi + # Run mutagen on nightly with TheBlueMatt's fork which exits with non-0 status + # if any mutations resulted in anything except test failures to prevent regressions. + - if [ "$(rustup show | grep default | grep nightly)" != "" ]; then + rm -rf mutagen && git clone https://github.com/TheBlueMatt/mutagen && + cargo install --force --path mutagen/mutagen-runner && + cd lightning && + ~/.cargo/bin/cargo-mutagen --features mutation_testing; fi + # Generate codecov on stable - if [ "$(rustup show | grep default | grep stable)" != "" ]; then wget https://github.com/SimonKagstrom/kcov/archive/master.tar.gz && tar xzf master.tar.gz && diff --git a/lightning/Cargo.toml b/lightning/Cargo.toml index 341084fc3..2e2218880 100644 --- a/lightning/Cargo.toml +++ b/lightning/Cargo.toml @@ -13,7 +13,6 @@ Still missing tons of error-handling. See GitHub issues for suggested projects i [features] # Supports tracking channels with a non-bitcoin chain hashes. Currently enables all kinds of fun DoS attacks. non_bitcoin_chain_hash_routing = [] -fuzztarget = ["secp256k1/fuzztarget", "bitcoin/fuzztarget", "bitcoin_hashes/fuzztarget"] # Unlog messages superior at targeted level. max_level_off = [] max_level_error = [] @@ -21,10 +20,15 @@ max_level_warn = [] max_level_info = [] max_level_debug = [] +# Testing only features, don't enable these unless you want to run rust-lightning tests! +fuzztarget = ["secp256k1/fuzztarget", "bitcoin/fuzztarget", "bitcoin_hashes/fuzztarget"] +mutation_testing = ["mutagen"] + [dependencies] bitcoin = "0.21" bitcoin_hashes = "0.7" secp256k1 = "0.15" +mutagen = { git = "https://github.com/TheBlueMatt/mutagen", optional = true } [dev-dependencies.bitcoin] version = "0.21" diff --git a/lightning/src/lib.rs b/lightning/src/lib.rs index 68924b57a..631b66df9 100644 --- a/lightning/src/lib.rs +++ b/lightning/src/lib.rs @@ -23,8 +23,15 @@ extern crate bitcoin_hashes; extern crate secp256k1; #[cfg(test)] extern crate rand; #[cfg(test)] extern crate hex; +#[cfg(all(test, feature = "mutation_testing"))] extern crate mutagen; #[macro_use] pub mod util; pub mod chain; pub mod ln; + +#[cfg(all( + any(feature = "mutation_testing", feature = "fuzztarget"), + not(any(test, debug_assertions)) + ))] +const ERR: () = "You should never be building with feature = mutation_testing or feature = fuzztarget! They are used to compile with broken code for testing only!"; diff --git a/lightning/src/ln/channel.rs b/lightning/src/ln/channel.rs index b726b2375..b9feb36dd 100644 --- a/lightning/src/ln/channel.rs +++ b/lightning/src/ln/channel.rs @@ -37,6 +37,9 @@ use std::{cmp,mem,fmt}; use std::sync::{Arc}; use std::ops::Deref; +#[cfg(all(test, feature = "mutation_testing"))] +use mutagen::mutate; + #[cfg(test)] pub struct ChannelValueStat { pub value_to_self_msat: u64, @@ -2484,6 +2487,7 @@ impl Channel { Ok(()) } + #[cfg_attr(all(test, feature = "mutation_testing"), mutate)] fn get_last_revoke_and_ack(&self) -> msgs::RevokeAndACK { let next_per_commitment_point = PublicKey::from_secret_key(&self.secp_ctx, &self.build_local_commitment_secret(self.cur_local_commitment_transaction_number)); let per_commitment_secret = chan_utils::build_commitment_secret(self.local_keys.commitment_seed(), self.cur_local_commitment_transaction_number + 2); -- 2.39.5