# Copyright 2021 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import os from pyfakefs import fake_filesystem_unittest # pylint: disable=import-error from typing import List, Tuple, Iterable from flake_suppressor_common import common_typing as ct from flake_suppressor_common import expectations as expectations_module from flake_suppressor_common import queries from flake_suppressor_common import results as results_module from flake_suppressor_common import tag_utils CHROMIUM_SRC_DIR = os.path.realpath( os.path.join(os.path.dirname(__file__), '..', '..')) RELATIVE_EXPECTATION_FILE_DIRECTORY = os.path.join('content', 'test', 'gpu', 'gpu_tests', 'test_expectations') ABSOLUTE_EXPECTATION_FILE_DIRECTORY = os.path.join( CHROMIUM_SRC_DIR, RELATIVE_EXPECTATION_FILE_DIRECTORY) TAG_HEADER = """\ # OS # tags: [ android android-lollipop android-marshmallow android-nougat # android-pie android-r android-s android-t # chromeos # fuchsia # linux ubuntu # mac highsierra mojave catalina bigsur monterey # win win8 win10 ] # Browser # tags: [ android-chromium android-webview-instrumentation # debug debug-x64 # release release-x64 # fuchsia-chrome web-engine-shell ] # results: [ Failure RetryOnFailure Skip Slow ] """ def CreateFile(test: fake_filesystem_unittest.TestCase, *args, **kwargs) -> None: # TODO(crbug.com/1156806): Remove this and just use fs.create_file() when # Catapult is updated to a newer version of pyfakefs that is compatible with # Chromium's version. if hasattr(test.fs, 'create_file'): test.fs.create_file(*args, **kwargs) else: test.fs.CreateFile(*args, **kwargs) class FakeProcess(): def __init__(self, stdout: str): self.stdout = stdout or '' class UnitTest_BigQueryQuerier(queries.BigQueryQuerier): def GetResultCountCIQuery(self) -> str: return """SELECT * FROM foo""" def GetResultCountTryQuery(self) -> str: return """submitted_builds SELECT * FROM bar""" def GetFlakyOrFailingCiQuery(self) -> str: return """SELECT * FROM foo""" def GetFlakyOrFailingTryQuery(self) -> str: return """submitted_builds SELECT * FROM bar""" def GetFailingBuildCulpritFromCiQuery(self) -> str: raise NotImplementedError() class UnitTestResultProcessor(results_module.ResultProcessor): def GetTestSuiteAndNameFromResultDbName(self, result_db_name: str ) -> Tuple[str, str]: _, suite, __, test_name = result_db_name.split('.', 3) return suite, test_name class UnitTestTagUtils(tag_utils.BaseTagUtils): def RemoveIgnoredTags(self, tags: Iterable[str]) -> ct.TagTupleType: tags = list(set(tags) - set(['win-laptop'])) tags.sort() return tuple(tags) # pylint: disable=unused-argument class UnitTestExpectationProcessor(expectations_module.ExpectationProcessor): def GetExpectationFileForSuite(self, suite: str, typ_tags: ct.TagTupleType) -> str: filename = suite.replace('integration_test', 'expectations.txt') return os.path.join(ABSOLUTE_EXPECTATION_FILE_DIRECTORY, filename) def IsSuiteUnsupported(self, suite) -> bool: return False def GetExpectedResult(self, fraction: float, flaky_threshold: float) -> str: if fraction < flaky_threshold: return 'RetryOnFailure' return 'Failure' def ListLocalCheckoutExpectationFiles(self) -> List[str]: raise NotImplementedError() def ListOriginExpectationFiles(self) -> List[str]: raise NotImplementedError() # pylint: enable=unused-argument