• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/env vpython3
2# Copyright 2020 The Chromium Authors
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5"""Tests for chrome_proxy_utils."""
6
7#pylint: disable=protected-access
8
9import os
10import unittest
11
12from pylib.utils import chrome_proxy_utils
13
14from devil.android import forwarder
15from devil.android import device_utils
16from devil.android.sdk import adb_wrapper
17from py_utils import ts_proxy_server
18from py_utils import webpagereplay_go_server
19
20import mock  # pylint: disable=import-error
21
22
23def _DeviceUtilsMock(test_serial, is_ready=True):
24  """Returns a DeviceUtils instance based on given serial."""
25  adb = mock.Mock(spec=adb_wrapper.AdbWrapper)
26  adb.__str__ = mock.Mock(return_value=test_serial)
27  adb.GetDeviceSerial.return_value = test_serial
28  adb.is_ready = is_ready
29  return device_utils.DeviceUtils(adb)
30
31
32class ChromeProxySessionTest(unittest.TestCase):
33  """Unittest for ChromeProxySession."""
34
35  #pylint: disable=no-self-use
36
37  @mock.patch.object(forwarder.Forwarder, 'Map')
38  @mock.patch.object(chrome_proxy_utils.WPRServer, 'StartServer')
39  @mock.patch.object(ts_proxy_server.TsProxyServer, 'StartServer')
40  @mock.patch.object(ts_proxy_server.TsProxyServer, 'UpdateOutboundPorts')
41  @mock.patch.object(ts_proxy_server.TsProxyServer, 'UpdateTrafficSettings')
42  @mock.patch('py_utils.ts_proxy_server.TsProxyServer.port',
43              new_callable=mock.PropertyMock)
44  def test_Start(self, port_mock, traffic_setting_mock, outboundport_mock,
45                 start_server_mock, wpr_mock, forwarder_mock):
46    chrome_proxy = chrome_proxy_utils.ChromeProxySession(4)
47    chrome_proxy._wpr_server._host_http_port = 1
48    chrome_proxy._wpr_server._host_https_port = 2
49    port_mock.return_value = 3
50    device = _DeviceUtilsMock('01234')
51    chrome_proxy.Start(device, 'abc')
52
53    forwarder_mock.assert_called_once_with([(4, 3)], device)
54    wpr_mock.assert_called_once_with('abc')
55    start_server_mock.assert_called_once()
56    outboundport_mock.assert_called_once_with(http_port=1, https_port=2)
57    traffic_setting_mock.assert_called_once_with(download_bandwidth_kbps=72000,
58                                                 round_trip_latency_ms=100,
59                                                 upload_bandwidth_kbps=72000)
60    port_mock.assert_called_once()
61
62  @mock.patch.object(forwarder.Forwarder, 'UnmapDevicePort')
63  @mock.patch.object(chrome_proxy_utils.WPRServer, 'StopServer')
64  @mock.patch.object(ts_proxy_server.TsProxyServer, 'StopServer')
65  def test_Stop(self, ts_proxy_mock, wpr_mock, forwarder_mock):
66    chrome_proxy = chrome_proxy_utils.ChromeProxySession(4)
67    device = _DeviceUtilsMock('01234')
68    chrome_proxy.wpr_record_mode = True
69    chrome_proxy._wpr_server._archive_path = 'abc'
70    chrome_proxy.Stop(device)
71
72    forwarder_mock.assert_called_once_with(4, device)
73    wpr_mock.assert_called_once_with()
74    ts_proxy_mock.assert_called_once_with()
75
76  #pylint: enable=no-self-use
77
78  @mock.patch.object(forwarder.Forwarder, 'UnmapDevicePort')
79  @mock.patch.object(webpagereplay_go_server.ReplayServer, 'StopServer')
80  @mock.patch.object(ts_proxy_server.TsProxyServer, 'StopServer')
81  def test_Stop_WithProperties(self, ts_proxy_mock, wpr_mock, forwarder_mock):
82    chrome_proxy = chrome_proxy_utils.ChromeProxySession(4)
83    chrome_proxy._wpr_server._server = webpagereplay_go_server.ReplayServer(
84        os.path.abspath(__file__), chrome_proxy_utils.PROXY_HOST_IP, 0, 0, [])
85    chrome_proxy._wpr_server._archive_path = os.path.abspath(__file__)
86    device = _DeviceUtilsMock('01234')
87    chrome_proxy.wpr_record_mode = True
88    chrome_proxy.Stop(device)
89
90    forwarder_mock.assert_called_once_with(4, device)
91    wpr_mock.assert_called_once_with()
92    ts_proxy_mock.assert_called_once_with()
93    self.assertFalse(chrome_proxy.wpr_replay_mode)
94    self.assertEqual(chrome_proxy.wpr_archive_path, os.path.abspath(__file__))
95
96  def test_SetWPRRecordMode(self):
97    chrome_proxy = chrome_proxy_utils.ChromeProxySession(4)
98    chrome_proxy.wpr_record_mode = True
99    self.assertTrue(chrome_proxy._wpr_server.record_mode)
100    self.assertTrue(chrome_proxy.wpr_record_mode)
101    self.assertFalse(chrome_proxy.wpr_replay_mode)
102
103    chrome_proxy.wpr_record_mode = False
104    self.assertFalse(chrome_proxy._wpr_server.record_mode)
105    self.assertFalse(chrome_proxy.wpr_record_mode)
106    self.assertTrue(chrome_proxy.wpr_replay_mode)
107
108  def test_SetWPRArchivePath(self):
109    chrome_proxy = chrome_proxy_utils.ChromeProxySession(4)
110    chrome_proxy._wpr_server._archive_path = 'abc'
111    self.assertEqual(chrome_proxy.wpr_archive_path, 'abc')
112
113  def test_UseDefaultDeviceProxyPort(self):
114    chrome_proxy = chrome_proxy_utils.ChromeProxySession()
115    expected_flags = [
116        '--ignore-certificate-errors-spki-list='
117        'PhrPvGIaAMmd29hj8BCZOq096yj7uMpRNHpn5PDxI6I=',
118        '--proxy-server=socks5://localhost:1080'
119    ]
120    self.assertEqual(chrome_proxy.device_proxy_port, 1080)
121    self.assertListEqual(chrome_proxy.GetFlags(), expected_flags)
122
123  def test_UseNewDeviceProxyPort(self):
124    chrome_proxy = chrome_proxy_utils.ChromeProxySession(1)
125    expected_flags = [
126        '--ignore-certificate-errors-spki-list='
127        'PhrPvGIaAMmd29hj8BCZOq096yj7uMpRNHpn5PDxI6I=',
128        '--proxy-server=socks5://localhost:1'
129    ]
130    self.assertEqual(chrome_proxy.device_proxy_port, 1)
131    self.assertListEqual(chrome_proxy.GetFlags(), expected_flags)
132
133
134class WPRServerTest(unittest.TestCase):
135  @mock.patch('py_utils.webpagereplay_go_server.ReplayServer')
136  def test_StartSever_fresh_replaymode(self, wpr_mock):
137    wpr_server = chrome_proxy_utils.WPRServer()
138    wpr_archive_file = os.path.abspath(__file__)
139    wpr_server.StartServer(wpr_archive_file)
140
141    wpr_mock.assert_called_once_with(wpr_archive_file,
142                                     '127.0.0.1',
143                                     http_port=0,
144                                     https_port=0,
145                                     replay_options=[])
146
147    self.assertEqual(wpr_server._archive_path, wpr_archive_file)
148    self.assertTrue(wpr_server._server)
149
150  @mock.patch('py_utils.webpagereplay_go_server.ReplayServer')
151  def test_StartSever_fresh_recordmode(self, wpr_mock):
152    wpr_server = chrome_proxy_utils.WPRServer()
153    wpr_server.record_mode = True
154    wpr_server.StartServer(os.path.abspath(__file__))
155    wpr_archive_file = os.path.abspath(__file__)
156
157    wpr_mock.assert_called_once_with(wpr_archive_file,
158                                     '127.0.0.1',
159                                     http_port=0,
160                                     https_port=0,
161                                     replay_options=['--record'])
162
163    self.assertEqual(wpr_server._archive_path, os.path.abspath(__file__))
164    self.assertTrue(wpr_server._server)
165
166  #pylint: disable=no-self-use
167
168  @mock.patch.object(webpagereplay_go_server.ReplayServer, 'StartServer')
169  def test_StartSever_recordmode(self, start_server_mock):
170    wpr_server = chrome_proxy_utils.WPRServer()
171    start_server_mock.return_value = {'http': 1, 'https': 2}
172    wpr_server.StartServer(os.path.abspath(__file__))
173
174    start_server_mock.assert_called_once()
175    self.assertEqual(wpr_server._host_http_port, 1)
176    self.assertEqual(wpr_server._host_https_port, 2)
177    self.assertEqual(wpr_server._archive_path, os.path.abspath(__file__))
178    self.assertTrue(wpr_server._server)
179
180  @mock.patch.object(webpagereplay_go_server.ReplayServer, 'StartServer')
181  def test_StartSever_reuseServer(self, start_server_mock):
182    wpr_server = chrome_proxy_utils.WPRServer()
183    wpr_server._server = webpagereplay_go_server.ReplayServer(
184        os.path.abspath(__file__),
185        chrome_proxy_utils.PROXY_HOST_IP,
186        http_port=0,
187        https_port=0,
188        replay_options=[])
189    wpr_server._archive_path = os.path.abspath(__file__)
190    wpr_server.StartServer(os.path.abspath(__file__))
191    start_server_mock.assert_not_called()
192
193  @mock.patch.object(webpagereplay_go_server.ReplayServer, 'StartServer')
194  @mock.patch.object(webpagereplay_go_server.ReplayServer, 'StopServer')
195  def test_StartSever_notReuseServer(self, stop_server_mock, start_server_mock):
196    wpr_server = chrome_proxy_utils.WPRServer()
197    wpr_server._server = webpagereplay_go_server.ReplayServer(
198        os.path.abspath(__file__),
199        chrome_proxy_utils.PROXY_HOST_IP,
200        http_port=0,
201        https_port=0,
202        replay_options=[])
203    wpr_server._archive_path = ''
204    wpr_server.StartServer(os.path.abspath(__file__))
205    start_server_mock.assert_called_once()
206    stop_server_mock.assert_called_once()
207
208  #pylint: enable=no-self-use
209
210  @mock.patch.object(webpagereplay_go_server.ReplayServer, 'StopServer')
211  def test_StopServer(self, stop_server_mock):
212    wpr_server = chrome_proxy_utils.WPRServer()
213    wpr_server._server = webpagereplay_go_server.ReplayServer(
214        os.path.abspath(__file__),
215        chrome_proxy_utils.PROXY_HOST_IP,
216        http_port=0,
217        https_port=0,
218        replay_options=[])
219    wpr_server.StopServer()
220    stop_server_mock.assert_called_once()
221    self.assertFalse(wpr_server._server)
222    self.assertFalse(wpr_server._archive_path)
223    self.assertFalse(wpr_server.http_port)
224    self.assertFalse(wpr_server.https_port)
225
226  def test_SetWPRRecordMode(self):
227    wpr_server = chrome_proxy_utils.WPRServer()
228    wpr_server.record_mode = True
229    self.assertTrue(wpr_server.record_mode)
230    wpr_server.record_mode = False
231    self.assertFalse(wpr_server.record_mode)
232
233
234if __name__ == '__main__':
235  unittest.main(verbosity=2)
236