0
0
Fork 0
mirror of https://github.com/bitcoin/bitcoin.git synced 2025-02-10 10:52:31 -05:00

Merge bitcoin/bitcoin#29821: fuzz: Some test/fuzz/test_runner.py improvements

47cedee776 fuzz: Introduce `BITCOINFUZZ` environment variable (Hennadii Stepanov)
1573e9a11e fuzz, refactor: Deduplicate fuzz binary path creation (Hennadii Stepanov)

Pull request description:

  These changes are split from https://github.com/bitcoin/bitcoin/pull/29774 and can be beneficial on their own.

  The new `BITCOINFUZZ` environment variable complements the already existing set of variables used by tests: b5d21182e5/test/functional/test_framework/test_framework.py (L238-L243)

ACKs for top commit:
  maflcko:
    lgtm ACK 47cedee776
  davidgumberg:
    utACK 47cedee776

Tree-SHA512: 45809cfd13dc4a45c44cc433184352e84726cb95bea80fd8f581c59a0b8b0a5495260ff66922f9c57c38adbdbdd102439238f370fd49d6ea27a241a5e6249895
This commit is contained in:
fanquake 2024-04-09 10:57:44 +02:00
commit f348ec7c2a
No known key found for this signature in database
GPG key ID: 2EEB9F5CC09526C1

View file

@ -104,9 +104,11 @@ def main():
logging.error("Must have fuzz executable built") logging.error("Must have fuzz executable built")
sys.exit(1) sys.exit(1)
fuzz_bin=os.getenv("BITCOINFUZZ", default=os.path.join(config["environment"]["BUILDDIR"], 'src', 'test', 'fuzz', 'fuzz'))
# Build list of tests # Build list of tests
test_list_all = parse_test_list( test_list_all = parse_test_list(
fuzz_bin=os.path.join(config["environment"]["BUILDDIR"], 'src', 'test', 'fuzz', 'fuzz'), fuzz_bin=fuzz_bin,
source_dir=config['environment']['SRCDIR'], source_dir=config['environment']['SRCDIR'],
) )
@ -151,7 +153,7 @@ def main():
try: try:
help_output = subprocess.run( help_output = subprocess.run(
args=[ args=[
os.path.join(config["environment"]["BUILDDIR"], 'src', 'test', 'fuzz', 'fuzz'), fuzz_bin,
'-help=1', '-help=1',
], ],
env=get_fuzz_env(target=test_list_selection[0], source_dir=config['environment']['SRCDIR']), env=get_fuzz_env(target=test_list_selection[0], source_dir=config['environment']['SRCDIR']),
@ -173,7 +175,7 @@ def main():
return generate_corpus( return generate_corpus(
fuzz_pool=fuzz_pool, fuzz_pool=fuzz_pool,
src_dir=config['environment']['SRCDIR'], src_dir=config['environment']['SRCDIR'],
build_dir=config["environment"]["BUILDDIR"], fuzz_bin=fuzz_bin,
corpus_dir=args.corpus_dir, corpus_dir=args.corpus_dir,
targets=test_list_selection, targets=test_list_selection,
) )
@ -184,7 +186,7 @@ def main():
corpus=args.corpus_dir, corpus=args.corpus_dir,
test_list=test_list_selection, test_list=test_list_selection,
src_dir=config['environment']['SRCDIR'], src_dir=config['environment']['SRCDIR'],
build_dir=config["environment"]["BUILDDIR"], fuzz_bin=fuzz_bin,
merge_dirs=[Path(m_dir) for m_dir in args.m_dir], merge_dirs=[Path(m_dir) for m_dir in args.m_dir],
) )
return return
@ -194,7 +196,7 @@ def main():
corpus=args.corpus_dir, corpus=args.corpus_dir,
test_list=test_list_selection, test_list=test_list_selection,
src_dir=config['environment']['SRCDIR'], src_dir=config['environment']['SRCDIR'],
build_dir=config["environment"]["BUILDDIR"], fuzz_bin=fuzz_bin,
using_libfuzzer=using_libfuzzer, using_libfuzzer=using_libfuzzer,
use_valgrind=args.valgrind, use_valgrind=args.valgrind,
empty_min_time=args.empty_min_time, empty_min_time=args.empty_min_time,
@ -237,7 +239,7 @@ def transform_rpc_target(targets, src_dir):
return targets return targets
def generate_corpus(*, fuzz_pool, src_dir, build_dir, corpus_dir, targets): def generate_corpus(*, fuzz_pool, src_dir, fuzz_bin, corpus_dir, targets):
"""Generates new corpus. """Generates new corpus.
Run {targets} without input, and outputs the generated corpus to Run {targets} without input, and outputs the generated corpus to
@ -270,7 +272,7 @@ def generate_corpus(*, fuzz_pool, src_dir, build_dir, corpus_dir, targets):
os.makedirs(target_corpus_dir, exist_ok=True) os.makedirs(target_corpus_dir, exist_ok=True)
use_value_profile = int(random.random() < .3) use_value_profile = int(random.random() < .3)
command = [ command = [
os.path.join(build_dir, 'src', 'test', 'fuzz', 'fuzz'), fuzz_bin,
"-rss_limit_mb=8000", "-rss_limit_mb=8000",
"-max_total_time=6000", "-max_total_time=6000",
"-reload=0", "-reload=0",
@ -283,12 +285,12 @@ def generate_corpus(*, fuzz_pool, src_dir, build_dir, corpus_dir, targets):
future.result() future.result()
def merge_inputs(*, fuzz_pool, corpus, test_list, src_dir, build_dir, merge_dirs): def merge_inputs(*, fuzz_pool, corpus, test_list, src_dir, fuzz_bin, merge_dirs):
logging.info(f"Merge the inputs from the passed dir into the corpus_dir. Passed dirs {merge_dirs}") logging.info(f"Merge the inputs from the passed dir into the corpus_dir. Passed dirs {merge_dirs}")
jobs = [] jobs = []
for t in test_list: for t in test_list:
args = [ args = [
os.path.join(build_dir, 'src', 'test', 'fuzz', 'fuzz'), fuzz_bin,
'-rss_limit_mb=8000', '-rss_limit_mb=8000',
'-set_cover_merge=1', '-set_cover_merge=1',
# set_cover_merge is used instead of -merge=1 to reduce the overall # set_cover_merge is used instead of -merge=1 to reduce the overall
@ -325,13 +327,13 @@ def merge_inputs(*, fuzz_pool, corpus, test_list, src_dir, build_dir, merge_dirs
future.result() future.result()
def run_once(*, fuzz_pool, corpus, test_list, src_dir, build_dir, using_libfuzzer, use_valgrind, empty_min_time): def run_once(*, fuzz_pool, corpus, test_list, src_dir, fuzz_bin, using_libfuzzer, use_valgrind, empty_min_time):
jobs = [] jobs = []
for t in test_list: for t in test_list:
corpus_path = corpus / t corpus_path = corpus / t
os.makedirs(corpus_path, exist_ok=True) os.makedirs(corpus_path, exist_ok=True)
args = [ args = [
os.path.join(build_dir, 'src', 'test', 'fuzz', 'fuzz'), fuzz_bin,
] ]
empty_dir = not any(corpus_path.iterdir()) empty_dir = not any(corpus_path.iterdir())
if using_libfuzzer: if using_libfuzzer: