Source code

Revision control

Copy as Markdown

Other Tools

#!/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("android-app-name", "org.mozilla.geckoview_example")
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()