blob: b38b268fe8a3bcd977e912f9c1bf3565abcc7490 [file] [log] [blame]
#!/usr/bin/env vpython
# Copyright 2020 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Tests for chrome_proxy_utils."""
#pylint: disable=protected-access
import os
import unittest
from pylib.utils import chrome_proxy_utils
from devil.android import forwarder
from devil.android import device_utils
from devil.android.sdk import adb_wrapper
from py_utils import ts_proxy_server
from py_utils import webpagereplay_go_server
import mock # pylint: disable=import-error
def _DeviceUtilsMock(test_serial, is_ready=True):
"""Returns a DeviceUtils instance based on given serial."""
adb = mock.Mock(spec=adb_wrapper.AdbWrapper)
adb.__str__ = mock.Mock(return_value=test_serial)
adb.GetDeviceSerial.return_value = test_serial
adb.is_ready = is_ready
return device_utils.DeviceUtils(adb)
class ChromeProxySessionTest(unittest.TestCase):
"""Unittest for ChromeProxySession."""
#pylint: disable=no-self-use
@mock.patch.object(forwarder.Forwarder, 'Map')
@mock.patch.object(chrome_proxy_utils.WPRServer, 'StartServer')
@mock.patch.object(ts_proxy_server.TsProxyServer, 'StartServer')
@mock.patch.object(ts_proxy_server.TsProxyServer, 'UpdateOutboundPorts')
@mock.patch.object(ts_proxy_server.TsProxyServer, 'UpdateTrafficSettings')
@mock.patch('py_utils.ts_proxy_server.TsProxyServer.port',
new_callable=mock.PropertyMock)
def test_Start(self, port_mock, traffic_setting_mock, outboundport_mock,
start_server_mock, wpr_mock, forwarder_mock):
chrome_proxy = chrome_proxy_utils.ChromeProxySession(4)
chrome_proxy._wpr_server._host_http_port = 1
chrome_proxy._wpr_server._host_https_port = 2
port_mock.return_value = 3
device = _DeviceUtilsMock('01234')
chrome_proxy.Start(device, 'abc')
forwarder_mock.assert_called_once_with([(4, 3)], device)
wpr_mock.assert_called_once_with('abc')
start_server_mock.assert_called_once()
outboundport_mock.assert_called_once_with(http_port=1, https_port=2)
traffic_setting_mock.assert_called_once_with(download_bandwidth_kbps=72000,
round_trip_latency_ms=100,
upload_bandwidth_kbps=72000)
port_mock.assert_called_once()
@mock.patch.object(forwarder.Forwarder, 'UnmapDevicePort')
@mock.patch.object(chrome_proxy_utils.WPRServer, 'StopServer')
@mock.patch.object(ts_proxy_server.TsProxyServer, 'StopServer')
def test_Stop(self, ts_proxy_mock, wpr_mock, forwarder_mock):
chrome_proxy = chrome_proxy_utils.ChromeProxySession(4)
device = _DeviceUtilsMock('01234')
chrome_proxy.wpr_record_mode = True
chrome_proxy._wpr_server._archive_path = 'abc'
chrome_proxy.Stop(device)
forwarder_mock.assert_called_once_with(4, device)
wpr_mock.assert_called_once_with()
ts_proxy_mock.assert_called_once_with()
#pylint: enable=no-self-use
@mock.patch.object(forwarder.Forwarder, 'UnmapDevicePort')
@mock.patch.object(webpagereplay_go_server.ReplayServer, 'StopServer')
@mock.patch.object(ts_proxy_server.TsProxyServer, 'StopServer')
def test_Stop_WithProperties(self, ts_proxy_mock, wpr_mock, forwarder_mock):
chrome_proxy = chrome_proxy_utils.ChromeProxySession(4)
chrome_proxy._wpr_server._server = webpagereplay_go_server.ReplayServer(
os.path.abspath(__file__), chrome_proxy_utils.PROXY_HOST_IP, 0, 0, [])
chrome_proxy._wpr_server._archive_path = os.path.abspath(__file__)
device = _DeviceUtilsMock('01234')
chrome_proxy.wpr_record_mode = True
chrome_proxy.Stop(device)
forwarder_mock.assert_called_once_with(4, device)
wpr_mock.assert_called_once_with()
ts_proxy_mock.assert_called_once_with()
self.assertFalse(chrome_proxy.wpr_replay_mode)
self.assertEquals(chrome_proxy.wpr_archive_path, os.path.abspath(__file__))
def test_SetWPRRecordMode(self):
chrome_proxy = chrome_proxy_utils.ChromeProxySession(4)
chrome_proxy.wpr_record_mode = True
self.assertTrue(chrome_proxy._wpr_server.record_mode)
self.assertTrue(chrome_proxy.wpr_record_mode)
self.assertFalse(chrome_proxy.wpr_replay_mode)
chrome_proxy.wpr_record_mode = False
self.assertFalse(chrome_proxy._wpr_server.record_mode)
self.assertFalse(chrome_proxy.wpr_record_mode)
self.assertTrue(chrome_proxy.wpr_replay_mode)
def test_SetWPRArchivePath(self):
chrome_proxy = chrome_proxy_utils.ChromeProxySession(4)
chrome_proxy._wpr_server._archive_path = 'abc'
self.assertEquals(chrome_proxy.wpr_archive_path, 'abc')
def test_UseDefaultDeviceProxyPort(self):
chrome_proxy = chrome_proxy_utils.ChromeProxySession()
expected_flags = [
'--ignore-certificate-errors-spki-list='
'PhrPvGIaAMmd29hj8BCZOq096yj7uMpRNHpn5PDxI6I=',
'--proxy-server=socks5://localhost:1080'
]
self.assertEquals(chrome_proxy.device_proxy_port, 1080)
self.assertListEqual(chrome_proxy.GetFlags(), expected_flags)
def test_UseNewDeviceProxyPort(self):
chrome_proxy = chrome_proxy_utils.ChromeProxySession(1)
expected_flags = [
'--ignore-certificate-errors-spki-list='
'PhrPvGIaAMmd29hj8BCZOq096yj7uMpRNHpn5PDxI6I=',
'--proxy-server=socks5://localhost:1'
]
self.assertEquals(chrome_proxy.device_proxy_port, 1)
self.assertListEqual(chrome_proxy.GetFlags(), expected_flags)
class WPRServerTest(unittest.TestCase):
@mock.patch('py_utils.webpagereplay_go_server.ReplayServer')
def test_StartSever_fresh_replaymode(self, wpr_mock):
wpr_server = chrome_proxy_utils.WPRServer()
wpr_archive_file = os.path.abspath(__file__)
wpr_server.StartServer(wpr_archive_file)
wpr_mock.assert_called_once_with(wpr_archive_file,
'127.0.0.1',
http_port=0,
https_port=0,
replay_options=[])
self.assertEqual(wpr_server._archive_path, wpr_archive_file)
self.assertTrue(wpr_server._server)
@mock.patch('py_utils.webpagereplay_go_server.ReplayServer')
def test_StartSever_fresh_recordmode(self, wpr_mock):
wpr_server = chrome_proxy_utils.WPRServer()
wpr_server.record_mode = True
wpr_server.StartServer(os.path.abspath(__file__))
wpr_archive_file = os.path.abspath(__file__)
wpr_mock.assert_called_once_with(wpr_archive_file,
'127.0.0.1',
http_port=0,
https_port=0,
replay_options=['--record'])
self.assertEqual(wpr_server._archive_path, os.path.abspath(__file__))
self.assertTrue(wpr_server._server)
#pylint: disable=no-self-use
@mock.patch.object(webpagereplay_go_server.ReplayServer, 'StartServer')
def test_StartSever_recordmode(self, start_server_mock):
wpr_server = chrome_proxy_utils.WPRServer()
start_server_mock.return_value = {'http': 1, 'https': 2}
wpr_server.StartServer(os.path.abspath(__file__))
start_server_mock.assert_called_once()
self.assertEqual(wpr_server._host_http_port, 1)
self.assertEqual(wpr_server._host_https_port, 2)
self.assertEqual(wpr_server._archive_path, os.path.abspath(__file__))
self.assertTrue(wpr_server._server)
@mock.patch.object(webpagereplay_go_server.ReplayServer, 'StartServer')
def test_StartSever_reuseServer(self, start_server_mock):
wpr_server = chrome_proxy_utils.WPRServer()
wpr_server._server = webpagereplay_go_server.ReplayServer(
os.path.abspath(__file__),
chrome_proxy_utils.PROXY_HOST_IP,
http_port=0,
https_port=0,
replay_options=[])
wpr_server._archive_path = os.path.abspath(__file__)
wpr_server.StartServer(os.path.abspath(__file__))
start_server_mock.assert_not_called()
@mock.patch.object(webpagereplay_go_server.ReplayServer, 'StartServer')
@mock.patch.object(webpagereplay_go_server.ReplayServer, 'StopServer')
def test_StartSever_notReuseServer(self, stop_server_mock, start_server_mock):
wpr_server = chrome_proxy_utils.WPRServer()
wpr_server._server = webpagereplay_go_server.ReplayServer(
os.path.abspath(__file__),
chrome_proxy_utils.PROXY_HOST_IP,
http_port=0,
https_port=0,
replay_options=[])
wpr_server._archive_path = ''
wpr_server.StartServer(os.path.abspath(__file__))
start_server_mock.assert_called_once()
stop_server_mock.assert_called_once()
#pylint: enable=no-self-use
@mock.patch.object(webpagereplay_go_server.ReplayServer, 'StopServer')
def test_StopServer(self, stop_server_mock):
wpr_server = chrome_proxy_utils.WPRServer()
wpr_server._server = webpagereplay_go_server.ReplayServer(
os.path.abspath(__file__),
chrome_proxy_utils.PROXY_HOST_IP,
http_port=0,
https_port=0,
replay_options=[])
wpr_server.StopServer()
stop_server_mock.assert_called_once()
self.assertFalse(wpr_server._server)
self.assertFalse(wpr_server._archive_path)
self.assertFalse(wpr_server.http_port)
self.assertFalse(wpr_server.https_port)
def test_SetWPRRecordMode(self):
wpr_server = chrome_proxy_utils.WPRServer()
wpr_server.record_mode = True
self.assertTrue(wpr_server.record_mode)
wpr_server.record_mode = False
self.assertFalse(wpr_server.record_mode)
if __name__ == '__main__':
unittest.main(verbosity=2)