tests = [ 'hb-shape-fuzzer.cc', 'hb-subset-fuzzer.cc', 'hb-set-fuzzer.cc', 'hb-draw-fuzzer.cc', 'hb-repacker-fuzzer.cc', ] # Build the binaries foreach file_name : tests test_name = file_name.split('.')[0] sources = [file_name] fuzzer_ldflags = [] extra_cpp_args = [] if get_option('fuzzer_ldflags') == '' sources += 'main.cc' else fuzzer_ldflags += get_option('fuzzer_ldflags').split() extra_cpp_args += '-DHB_IS_IN_FUZZER' endif if get_option('experimental_api') extra_cpp_args += '-DHB_EXPERIMENTAL_API' endif exe = executable(test_name, sources, cpp_args: cpp_args + extra_cpp_args, include_directories: [incconfig, incsrc], link_args: fuzzer_ldflags, link_with: [libharfbuzz, libharfbuzz_subset], install: false, ) set_variable('@0@_exe'.format(test_name.underscorify()), exe) endforeach glob_cmd = find_program('glob.py', required: true) fonts_glob = run_command(glob_cmd, meson.current_source_dir() / 'fonts', check:true).stdout().strip().split('\n') subset_fonts_glob = run_command(glob_cmd, meson.current_source_dir() / '..' / 'subset' / 'data' / 'fonts', check:true).stdout().strip().split('\n') graphs_glob = run_command(glob_cmd, meson.current_source_dir() / 'graphs', check:true).stdout().strip().split('\n') sets_glob = run_command(glob_cmd, meson.current_source_dir() / 'sets', check:true).stdout().strip().split('\n') # Chunk the glob lists to avoid command line length limits, and for parallelization chunk_size = 64 foreach glob_name : ['fonts_glob', 'subset_fonts_glob', 'graphs_glob', 'sets_glob'] glob = get_variable(glob_name) chunks = [] chunk = [] foreach item : glob if chunk.length() >= chunk_size chunks += [chunk] chunk = [] endif chunk += [item] endforeach if chunk.length() > 0 chunks += [chunk] endif set_variable('@0@_chunks'.format(glob_name), chunks) endforeach # Run fuzzers i = 0 foreach chunk : fonts_glob_chunks test('shape-fuzzer-chunk-@0@'.format(i), hb_shape_fuzzer_exe, args: chunk, workdir: meson.current_build_dir() / '..' / '..', protocol: 'tap', suite: ['fuzzing'], ) i += 1 endforeach i = 0 foreach chunk : fonts_glob_chunks test('draw-fuzzer-chunk-@0@'.format(i), hb_draw_fuzzer_exe, args: chunk, workdir: meson.current_build_dir() / '..' / '..', protocol: 'tap', suite: ['fuzzing'], ) i += 1 endforeach i = 0 foreach chunk : fonts_glob_chunks + subset_fonts_glob_chunks test('subset-fuzzer-chunk-@0@'.format(i), hb_subset_fuzzer_exe, args: chunk, workdir: meson.current_build_dir() / '..' / '..', protocol: 'tap', suite: ['fuzzing'], ) i += 1 endforeach i = 0 foreach chunk : graphs_glob_chunks test('repacker-fuzzer-chunk-@0@'.format(i), hb_repacker_fuzzer_exe, args: chunk, workdir: meson.current_build_dir() / '..' / '..', protocol: 'tap', suite: ['fuzzing'], ) i += 1 endforeach i = 0 foreach chunk : sets_glob_chunks test('set-fuzzer-chunk-@0@'.format(i), hb_set_fuzzer_exe, args: chunk, workdir: meson.current_build_dir() / '..' / '..', protocol: 'tap', suite: ['fuzzing'], ) i += 1 endforeach