summaryrefslogtreecommitdiffstats
path: root/python/mozperftest/mozperftest/tests/test_proxy.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/mozperftest/mozperftest/tests/test_proxy.py')
-rw-r--r--python/mozperftest/mozperftest/tests/test_proxy.py231
1 files changed, 231 insertions, 0 deletions
diff --git a/python/mozperftest/mozperftest/tests/test_proxy.py b/python/mozperftest/mozperftest/tests/test_proxy.py
new file mode 100644
index 0000000000..bfe1220e2a
--- /dev/null
+++ b/python/mozperftest/mozperftest/tests/test_proxy.py
@@ -0,0 +1,231 @@
+#!/usr/bin/env python
+import json
+import os
+import shutil
+import tempfile
+from unittest import mock
+
+import mozunit
+import pytest
+
+from mozperftest.environment import SYSTEM
+from mozperftest.system.proxy import OutputHandler
+from mozperftest.tests.support import get_running_env
+from mozperftest.utils import silence
+
+here = os.path.abspath(os.path.dirname(__file__))
+example_dump = os.path.join(here, "..", "system", "example.zip")
+
+
+class FakeOutputHandler:
+ def finished(self):
+ pass
+
+ def wait_for_port(self):
+ return 1234
+
+
+class FakeOutputHandlerFail:
+ def finished(self):
+ pass
+
+ def wait_for_port(self):
+ return None
+
+
+class ProcHandler:
+ def __init__(self, *args, **kw):
+ self.args = args
+ self.kw = kw
+ self.pid = 1234
+
+ def wait(self, *args):
+ return
+
+ run = wait
+
+ @property
+ def proc(self):
+ return self
+
+
+class ProcHandlerError:
+ def __init__(self, *args, **kw):
+ self.args = args
+ self.kw = kw
+ self.pid = 1234
+
+ def wait(self, *args):
+ return 1
+
+ run = wait
+
+ @property
+ def proc(self):
+ return self
+
+
+class FakeDevice:
+ def create_socket_connection(self, direction, local, remote):
+ return "A Fake socket"
+
+
+def running_env():
+ return get_running_env(proxy=True)
+
+
+def mock_download_file(url, dest):
+ shutil.copyfile(example_dump, dest)
+
+
+@mock.patch("mozperftest.system.proxy.download_file", mock_download_file)
+@mock.patch("mozperftest.system.proxy.ProcessHandler", new=ProcHandler)
+@mock.patch("mozperftest.system.proxy.OutputHandler", new=FakeOutputHandlerFail)
+@mock.patch("os.kill")
+def test_port_error(killer):
+ mach_cmd, metadata, env = running_env()
+ system = env.layers[SYSTEM]
+ with tempfile.TemporaryDirectory() as tmpdir:
+ recording = os.path.join(tmpdir, "recording.zip")
+ env.set_arg("proxy-mode", "record")
+ env.set_arg("proxy-file", recording)
+
+ with system as proxy, pytest.raises(ValueError) as excinfo, silence():
+ proxy(metadata)
+ assert "Unable to retrieve the port number from mozproxy" in str(excinfo.value)
+
+
+@mock.patch("mozperftest.system.proxy.download_file", mock_download_file)
+@mock.patch("mozperftest.system.proxy.ProcessHandler", new=ProcHandlerError)
+@mock.patch("mozperftest.system.proxy.OutputHandler", new=FakeOutputHandler)
+@mock.patch("os.kill")
+def test_proxy_error(killer):
+ mach_cmd, metadata, env = running_env()
+ system = env.layers[SYSTEM]
+ with tempfile.TemporaryDirectory() as tmpdir:
+ recording = os.path.join(tmpdir, "recording.zip")
+ env.set_arg("proxy-mode", "record")
+ env.set_arg("proxy-file", recording)
+
+ with pytest.raises(ValueError) as excinfo:
+ with system as proxy, silence():
+ proxy(metadata)
+ assert "mozproxy terminated early with return code 1" in str(excinfo.value)
+
+
+@mock.patch("mozperftest.system.proxy.download_file", mock_download_file)
+@mock.patch("mozperftest.system.proxy.ProcessHandler", new=ProcHandler)
+@mock.patch("mozperftest.system.proxy.OutputHandler", new=FakeOutputHandler)
+@mock.patch("os.kill")
+def test_playback_no_file(killer):
+ mach_cmd, metadata, env = running_env()
+ system = env.layers[SYSTEM]
+ env.set_arg("proxy-mode", "playback")
+
+ with system as proxy, pytest.raises(ValueError) as excinfo, silence():
+ proxy(metadata)
+ assert "Proxy file not provided!!" in str(excinfo.value)
+
+
+@mock.patch("mozperftest.system.proxy.download_file", mock_download_file)
+@mock.patch("mozperftest.system.proxy.ProcessHandler", new=ProcHandler)
+@mock.patch("mozperftest.system.proxy.OutputHandler", new=FakeOutputHandler)
+@mock.patch("os.kill")
+def test_playback_no_mode(killer):
+ mach_cmd, metadata, env = running_env()
+ system = env.layers[SYSTEM]
+ env.set_arg("proxy-file", example_dump)
+
+ with system as proxy, pytest.raises(ValueError) as excinfo, silence():
+ proxy(metadata)
+ assert "Proxy mode not provided please provide proxy mode" in str(excinfo.value)
+
+
+@mock.patch("mozperftest.system.proxy.OutputHandler", new=FakeOutputHandler)
+@mock.patch("mozperftest.system.proxy.ProcessHandler", new=ProcHandler)
+@mock.patch("mozperftest.system.proxy.ADBDevice", new=FakeDevice)
+@mock.patch("os.kill")
+def test_android_proxy(killer):
+ mach_cmd, metadata, env = running_env()
+ metadata.flavor = "mobile-browser"
+ system = env.layers[SYSTEM]
+ env.set_arg("proxy-mode", "playback")
+ env.set_arg("proxy-file", example_dump)
+
+ with system as proxy, silence():
+ proxy(metadata)
+
+ browser_prefs = metadata.get_options("browser_prefs")
+ assert browser_prefs["network.proxy.http_port"] == 1234
+
+
+@mock.patch("mozperftest.system.proxy.OutputHandler", new=FakeOutputHandler)
+@mock.patch("mozperftest.system.proxy.ProcessHandler", new=ProcHandler)
+@mock.patch("os.kill")
+def test_replay(killer):
+ mach_cmd, metadata, env = running_env()
+ system = env.layers[SYSTEM]
+ env.set_arg("proxy-mode", "playback")
+ env.set_arg("proxy-file", example_dump)
+
+ with system as proxy, silence():
+ proxy(metadata)
+
+ browser_prefs = metadata.get_options("browser_prefs")
+ assert browser_prefs["network.proxy.http_port"] == 1234
+
+
+@mock.patch("mozperftest.system.proxy.download_file", mock_download_file)
+@mock.patch("mozperftest.system.proxy.ProcessHandler", new=ProcHandler)
+@mock.patch("mozperftest.system.proxy.OutputHandler", new=FakeOutputHandler)
+@mock.patch("os.kill")
+def test_replay_url(killer):
+ mach_cmd, metadata, env = running_env()
+ system = env.layers[SYSTEM]
+ env.set_arg("proxy-mode", "playback")
+ env.set_arg("proxy-file", "http://example.dump")
+
+ with system as proxy, silence():
+ proxy(metadata)
+
+ browser_prefs = metadata.get_options("browser_prefs")
+ assert browser_prefs["network.proxy.http_port"] == 1234
+
+
+@mock.patch("mozperftest.system.proxy.download_file", mock_download_file)
+@mock.patch("mozperftest.system.proxy.ProcessHandler", new=ProcHandler)
+@mock.patch("mozperftest.system.proxy.OutputHandler", new=FakeOutputHandler)
+@mock.patch("os.kill")
+def test_record(killer):
+ mach_cmd, metadata, env = running_env()
+ system = env.layers[SYSTEM]
+ with tempfile.TemporaryDirectory() as tmpdir:
+ recording = os.path.join(tmpdir, "recording.zip")
+ env.set_arg("proxy-mode", "record")
+ env.set_arg("proxy-file", recording)
+
+ with system as proxy, silence():
+ proxy(metadata)
+
+ browser_prefs = metadata.get_options("browser_prefs")
+ assert browser_prefs["network.proxy.http_port"] == 1234
+
+
+@mock.patch("mozperftest.system.proxy.LOG")
+def test_output_handler(logged):
+ hdlr = OutputHandler()
+
+ hdlr(b"")
+ hdlr(b"simple line")
+ hdlr(json.dumps({"not": "expected data"}).encode())
+
+ hdlr.finished()
+ assert hdlr.wait_for_port() is None
+
+ # this catches the port
+ hdlr(json.dumps({"action": "", "message": "Proxy running on port 1234"}).encode())
+ assert hdlr.wait_for_port() == 1234
+
+
+if __name__ == "__main__":
+ mozunit.main()