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