OLD | NEW |
1 # Copyright 2013 The Chromium Authors. All rights reserved. | 1 # Copyright 2013 The Chromium Authors. All rights reserved. |
2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
4 | 4 |
5 """Base classes for a test and validator which upload results | 5 """Base classes for a test and validator which upload results |
6 (reference images, error images) to cloud storage.""" | 6 (reference images, error images) to cloud storage.""" |
7 | 7 |
8 import os | 8 import os |
9 import re | 9 import re |
10 import tempfile | 10 import tempfile |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 return '%s_v%s_%s.png' % ( | 136 return '%s_v%s_%s.png' % ( |
137 img_name, | 137 img_name, |
138 page.revision, | 138 page.revision, |
139 self._FormatGpuInfo(tab)) | 139 self._FormatGpuInfo(tab)) |
140 | 140 |
141 def _UploadBitmapToCloudStorage(self, bucket, name, bitmap, public=False): | 141 def _UploadBitmapToCloudStorage(self, bucket, name, bitmap, public=False): |
142 # This sequence of steps works on all platforms to write a temporary | 142 # This sequence of steps works on all platforms to write a temporary |
143 # PNG to disk, following the pattern in bitmap_unittest.py. The key to | 143 # PNG to disk, following the pattern in bitmap_unittest.py. The key to |
144 # avoiding PermissionErrors seems to be to not actually try to write to | 144 # avoiding PermissionErrors seems to be to not actually try to write to |
145 # the temporary file object, but to re-open its name for all operations. | 145 # the temporary file object, but to re-open its name for all operations. |
146 temp_file = tempfile.NamedTemporaryFile().name | 146 temp_file = tempfile.NamedTemporaryFile(suffix='.png').name |
147 image_util.WritePngFile(bitmap, temp_file) | 147 image_util.WritePngFile(bitmap, temp_file) |
148 cloud_storage.Insert(bucket, name, temp_file, publicly_readable=public) | 148 cloud_storage.Insert(bucket, name, temp_file, publicly_readable=public) |
149 | 149 |
150 def _ConditionallyUploadToCloudStorage(self, img_name, page, tab, screenshot): | 150 def _ConditionallyUploadToCloudStorage(self, img_name, page, tab, screenshot): |
151 """Uploads the screenshot to cloud storage as the reference image | 151 """Uploads the screenshot to cloud storage as the reference image |
152 for this test, unless it already exists. Returns True if the | 152 for this test, unless it already exists. Returns True if the |
153 upload was actually performed.""" | 153 upload was actually performed.""" |
154 if not self.options.refimg_cloud_storage_bucket: | 154 if not self.options.refimg_cloud_storage_bucket: |
155 raise Exception('--refimg-cloud-storage-bucket argument is required') | 155 raise Exception('--refimg-cloud-storage-bucket argument is required') |
156 cloud_name = self._FormatReferenceImageName(img_name, page, tab) | 156 cloud_name = self._FormatReferenceImageName(img_name, page, tab) |
157 if not cloud_storage.Exists(self.options.refimg_cloud_storage_bucket, | 157 if not cloud_storage.Exists(self.options.refimg_cloud_storage_bucket, |
158 cloud_name): | 158 cloud_name): |
159 self._UploadBitmapToCloudStorage(self.options.refimg_cloud_storage_bucket, | 159 self._UploadBitmapToCloudStorage(self.options.refimg_cloud_storage_bucket, |
160 cloud_name, | 160 cloud_name, |
161 screenshot) | 161 screenshot) |
162 return True | 162 return True |
163 return False | 163 return False |
164 | 164 |
165 def _DownloadFromCloudStorage(self, img_name, page, tab): | 165 def _DownloadFromCloudStorage(self, img_name, page, tab): |
166 """Downloads the reference image for the given test from cloud | 166 """Downloads the reference image for the given test from cloud |
167 storage, returning it as a Telemetry Bitmap object.""" | 167 storage, returning it as a Telemetry Bitmap object.""" |
168 # TODO(kbr): there's a race condition between the deletion of the | 168 # TODO(kbr): there's a race condition between the deletion of the |
169 # temporary file and gsutil's overwriting it. | 169 # temporary file and gsutil's overwriting it. |
170 if not self.options.refimg_cloud_storage_bucket: | 170 if not self.options.refimg_cloud_storage_bucket: |
171 raise Exception('--refimg-cloud-storage-bucket argument is required') | 171 raise Exception('--refimg-cloud-storage-bucket argument is required') |
172 temp_file = tempfile.NamedTemporaryFile().name | 172 temp_file = tempfile.NamedTemporaryFile(suffix='.png').name |
173 cloud_storage.Get(self.options.refimg_cloud_storage_bucket, | 173 cloud_storage.Get(self.options.refimg_cloud_storage_bucket, |
174 self._FormatReferenceImageName(img_name, page, tab), | 174 self._FormatReferenceImageName(img_name, page, tab), |
175 temp_file) | 175 temp_file) |
176 return image_util.FromPngFile(temp_file) | 176 return image_util.FromPngFile(temp_file) |
177 | 177 |
178 def _UploadErrorImagesToCloudStorage(self, image_name, screenshot, ref_img): | 178 def _UploadErrorImagesToCloudStorage(self, image_name, screenshot, ref_img): |
179 """For a failing run, uploads the failing image, reference image (if | 179 """For a failing run, uploads the failing image, reference image (if |
180 supplied), and diff image (if reference image was supplied) to cloud | 180 supplied), and diff image (if reference image was supplied) to cloud |
181 storage. This subsumes the functionality of the | 181 storage. This subsumes the functionality of the |
182 archive_gpu_pixel_test_results.py script.""" | 182 archive_gpu_pixel_test_results.py script.""" |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
246 default='') | 246 default='') |
247 group.add_option('--test-machine-name', | 247 group.add_option('--test-machine-name', |
248 help='Name of the test machine. Specifying this argument causes this ' | 248 help='Name of the test machine. Specifying this argument causes this ' |
249 'script to upload failure images and diffs to cloud storage directly, ' | 249 'script to upload failure images and diffs to cloud storage directly, ' |
250 'instead of relying on the archive_gpu_pixel_test_results.py script.', | 250 'instead of relying on the archive_gpu_pixel_test_results.py script.', |
251 default='') | 251 default='') |
252 group.add_option('--generated-dir', | 252 group.add_option('--generated-dir', |
253 help='Overrides the default on-disk location for generated test images ' | 253 help='Overrides the default on-disk location for generated test images ' |
254 '(only used for local testing without a cloud storage account)', | 254 '(only used for local testing without a cloud storage account)', |
255 default=default_generated_data_dir) | 255 default=default_generated_data_dir) |
OLD | NEW |