strategy:
matrix:
toolchain: [ stable,
- beta,
+ nightly,
# 1.22.0 is MSRV for rust-lightning in general:
1.22.0,
# 1.34.2 is Debian stable
include:
- toolchain: stable
build-net-tokio: true
- - toolchain: beta
+ - toolchain: nightly
build-net-tokio: true
+ run-mutagen: true
- toolchain: 1.39.0
build-net-tokio: true
coverage: true
- name: Test on Rust ${{ matrix.toolchain }}
if: "! matrix.build-net-tokio"
run: RUSTFLAGS="-C link-dead-code" cargo test --verbose --color always -p lightning
+ - name: Run mutagen tests on ${{ matrix.toolchain }}
+ if: matrix.run-mutagen
+ # 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.
+ run: |
+ 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
+ # Generate code cov information on Rust 1.39.0
- name: Install deps for kcov
if: matrix.coverage
run: |
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
- 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)
- if [ "$BUILD_NET_TOKIO" != "1" ]; then RUSTFLAGS="-C link-dead-code" cargo test --verbose -p lightning; fi
# Run lightning workspace fuzz tests on Rust stable
- if [ "$(rustup show | grep default | grep stable)" != "" ]; then cd fuzz && cargo test --verbose && ./ci-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 code cov information on Rust 1.39.0
- if [ "$(rustup show | grep default | grep 1.39.0)" != "" ]; then
wget https://github.com/SimonKagstrom/kcov/archive/master.tar.gz &&
[features]
# Supports tracking channels with a non-bitcoin chain hashes. Currently enables all kinds of fun DoS attacks.
non_bitcoin_chain_hash_routing = []
-fuzztarget = ["bitcoin/fuzztarget"]
# Unlog messages superior at targeted level.
max_level_off = []
max_level_error = []
max_level_info = []
max_level_debug = []
+# Testing only features, don't enable these unless you want to run rust-lightning tests!
+fuzztarget = ["bitcoin/fuzztarget"]
+mutation_testing = ["mutagen"]
+
[dependencies]
bitcoin = "0.23"
+mutagen = { git = "https://github.com/TheBlueMatt/mutagen", optional = true }
[dev-dependencies.bitcoin]
version = "0.23"
extern crate bitcoin;
#[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!";
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,
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);