Skip to content

Commit

Permalink
Run with mutagen on travis.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
TheBlueMatt committed Jan 19, 2020
1 parent 0b5b282 commit 511cbdc
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 2 deletions.
10 changes: 9 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
language: rust
rust:
- stable
- beta
- nightly
- 1.22.0
- 1.34.2
cache: cargo
Expand All @@ -22,6 +22,14 @@ script:
- if [ "$(rustup show | grep default | grep 1.22.0)" != "" ]; 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 just sets an extra features flag and
# exits with non-0 status if any mutations resulted in anything except test failures.
- 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 mutagen; 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 &&
Expand Down
6 changes: 5 additions & 1 deletion lightning/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,22 @@ 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 = []
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"
Expand Down
7 changes: 7 additions & 0 deletions lightning/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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!";
4 changes: 4 additions & 0 deletions lightning/src/ln/channel.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ use std::default::Default;
use std::{cmp,mem,fmt};
use std::sync::{Arc};

#[cfg(all(test, feature = "mutation_testing"))]
use mutagen::mutate;

#[cfg(test)]
pub struct ChannelValueStat {
pub value_to_self_msat: u64,
Expand Down Expand Up @@ -2337,6 +2340,7 @@ impl<ChanSigner: ChannelKeys> Channel<ChanSigner> {
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);
Expand Down

0 comments on commit 511cbdc

Please sign in to comment.