Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2)

Side by Side Diff: tools-webrtc/gtest-parallel-wrapper.py

Issue 2862803002: Don't duplicate gtest-parallel flags in gtest-parallel-wrappers. (Closed)
Patch Set: Updated comments. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | tools-webrtc/mb/mb.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 2
3 # Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. 3 # Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
4 # 4 #
5 # Use of this source code is governed by a BSD-style license 5 # Use of this source code is governed by a BSD-style license
6 # that can be found in the LICENSE file in the root of the source 6 # that can be found in the LICENSE file in the root of the source
7 # tree. An additional intellectual property rights grant can be found 7 # tree. An additional intellectual property rights grant can be found
8 # in the file PATENTS. All contributing project authors may 8 # in the file PATENTS. All contributing project authors may
9 # be found in the AUTHORS file in the root of the source tree. 9 # be found in the AUTHORS file in the root of the source tree.
10 10
11 # pylint: disable=invalid-name 11 # pylint: disable=invalid-name
12 """ 12 """
13 This script acts as an interface between the Chromium infrastructure and 13 This script acts as an interface between the Chromium infrastructure and
14 gtest-parallel, renaming options and translating environment variables into 14 gtest-parallel, renaming options and translating environment variables into
15 flags. Developers should execute gtest-parallel directly. 15 flags. Developers should execute gtest-parallel directly.
16 16
17 In particular, this translates the GTEST_SHARD_INDEX and GTEST_TOTAL_SHARDS 17 In particular, this translates the GTEST_SHARD_INDEX and GTEST_TOTAL_SHARDS
18 environment variables to the --shard_index and --shard_count flags, and renames 18 environment variables to the --shard_index and --shard_count flags, and renames
19 the --isolated-script-test-output flag to --dump_json_test_results. 19 the --isolated-script-test-output flag to --dump_json_test_results.
20 20
21 Note that the flags unprocessed by this script will passed as arguments to the 21 All flags before '--' will be passed as arguments to gtest-parallel, and
22 test executable, i.e. 22 (almost) all flags after '--' will be passed as arguments to the test
23 executable.
24 The exception is that --isolated-script-test-output and
25 --isolated-script-test-chartson-output are expected to be after '--', so they
26 are processed and removed from there.
27 For example:
23 28
24 gtest-parallel-wrapper.py some_test \ 29 gtest-parallel-wrapper.py some_test \
30 --some_flag=some_value \
31 --another_flag \
32 -- \
25 --isolated-script-test-output=some_dir \ 33 --isolated-script-test-output=some_dir \
26 --unprocessed_arg_1 34 --isolated-script-test-chartjson-output=some_other_dir \
27 -- \ 35 --foo=bar \
28 --unprocessed_arg_2 36 --baz
29 37
30 will be converted into 38 Will be converted into:
31 39
32 python gtest-parallel some_test \ 40 python gtest-parallel some_test \
33 --shard_count 1 \ 41 --shard_count 1 \
34 --shard_index 0 \ 42 --shard_index 0 \
35 --dump_json_test_results some_dir \ 43 --some_flag=some_value \
44 --another_flag \
45 --dump_json_test_results=some_dir \
36 -- \ 46 -- \
37 --unprocessed_arg_1 47 --foo=bar
38 --unprocessed_arg_2 48 --baz
49
39 """ 50 """
40 51
41 import argparse 52 import argparse
42 import os 53 import os
43 import subprocess 54 import subprocess
44 import sys 55 import sys
45 56
46 57
47 def CatFiles(file_list, output_file): 58 def CatFiles(file_list, output_file):
48 with open(output_file, 'w') as output_file: 59 with open(output_file, 'w') as output_file:
49 for filename in file_list: 60 for filename in file_list:
50 with open(filename) as input_file: 61 with open(filename) as input_file:
51 output_file.write(input_file.read()) 62 output_file.write(input_file.read())
52 os.remove(filename) 63 os.remove(filename)
53 64
54 65
55 def main(): 66 def get_args_and_env():
56 # Ignore '--'. Options unprocessed by this script will be passed to the test 67 if '--' not in sys.argv:
57 # as arguments. 68 return sys.argv, os.environ
58 if '--' in sys.argv: 69
59 del sys.argv[sys.argv.index('--')] 70 argv_index = sys.argv.index('--')
71
72 gtest_parallel_args = sys.argv[1:argv_index]
73 executable_args = sys.argv[argv_index + 1:]
60 74
61 parser = argparse.ArgumentParser() 75 parser = argparse.ArgumentParser()
62 parser.add_argument('--isolated-script-test-output', type=str, default=None) 76 parser.add_argument('--isolated-script-test-output', type=str, default=None)
63 77
64 # We don't need to implement this flag, and possibly can't, since it's 78 # We don't need to implement this flag, and possibly can't, since it's
65 # intended for results of Telemetry tests. See 79 # intended for results of Telemetry tests. See
66 # https://chromium.googlesource.com/external/github.com/catapult-project/catap ult/+/HEAD/dashboard/docs/data-format.md 80 # https://chromium.googlesource.com/external/github.com/catapult-project/catap ult/+/HEAD/dashboard/docs/data-format.md
67 parser.add_argument('--isolated-script-test-chartjson-output', type=str, 81 parser.add_argument('--isolated-script-test-chartjson-output', type=str,
68 default=None) 82 default=None)
69 83
70 # TODO(ehmaldonado): Figure out a way to avoid duplicating the flags in 84 # We have to do this, since --isolated-script-test-output is passed as an
71 # gtest-parallel. 85 # argument to the executable by the swarming scripts, and we want to pass it
72 parser.add_argument('--gtest_color', type=str, default='auto') 86 # to gtest-parallel instead.
73 parser.add_argument('--output_dir', type=str, default=None) 87 options, executable_args = parser.parse_known_args(executable_args)
74 parser.add_argument('--timeout', type=int, default=None) 88
89 # --isolated-script-test-output is used to upload results to the flakiness
90 # dashboard. This translation is made because gtest-parallel expects the flag
91 # to be called --dump_json_test_results instead.
92 if options.isolated_script_test_output:
93 gtest_parallel_args += [
94 '--dump_json_test_results',
95 options.isolated_script_test_output,
96 ]
75 97
76 # GTEST_SHARD_INDEX and GTEST_TOTAL_SHARDS must be removed from the 98 # GTEST_SHARD_INDEX and GTEST_TOTAL_SHARDS must be removed from the
77 # environment. Otherwise it will be picked up by the binary, causing a bug 99 # environment. Otherwise it will be picked up by the binary, causing a bug
78 # where only tests in the first shard are executed. 100 # where only tests in the first shard are executed.
79 test_env = os.environ.copy() 101 test_env = os.environ.copy()
80 gtest_shard_index = test_env.pop('GTEST_SHARD_INDEX', '0') 102 gtest_shard_index = test_env.pop('GTEST_SHARD_INDEX', '0')
81 gtest_total_shards = test_env.pop('GTEST_TOTAL_SHARDS', '1') 103 gtest_total_shards = test_env.pop('GTEST_TOTAL_SHARDS', '1')
82 104
105 gtest_parallel_args += [
106 '--shard_count',
107 gtest_total_shards,
108 '--shard_index',
109 gtest_shard_index,
110 ] + ['--'] + executable_args
111
112 return gtest_parallel_args, test_env
113
114
115 def get_output_dir(gtest_parallel_args):
116 parser = argparse.ArgumentParser()
117 parser.add_argument('--output_dir', type=str, default=None)
118 options, _ = parser.parse_known_args(gtest_parallel_args)
119 return options.output_dir
120
121
122 def main():
83 webrtc_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 123 webrtc_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
84 gtest_parallel_path = os.path.join( 124 gtest_parallel_path = os.path.join(
85 webrtc_root, 'third_party', 'gtest-parallel', 'gtest-parallel') 125 webrtc_root, 'third_party', 'gtest-parallel', 'gtest-parallel')
86 126
87 options, unprocessed = parser.parse_known_args() 127 gtest_parallel_args, test_env = get_args_and_env()
88 test_executable = unprocessed[0]
89 test_arguments = unprocessed[1:]
90
91 gtest_args = [
92 test_executable,
93 '--shard_count',
94 gtest_total_shards,
95 '--shard_index',
96 gtest_shard_index,
97 '--gtest_color',
98 options.gtest_color,
99 ]
100
101 # --isolated-script-test-output is used to upload results to the flakiness
102 # dashboard. This translation is made because gtest-parallel expects the flag
103 # to be called --dump_json_test_results instead.
104 if options.isolated_script_test_output:
105 gtest_args += [
106 '--dump_json_test_results',
107 options.isolated_script_test_output,
108 ]
109
110 if options.output_dir:
111 gtest_args += [
112 '--output_dir',
113 options.output_dir,
114 ]
115
116 if options.timeout:
117 gtest_args += [
118 '--timeout',
119 str(options.timeout),
120 ]
121 128
122 command = [ 129 command = [
123 sys.executable, 130 sys.executable,
124 gtest_parallel_path, 131 gtest_parallel_path,
125 ] + gtest_args + ['--'] + test_arguments 132 ] + gtest_parallel_args
126 133
127 print 'gtest-parallel-wrapper: Executing command %s' % ' '.join(command) 134 print 'gtest-parallel-wrapper: Executing command %s' % ' '.join(command)
128 sys.stdout.flush() 135 sys.stdout.flush()
129 136
130 exit_code = subprocess.call(command, env=test_env, cwd=os.getcwd()) 137 exit_code = subprocess.call(command, env=test_env, cwd=os.getcwd())
131 138
132 if options.output_dir: 139 output_dir = get_output_dir(gtest_parallel_args)
140 if output_dir:
133 for test_status in 'passed', 'failed', 'interrupted': 141 for test_status in 'passed', 'failed', 'interrupted':
134 logs_dir = os.path.join(options.output_dir, test_status) 142 logs_dir = os.path.join(output_dir, test_status)
135 if not os.path.isdir(logs_dir): 143 if not os.path.isdir(logs_dir):
136 continue 144 continue
137 logs = [os.path.join(logs_dir, log) for log in os.listdir(logs_dir)] 145 logs = [os.path.join(logs_dir, log) for log in os.listdir(logs_dir)]
138 log_file = os.path.join(options.output_dir, '%s-tests.log' % test_status) 146 log_file = os.path.join(output_dir, '%s-tests.log' % test_status)
139 CatFiles(logs, log_file) 147 CatFiles(logs, log_file)
140 os.rmdir(logs_dir) 148 os.rmdir(logs_dir)
141 149
142 return exit_code 150 return exit_code
143 151
144 152
145 if __name__ == '__main__': 153 if __name__ == '__main__':
146 sys.exit(main()) 154 sys.exit(main())
OLDNEW
« no previous file with comments | « no previous file | tools-webrtc/mb/mb.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698