1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch# Copyright 2014 The Chromium Authors. All rights reserved.
2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch# Use of this source code is governed by a BSD-style license that can be
3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch# found in the LICENSE file.
4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)import base64
6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochimport logging
7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)import urlparse
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from integration_tests import chrome_proxy_metrics as metrics
10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochfrom metrics import loading
11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochfrom telemetry.core import util
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)from telemetry.page import page_test
13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class ChromeProxyLatency(page_test.PageTest):
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  """Chrome proxy latency measurement."""
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  def __init__(self, *args, **kwargs):
19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    super(ChromeProxyLatency, self).__init__(*args, **kwargs)
20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  def WillNavigateToPage(self, page, tab):
22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    tab.ClearCache(force=True)
23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def ValidateAndMeasurePage(self, page, tab, results):
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    # Wait for the load event.
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    tab.WaitForJavaScriptExpression('performance.timing.loadEventStart', 300)
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    loading.LoadingMetric().AddResults(tab, results)
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class ChromeProxyDataSaving(page_test.PageTest):
31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  """Chrome proxy data daving measurement."""
32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  def __init__(self, *args, **kwargs):
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    super(ChromeProxyDataSaving, self).__init__(*args, **kwargs)
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self._metrics = metrics.ChromeProxyMetric()
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  def WillNavigateToPage(self, page, tab):
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    tab.ClearCache(force=True)
38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    self._metrics.Start(page, tab)
39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def ValidateAndMeasurePage(self, page, tab, results):
41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    # Wait for the load event.
42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    tab.WaitForJavaScriptExpression('performance.timing.loadEventStart', 300)
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    self._metrics.Stop(page, tab)
44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    self._metrics.AddResultsForDataSaving(tab, results)
45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class ChromeProxyValidation(page_test.PageTest):
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  """Base class for all chrome proxy correctness measurements."""
49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  def __init__(self, restart_after_each_page=False):
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    super(ChromeProxyValidation, self).__init__(
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        needs_browser_restart_after_each_page=restart_after_each_page)
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    self._metrics = metrics.ChromeProxyMetric()
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    self._page = None
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    # Whether a timeout exception is expected during the test.
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    self._expect_timeout = False
57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  def CustomizeBrowserOptions(self, options):
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    # Enable the chrome proxy (data reduction proxy).
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    options.AppendExtraBrowserArgs('--enable-spdy-proxy-auth')
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  def WillNavigateToPage(self, page, tab):
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    tab.ClearCache(force=True)
64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    assert self._metrics
65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    self._metrics.Start(page, tab)
66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  def ValidateAndMeasurePage(self, page, tab, results):
68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    self._page = page
69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    # Wait for the load event.
70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    tab.WaitForJavaScriptExpression('performance.timing.loadEventStart', 300)
71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    assert self._metrics
72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    self._metrics.Stop(page, tab)
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    self.AddResults(tab, results)
74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  def AddResults(self, tab, results):
76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    raise NotImplementedError
77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  def StopBrowserAfterPage(self, browser, page):  # pylint: disable=W0613
79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if hasattr(page, 'restart_after') and page.restart_after:
80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      return True
81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return False
82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  def RunNavigateSteps(self, page, tab):
84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    # The redirect from safebrowsing causes a timeout. Ignore that.
85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    try:
86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      super(ChromeProxyValidation, self).RunNavigateSteps(page, tab)
87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    except util.TimeoutException, e:
88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      if self._expect_timeout:
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        logging.warning('Navigation timeout on page %s',
90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                        page.name if page.name else page.url)
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      else:
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        raise e
93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass ChromeProxyHeaders(ChromeProxyValidation):
96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  """Correctness measurement for response headers."""
97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  def __init__(self):
99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    super(ChromeProxyHeaders, self).__init__(restart_after_each_page=True)
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  def AddResults(self, tab, results):
102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    self._metrics.AddResultsForHeaderValidation(tab, results)
103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass ChromeProxyBypass(ChromeProxyValidation):
106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  """Correctness measurement for bypass responses."""
107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  def __init__(self):
109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    super(ChromeProxyBypass, self).__init__(restart_after_each_page=True)
110effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  def AddResults(self, tab, results):
112effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    self._metrics.AddResultsForBypass(tab, results)
113effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
114effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ChromeProxyBlockOnce(ChromeProxyValidation):
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """Correctness measurement for block-once responses."""
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __init__(self):
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    super(ChromeProxyBlockOnce, self).__init__(restart_after_each_page=True)
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def AddResults(self, tab, results):
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._metrics.AddResultsForBlockOnce(tab, results)
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
125effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass ChromeProxySafebrowsing(ChromeProxyValidation):
126effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  """Correctness measurement for safebrowsing."""
127effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
128effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  def __init__(self):
129effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    super(ChromeProxySafebrowsing, self).__init__()
130effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
131effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  def WillNavigateToPage(self, page, tab):
132effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    super(ChromeProxySafebrowsing, self).WillNavigateToPage(page, tab)
133effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    self._expect_timeout = True
134effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  def AddResults(self, tab, results):
136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    self._metrics.AddResultsForSafebrowsing(tab, results)
137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)_FAKE_PROXY_AUTH_VALUE = 'aabbccdd3b7579186c1b0620614fdb1f0000ffff'
140010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)_TEST_SERVER = 'chromeproxy-test.appspot.com'
141010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)_TEST_SERVER_DEFAULT_URL = 'http://' + _TEST_SERVER + '/default'
142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
143010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
144010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)# We rely on the chromeproxy-test server to facilitate some of the tests.
145010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)# The test server code is at <TBD location> and runs at _TEST_SERVER
146010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#
147010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)# The test server allow request to override response status, headers, and
148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)# body through query parameters. See GetResponseOverrideURL.
149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)def GetResponseOverrideURL(url, respStatus=0, respHeader="", respBody=""):
150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  """ Compose the request URL with query parameters to override
151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  the chromeproxy-test server response.
152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  """
153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  queries = []
155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if respStatus > 0:
156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    queries.append('respStatus=%d' % respStatus)
157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if respHeader:
158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    queries.append('respHeader=%s' % base64.b64encode(respHeader))
159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if respBody:
160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    queries.append('respBody=%s' % base64.b64encode(respBody))
161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if len(queries) == 0:
162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return url
163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  "&".join(queries)
164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  # url has query already
165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  if urlparse.urlparse(url).query:
166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return url + '&' + "&".join(queries)
167010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  else:
168010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    return url + '?' + "&".join(queries)
169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class ChromeProxyHTTPFallbackProbeURL(ChromeProxyValidation):
172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  """Correctness measurement for proxy fallback.
173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  In this test, the probe URL does not return 'OK'. Chrome is expected
175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  to use the fallback proxy.
176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  """
177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def __init__(self):
179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    super(ChromeProxyHTTPFallbackProbeURL, self).__init__()
180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def CustomizeBrowserOptions(self, options):
182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    super(ChromeProxyHTTPFallbackProbeURL,
183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          self).CustomizeBrowserOptions(options)
184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    # Use the test server probe URL which returns the response
185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    # body as specified by respBody.
186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    probe_url = GetResponseOverrideURL(
187010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        _TEST_SERVER_DEFAULT_URL,
188010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        respBody='not OK')
189010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    options.AppendExtraBrowserArgs(
190010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        '--data-reduction-proxy-probe-url=%s' % probe_url)
191010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
192010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def AddResults(self, tab, results):
193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self._metrics.AddResultsForHTTPFallback(tab, results)
194010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
195010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
196010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class ChromeProxyHTTPFallbackViaHeader(ChromeProxyValidation):
197010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  """Correctness measurement for proxy fallback.
198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
199010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  In this test, the configured proxy is the chromeproxy-test server which
200010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  will send back a response without the expected Via header. Chrome is
201010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  expected to use the fallback proxy and add the configured proxy to the
202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bad proxy list.
203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  """
204010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def __init__(self):
206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    super(ChromeProxyHTTPFallbackViaHeader, self).__init__()
207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def CustomizeBrowserOptions(self, options):
209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    super(ChromeProxyHTTPFallbackViaHeader,
210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)          self).CustomizeBrowserOptions(options)
211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    options.AppendExtraBrowserArgs('--ignore-certificate-errors')
212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    options.AppendExtraBrowserArgs(
213010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        '--spdy-proxy-auth-origin=http://%s' % _TEST_SERVER)
214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    options.AppendExtraBrowserArgs(
215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        '--spdy-proxy-auth-value=%s' % _FAKE_PROXY_AUTH_VALUE)
216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
217010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  def AddResults(self, tab, results):
218010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    proxies = [
219010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        _TEST_SERVER + ":80",
220010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        self._metrics.effective_proxies['fallback'],
221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        self._metrics.effective_proxies['direct']]
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bad_proxies = [_TEST_SERVER + ":80", metrics.PROXY_SETTING_HTTP]
223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    self._metrics.AddResultsForHTTPFallback(tab, results, proxies, bad_proxies)
224010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
225010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass ChromeProxyClientVersion(ChromeProxyValidation):
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """Correctness measurement for version directives in Chrome-Proxy header.
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  The test verifies that the version information provided in the Chrome-Proxy
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  request header overrides any version, if specified, that is provided in the
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  user agent string.
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  """
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def __init__(self):
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    super(ChromeProxyClientVersion, self).__init__()
2361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def CustomizeBrowserOptions(self, options):
2381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    super(ChromeProxyClientVersion,
2391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          self).CustomizeBrowserOptions(options)
2401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    options.AppendExtraBrowserArgs('--user-agent="Chrome/32.0.1700.99"')
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  def AddResults(self, tab, results):
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    self._metrics.AddResultsForClientVersion(tab, results)
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
246effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass ChromeProxySmoke(ChromeProxyValidation):
247effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  """Smoke measurement for basic chrome proxy correctness."""
248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
249effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  def __init__(self):
250effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    super(ChromeProxySmoke, self).__init__()
251effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
252effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  def WillNavigateToPage(self, page, tab):
253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    super(ChromeProxySmoke, self).WillNavigateToPage(page, tab)
254effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if page.name == 'safebrowsing':
255effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      self._expect_timeout = True
256effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
257effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  def AddResults(self, tab, results):
258effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    # Map a page name to its AddResults func.
259effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    page_to_metrics = {
260effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        'header validation': [self._metrics.AddResultsForHeaderValidation],
261effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        'compression: image': [
262effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            self._metrics.AddResultsForHeaderValidation,
263effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            self._metrics.AddResultsForDataSaving,
264effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            ],
265effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        'compression: javascript': [
266effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            self._metrics.AddResultsForHeaderValidation,
267effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            self._metrics.AddResultsForDataSaving,
268effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            ],
269effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        'compression: css': [
270effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            self._metrics.AddResultsForHeaderValidation,
271effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            self._metrics.AddResultsForDataSaving,
272effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            ],
273effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        'bypass': [self._metrics.AddResultsForBypass],
274effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        'safebrowsing': [self._metrics.AddResultsForSafebrowsing],
275effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        }
276effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if not self._page.name in page_to_metrics:
2775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      raise page_test.MeasurementFailure(
278effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          'Invalid page name (%s) in smoke. Page name must be one of:\n%s' % (
279effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          self._page.name, page_to_metrics.keys()))
280effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    for add_result in page_to_metrics[self._page.name]:
281effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      add_result(tab, results)
282