summaryrefslogtreecommitdiffstats
path: root/python/mozperftest/mozperftest/system/profile.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/mozperftest/mozperftest/system/profile.py')
-rw-r--r--python/mozperftest/mozperftest/system/profile.py122
1 files changed, 122 insertions, 0 deletions
diff --git a/python/mozperftest/mozperftest/system/profile.py b/python/mozperftest/mozperftest/system/profile.py
new file mode 100644
index 0000000000..d29744a818
--- /dev/null
+++ b/python/mozperftest/mozperftest/system/profile.py
@@ -0,0 +1,122 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+import os
+import shutil
+import tempfile
+from pathlib import Path
+
+from condprof.client import ProfileNotFoundError, get_profile
+from condprof.util import get_current_platform
+from mozprofile import create_profile
+from mozprofile.prefs import Preferences
+
+from mozperftest.layers import Layer
+
+HERE = os.path.dirname(__file__)
+
+
+class Profile(Layer):
+ name = "profile"
+ activated = True
+ arguments = {
+ "directory": {"type": str, "default": None, "help": "Profile to use"},
+ "user-js": {"type": str, "default": None, "help": "Custom user.js"},
+ "conditioned": {
+ "action": "store_true",
+ "default": False,
+ "help": "Use a conditioned profile.",
+ },
+ "conditioned-scenario": {
+ "type": str,
+ "default": "settled",
+ "help": "Conditioned scenario to use",
+ },
+ "conditioned-platform": {
+ "type": str,
+ "default": None,
+ "help": "Conditioned platform to use (use local by default)",
+ },
+ "conditioned-project": {
+ "type": str,
+ "default": "mozilla-central",
+ "help": "Conditioned project",
+ "choices": ["try", "mozilla-central"],
+ },
+ }
+
+ def __init__(self, env, mach_cmd):
+ super(Profile, self).__init__(env, mach_cmd)
+ self._created_dirs = []
+
+ def setup(self):
+ pass
+
+ def _cleanup(self):
+ pass
+
+ def _get_conditioned_profile(self):
+ platform = self.get_arg("conditioned-platform")
+ if platform is None:
+ platform = get_current_platform()
+ scenario = self.get_arg("conditioned-scenario")
+ project = self.get_arg("conditioned-project")
+ alternate_project = "mozilla-central" if project != "mozilla-central" else "try"
+
+ temp_dir = tempfile.mkdtemp()
+ try:
+ condprof = get_profile(temp_dir, platform, scenario, repo=project)
+ except ProfileNotFoundError:
+ condprof = get_profile(temp_dir, platform, scenario, repo=alternate_project)
+ except Exception:
+ raise
+
+ # now get the full directory path to our fetched conditioned profile
+ condprof = Path(temp_dir, condprof)
+ if not condprof.exists():
+ raise OSError(str(condprof))
+
+ return condprof
+
+ def run(self, metadata):
+ # using a conditioned profile
+ if self.get_arg("conditioned"):
+ profile_dir = self._get_conditioned_profile()
+ self.set_arg("profile-directory", str(profile_dir))
+ self._created_dirs.append(str(profile_dir))
+ return metadata
+
+ if self.get_arg("directory") is not None:
+ # no need to create one or load a conditioned one
+ return metadata
+
+ # fresh profile
+ profile = create_profile(app="firefox")
+
+ # mozprofile.Profile.__del__ silently deletes the profile
+ # it creates in a non-deterministic time (garbage collected) by
+ # calling cleanup. We override this silly behavior here.
+ profile.cleanup = self._cleanup
+
+ prefs = metadata.get_options("browser_prefs")
+
+ if prefs == {}:
+ prefs["mozperftest"] = "true"
+
+ # apply custom user prefs if any
+ user_js = self.get_arg("user-js")
+ if user_js is not None:
+ self.info("Applying use prefs from %s" % user_js)
+ default_prefs = dict(Preferences.read_prefs(user_js))
+ prefs.update(default_prefs)
+
+ profile.set_preferences(prefs)
+ self.info("Created profile at %s" % profile.profile)
+ self._created_dirs.append(profile.profile)
+ self.set_arg("profile-directory", profile.profile)
+ return metadata
+
+ def teardown(self):
+ for dir in self._created_dirs:
+ if os.path.exists(dir):
+ shutil.rmtree(dir)