Skip to content

Commit 0d75545

Browse files
authored
Merge pull request #593 from TheBlueMatt/2020-04-par-fuzz-check
Thread fuzz test cases
2 parents 4441827 + 6745aff commit 0d75545

File tree

66 files changed

+1398
-265
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

+1398
-265
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: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,48 @@ 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::StringBuffer;
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();
54-
println!("Running test {}...", path.file_name().unwrap().to_str().unwrap());
55-
fs::File::open(path).unwrap().read_to_end(&mut data).unwrap();
56-
chanmon_consistency_run(data.as_ptr(), data.len());
61+
fs::File::open(&path).unwrap().read_to_end(&mut data).unwrap();
62+
threads_running.fetch_add(1, atomic::Ordering::AcqRel);
63+
64+
let thread_count_ref = Arc::clone(&threads_running);
65+
let main_thread_ref = std::thread::current();
66+
threads.push((path.file_name().unwrap().to_str().unwrap().to_string(),
67+
std::thread::spawn(move || {
68+
let string_logger = StringBuffer::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+
));
81+
while threads_running.load(atomic::Ordering::Acquire) > 32 {
82+
std::thread::park();
83+
}
84+
}
85+
}
86+
for (test, thread) in threads.drain(..) {
87+
if let Some(output) = thread.join().unwrap() {
88+
println!("Output of {}:\n{}", test, output);
89+
panic!();
5790
}
5891
}
5992
}

fuzz/src/bin/chanmon_deser_target.rs

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,48 @@ 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::StringBuffer;
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();
54-
println!("Running test {}...", path.file_name().unwrap().to_str().unwrap());
55-
fs::File::open(path).unwrap().read_to_end(&mut data).unwrap();
56-
chanmon_deser_run(data.as_ptr(), data.len());
61+
fs::File::open(&path).unwrap().read_to_end(&mut data).unwrap();
62+
threads_running.fetch_add(1, atomic::Ordering::AcqRel);
63+
64+
let thread_count_ref = Arc::clone(&threads_running);
65+
let main_thread_ref = std::thread::current();
66+
threads.push((path.file_name().unwrap().to_str().unwrap().to_string(),
67+
std::thread::spawn(move || {
68+
let string_logger = StringBuffer::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+
));
81+
while threads_running.load(atomic::Ordering::Acquire) > 32 {
82+
std::thread::park();
83+
}
84+
}
85+
}
86+
for (test, thread) in threads.drain(..) {
87+
if let Some(output) = thread.join().unwrap() {
88+
println!("Output of {}:\n{}", test, output);
89+
panic!();
5790
}
5891
}
5992
}

fuzz/src/bin/full_stack_target.rs

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,48 @@ 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::StringBuffer;
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();
54-
println!("Running test {}...", path.file_name().unwrap().to_str().unwrap());
55-
fs::File::open(path).unwrap().read_to_end(&mut data).unwrap();
56-
full_stack_run(data.as_ptr(), data.len());
61+
fs::File::open(&path).unwrap().read_to_end(&mut data).unwrap();
62+
threads_running.fetch_add(1, atomic::Ordering::AcqRel);
63+
64+
let thread_count_ref = Arc::clone(&threads_running);
65+
let main_thread_ref = std::thread::current();
66+
threads.push((path.file_name().unwrap().to_str().unwrap().to_string(),
67+
std::thread::spawn(move || {
68+
let string_logger = StringBuffer::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+
));
81+
while threads_running.load(atomic::Ordering::Acquire) > 32 {
82+
std::thread::park();
83+
}
84+
}
85+
}
86+
for (test, thread) in threads.drain(..) {
87+
if let Some(output) = thread.join().unwrap() {
88+
println!("Output of {}:\n{}", test, output);
89+
panic!();
5790
}
5891
}
5992
}

fuzz/src/bin/msg_accept_channel_target.rs

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,48 @@ 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::StringBuffer;
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();
54-
println!("Running test {}...", path.file_name().unwrap().to_str().unwrap());
55-
fs::File::open(path).unwrap().read_to_end(&mut data).unwrap();
56-
msg_accept_channel_run(data.as_ptr(), data.len());
61+
fs::File::open(&path).unwrap().read_to_end(&mut data).unwrap();
62+
threads_running.fetch_add(1, atomic::Ordering::AcqRel);
63+
64+
let thread_count_ref = Arc::clone(&threads_running);
65+
let main_thread_ref = std::thread::current();
66+
threads.push((path.file_name().unwrap().to_str().unwrap().to_string(),
67+
std::thread::spawn(move || {
68+
let string_logger = StringBuffer::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+
));
81+
while threads_running.load(atomic::Ordering::Acquire) > 32 {
82+
std::thread::park();
83+
}
84+
}
85+
}
86+
for (test, thread) in threads.drain(..) {
87+
if let Some(output) = thread.join().unwrap() {
88+
println!("Output of {}:\n{}", test, output);
89+
panic!();
5790
}
5891
}
5992
}

fuzz/src/bin/msg_announcement_signatures_target.rs

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,48 @@ 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::StringBuffer;
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();
54-
println!("Running test {}...", path.file_name().unwrap().to_str().unwrap());
55-
fs::File::open(path).unwrap().read_to_end(&mut data).unwrap();
56-
msg_announcement_signatures_run(data.as_ptr(), data.len());
61+
fs::File::open(&path).unwrap().read_to_end(&mut data).unwrap();
62+
threads_running.fetch_add(1, atomic::Ordering::AcqRel);
63+
64+
let thread_count_ref = Arc::clone(&threads_running);
65+
let main_thread_ref = std::thread::current();
66+
threads.push((path.file_name().unwrap().to_str().unwrap().to_string(),
67+
std::thread::spawn(move || {
68+
let string_logger = StringBuffer::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+
));
81+
while threads_running.load(atomic::Ordering::Acquire) > 32 {
82+
std::thread::park();
83+
}
84+
}
85+
}
86+
for (test, thread) in threads.drain(..) {
87+
if let Some(output) = thread.join().unwrap() {
88+
println!("Output of {}:\n{}", test, output);
89+
panic!();
5790
}
5891
}
5992
}

fuzz/src/bin/msg_channel_announcement_target.rs

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,48 @@ 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::StringBuffer;
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();
54-
println!("Running test {}...", path.file_name().unwrap().to_str().unwrap());
55-
fs::File::open(path).unwrap().read_to_end(&mut data).unwrap();
56-
msg_channel_announcement_run(data.as_ptr(), data.len());
61+
fs::File::open(&path).unwrap().read_to_end(&mut data).unwrap();
62+
threads_running.fetch_add(1, atomic::Ordering::AcqRel);
63+
64+
let thread_count_ref = Arc::clone(&threads_running);
65+
let main_thread_ref = std::thread::current();
66+
threads.push((path.file_name().unwrap().to_str().unwrap().to_string(),
67+
std::thread::spawn(move || {
68+
let string_logger = StringBuffer::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+
));
81+
while threads_running.load(atomic::Ordering::Acquire) > 32 {
82+
std::thread::park();
83+
}
84+
}
85+
}
86+
for (test, thread) in threads.drain(..) {
87+
if let Some(output) = thread.join().unwrap() {
88+
println!("Output of {}:\n{}", test, output);
89+
panic!();
5790
}
5891
}
5992
}

fuzz/src/bin/msg_channel_reestablish_target.rs

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,48 @@ 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::StringBuffer;
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();
54-
println!("Running test {}...", path.file_name().unwrap().to_str().unwrap());
55-
fs::File::open(path).unwrap().read_to_end(&mut data).unwrap();
56-
msg_channel_reestablish_run(data.as_ptr(), data.len());
61+
fs::File::open(&path).unwrap().read_to_end(&mut data).unwrap();
62+
threads_running.fetch_add(1, atomic::Ordering::AcqRel);
63+
64+
let thread_count_ref = Arc::clone(&threads_running);
65+
let main_thread_ref = std::thread::current();
66+
threads.push((path.file_name().unwrap().to_str().unwrap().to_string(),
67+
std::thread::spawn(move || {
68+
let string_logger = StringBuffer::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+
));
81+
while threads_running.load(atomic::Ordering::Acquire) > 32 {
82+
std::thread::park();
83+
}
84+
}
85+
}
86+
for (test, thread) in threads.drain(..) {
87+
if let Some(output) = thread.join().unwrap() {
88+
println!("Output of {}:\n{}", test, output);
89+
panic!();
5790
}
5891
}
5992
}

0 commit comments

Comments
 (0)