v8/tools/testrunner/testproc/fuzzer_test.py
Michael Achenbach 3212b90600 [numfuzz] Gracefully ignore contradictory flags
NumFuzz passes various flags to V8 testing randomly, which can lead to
various flag contradictions with existing flags. Up to now the system
ignored the check for contradictions and kept running the test cases,
leading to false positives.

This change adds a new v8 flag --exit-on-contradictory-flags that
exists gracefully when a contradiction is detected. On the numfuzz
side we now filter simple contradictions beforehand.

Measurements showed that ~2% of all numfuzz tests ran into
contradictions. Around half of them are simple contradictions
(repetitions and inversions), which are now filtered beforehand.
The remaining ones (redundant or contradictory implications) are
now ignored.

Bug: v8:11826
Change-Id: I9942e203ba9668a097fabe1343dd1365c9da94c1
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3650746
Commit-Queue: Michael Achenbach <machenbach@chromium.org>
Reviewed-by: Tobias Tebbi <tebbi@chromium.org>
Reviewed-by: Almothana Athamneh <almuthanna@chromium.org>
Cr-Commit-Position: refs/heads/main@{#80589}
2022-05-17 13:09:07 +00:00

52 lines
1.7 KiB
Python

#!/usr/bin/env python3
# Copyright 2022 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.
"""
Test functionality used by the fuzzer test processor.
"""
import os
import sys
import unittest
# Needed because the test runner contains relative imports.
TOOLS_PATH = os.path.dirname(
os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
sys.path.append(TOOLS_PATH)
from testrunner.testproc import fuzzer
class TestFuzzerProcHelpers(unittest.TestCase):
def test_invert_flag(self):
self.assertEqual(fuzzer._invert_flag('--no-flag'), '--flag')
self.assertEqual(fuzzer._invert_flag('--flag'), '--no-flag')
def test_flag_prefix(self):
self.assertEqual(fuzzer._flag_prefix('--flag'), '--flag')
self.assertEqual(fuzzer._flag_prefix('--flag=42'), '--flag')
def test_contradictory_flags(self):
def check(new_flags, old_flags, expected_flags):
actual = fuzzer._drop_contradictory_flags(new_flags, old_flags)
self.assertEqual(actual, expected_flags)
old_flags = ['--foo-bar', '--no-bar', '--baz', '--doom-melon=42', '--flag']
check([], old_flags, [])
check(['--flag', '--no-baz', '--bar'], old_flags, [])
check(['--foo-bar=42', '--doom-melon=0'], old_flags, [])
check(['--flag', '--something', '--bar'], old_flags, ['--something'])
check(['--something', '--doom-melon=0'], old_flags, ['--something'])
check(old_flags, old_flags, [])
check(['--a', '--b'], old_flags, ['--a', '--b'])
old_flags = []
check(['--flag', '--no-baz'], old_flags, ['--flag', '--no-baz'])
if __name__ == '__main__':
unittest.main()