# Copyright 2020 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Helper methods for unittests."""
from typing import Generator, Iterable, List, Optional, Set, Tuple, Type
import pandas
from unexpected_passes_common import builders
from unexpected_passes_common import expectations
from unexpected_passes_common import data_types
from unexpected_passes_common import queries as queries_module
def CreateStatsWithPassFails(passes: int, fails: int) -> data_types.BuildStats:
stats = data_types.BuildStats()
for _ in range(passes):
stats.AddPassedBuild(frozenset())
for i in range(fails):
stats.AddFailedBuild('build_id%d' % i, frozenset())
return stats
# id_ is used instead of id since id is a python built-in.
def FakeQueryResult(builder_name: str, id_: str, test_id: str, status: str,
typ_tags: Iterable[str], step_name: str) -> pandas.Series:
return pandas.Series(
data={
'builder_name': builder_name,
'id': id_,
'test_id': test_id,
'status': status,
'typ_tags': list(typ_tags),
'step_name': step_name,
})
class SimpleBigQueryQuerier(queries_module.BigQueryQuerier):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.query_results = []
def _GetSeriesForQuery(self, _) -> Generator[pandas.Series, None, None]:
for r in self.query_results:
yield r
def _GetRelevantExpectationFilesForQueryResult(self, _) -> None:
return None
def _StripPrefixFromTestId(self, test_id: str) -> str:
return test_id.split('.')[-1]
def _GetPublicCiQuery(self) -> str:
return 'public_ci'
def _GetInternalCiQuery(self) -> str:
return 'internal_ci'
def _GetPublicTryQuery(self) -> str:
return 'public_try'
def _GetInternalTryQuery(self) -> str:
return 'internal_try'
def CreateGenericQuerier(
suite: Optional[str] = None,
project: Optional[str] = None,
num_samples: Optional[int] = None,
keep_unmatched_results: bool = False,
cls: Optional[Type[queries_module.BigQueryQuerier]] = None
) -> queries_module.BigQueryQuerier:
suite = suite or 'pixel'
project = project or 'project'
num_samples = num_samples or 5
cls = cls or SimpleBigQueryQuerier
return cls(suite, project, num_samples, keep_unmatched_results)
def GetArgsForMockCall(call_args_list: List[tuple],
call_number: int) -> Tuple[tuple, dict]:
"""Helper to more sanely get call args from a mocked method.
Args:
call_args_list: The call_args_list member from the mock in question.
call_number: The call number to pull args from, starting at 0 for the first
call to the method.
Returns:
A tuple (args, kwargs). |args| is a list of arguments passed to the method.
|kwargs| is a dict containing the keyword arguments padded to the method.
"""
args = call_args_list[call_number][0]
kwargs = call_args_list[call_number][1]
return args, kwargs
class GenericBuilders(builders.Builders):
#pylint: disable=useless-super-delegation
def __init__(self,
suite: Optional[str] = None,
include_internal_builders: bool = False):
super().__init__(suite, include_internal_builders)
#pylint: enable=useless-super-delegation
def _BuilderRunsTestOfInterest(self, _test_map) -> bool:
return True
def GetIsolateNames(self) -> Set[str]:
return set()
def GetFakeCiBuilders(self) -> dict:
return {}
def GetNonChromiumBuilders(self) -> Set[data_types.BuilderEntry]:
return set()
def RegisterGenericBuildersImplementation() -> None:
builders.RegisterInstance(GenericBuilders())
class GenericExpectations(expectations.Expectations):
def GetExpectationFilepaths(self) -> list:
return []
def _GetExpectationFileTagHeader(self, _) -> str:
return """\
# tags: [ linux mac win ]
# tags: [ amd intel nvidia ]
# results: [ Failure RetryOnFailure Skip Pass ]
"""
def _GetKnownTags(self) -> Set[str]:
return set(['linux', 'mac', 'win', 'amd', 'intel', 'nvidia'])
def CreateGenericExpectations() -> GenericExpectations:
return GenericExpectations()
def RegisterGenericExpectationsImplementation() -> None:
expectations.RegisterInstance(CreateGenericExpectations())