Skip to content

Commit a5b3aea

Browse files
committed
Thread fuzz test cases
Adds threading (with logger capture) to fuzz targets so that we can more effeciently test a failing fuzz corpus on new code changes.
1 parent a44454e commit a5b3aea

File tree

66 files changed

+1305
-203
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

66 files changed

+1305
-203
lines changed

fuzz/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ members = ["."]
3737
lto = true
3838
codegen-units = 1
3939

40+
# When testing a large fuzz corpus, -O1 offers a nice speedup
41+
[profile.dev]
42+
opt-level = 1
43+
4044
[lib]
4145
name = "lightning_fuzz"
4246
path = "src/lib.rs"

fuzz/src/bin/chanmon_consistency_target.rs

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,47 @@ fn main() {
4545

4646
#[test]
4747
fn run_test_cases() {
48-
let mut data: Vec<u8> = vec![0];
49-
chanmon_consistency_run(data.as_ptr(), data.len());
48+
use lightning_fuzz::utils::test_logger::StringLogger;
49+
50+
use std::sync::{atomic, Arc};
51+
{
52+
let data: Vec<u8> = vec![0];
53+
chanmon_consistency_run(data.as_ptr(), data.len());
54+
}
55+
let mut threads = Vec::new();
56+
let threads_running = Arc::new(atomic::AtomicUsize::new(0));
5057
if let Ok(tests) = fs::read_dir("test_cases/chanmon_consistency") {
5158
for test in tests {
52-
data.clear();
59+
let mut data: Vec<u8> = Vec::new();
5360
let path = test.unwrap().path();
5461
println!("Running test {}...", path.file_name().unwrap().to_str().unwrap());
5562
fs::File::open(path).unwrap().read_to_end(&mut data).unwrap();
56-
chanmon_consistency_run(data.as_ptr(), data.len());
63+
threads_running.fetch_add(1, atomic::Ordering::AcqRel);
64+
65+
let thread_count_ref = Arc::clone(&threads_running);
66+
let main_thread_ref = std::thread::current();
67+
threads.push(std::thread::spawn(move || {
68+
let string_logger = StringLogger::new();
69+
70+
let panic_logger = string_logger.clone();
71+
let res = if ::std::panic::catch_unwind(move || {
72+
chanmon_consistency_test(&data, panic_logger);
73+
}).is_err() {
74+
Some(string_logger.into_string())
75+
} else { None };
76+
thread_count_ref.fetch_sub(1, atomic::Ordering::AcqRel);
77+
main_thread_ref.unpark();
78+
res
79+
}));
80+
while threads_running.load(atomic::Ordering::Acquire) > 32 {
81+
std::thread::park();
82+
}
83+
}
84+
}
85+
for thread in threads.drain(..) {
86+
if let Some(output) = thread.join().unwrap() {
87+
println!("{}", output);
88+
panic!();
5789
}
5890
}
5991
}

fuzz/src/bin/chanmon_deser_target.rs

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,47 @@ fn main() {
4545

4646
#[test]
4747
fn run_test_cases() {
48-
let mut data: Vec<u8> = vec![0];
49-
chanmon_deser_run(data.as_ptr(), data.len());
48+
use lightning_fuzz::utils::test_logger::StringLogger;
49+
50+
use std::sync::{atomic, Arc};
51+
{
52+
let data: Vec<u8> = vec![0];
53+
chanmon_deser_run(data.as_ptr(), data.len());
54+
}
55+
let mut threads = Vec::new();
56+
let threads_running = Arc::new(atomic::AtomicUsize::new(0));
5057
if let Ok(tests) = fs::read_dir("test_cases/chanmon_deser") {
5158
for test in tests {
52-
data.clear();
59+
let mut data: Vec<u8> = Vec::new();
5360
let path = test.unwrap().path();
5461
println!("Running test {}...", path.file_name().unwrap().to_str().unwrap());
5562
fs::File::open(path).unwrap().read_to_end(&mut data).unwrap();
56-
chanmon_deser_run(data.as_ptr(), data.len());
63+
threads_running.fetch_add(1, atomic::Ordering::AcqRel);
64+
65+
let thread_count_ref = Arc::clone(&threads_running);
66+
let main_thread_ref = std::thread::current();
67+
threads.push(std::thread::spawn(move || {
68+
let string_logger = StringLogger::new();
69+
70+
let panic_logger = string_logger.clone();
71+
let res = if ::std::panic::catch_unwind(move || {
72+
chanmon_deser_test(&data, panic_logger);
73+
}).is_err() {
74+
Some(string_logger.into_string())
75+
} else { None };
76+
thread_count_ref.fetch_sub(1, atomic::Ordering::AcqRel);
77+
main_thread_ref.unpark();
78+
res
79+
}));
80+
while threads_running.load(atomic::Ordering::Acquire) > 32 {
81+
std::thread::park();
82+
}
83+
}
84+
}
85+
for thread in threads.drain(..) {
86+
if let Some(output) = thread.join().unwrap() {
87+
println!("{}", output);
88+
panic!();
5789
}
5890
}
5991
}

fuzz/src/bin/full_stack_target.rs

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,47 @@ fn main() {
4545

4646
#[test]
4747
fn run_test_cases() {
48-
let mut data: Vec<u8> = vec![0];
49-
full_stack_run(data.as_ptr(), data.len());
48+
use lightning_fuzz::utils::test_logger::StringLogger;
49+
50+
use std::sync::{atomic, Arc};
51+
{
52+
let data: Vec<u8> = vec![0];
53+
full_stack_run(data.as_ptr(), data.len());
54+
}
55+
let mut threads = Vec::new();
56+
let threads_running = Arc::new(atomic::AtomicUsize::new(0));
5057
if let Ok(tests) = fs::read_dir("test_cases/full_stack") {
5158
for test in tests {
52-
data.clear();
59+
let mut data: Vec<u8> = Vec::new();
5360
let path = test.unwrap().path();
5461
println!("Running test {}...", path.file_name().unwrap().to_str().unwrap());
5562
fs::File::open(path).unwrap().read_to_end(&mut data).unwrap();
56-
full_stack_run(data.as_ptr(), data.len());
63+
threads_running.fetch_add(1, atomic::Ordering::AcqRel);
64+
65+
let thread_count_ref = Arc::clone(&threads_running);
66+
let main_thread_ref = std::thread::current();
67+
threads.push(std::thread::spawn(move || {
68+
let string_logger = StringLogger::new();
69+
70+
let panic_logger = string_logger.clone();
71+
let res = if ::std::panic::catch_unwind(move || {
72+
full_stack_test(&data, panic_logger);
73+
}).is_err() {
74+
Some(string_logger.into_string())
75+
} else { None };
76+
thread_count_ref.fetch_sub(1, atomic::Ordering::AcqRel);
77+
main_thread_ref.unpark();
78+
res
79+
}));
80+
while threads_running.load(atomic::Ordering::Acquire) > 32 {
81+
std::thread::park();
82+
}
83+
}
84+
}
85+
for thread in threads.drain(..) {
86+
if let Some(output) = thread.join().unwrap() {
87+
println!("{}", output);
88+
panic!();
5789
}
5890
}
5991
}

fuzz/src/bin/msg_accept_channel_target.rs

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,47 @@ fn main() {
4545

4646
#[test]
4747
fn run_test_cases() {
48-
let mut data: Vec<u8> = vec![0];
49-
msg_accept_channel_run(data.as_ptr(), data.len());
48+
use lightning_fuzz::utils::test_logger::StringLogger;
49+
50+
use std::sync::{atomic, Arc};
51+
{
52+
let data: Vec<u8> = vec![0];
53+
msg_accept_channel_run(data.as_ptr(), data.len());
54+
}
55+
let mut threads = Vec::new();
56+
let threads_running = Arc::new(atomic::AtomicUsize::new(0));
5057
if let Ok(tests) = fs::read_dir("test_cases/msg_accept_channel") {
5158
for test in tests {
52-
data.clear();
59+
let mut data: Vec<u8> = Vec::new();
5360
let path = test.unwrap().path();
5461
println!("Running test {}...", path.file_name().unwrap().to_str().unwrap());
5562
fs::File::open(path).unwrap().read_to_end(&mut data).unwrap();
56-
msg_accept_channel_run(data.as_ptr(), data.len());
63+
threads_running.fetch_add(1, atomic::Ordering::AcqRel);
64+
65+
let thread_count_ref = Arc::clone(&threads_running);
66+
let main_thread_ref = std::thread::current();
67+
threads.push(std::thread::spawn(move || {
68+
let string_logger = StringLogger::new();
69+
70+
let panic_logger = string_logger.clone();
71+
let res = if ::std::panic::catch_unwind(move || {
72+
msg_accept_channel_test(&data, panic_logger);
73+
}).is_err() {
74+
Some(string_logger.into_string())
75+
} else { None };
76+
thread_count_ref.fetch_sub(1, atomic::Ordering::AcqRel);
77+
main_thread_ref.unpark();
78+
res
79+
}));
80+
while threads_running.load(atomic::Ordering::Acquire) > 32 {
81+
std::thread::park();
82+
}
83+
}
84+
}
85+
for thread in threads.drain(..) {
86+
if let Some(output) = thread.join().unwrap() {
87+
println!("{}", output);
88+
panic!();
5789
}
5890
}
5991
}

fuzz/src/bin/msg_announcement_signatures_target.rs

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,47 @@ fn main() {
4545

4646
#[test]
4747
fn run_test_cases() {
48-
let mut data: Vec<u8> = vec![0];
49-
msg_announcement_signatures_run(data.as_ptr(), data.len());
48+
use lightning_fuzz::utils::test_logger::StringLogger;
49+
50+
use std::sync::{atomic, Arc};
51+
{
52+
let data: Vec<u8> = vec![0];
53+
msg_announcement_signatures_run(data.as_ptr(), data.len());
54+
}
55+
let mut threads = Vec::new();
56+
let threads_running = Arc::new(atomic::AtomicUsize::new(0));
5057
if let Ok(tests) = fs::read_dir("test_cases/msg_announcement_signatures") {
5158
for test in tests {
52-
data.clear();
59+
let mut data: Vec<u8> = Vec::new();
5360
let path = test.unwrap().path();
5461
println!("Running test {}...", path.file_name().unwrap().to_str().unwrap());
5562
fs::File::open(path).unwrap().read_to_end(&mut data).unwrap();
56-
msg_announcement_signatures_run(data.as_ptr(), data.len());
63+
threads_running.fetch_add(1, atomic::Ordering::AcqRel);
64+
65+
let thread_count_ref = Arc::clone(&threads_running);
66+
let main_thread_ref = std::thread::current();
67+
threads.push(std::thread::spawn(move || {
68+
let string_logger = StringLogger::new();
69+
70+
let panic_logger = string_logger.clone();
71+
let res = if ::std::panic::catch_unwind(move || {
72+
msg_announcement_signatures_test(&data, panic_logger);
73+
}).is_err() {
74+
Some(string_logger.into_string())
75+
} else { None };
76+
thread_count_ref.fetch_sub(1, atomic::Ordering::AcqRel);
77+
main_thread_ref.unpark();
78+
res
79+
}));
80+
while threads_running.load(atomic::Ordering::Acquire) > 32 {
81+
std::thread::park();
82+
}
83+
}
84+
}
85+
for thread in threads.drain(..) {
86+
if let Some(output) = thread.join().unwrap() {
87+
println!("{}", output);
88+
panic!();
5789
}
5890
}
5991
}

fuzz/src/bin/msg_channel_announcement_target.rs

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,47 @@ fn main() {
4545

4646
#[test]
4747
fn run_test_cases() {
48-
let mut data: Vec<u8> = vec![0];
49-
msg_channel_announcement_run(data.as_ptr(), data.len());
48+
use lightning_fuzz::utils::test_logger::StringLogger;
49+
50+
use std::sync::{atomic, Arc};
51+
{
52+
let data: Vec<u8> = vec![0];
53+
msg_channel_announcement_run(data.as_ptr(), data.len());
54+
}
55+
let mut threads = Vec::new();
56+
let threads_running = Arc::new(atomic::AtomicUsize::new(0));
5057
if let Ok(tests) = fs::read_dir("test_cases/msg_channel_announcement") {
5158
for test in tests {
52-
data.clear();
59+
let mut data: Vec<u8> = Vec::new();
5360
let path = test.unwrap().path();
5461
println!("Running test {}...", path.file_name().unwrap().to_str().unwrap());
5562
fs::File::open(path).unwrap().read_to_end(&mut data).unwrap();
56-
msg_channel_announcement_run(data.as_ptr(), data.len());
63+
threads_running.fetch_add(1, atomic::Ordering::AcqRel);
64+
65+
let thread_count_ref = Arc::clone(&threads_running);
66+
let main_thread_ref = std::thread::current();
67+
threads.push(std::thread::spawn(move || {
68+
let string_logger = StringLogger::new();
69+
70+
let panic_logger = string_logger.clone();
71+
let res = if ::std::panic::catch_unwind(move || {
72+
msg_channel_announcement_test(&data, panic_logger);
73+
}).is_err() {
74+
Some(string_logger.into_string())
75+
} else { None };
76+
thread_count_ref.fetch_sub(1, atomic::Ordering::AcqRel);
77+
main_thread_ref.unpark();
78+
res
79+
}));
80+
while threads_running.load(atomic::Ordering::Acquire) > 32 {
81+
std::thread::park();
82+
}
83+
}
84+
}
85+
for thread in threads.drain(..) {
86+
if let Some(output) = thread.join().unwrap() {
87+
println!("{}", output);
88+
panic!();
5789
}
5890
}
5991
}

fuzz/src/bin/msg_channel_reestablish_target.rs

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,47 @@ fn main() {
4545

4646
#[test]
4747
fn run_test_cases() {
48-
let mut data: Vec<u8> = vec![0];
49-
msg_channel_reestablish_run(data.as_ptr(), data.len());
48+
use lightning_fuzz::utils::test_logger::StringLogger;
49+
50+
use std::sync::{atomic, Arc};
51+
{
52+
let data: Vec<u8> = vec![0];
53+
msg_channel_reestablish_run(data.as_ptr(), data.len());
54+
}
55+
let mut threads = Vec::new();
56+
let threads_running = Arc::new(atomic::AtomicUsize::new(0));
5057
if let Ok(tests) = fs::read_dir("test_cases/msg_channel_reestablish") {
5158
for test in tests {
52-
data.clear();
59+
let mut data: Vec<u8> = Vec::new();
5360
let path = test.unwrap().path();
5461
println!("Running test {}...", path.file_name().unwrap().to_str().unwrap());
5562
fs::File::open(path).unwrap().read_to_end(&mut data).unwrap();
56-
msg_channel_reestablish_run(data.as_ptr(), data.len());
63+
threads_running.fetch_add(1, atomic::Ordering::AcqRel);
64+
65+
let thread_count_ref = Arc::clone(&threads_running);
66+
let main_thread_ref = std::thread::current();
67+
threads.push(std::thread::spawn(move || {
68+
let string_logger = StringLogger::new();
69+
70+
let panic_logger = string_logger.clone();
71+
let res = if ::std::panic::catch_unwind(move || {
72+
msg_channel_reestablish_test(&data, panic_logger);
73+
}).is_err() {
74+
Some(string_logger.into_string())
75+
} else { None };
76+
thread_count_ref.fetch_sub(1, atomic::Ordering::AcqRel);
77+
main_thread_ref.unpark();
78+
res
79+
}));
80+
while threads_running.load(atomic::Ordering::Acquire) > 32 {
81+
std::thread::park();
82+
}
83+
}
84+
}
85+
for thread in threads.drain(..) {
86+
if let Some(output) = thread.join().unwrap() {
87+
println!("{}", output);
88+
panic!();
5789
}
5890
}
5991
}

0 commit comments

Comments
 (0)