Index: tools/telemetry/telemetry/test.py |
diff --git a/tools/telemetry/telemetry/test.py b/tools/telemetry/telemetry/test.py |
index 39003e2d310583c5f524c2c674469b5aa47fc8c4..cf803df9637dca469f968631993d63ef6e1dc76a 100644 |
--- a/tools/telemetry/telemetry/test.py |
+++ b/tools/telemetry/telemetry/test.py |
@@ -2,11 +2,17 @@ |
# Use of this source code is governed by a BSD-style license that can be |
# found in the LICENSE file. |
+import logging |
import os |
+import shutil |
+import sys |
+import zipfile |
+from telemetry.core import browser_finder |
from telemetry.core import repeat_options |
from telemetry.core import util |
from telemetry.page import page_runner |
+from telemetry.page import cloud_storage |
from telemetry.page import page_set |
from telemetry.page import page_test |
from telemetry.page import test_expectations |
@@ -50,6 +56,8 @@ class Test(object): |
test.AddCommandLineOptions(parser) |
options.MergeDefaultValues(parser.get_default_values()) |
+ self._DownloadGeneratedProfileArchive(options) |
+ |
results = page_runner.Run(test, ps, expectations, options) |
results.PrintSummary() |
return len(results.failures) + len(results.errors) |
@@ -62,6 +70,69 @@ class Test(object): |
getattr(options, 'pageset_repeat_iters', 1), |
) |
+ def _DownloadGeneratedProfileArchive(self, options): |
+ """Download and extract profile directory archive if one exists.""" |
+ archive_name = getattr(self, 'generated_profile_archive', None) |
+ |
+ # If attribute not specified, nothing to do. |
+ if not archive_name: |
+ return |
+ |
+ # If profile dir specified on command line, nothing to do. |
+ if options.browser_options.profile_dir: |
+ logging.warning("Profile directory specified on command line: %s, this" |
+ "overrides the benchmark's default profile directory.", |
+ options.browser_options.profile_dir) |
+ return |
+ |
+ # Download profile directory from cloud storage. |
+ found_browser = browser_finder.FindBrowser(options) |
+ test_data_dir = os.path.join(util.GetChromiumSrcDir(), 'tools', 'perf', |
+ 'generated_profiles', |
+ found_browser.target_os) |
+ generated_profile_archive_path = os.path.normpath( |
+ os.path.join(test_data_dir, archive_name)) |
+ |
+ try: |
+ cloud_storage.GetIfChanged(generated_profile_archive_path, |
+ cloud_storage.PUBLIC_BUCKET) |
+ except (cloud_storage.CredentialsError, |
+ cloud_storage.PermissionError) as e: |
+ if os.path.exists(generated_profile_archive_path): |
+ # If the profile directory archive exists, assume the user has their |
+ # own local copy simply warn. |
+ logging.warning('Could not download Profile archive: %s', |
+ generated_profile_archive_path) |
+ else: |
+ # If the archive profile directory doesn't exist, this is fatal. |
+ logging.error('Can not run without required profile archive: %s. ' |
+ 'If you believe you have credentials, follow the ' |
+ 'instructions below.', |
+ generated_profile_archive_path) |
+ logging.error(e) |
+ sys.exit(1) |
+ |
+ # Unzip profile directory. |
+ extracted_profile_dir_path = ( |
+ os.path.splitext(generated_profile_archive_path)[0]) |
+ if not os.path.isfile(generated_profile_archive_path): |
+ raise Exception("Profile directory archive not downloaded: ", |
+ generated_profile_archive_path) |
+ with zipfile.ZipFile(generated_profile_archive_path) as f: |
+ try: |
+ f.extractall(os.path.dirname(generated_profile_archive_path)) |
+ except e: |
+ # Cleanup any leftovers from unzipping. |
+ if os.path.exists(extracted_profile_dir_path): |
+ shutil.rmtree(extracted_profile_dir_path) |
+ logging.error("Error extracting profile directory zip file: %s", e) |
+ sys.exit(1) |
+ |
+ # Run with freshly extracted profile directory. |
+ logging.info("Using profile archive directory: %s", |
+ extracted_profile_dir_path) |
+ options.browser_options.profile_dir = extracted_profile_dir_path |
+ |
def CreatePageSet(self, options): # pylint: disable=W0613 |
"""Get the page set this test will run on. |