harfbuzz/test/fuzzing/meson.build
2025-04-06 13:54:47 -06:00

124 lines
3.1 KiB
Meson

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