mirror of
https://github.com/nodejs/node.git
synced 2025-05-15 02:04:52 +00:00

PR-URL: https://github.com/nodejs/node/pull/54077 Reviewed-By: Jiawen Geng <technicalcute@gmail.com> Reviewed-By: Richard Lau <rlau@redhat.com> Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com> Reviewed-By: Marco Ippolito <marcoippolito54@gmail.com>
123 lines
3.7 KiB
Python
123 lines
3.7 KiB
Python
#!/usr/bin/env python3
|
|
# Copyright 2024 the V8 project authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
import os
|
|
import unittest
|
|
|
|
from mock import patch
|
|
from pyfakefs import fake_filesystem_unittest
|
|
from textwrap import dedent
|
|
|
|
import gen_fuzztest_configs
|
|
|
|
|
|
class TestFileName(unittest.TestCase):
|
|
|
|
def test_errors(self):
|
|
|
|
def check_error(test_name):
|
|
with self.assertRaises(AssertionError):
|
|
gen_fuzztest_configs.fuzz_test_to_file_name(test_name)
|
|
|
|
check_error('')
|
|
check_error(' ')
|
|
check_error('foo')
|
|
check_error('SimpleTestSuite')
|
|
check_error('ExampleFuzzTest')
|
|
check_error('suite_test_fuzztest')
|
|
check_error('Too.Many.Dots')
|
|
check_error('No.White space')
|
|
|
|
def test_conversion(self):
|
|
|
|
def check_conversion(test_name, file_name):
|
|
self.assertEqual(file_name,
|
|
gen_fuzztest_configs.fuzz_test_to_file_name(test_name))
|
|
|
|
check_conversion('Foo.Bar', 'v8_foo_bar_fuzztest')
|
|
check_conversion('foo.bar', 'v8_foo_bar_fuzztest')
|
|
check_conversion('SimpleSuite.SimpleTest',
|
|
'v8_simple_suite_simple_fuzztest')
|
|
check_conversion('RemoveFuzzTest.SimpleTest',
|
|
'v8_remove_simple_fuzztest')
|
|
check_conversion('IPConversionABC.I24P',
|
|
'v8_ip_conversion_abc_i24_p_fuzztest')
|
|
|
|
|
|
class TestFullRun(fake_filesystem_unittest.TestCase):
|
|
|
|
def test_no_executable(self):
|
|
self.setUpPyfakefs(allow_root_user=True)
|
|
with self.assertRaises(AssertionError):
|
|
# The expected executable is missing.
|
|
gen_fuzztest_configs.main()
|
|
|
|
def _set_up_executable(self):
|
|
os.makedirs('/out/build')
|
|
os.chdir('/out/build')
|
|
with open('/out/build/v8_unittests', 'w') as f:
|
|
f.write('I am an executable')
|
|
|
|
def test_no_fuzzers(self):
|
|
self.setUpPyfakefs(allow_root_user=True)
|
|
self._set_up_executable()
|
|
|
|
with patch('subprocess.check_output', return_value=b''):
|
|
with self.assertRaises(AssertionError) as e:
|
|
gen_fuzztest_configs.main()
|
|
|
|
def test_three_fuzzers(self):
|
|
self.setUpPyfakefs(allow_root_user=True)
|
|
self._set_up_executable()
|
|
|
|
os.makedirs('/out/build/fuzztests')
|
|
with open('/out/build/fuzztests/leftover_garbage', 'w') as f:
|
|
f.write('')
|
|
|
|
fake_fuzz_test_list = dedent("""\
|
|
[*] Fuzz test: FooTest.Test1
|
|
[*] Fuzz test: FooTest.Test2
|
|
[*] Fuzz test: AlphaSortThis.FooBarXYZ""")
|
|
|
|
with patch(
|
|
'subprocess.check_output',
|
|
return_value=fake_fuzz_test_list.encode('utf-8')):
|
|
gen_fuzztest_configs.main()
|
|
|
|
fuzz_test_output = sorted(os.listdir('/out/build/fuzztests'))
|
|
expexted_fuzz_test_output = [
|
|
'centipede', # Bash wrapper to ../centipede
|
|
'fuzztests.stamp',
|
|
'v8_alpha_sort_this_foo_bar_xyz_fuzztest',
|
|
'v8_foo_1_fuzztest',
|
|
'v8_foo_2_fuzztest',
|
|
]
|
|
self.assertEqual(expexted_fuzz_test_output, fuzz_test_output)
|
|
|
|
with open('/out/build/fuzztests/fuzztests.stamp') as f:
|
|
self.assertEqual('AlphaSortThis.FooBarXYZ\nFooTest.Test1\nFooTest.Test2',
|
|
f.read())
|
|
|
|
expected_wrapper = dedent("""\
|
|
#!/bin/sh
|
|
BINARY_DIR="$(cd "${0%/*}"/..; pwd)"
|
|
cd $BINARY_DIR
|
|
# Normal fuzzing.
|
|
if [ "$#" -eq "0" ]; then
|
|
exec $BINARY_DIR/v8_unittests --fuzz=FooTest.Test1 --corpus_database=""
|
|
fi
|
|
# Fuzztest replay.
|
|
if [ "$#" -eq "1" ]; then
|
|
unset CENTIPEDE_RUNNER_FLAGS
|
|
FUZZTEST_REPLAY=$1 exec $BINARY_DIR/v8_unittests --fuzz=FooTest.Test1 --corpus_database=""
|
|
fi
|
|
""")
|
|
with open('/out/build/fuzztests/v8_foo_1_fuzztest') as f:
|
|
self.assertEqual(expected_wrapper, f.read())
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|