Update URLs handling

- Use chrome-controlled https://chromium-workloads.web.app/ by default
- Add --official option for using the offically hosted version
- Add more url option alternatives
- Add more motionmark versions, mostly for consistency

Change-Id: I064805024fa998416c7878cafe83168b54a1d18c
Reviewed-on: https://chromium-review.googlesource.com/c/crossbench/+/5344754
Reviewed-by: Patrick Thier <pthier@chromium.org>
Commit-Queue: Camillo Bruni <cbruni@chromium.org>
diff --git a/crossbench/benchmarks/all.py b/crossbench/benchmarks/all.py
index bfc0ec2..c0f412c 100644
--- a/crossbench/benchmarks/all.py
+++ b/crossbench/benchmarks/all.py
@@ -9,7 +9,9 @@
                                              JetStream21Benchmark)
 from crossbench.benchmarks.loading.loading_benchmark import PageLoadBenchmark
 from crossbench.benchmarks.manual import ManualBenchmark
-from crossbench.benchmarks.motionmark import (MotionMark12Benchmark,
+from crossbench.benchmarks.motionmark import (MotionMark10Benchmark,
+                                              MotionMark11Benchmark,
+                                              MotionMark12Benchmark,
                                               MotionMark13Benchmark)
 from crossbench.benchmarks.speedometer import (Speedometer20Benchmark,
                                                Speedometer21Benchmark,
diff --git a/crossbench/benchmarks/base.py b/crossbench/benchmarks/base.py
index 236c5ee..e382fde 100644
--- a/crossbench/benchmarks/base.py
+++ b/crossbench/benchmarks/base.py
@@ -397,23 +397,36 @@
     parser = super().add_cli_parser(subparsers, aliases)
     # TODO: Move story-related args to dedicated PressBenchmarkStoryFilter class
     benchmark_url_group = parser.add_mutually_exclusive_group()
-    default_live_url = cls.DEFAULT_STORY_CLS.URL
-    default_local_url = cls.DEFAULT_STORY_CLS.URL_LOCAL
+    live_url = cls.DEFAULT_STORY_CLS.URL
+    local_url = cls.DEFAULT_STORY_CLS.URL_LOCAL
+    official_url = cls.DEFAULT_STORY_CLS.URL_OFFICIAL
     benchmark_url_group.add_argument(
         "--live",
+        "--live-url",
+        "--browser-ben",
         dest="custom_benchmark_url",
         const=None,
         action="store_const",
-        help=f"Use live/online benchmark url ({default_live_url}).")
+        help=(f"Use chrome live benchmark url ({live_url}) "
+              "on https://browserben.ch."))
+    benchmark_url_group.add_argument(
+        "--official",
+        "--official-url",
+        dest="custom_benchmark_url",
+        const=official_url,
+        action="store_const",
+        help=(f"Use officially hosted live/online benchmark url "
+              f"({official_url})."))
     benchmark_url_group.add_argument(
         "--local",
+        "--local-url",
         "--url",
         "--custom-benchmark-url",
         type=cli_helper.parse_httpx_url_str,
         nargs="?",
         dest="custom_benchmark_url",
-        const=default_local_url,
-        help=(f"Use custom or locally (default={default_local_url}) "
+        const=local_url,
+        help=(f"Use custom or locally (default={local_url}) "
               "hosted benchmark url."))
     cls.STORY_FILTER_CLS.add_cli_parser(parser)
     return parser
@@ -429,6 +442,7 @@
     data = super().describe()
     assert issubclass(cls.DEFAULT_STORY_CLS, PressBenchmarkStory)
     data["url"] = cls.DEFAULT_STORY_CLS.URL
+    data["url-official"] = cls.DEFAULT_STORY_CLS.URL_OFFICIAL
     data["url-local"] = cls.DEFAULT_STORY_CLS.URL_LOCAL
     return data
 
diff --git a/crossbench/benchmarks/jetstream/jetstream_2_0.py b/crossbench/benchmarks/jetstream/jetstream_2_0.py
index a224fff..f98287c 100644
--- a/crossbench/benchmarks/jetstream/jetstream_2_0.py
+++ b/crossbench/benchmarks/jetstream/jetstream_2_0.py
@@ -20,7 +20,8 @@
 class JetStream20Story(JetStream2Story):
   __doc__ = JetStream2Story.__doc__
   NAME: str = "jetstream_2.0"
-  URL: str = "https://browserbench.org/JetStream2.0/"
+  URL: str = "https://chromium-workloads.web.app/jetstream/v2.0/"
+  URL_OFFICIAL: str = "https://browserbench.org/JetStream2.0/"
 
 
 class JetStream20Benchmark(JetStream2Benchmark):
diff --git a/crossbench/benchmarks/jetstream/jetstream_2_1.py b/crossbench/benchmarks/jetstream/jetstream_2_1.py
index dd42698..bed8a0d 100644
--- a/crossbench/benchmarks/jetstream/jetstream_2_1.py
+++ b/crossbench/benchmarks/jetstream/jetstream_2_1.py
@@ -20,7 +20,8 @@
 class JetStream21Story(JetStream2Story):
   __doc__ = JetStream2Story.__doc__
   NAME: str = "jetstream_2.1"
-  URL: str = "https://browserbench.org/JetStream2.1/"
+  URL: str = "https://chromium-workloads.web.app/jetstream/v2.1/"
+  URL_OFFICIAL: str = "https://browserbench.org/JetStream2.1/"
 
 
 class JetStream21Benchmark(JetStream2Benchmark):
diff --git a/crossbench/benchmarks/motionmark/__init__.py b/crossbench/benchmarks/motionmark/__init__.py
index b8f1975..16bcede 100644
--- a/crossbench/benchmarks/motionmark/__init__.py
+++ b/crossbench/benchmarks/motionmark/__init__.py
@@ -4,12 +4,17 @@
 
 from __future__ import annotations
 
+from crossbench.benchmarks.motionmark.motionmark_1_0 import \
+    MotionMark10Benchmark
+from crossbench.benchmarks.motionmark.motionmark_1_1 import \
+    MotionMark11Benchmark
 from crossbench.benchmarks.motionmark.motionmark_1_2 import \
     MotionMark12Benchmark
 from crossbench.benchmarks.motionmark.motionmark_1_3 import \
     MotionMark13Benchmark
 
-benchmark_classes = (MotionMark12Benchmark, MotionMark13Benchmark)
+benchmark_classes = (MotionMark10Benchmark, MotionMark11Benchmark,
+                     MotionMark12Benchmark, MotionMark13Benchmark)
 
 _versions = set()
 for benchmark_cls in benchmark_classes:
diff --git a/crossbench/benchmarks/motionmark/motionmark_1.py b/crossbench/benchmarks/motionmark/motionmark_1.py
index d692f7a..1814cc3 100644
--- a/crossbench/benchmarks/motionmark/motionmark_1.py
+++ b/crossbench/benchmarks/motionmark/motionmark_1.py
@@ -62,7 +62,7 @@
 
 
 class MotionMark1Story(PressBenchmarkStory):
-  URL_LOCAL = "http://localhost:8000/"
+  URL_LOCAL: str = "http://localhost:8000/"
   ALL_STORIES = {
       "MotionMark": (
           "Multiply",
diff --git a/crossbench/benchmarks/motionmark/motionmark_1_0.py b/crossbench/benchmarks/motionmark/motionmark_1_0.py
new file mode 100644
index 0000000..e9a1b1a
--- /dev/null
+++ b/crossbench/benchmarks/motionmark/motionmark_1_0.py
@@ -0,0 +1,38 @@
+# Copyright 2024 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from __future__ import annotations
+
+from typing import Tuple
+
+from crossbench.benchmarks.motionmark.motionmark_1 import (MotionMark1Benchmark,
+                                                           MotionMark1Probe,
+                                                           MotionMark1Story)
+
+
+class MotionMark10Probe(MotionMark1Probe):
+  __doc__ = MotionMark1Probe.__doc__
+  NAME = "motionmark_1.0"
+
+
+class MotionMark10Story(MotionMark1Story):
+  NAME = "motionmark_1.0"
+  URL: str = "https://chromium-workloads.web.app/motionmark/v1.0/"
+  URL_OFFICIAL: str = "https://browserbench.org/MotionMark1.0/"
+
+
+class MotionMark10Benchmark(MotionMark1Benchmark):
+  """
+  Benchmark runner for MotionMark 1.0.
+
+  See https://browserbench.org/MotionMark1.0/ for more details.
+  """
+
+  NAME = "motionmark_1.0"
+  DEFAULT_STORY_CLS = MotionMark10Story
+  PROBES = (MotionMark10Probe,)
+
+  @classmethod
+  def version(cls) -> Tuple[int, ...]:
+    return (1, 0)
diff --git a/crossbench/benchmarks/motionmark/motionmark_1_1.py b/crossbench/benchmarks/motionmark/motionmark_1_1.py
new file mode 100644
index 0000000..f997833
--- /dev/null
+++ b/crossbench/benchmarks/motionmark/motionmark_1_1.py
@@ -0,0 +1,38 @@
+# Copyright 2024 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+from __future__ import annotations
+
+from typing import Tuple
+
+from crossbench.benchmarks.motionmark.motionmark_1 import (MotionMark1Benchmark,
+                                                           MotionMark1Probe,
+                                                           MotionMark1Story)
+
+
+class MotionMark11Probe(MotionMark1Probe):
+  __doc__ = MotionMark1Probe.__doc__
+  NAME = "motionmark_1.1"
+
+
+class MotionMark11Story(MotionMark1Story):
+  NAME = "motionmark_1.1"
+  URL: str = "https://chromium-workloads.web.app/motionmark/v1.1/"
+  URL_OFFICIAL: str = "https://browserbench.org/MotionMark1.1/"
+
+
+class MotionMark11Benchmark(MotionMark1Benchmark):
+  """
+  Benchmark runner for MotionMark 1.1.
+
+  See https://browserbench.org/MotionMark1.1/ for more details.
+  """
+
+  NAME = "motionmark_1.1"
+  DEFAULT_STORY_CLS = MotionMark11Story
+  PROBES = (MotionMark11Probe,)
+
+  @classmethod
+  def version(cls) -> Tuple[int, ...]:
+    return (1, 1)
diff --git a/crossbench/benchmarks/motionmark/motionmark_1_2.py b/crossbench/benchmarks/motionmark/motionmark_1_2.py
index c782f5b..2623dbe 100644
--- a/crossbench/benchmarks/motionmark/motionmark_1_2.py
+++ b/crossbench/benchmarks/motionmark/motionmark_1_2.py
@@ -18,7 +18,8 @@
 
 class MotionMark12Story(MotionMark1Story):
   NAME = "motionmark_1.2"
-  URL = "https://browserbench.org/MotionMark1.2"
+  URL: str = "https://chromium-workloads.web.app/motionmark/v1.2/"
+  URL_OFFICIAL: str = "https://browserbench.org/MotionMark1.2/"
 
 
 class MotionMark12Benchmark(MotionMark1Benchmark):
diff --git a/crossbench/benchmarks/motionmark/motionmark_1_3.py b/crossbench/benchmarks/motionmark/motionmark_1_3.py
index b6d2505..9632d5f 100644
--- a/crossbench/benchmarks/motionmark/motionmark_1_3.py
+++ b/crossbench/benchmarks/motionmark/motionmark_1_3.py
@@ -18,7 +18,8 @@
 
 class MotionMark13Story(MotionMark1Story):
   NAME = "motionmark_1.3"
-  URL = "https://browserbench.org/MotionMark1.3"
+  URL: str = "https://chromium-workloads.web.app/motionmark/v1.3/"
+  URL_OFFICIAL: str = "https://browserbench.org/MotionMark1.3/"
   DEVELOPER_READY_JS: str = (
       "return !(document.querySelector('#frame-rate-detection span'));")
   READY_JS: str = (
diff --git a/crossbench/benchmarks/speedometer/speedometer_2_0.py b/crossbench/benchmarks/speedometer/speedometer_2_0.py
index 29a240c..1f29b89 100644
--- a/crossbench/benchmarks/speedometer/speedometer_2_0.py
+++ b/crossbench/benchmarks/speedometer/speedometer_2_0.py
@@ -18,7 +18,8 @@
 
 class Speedometer20Story(Speedometer2Story):
   NAME: str = "speedometer_2.0"
-  URL: str = "https://browserbench.org/Speedometer2.0"
+  URL: str = "https://chromium-workloads.web.app/speedometer/v2.0/"
+  URL_OFFICIAL: str = "https://browserbench.org/Speedometer2.0/"
 
 
 class Speedometer20Benchmark(SpeedometerBenchmark):
diff --git a/crossbench/benchmarks/speedometer/speedometer_2_1.py b/crossbench/benchmarks/speedometer/speedometer_2_1.py
index d54898d..da709a5 100644
--- a/crossbench/benchmarks/speedometer/speedometer_2_1.py
+++ b/crossbench/benchmarks/speedometer/speedometer_2_1.py
@@ -18,7 +18,8 @@
 
 class Speedometer21Story(Speedometer2Story):
   NAME: str = "speedometer_2.1"
-  URL: str = "https://browserbench.org/Speedometer2.1/"
+  URL: str = "https://chromium-workloads.web.app/speedometer/v2.1/"
+  URL_OFFICIAL: str = "https://browserbench.org/Speedometer2.1/"
 
 
 class Speedometer21Benchmark(SpeedometerBenchmark):
diff --git a/crossbench/benchmarks/speedometer/speedometer_3_0.py b/crossbench/benchmarks/speedometer/speedometer_3_0.py
index c75f8fe..502d1b9 100644
--- a/crossbench/benchmarks/speedometer/speedometer_3_0.py
+++ b/crossbench/benchmarks/speedometer/speedometer_3_0.py
@@ -223,8 +223,8 @@
 class Speedometer30Story(SpeedometerStory):
   __doc__ = SpeedometerStory.__doc__
   NAME: str = "speedometer_3.0"
-  # TODO: Update once public version is available
-  URL: str = "https://sp3-alpha-testing.netlify.app/"
+  URL: str = "https://chromium-workloads.web.app/speedometer/v3.0/"
+  URL_OFFICIAL: str = "https://browserbench.org/Speedometer3.0/"
   URL_LOCAL: str = "http://127.0.0.1:7000"
   SUBSTORIES: Tuple[str, ...] = tuple(SPEEDOMETER_3_STORY_DATA.keys())
 
diff --git a/crossbench/cli/cli.py b/crossbench/cli/cli.py
index 92da4e6..6ca4392 100644
--- a/crossbench/cli/cli.py
+++ b/crossbench/cli/cli.py
@@ -97,8 +97,10 @@
       benchmarks.Speedometer20Benchmark,
       benchmarks.JetStream21Benchmark,
       benchmarks.JetStream20Benchmark,
-      benchmarks.MotionMark12Benchmark,
       benchmarks.MotionMark13Benchmark,
+      benchmarks.MotionMark12Benchmark,
+      benchmarks.MotionMark11Benchmark,
+      benchmarks.MotionMark10Benchmark,
       benchmarks.PageLoadBenchmark,
       benchmarks.PowerBenchmark,
       benchmarks.ManualBenchmark,
diff --git a/crossbench/runner/run.py b/crossbench/runner/run.py
index c782d1a..f3e5c86 100644
--- a/crossbench/runner/run.py
+++ b/crossbench/runner/run.py
@@ -222,6 +222,7 @@
     self._cool_down(is_dry_run)
     with ChangeCWD(self._out_dir), self.exception_info(*self.info_stack):
       self._probe_context_manager.setup(self.probes, is_dry_run)
+    self._log_setup()
 
   def setup_selenium_options(self, options: ArgOptions):
     # TODO: move explicitly to session.
diff --git a/crossbench/stories/press_benchmark.py b/crossbench/stories/press_benchmark.py
index c1cdcb7..b7aa011 100644
--- a/crossbench/stories/press_benchmark.py
+++ b/crossbench/stories/press_benchmark.py
@@ -19,6 +19,7 @@
 class PressBenchmarkStory(Story, metaclass=abc.ABCMeta):
   NAME: str = ""
   URL: str = ""
+  URL_OFFICIAL: str = ""
   URL_LOCAL: str = ""
   SUBSTORIES: Tuple[str, ...] = ()
 
@@ -82,6 +83,7 @@
     assert self.SUBSTORIES, f"{cls}.SUBSTORIES is not set."
     assert self.NAME is not None, f"{cls}.NAME is not set."
     self._verify_url(self.URL, "URL")
+    self._verify_url(self.URL_OFFICIAL, "URL_OFFICIAL")
     self._verify_url(self.URL_LOCAL, "URL_LOCAL")
     assert substories, f"No substories provided for {cls}"
     self._substories = substories