summaryrefslogtreecommitdiffstats
path: root/testing/raptor/test/test_power.py
diff options
context:
space:
mode:
Diffstat (limited to 'testing/raptor/test/test_power.py')
-rw-r--r--testing/raptor/test/test_power.py269
1 files changed, 269 insertions, 0 deletions
diff --git a/testing/raptor/test/test_power.py b/testing/raptor/test/test_power.py
new file mode 100644
index 0000000000..7fa3b1a609
--- /dev/null
+++ b/testing/raptor/test/test_power.py
@@ -0,0 +1,269 @@
+# 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 sys
+import tempfile
+from unittest import mock
+
+import mozunit
+
+# need this so raptor imports work both from /raptor and via mach
+here = os.path.abspath(os.path.dirname(__file__))
+
+raptor_dir = os.path.join(os.path.dirname(here), "raptor")
+sys.path.insert(0, raptor_dir)
+
+import power
+from webextension import WebExtensionAndroid
+
+
+def test_android7_power():
+ if not os.getenv("MOZ_UPLOAD_DIR"):
+ os.environ["MOZ_UPLOAD_DIR"] = tempfile.mkdtemp()
+
+ with mock.patch("mozdevice.adb.ADBDevice") as device:
+ with mock.patch("control_server.RaptorControlServer") as control_server:
+ # Override the shell output with sample CPU usage details
+ filepath = os.path.abspath(os.path.dirname(__file__)) + "/files/"
+ f = open(filepath + "batterystats-android-7.txt", "r")
+ batterystats_return_value = f.read()
+
+ # Multiple shell output calls are performed
+ # and only those with non-None output are required
+ device.shell_output.return_value = None
+ device.shell_output.side_effect = [
+ None,
+ None,
+ "Test value",
+ "Test value",
+ batterystats_return_value,
+ "7.0.0",
+ ]
+
+ device._verbose = True
+ device.version = 7
+
+ # Create a control server
+ control_server.power_test = True
+ control_server.test_name = "gve-pytest"
+ control_server.device = device
+ control_server.app_name = "org.mozilla.geckoview_example"
+
+ original_get = WebExtensionAndroid.get_browser_meta
+ WebExtensionAndroid.get_browser_meta = mock.MagicMock()
+ WebExtensionAndroid.get_browser_meta.return_value = ("app", "version")
+
+ web_extension = WebExtensionAndroid(
+ "geckoview", "org.mozilla.geckoview_example", power_test=True
+ )
+ WebExtensionAndroid.get_browser_meta = original_get
+
+ web_extension.device = device
+ web_extension.config["power_test"] = True
+ web_extension.control_server = control_server
+ web_extension.power_test_time = 20 # minutes
+ web_extension.os_baseline_data = {
+ "type": "power",
+ "test": "gve-pytest",
+ "unit": "mAh",
+ "values": {"cpu": float(5), "wifi": float(5), "screen": float(5)},
+ }
+
+ # Verify the response contains our expected calculations
+ # (no proportional measure on android 7)
+ power_data = {
+ "type": "power",
+ "test": "gve-pytest",
+ "unit": "mAh",
+ "values": {
+ "cpu": float(14.5),
+ "wifi": float(0.132),
+ "screen": float(70.7),
+ },
+ }
+
+ pc_data = {
+ "type": "power",
+ "test": "gve-pytest-%change",
+ "unit": "%",
+ "values": {
+ "cpu": float(14.5),
+ "wifi": float(0.132000000000005),
+ "screen": float(70.70000000000002),
+ },
+ }
+
+ power.finish_android_power_test(web_extension, "gve-pytest")
+
+ control_server.submit_supporting_data.assert_has_calls(
+ [
+ mock.call(power_data),
+ mock.call(pc_data),
+ mock.call(web_extension.os_baseline_data),
+ ]
+ )
+
+
+def test_android8_power():
+ if not os.getenv("MOZ_UPLOAD_DIR"):
+ os.environ["MOZ_UPLOAD_DIR"] = tempfile.mkdtemp()
+
+ with mock.patch("mozdevice.adb.ADBDevice") as device:
+ with mock.patch("control_server.RaptorControlServer") as control_server:
+ # Override the shell output with sample CPU usage details
+ filepath = os.path.abspath(os.path.dirname(__file__)) + "/files/"
+ f = open(filepath + "batterystats-android-8.txt", "r")
+ batterystats_return_value = f.read()
+ print(type(batterystats_return_value))
+
+ # Multiple shell output calls are performed
+ # and only those with non-None output are required
+ device.shell_output.return_value = None
+ device.shell_output.side_effect = [
+ None,
+ None,
+ "Test value",
+ "Test value",
+ batterystats_return_value,
+ "8.0.0",
+ ]
+
+ device._verbose = True
+ device.version = 8
+
+ # Create a control server
+ control_server.power_test = True
+ control_server.test_name = "gve-pytest"
+ control_server.device = device
+ control_server.app_name = "org.mozilla.geckoview_example"
+
+ original_get = WebExtensionAndroid.get_browser_meta
+ WebExtensionAndroid.get_browser_meta = mock.MagicMock()
+ WebExtensionAndroid.get_browser_meta.return_value = ("app", "version")
+
+ web_extension = WebExtensionAndroid(
+ "geckoview", "org.mozilla.geckoview_example", power_test=True
+ )
+ WebExtensionAndroid.get_browser_meta = original_get
+
+ web_extension.device = device
+ web_extension.config["power_test"] = True
+ web_extension.control_server = control_server
+ web_extension.power_test_time = 20 # minutes
+ web_extension.os_baseline_data = {
+ "type": "power",
+ "test": "gve-pytest",
+ "unit": "mAh",
+ "values": {
+ "cpu": float(5),
+ "wifi": float(5),
+ "screen": float(5),
+ "proportional": float(5),
+ },
+ }
+
+ # Verify the response contains our expected calculations
+ power_data = {
+ "type": "power",
+ "test": "gve-pytest",
+ "unit": "mAh",
+ "values": {
+ "cpu": float(4.7),
+ "wifi": float(0.000556),
+ "screen": float(51.5),
+ "proportional": float(11.2),
+ },
+ }
+
+ pc_data = {
+ "type": "power",
+ "test": "gve-pytest-%change",
+ "unit": "%",
+ "values": {
+ "cpu": float(4.700000000000017),
+ "wifi": float(0.0005559999999888987),
+ "screen": float(51.5),
+ "proportional": float(11.199999999999989),
+ },
+ }
+
+ power.finish_android_power_test(web_extension, "gve-pytest")
+
+ control_server.submit_supporting_data.assert_has_calls(
+ [
+ mock.call(power_data),
+ mock.call(pc_data),
+ mock.call(web_extension.os_baseline_data),
+ ]
+ )
+
+
+def test_androidos_baseline_power():
+ if not os.getenv("MOZ_UPLOAD_DIR"):
+ os.environ["MOZ_UPLOAD_DIR"] = tempfile.mkdtemp()
+
+ with mock.patch("mozdevice.adb.ADBDevice") as device:
+ with mock.patch("control_server.RaptorControlServer") as control_server:
+ # Override the shell output with sample CPU usage details
+ filepath = os.path.abspath(os.path.dirname(__file__)) + "/files/"
+ f = open(filepath + "batterystats-android-8.txt", "r")
+ batterystats_return_value = f.read()
+
+ # Multiple shell output calls are performed
+ # and only those with non-None output are required
+ device.shell_output.return_value = None
+ device.shell_output.side_effect = [
+ None,
+ None,
+ "Test value",
+ "Test value",
+ batterystats_return_value,
+ "8.0.0",
+ ]
+
+ device._verbose = True
+ device.version = 8
+
+ # Create a control server
+ control_server.power_test = True
+ control_server.test_name = "gve-pytest"
+ control_server.device = device
+ control_server.app_name = "org.mozilla.geckoview_example"
+
+ original_get = WebExtensionAndroid.get_browser_meta
+ WebExtensionAndroid.get_browser_meta = mock.MagicMock()
+ WebExtensionAndroid.get_browser_meta.return_value = ("app", "version")
+
+ web_extension = WebExtensionAndroid(
+ "geckoview", "org.mozilla.geckoview_example", power_test=True
+ )
+ WebExtensionAndroid.get_browser_meta = original_get
+
+ web_extension.device = device
+ web_extension.config["power_test"] = True
+ web_extension.control_server = control_server
+
+ # Expected OS baseline calculation result
+ os_baseline_data = {
+ "type": "power",
+ "test": "gve-pytest",
+ "unit": "mAh",
+ "values": {
+ "cpu": float(10.786654),
+ "wifi": float(2.26132),
+ "screen": float(51.66),
+ "proportional": float(11.294805199999999),
+ },
+ }
+
+ # Verify the response contains our expected calculations
+ power.finish_android_power_test(
+ web_extension, "gve-pytest", os_baseline=True
+ )
+
+ assert web_extension.os_baseline_data == os_baseline_data
+
+
+if __name__ == "__main__":
+ mozunit.main()