summaryrefslogtreecommitdiffstats
path: root/testing/performance/hooks_android_view.py
diff options
context:
space:
mode:
Diffstat (limited to 'testing/performance/hooks_android_view.py')
-rw-r--r--testing/performance/hooks_android_view.py154
1 files changed, 154 insertions, 0 deletions
diff --git a/testing/performance/hooks_android_view.py b/testing/performance/hooks_android_view.py
new file mode 100644
index 0000000000..667d78f9ed
--- /dev/null
+++ b/testing/performance/hooks_android_view.py
@@ -0,0 +1,154 @@
+# 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 json
+import pathlib
+import tempfile
+import time
+
+from mozperftest.system.android import _ROOT_URL
+from mozperftest.test.browsertime import add_options
+from mozperftest.utils import (
+ download_file,
+ get_multi_tasks_url,
+ get_revision_namespace_url,
+ install_package,
+)
+
+# We specifically select this URL because:
+# - we access Mozilla URLs in tests so any connections to Mozilla URLs may re-use
+# existing connections and have different perf characteristics. We can mostly
+# avoid this problem by using a non-Mozilla URL
+# - we authored the site so we can guarantee it doesn't change or change it if
+# needed
+# - we're not directing traffic to a site we don't own
+URL = "'https://mozilla-mobile.github.io/perf-tools/mozperftest-test-page.html'"
+
+COMMON_OPTIONS = [
+ ("processStartTime", "true"),
+ ("firefox.disableBrowsertimeExtension", "true"),
+ ("firefox.android.intentArgument", "'-a'"),
+ ("firefox.android.intentArgument", "'android.intent.action.VIEW'"),
+ ("firefox.android.intentArgument", "'-d'"),
+ ("firefox.android.intentArgument", URL),
+]
+
+NIGHTLY_SIM_ROUTE = "mobile.v3.firefox-android.apks.fenix-nightly-simulation"
+ROUTE_SUFFIX = "artifacts/public/build/fenix/{architecture}/target.apk"
+
+build_generator = None
+
+
+def before_iterations(kw):
+ global build_generator
+
+ install_list = kw.get("android_install_apk")
+ if len(install_list) == 0 or all(
+ ["fenix_nightlysim_multicommit" not in apk for apk in install_list]
+ ):
+ return
+
+ # Install gitpython
+ install_package(kw["virtualenv"], "gitpython==3.1.0")
+ import git
+
+ class _GitProgress(git.RemoteProgress):
+ def update(self, op_code, cur_count, max_count=None, message=""):
+ if message:
+ print(message)
+
+ # Setup the local fenix github repo
+ print("Cloning fenix repo...")
+ fenix_repo = git.Repo.clone_from(
+ "https://github.com/mozilla-mobile/fenix",
+ tempfile.mkdtemp(),
+ branch="master",
+ progress=_GitProgress(),
+ )
+
+ # Get the builds to test
+ architecture = (
+ "arm64-v8a" if "arm64_v8a" in kw.get("android_install_apk") else "armeabi-v7a"
+ )
+ json_ = _fetch_json(
+ get_revision_namespace_url, NIGHTLY_SIM_ROUTE, day=kw["test_date"]
+ )
+ namespaces = json_["namespaces"]
+ revisions = [namespace["name"] for namespace in namespaces]
+
+ tasks = []
+ for revision in revisions:
+ try:
+ commit = fenix_repo.commit(revision)
+ name_rev = str(commit.name_rev)
+ if (
+ "remotes/origin" not in name_rev
+ or "release" in name_rev
+ or "tag" in name_rev
+ ):
+ print(
+ "Commit %s is a release-branch commit, it won't be tested."
+ % revision
+ )
+ continue
+
+ commitdate = commit.committed_date
+ except ValueError:
+ print("Commit %s is not from the Fenix master branch" % revision)
+ continue
+
+ json_ = _fetch_json(
+ get_multi_tasks_url, NIGHTLY_SIM_ROUTE, revision, day=kw["test_date"]
+ )
+ for task in json_["tasks"]:
+ route = task["namespace"]
+ task_architecture = route.split(".")[-1]
+ if task_architecture == architecture:
+ tasks.append(
+ {
+ "timestamp": commitdate,
+ "revision": revision,
+ "route": route,
+ "route_suffix": ROUTE_SUFFIX.format(
+ architecture=task_architecture
+ ),
+ }
+ )
+
+ # Set the number of test-iterations to the number of builds
+ kw["test_iterations"] = len(tasks)
+
+ def _build_iterator():
+ for task in tasks:
+ revision = task["revision"]
+ timestamp = task["timestamp"]
+
+ humandate = time.ctime(int(timestamp))
+ print(f"Testing revision {revision} from {humandate}")
+
+ download_url = f'{_ROOT_URL}{task["route"]}/{task["route_suffix"]}'
+ yield revision, timestamp, [download_url]
+
+ build_generator = _build_iterator()
+
+ return kw
+
+
+def _fetch_json(get_url_function, *args, **kwargs):
+ build_url = get_url_function(*args, **kwargs)
+ tmpfile = pathlib.Path(tempfile.mkdtemp(), "temp.json")
+ download_file(build_url, tmpfile)
+
+ with tmpfile.open() as f:
+ return json.load(f)
+
+
+def before_runs(env, **kw):
+ global build_generator
+
+ add_options(env, COMMON_OPTIONS)
+ if build_generator:
+ revision, timestamp, build = next(build_generator)
+ env.set_arg("android-install-apk", build)
+ env.set_arg("perfherder-prefix", revision)
+ env.set_arg("perfherder-timestamp", timestamp)