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

Side by Side Diff: scripts/slave/recipe_modules/test_results/resources/upload_test_results.py

Issue 2469233003: [recipe_modules/test_results] Refactor the logic of generating full json results files to a method (Closed)
Patch Set: Add test & fix Created 4 years, 1 month 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 | scripts/slave/recipe_modules/test_results/resources/upload_test_results_unittest.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 # Copyright (c) 2015 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2015 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """See README.md for usage instructions. 6 """See README.md for usage instructions.
7 7
8 This file heavily modified from build/scripts/slave/gtest_slave_utils.py and 8 This file heavily modified from build/scripts/slave/gtest_slave_utils.py and
9 is intended to replace it as all tests move to swarming. 9 is intended to replace it as all tests move to swarming.
10 TODO(estaab): Remove build/scripts/slave/gtest.* once this is fully deployed. 10 TODO(estaab): Remove build/scripts/slave/gtest.* once this is fully deployed.
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 for test, results in result_sets.iteritems(): 42 for test, results in result_sets.iteritems():
43 for result in results: 43 for result in results:
44 result = test_result.TestResult( 44 result = test_result.TestResult(
45 test, 45 test,
46 status=result['status'], 46 status=result['status'],
47 elapsed_time=result.get('elapsed_time_ms', 0) / 1000.) 47 elapsed_time=result.get('elapsed_time_ms', 0) / 1000.)
48 test_results_map.setdefault(test, []).append(result) 48 test_results_map.setdefault(test, []).append(result)
49 return test_results_map 49 return test_results_map
50 50
51 51
52 def generate_json_results(test_results_map, builder_name, build_number, 52 def generate_json_results_file(results_json, builder_name, build_number,
53 results_directory, chrome_revision, master_name): 53 results_directory, chrome_revision, master_name):
54 """Generates JSON results files from the given test_results_map. 54 """Generates JSON results files from the given |results_json|.
55 55
56 Args: 56 Args:
estaab 2016/11/03 15:05:09 Can you add a "Returns:" section documenting the r
nednguyen 2016/11/03 21:34:57 Done.
57 test_results_map: A map of TestResult. 57 results_json: the raw test results object that follows GTest format.
estaab 2016/11/03 15:05:09 The comment mentions this is in gtest format - is
nednguyen 2016/11/03 21:34:57 Done.
58 """ 58 """
59 test_results_map = get_results_map_from_json(results_json)
nednguyen 2016/11/02 22:56:09 The test also helps catch this bug.
59 if not os.path.exists(results_directory): 60 if not os.path.exists(results_directory):
60 os.makedirs(results_directory) 61 os.makedirs(results_directory)
61 62
62 print('Generating json: ' 63 print('Generating json: '
63 'builder_name:%s, build_number:%s, ' 64 'builder_name:%s, build_number:%s, '
64 'results_directory:%s, ' 65 'results_directory:%s, '
65 'chrome_revision:%s ' 66 'chrome_revision:%s '
66 'master_name:%s' % 67 'master_name:%s' %
67 (builder_name, build_number, 68 (builder_name, build_number,
68 results_directory, 69 results_directory,
69 chrome_revision, 70 chrome_revision,
70 master_name)) 71 master_name))
71 72
72 # TODO(estaab): This doesn't need to be an object. Make it a simple function. 73 # TODO(estaab): This doesn't need to be an object. Make it a simple function.
73 generator = JSONResultsGenerator( 74 generator = JSONResultsGenerator(
74 builder_name, build_number, 75 builder_name, build_number,
75 results_directory, 76 results_directory,
76 test_results_map, 77 test_results_map,
77 svn_revisions=[('chromium', chrome_revision)], 78 svn_revisions=[('chromium', chrome_revision)],
78 master_name=master_name) 79 master_name=master_name)
79 generator.generate_json_output() 80 generator.generate_json_output()
80 generator.generate_times_ms_file() 81 generator.generate_times_ms_file()
82 return [(f, os.path.join(results_directory, f)) for f in
83 (FULL_RESULTS_FILENAME, TIMES_MS_FILENAME)]
81 84
82 85
83 def main(): 86 def main(args):
84 option_parser = optparse.OptionParser() 87 option_parser = optparse.OptionParser()
85 option_parser.add_option('--test-type', 88 option_parser.add_option('--test-type',
86 help='Test type that generated the results json,' 89 help='Test type that generated the results json,'
87 ' e.g. unit-tests.') 90 ' e.g. unit-tests.')
88 option_parser.add_option('--results-directory', default=os.getcwd(), 91 option_parser.add_option('--results-directory', default=os.getcwd(),
89 help='Output results directory source dir.') 92 help='Output results directory source dir.')
90 option_parser.add_option('--input-json', 93 option_parser.add_option('--input-json',
91 help='Test results json file (input for us).') 94 help='Test results json file (input for us).')
92 option_parser.add_option('--builder-name', 95 option_parser.add_option('--builder-name',
93 default='DUMMY_BUILDER_NAME', 96 default='DUMMY_BUILDER_NAME',
94 help='The name of the builder shown on the ' 97 help='The name of the builder shown on the '
95 'waterfall running this script e.g. WebKit.') 98 'waterfall running this script e.g. WebKit.')
96 option_parser.add_option('--build-number', 99 option_parser.add_option('--build-number',
97 help='The build number of the builder running' 100 help='The build number of the builder running'
98 'this script.') 101 'this script.')
99 option_parser.add_option('--test-results-server', 102 option_parser.add_option('--test-results-server',
100 help='The test results server to upload the ' 103 help='The test results server to upload the '
101 'results.') 104 'results.')
102 option_parser.add_option('--master-name', 105 option_parser.add_option('--master-name',
103 help='The name of the buildbot master. ' 106 help='The name of the buildbot master. '
104 'Both test-results-server and master-name ' 107 'Both test-results-server and master-name '
105 'need to be specified to upload the results ' 108 'need to be specified to upload the results '
106 'to the server.') 109 'to the server.')
107 option_parser.add_option('--chrome-revision', default='0', 110 option_parser.add_option('--chrome-revision', default='0',
108 help='The Chromium revision being tested. If not ' 111 help='The Chromium revision being tested. If not '
109 'given, defaults to 0.') 112 'given, defaults to 0.')
110 113
111 options = option_parser.parse_args()[0] 114 options = option_parser.parse_args(args)[0]
112 logging.basicConfig() 115 logging.basicConfig()
113 116
114 if not options.test_type: 117 if not options.test_type:
115 option_parser.error('--test-type needs to be specified.') 118 option_parser.error('--test-type needs to be specified.')
116 return 1 119 return 1
117 120
118 if not options.input_json: 121 if not options.input_json:
119 option_parser.error('--input-json needs to be specified.') 122 option_parser.error('--input-json needs to be specified.')
120 return 1 123 return 1
121 124
122 if options.test_results_server and not options.master_name: 125 if options.test_results_server and not options.master_name:
123 logging.warn('--test-results-server is given but ' 126 logging.warn('--test-results-server is given but '
124 '--master-name is not specified; the results won\'t be ' 127 '--master-name is not specified; the results won\'t be '
125 'uploaded to the server.') 128 'uploaded to the server.')
126 129
127 with file(options.input_json) as json_file: 130 with file(options.input_json) as json_file:
128 results_map = get_results_map_from_json(json_file.read()) 131 results_json = json_file.read()
129 132
130 generate_json_results(results_map, options.builder_name, 133 files = generate_json_results_file(
131 options.build_number, options.results_directory, 134 results_json, builder_name=options.builder_name,
132 options.chrome_revision, options.master_name) 135 build_number=options.build_number,
136 results_directory=options.results_directory,
137 chrome_revision=options.chrome_revision,
138 master_name=options.master_name)
133 139
134 # Upload to a test results server if specified. 140 # Upload to a test results server if specified.
135 if options.test_results_server and options.master_name: 141 if options.test_results_server and options.master_name:
136 print 'Uploading JSON files for builder "%s" to server "%s"' % ( 142 print 'Uploading JSON files for builder "%s" to server "%s"' % (
137 options.builder_name, options.test_results_server) 143 options.builder_name, options.test_results_server)
138 attrs = [('builder', options.builder_name), 144 attrs = [('builder', options.builder_name),
139 ('testtype', options.test_type), 145 ('testtype', options.test_type),
140 ('master', options.master_name)] 146 ('master', options.master_name)]
141 147
142 files = [(f, os.path.join(options.results_directory, f)) for f in
143 (FULL_RESULTS_FILENAME, TIMES_MS_FILENAME)]
144
145 # Set uploading timeout in case appengine server is having problem. 148 # Set uploading timeout in case appengine server is having problem.
146 # 120 seconds are more than enough to upload test results. 149 # 120 seconds are more than enough to upload test results.
147 test_results_uploader.upload_test_results( 150 test_results_uploader.upload_test_results(
148 options.test_results_server, attrs, files, 120) 151 options.test_results_server, attrs, files, 120)
149 return 0 152 return 0
150 153
151 154
152 if __name__ == '__main__': 155 if __name__ == '__main__':
153 sys.exit(main()) 156 sys.exit(main(sys.argv[1:]))
OLDNEW
« no previous file with comments | « no previous file | scripts/slave/recipe_modules/test_results/resources/upload_test_results_unittest.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698