File: run_gpu_integration_test.py

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (130 lines) | stat: -rwxr-xr-x 4,486 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/usr/bin/env vpython3
# Copyright 2016 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import argparse
import json
import os
import sys

# This needs to be before the Telemetry imports for importing to work correctly.
# pylint: disable=wrong-import-order
from gpu_path_util import setup_telemetry_paths  # pylint: disable=unused-import
# pylint: enable=wrong-import-order
from telemetry.testing import browser_test_runner
from telemetry.testing import serially_executed_browser_test_case
from py_utils import discover

import gpu_project_config
import gpu_path_util


def PostprocessJSON(file_name, run_test_args):
  # The file is not necessarily written depending on the arguments - only
  # postprocess it in case it is.
  if os.path.isfile(file_name):
    with open(file_name, encoding='utf-8') as f:
      test_result = json.load(f)
    test_result['run_test_args'] = run_test_args
    with open(file_name, 'w', encoding='utf-8') as f:
      json.dump(test_result, f, indent=2)


def FailIfScreenLockedOnMac():
  # Detect if the Mac lockscreen is present, which causes issues when running
  # tests.
  if not sys.platform.startswith('darwin'):
    return
  import Quartz  # pylint: disable=import-outside-toplevel,import-error
  current_session = Quartz.CGSessionCopyCurrentDictionary()
  if not current_session:
    # Using the logging module doesn't seem to be guaranteed to show up in
    # stdout, so use print instead.
    print('WARNING: Unable to obtain CGSessionCoppyCurrentDictionary via '
          'Quartz - unable to determine whether Mac lockscreen is present or '
          'not.')
    return
  if current_session.get('CGSSessionScreenIsLocked'):
    raise RuntimeError('Mac lockscreen detected, aborting.')


def FindTestCase(test_name):
  for start_dir in gpu_project_config.CONFIG.start_dirs:
    modules_to_classes = discover.DiscoverClasses(
        start_dir,
        gpu_project_config.CONFIG.top_level_dir,
        base_class=serially_executed_browser_test_case.
        SeriallyExecutedBrowserTestCase)
    for cl in modules_to_classes.values():
      if cl.Name() == test_name:
        return cl
  return None


def ProcessArgs(args, parser=None):
  parser = parser or argparse.ArgumentParser()
  parser.add_argument(
      '--write-run-test-arguments',
      action='store_true',
      help='Write the test script arguments to the results file.')
  option, rest_args_filtered = parser.parse_known_args(args)

  parser.add_argument('test', nargs='*', type=str, help=argparse.SUPPRESS)
  option, _ = parser.parse_known_args(rest_args_filtered)

  if option.test:
    test_class = FindTestCase(option.test[0])
  else:
    test_class = None

  if test_class:
    rest_args_filtered.extend([
        f'--test-name-prefix={test_class.__module__}.{test_class.__name__}.',
    ])

  if not any(arg.startswith('--retry-limit') for arg in rest_args_filtered):
    if '--retry-only-retry-on-failure-tests' not in rest_args_filtered:
      rest_args_filtered.append('--retry-only-retry-on-failure-tests')
    rest_args_filtered.append('--retry-limit=2')
  rest_args_filtered.extend(
      ['--repository-absolute-path', gpu_path_util.CHROMIUM_SRC_DIR])
  return rest_args_filtered


def main():
  rest_args = sys.argv[1:]
  FailIfScreenLockedOnMac()
  parser = argparse.ArgumentParser(
      description='Extra argument parser', add_help=False)

  rest_args_filtered = ProcessArgs(rest_args, parser)

  retval = browser_test_runner.Run(gpu_project_config.CONFIG,
                                   rest_args_filtered)

  # We're not relying on argparse to print the help in the normal way, because
  # we need the help output from both the argument parser here and the argument
  # parser in browser_test_runner.
  if '--help' in rest_args:
    print('\n\nCommand line arguments handed by run_gpu_integration_test:')
    parser.print_help()
    return retval

  # This duplicates an argument of browser_test_runner.
  parser.add_argument(
      '--write-full-results-to',
      metavar='FILENAME',
      action='store',
      help='If specified, writes the full results to that path.')

  option, _ = parser.parse_known_args(rest_args)

  # Postprocess the outputted JSON to add test arguments.
  if option.write_run_test_arguments and option.write_full_results_to:
    PostprocessJSON(option.write_full_results_to, rest_args)
  return retval


if __name__ == '__main__':
  sys.exit(main())