ci: Run fuzz target even if input folder is empty

This commit is contained in:
MarcoFalke 2023-06-20 15:58:21 +02:00
parent c2316b1e34
commit 0000f55293
No known key found for this signature in database
2 changed files with 19 additions and 5 deletions

View file

@ -170,5 +170,5 @@ if [ "${RUN_TIDY}" = "true" ]; then
fi fi
if [ "$RUN_FUZZ_TESTS" = "true" ]; then if [ "$RUN_FUZZ_TESTS" = "true" ]; then
bash -c "LD_LIBRARY_PATH=${DEPENDS_DIR}/${HOST}/lib test/fuzz/test_runner.py ${FUZZ_TESTS_CONFIG} $MAKEJOBS -l DEBUG ${DIR_FUZZ_IN}" bash -c "LD_LIBRARY_PATH=${DEPENDS_DIR}/${HOST}/lib test/fuzz/test_runner.py ${FUZZ_TESTS_CONFIG} $MAKEJOBS -l DEBUG ${DIR_FUZZ_IN} --empty_min_time=60"
fi fi

View file

@ -6,6 +6,7 @@
""" """
from concurrent.futures import ThreadPoolExecutor, as_completed from concurrent.futures import ThreadPoolExecutor, as_completed
from pathlib import Path
import argparse import argparse
import configparser import configparser
import logging import logging
@ -41,6 +42,11 @@ def main():
action='store_true', action='store_true',
help='If true, run fuzzing binaries under the valgrind memory error detector', help='If true, run fuzzing binaries under the valgrind memory error detector',
) )
parser.add_argument(
"--empty_min_time",
type=int,
help="If set, run at least this long, if the existing fuzz inputs directory is empty.",
)
parser.add_argument( parser.add_argument(
'-x', '-x',
'--exclude', '--exclude',
@ -76,6 +82,7 @@ def main():
) )
args = parser.parse_args() args = parser.parse_args()
args.corpus_dir = Path(args.corpus_dir)
# Set up logging # Set up logging
logging.basicConfig( logging.basicConfig(
@ -180,6 +187,7 @@ def main():
src_dir=config['environment']['SRCDIR'], src_dir=config['environment']['SRCDIR'],
build_dir=config["environment"]["BUILDDIR"], build_dir=config["environment"]["BUILDDIR"],
use_valgrind=args.valgrind, use_valgrind=args.valgrind,
empty_min_time=args.empty_min_time,
) )
@ -251,14 +259,20 @@ def merge_inputs(*, fuzz_pool, corpus, test_list, src_dir, build_dir, merge_dir)
future.result() future.result()
def run_once(*, fuzz_pool, corpus, test_list, src_dir, build_dir, use_valgrind): def run_once(*, fuzz_pool, corpus, test_list, src_dir, build_dir, use_valgrind, empty_min_time):
jobs = [] jobs = []
for t in test_list: for t in test_list:
corpus_path = os.path.join(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'), os.path.join(build_dir, 'src', 'test', 'fuzz', 'fuzz'),
'-runs=1', ]
empty_dir = not any(corpus_path.iterdir())
if empty_min_time and empty_dir:
args += [f"-max_total_time={empty_min_time}"]
else:
args += [
"-runs=1",
corpus_path, corpus_path,
] ]
if use_valgrind: if use_valgrind: