193 lines
6.3 KiB
Python
193 lines
6.3 KiB
Python
|
|
# 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.
|
||
|
|
"""Class for storing Skia Gold comparison properties.
|
||
|
|
|
||
|
|
Examples:
|
||
|
|
* git revision being tested
|
||
|
|
* Whether the test is being run locally or on a bot
|
||
|
|
* What the continuous integration system is
|
||
|
|
"""
|
||
|
|
|
||
|
|
import argparse
|
||
|
|
import logging
|
||
|
|
import optparse
|
||
|
|
import os
|
||
|
|
from typing import Union
|
||
|
|
|
||
|
|
ParsedCmdArgs = Union[argparse.Namespace, optparse.Values]
|
||
|
|
|
||
|
|
|
||
|
|
class SkiaGoldProperties():
|
||
|
|
def __init__(self, args: ParsedCmdArgs):
|
||
|
|
"""Abstract class to validate and store properties related to Skia Gold.
|
||
|
|
|
||
|
|
Args:
|
||
|
|
args: The parsed arguments from an argparse.ArgumentParser.
|
||
|
|
"""
|
||
|
|
self._git_revision = None
|
||
|
|
self._issue = None
|
||
|
|
self._patchset = None
|
||
|
|
self._job_id = None
|
||
|
|
self._local_pixel_tests = None
|
||
|
|
self._no_luci_auth = None
|
||
|
|
self._service_account = None
|
||
|
|
self._bypass_skia_gold_functionality = None
|
||
|
|
self._code_review_system = None
|
||
|
|
self._continuous_integration_system = None
|
||
|
|
self._local_png_directory = None
|
||
|
|
|
||
|
|
self._InitializeProperties(args)
|
||
|
|
|
||
|
|
def IsTryjobRun(self) -> bool:
|
||
|
|
return self.issue is not None
|
||
|
|
|
||
|
|
@property
|
||
|
|
def continuous_integration_system(self) -> str:
|
||
|
|
return self._continuous_integration_system or 'buildbucket'
|
||
|
|
|
||
|
|
@property
|
||
|
|
def code_review_system(self) -> str:
|
||
|
|
return self._code_review_system or 'gerrit'
|
||
|
|
|
||
|
|
@property
|
||
|
|
def git_revision(self) -> str:
|
||
|
|
return self._GetGitRevision()
|
||
|
|
|
||
|
|
@property
|
||
|
|
def issue(self) -> int:
|
||
|
|
return self._issue
|
||
|
|
|
||
|
|
@property
|
||
|
|
def job_id(self) -> str:
|
||
|
|
return self._job_id
|
||
|
|
|
||
|
|
@property
|
||
|
|
def local_pixel_tests(self) -> bool:
|
||
|
|
return self._IsLocalRun()
|
||
|
|
|
||
|
|
@property
|
||
|
|
def local_png_directory(self) -> str:
|
||
|
|
return self._local_png_directory
|
||
|
|
|
||
|
|
@property
|
||
|
|
def no_luci_auth(self) -> bool:
|
||
|
|
return self._no_luci_auth
|
||
|
|
|
||
|
|
@property
|
||
|
|
def service_account(self) -> str:
|
||
|
|
return self._service_account
|
||
|
|
|
||
|
|
@property
|
||
|
|
def patchset(self) -> int:
|
||
|
|
return self._patchset
|
||
|
|
|
||
|
|
@property
|
||
|
|
def bypass_skia_gold_functionality(self) -> bool:
|
||
|
|
return self._bypass_skia_gold_functionality
|
||
|
|
|
||
|
|
@staticmethod
|
||
|
|
def _GetGitOriginMainHeadSha1() -> str:
|
||
|
|
raise NotImplementedError()
|
||
|
|
|
||
|
|
def _GetGitRevision(self) -> str:
|
||
|
|
if not self._git_revision:
|
||
|
|
# Automated tests should always pass the revision, so assume we're on
|
||
|
|
# a workstation and try to get the local origin/master HEAD.
|
||
|
|
if not self._IsLocalRun():
|
||
|
|
raise RuntimeError(
|
||
|
|
'--git-revision was not passed when running on a bot')
|
||
|
|
revision = self._GetGitOriginMainHeadSha1()
|
||
|
|
if not revision or len(revision) != 40:
|
||
|
|
raise RuntimeError(
|
||
|
|
'--git-revision not passed and unable to determine from git')
|
||
|
|
self._git_revision = revision
|
||
|
|
return self._git_revision
|
||
|
|
|
||
|
|
def _IsLocalRun(self) -> bool:
|
||
|
|
if self._local_pixel_tests is None:
|
||
|
|
# Look for the presence of the SWARMING_SERVER environment variable as a
|
||
|
|
# heuristic to determine whether we're running on a workstation or a bot.
|
||
|
|
# This should always be set on swarming, but would be strange to be set on
|
||
|
|
# a workstation.
|
||
|
|
# However, since Skylab technically isn't swarming, we need to look for
|
||
|
|
# an alternative environment variable there.
|
||
|
|
in_swarming = 'SWARMING_SERVER' in os.environ
|
||
|
|
in_skylab = bool(int(os.environ.get('RUNNING_IN_SKYLAB', '0')))
|
||
|
|
self._local_pixel_tests = not (in_swarming or in_skylab)
|
||
|
|
if self._local_pixel_tests:
|
||
|
|
logging.warning(
|
||
|
|
'Automatically determined that test is running on a workstation')
|
||
|
|
else:
|
||
|
|
logging.warning(
|
||
|
|
'Automatically determined that test is running on a bot')
|
||
|
|
return self._local_pixel_tests
|
||
|
|
|
||
|
|
@staticmethod
|
||
|
|
def AddCommandLineArguments(parser: argparse.ArgumentParser) -> None:
|
||
|
|
""" Add command line arguments to an ArgumentParser instance
|
||
|
|
|
||
|
|
Args:
|
||
|
|
parser: ArgumentParser instance
|
||
|
|
|
||
|
|
Returns:
|
||
|
|
None
|
||
|
|
"""
|
||
|
|
parser.add_argument('--git-revision', type=str, help='Git revision')
|
||
|
|
parser.add_argument('--gerrit-issue', type=int, help='Gerrit issue number')
|
||
|
|
parser.add_argument('--gerrit-patchset',
|
||
|
|
type=int,
|
||
|
|
help='Gerrit patchset number')
|
||
|
|
parser.add_argument('--buildbucket-id',
|
||
|
|
type=int,
|
||
|
|
help='Buildbucket ID of builder')
|
||
|
|
parser.add_argument('--code-review-system',
|
||
|
|
type=str,
|
||
|
|
help='Code review system')
|
||
|
|
parser.add_argument('--continuous-integration-system',
|
||
|
|
type=str,
|
||
|
|
help='Continuous integration system')
|
||
|
|
|
||
|
|
def _InitializeProperties(self, args: ParsedCmdArgs) -> None:
|
||
|
|
if hasattr(args, 'local_pixel_tests'):
|
||
|
|
# If not set, will be automatically determined later if needed.
|
||
|
|
self._local_pixel_tests = args.local_pixel_tests
|
||
|
|
|
||
|
|
if hasattr(args, 'skia_gold_local_png_write_directory'):
|
||
|
|
self._local_png_directory = args.skia_gold_local_png_write_directory
|
||
|
|
|
||
|
|
if hasattr(args, 'no_luci_auth'):
|
||
|
|
self._no_luci_auth = args.no_luci_auth
|
||
|
|
|
||
|
|
if hasattr(args, 'service_account'):
|
||
|
|
self._service_account = args.service_account
|
||
|
|
if self._service_account:
|
||
|
|
self._no_luci_auth = True
|
||
|
|
|
||
|
|
if hasattr(args, 'bypass_skia_gold_functionality'):
|
||
|
|
self._bypass_skia_gold_functionality = args.bypass_skia_gold_functionality
|
||
|
|
|
||
|
|
if hasattr(args, 'code_review_system'):
|
||
|
|
self._code_review_system = args.code_review_system
|
||
|
|
|
||
|
|
if hasattr(args, 'continuous_integration_system'):
|
||
|
|
self._continuous_integration_system = args.continuous_integration_system
|
||
|
|
|
||
|
|
# Will be automatically determined later if needed.
|
||
|
|
if not hasattr(args, 'git_revision') or not args.git_revision:
|
||
|
|
return
|
||
|
|
self._git_revision = args.git_revision
|
||
|
|
|
||
|
|
# Only expected on tryjob runs.
|
||
|
|
if not hasattr(args, 'gerrit_issue') or not args.gerrit_issue:
|
||
|
|
return
|
||
|
|
self._issue = args.gerrit_issue
|
||
|
|
if not hasattr(args, 'gerrit_patchset') or not args.gerrit_patchset:
|
||
|
|
raise RuntimeError(
|
||
|
|
'--gerrit-issue passed, but --gerrit-patchset not passed.')
|
||
|
|
self._patchset = args.gerrit_patchset
|
||
|
|
if not hasattr(args, 'buildbucket_id') or not args.buildbucket_id:
|
||
|
|
raise RuntimeError(
|
||
|
|
'--gerrit-issue passed, but --buildbucket-id not passed.')
|
||
|
|
self._job_id = args.buildbucket_id
|