| # 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. |
| """Module for custom data types.""" |
| |
| import datetime |
| from typing import Any, List, Optional |
| |
| from flake_suppressor_common import common_typing as ct |
| from unexpected_passes_common import data_types as unexpected_dt |
| |
| |
| class Expectation(unexpected_dt.Expectation): |
| """Container for a test expectation. |
| |
| Re-uses the unexpected pass finder's equivalent class, but updates the |
| check to work with the flake suppressor's Result class instead of the |
| unexpected pass finder's. |
| |
| Does not contain information on suite/expectation file, so these are expected |
| to be separated based on that. |
| """ |
| |
| def AppliesToResult(self, result: 'Result') -> bool: |
| assert isinstance(result, Result) |
| return self._comp(result.test) and self.tags <= set(result.tags) |
| |
| |
| class Result(): |
| """Container for a test result. |
| |
| Contains all the relevant information we get back from BigQuery for a result |
| for the purposes of the flake finder. |
| """ |
| |
| # TODO(crbug.com/40237087): Refactor this Class to take ResultTupleType as an |
| # input. |
| def __init__(self, |
| suite: str, |
| test: str, |
| tags: ct.TagTupleType, |
| build_id: str, |
| status: Optional[str] = None, |
| date: Optional[datetime.date] = None, |
| is_slow: Optional[bool] = None, |
| typ_expectations: Optional[List[str]] = None): |
| assert isinstance(tags, tuple), 'Tags must be in tuple form to be hashable' |
| # Results should not have any globs. |
| assert '*' not in test |
| self.suite = suite |
| self.test = test |
| self.tags = tags |
| self.build_id = build_id |
| self.status = status or '' |
| self.date = date or datetime.date.min |
| self.is_slow = is_slow or False |
| self.typ_expectations = typ_expectations or [] |
| self.typ_expectations.sort() |
| |
| def __eq__(self, other: Any) -> bool: |
| return (isinstance(other, Result) and self.suite == other.suite |
| and self.test == other.test and self.tags == other.tags |
| and self.build_id == other.build_id and self.status == other.status |
| and self.date == other.date and self.is_slow == other.is_slow |
| and self.typ_expectations == other.typ_expectations) |
| |
| def __hash__(self) -> int: |
| return hash((self.suite, self.test, self.tags, self.build_id, self.status, |
| self.date, self.is_slow, tuple(self.typ_expectations))) |