blob: 2b3259fe52f1590fb859e5c3e969bce54249b5d4 [file] [log] [blame]
# Copyright 2017 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.
import common
from common import TestDriver
from common import IntegrationTest
class Bypass(IntegrationTest):
# Ensure Chrome does not use Data Saver for block-once, but does use Data
# Saver for a subsequent request.
def testBlockOnce(self):
with TestDriver() as t:
t.AddChromeArg('--enable-spdy-proxy-auth')
t.LoadURL('http://check.googlezip.net/blocksingle/')
responses = t.GetHTTPResponses()
self.assertEqual(2, len(responses))
for response in responses:
if response.url == "http://check.googlezip.net/image.png":
self.assertHasChromeProxyViaHeader(response)
else:
self.assertNotHasChromeProxyViaHeader(response)
# Ensure Chrome does not use Data Saver for block=0, which uses the default
# proxy retry delay.
def testBypass(self):
with TestDriver() as t:
t.AddChromeArg('--enable-spdy-proxy-auth')
t.LoadURL('http://check.googlezip.net/block/')
for response in t.GetHTTPResponses():
self.assertNotHasChromeProxyViaHeader(response)
# Load another page and check that Data Saver is not used.
t.LoadURL('http://check.googlezip.net/test.html')
for response in t.GetHTTPResponses():
self.assertNotHasChromeProxyViaHeader(response)
# Ensure Chrome does not use Data Saver for HTTPS requests.
def testHttpsBypass(self):
with TestDriver() as t:
t.AddChromeArg('--enable-spdy-proxy-auth')
# Load HTTP page and check that Data Saver is used.
t.LoadURL('http://check.googlezip.net/test.html')
responses = t.GetHTTPResponses()
self.assertEqual(2, len(responses))
for response in responses:
self.assertHasChromeProxyViaHeader(response)
# Load HTTPS page and check that Data Saver is not used.
t.LoadURL('https://check.googlezip.net/test.html')
responses = t.GetHTTPResponses()
self.assertEqual(2, len(responses))
for response in responses:
self.assertNotHasChromeProxyViaHeader(response)
# Verify that CORS requests receive a block-once from the data reduction
# proxy by checking that those requests are retried without data reduction
# proxy.
def testCorsBypass(self):
with TestDriver() as test_driver:
test_driver.AddChromeArg('--enable-spdy-proxy-auth')
test_driver.LoadURL('http://www.gstatic.com/chrome/googlezip/cors/')
# Navigate to a different page to verify that later requests are not
# blocked.
test_driver.LoadURL('http://check.googlezip.net/test.html')
cors_requests = 0
same_origin_requests = 0
for response in test_driver.GetHTTPResponses():
# The origin header implies that |response| is a CORS request.
if ('origin' not in response.request_headers):
self.assertHasChromeProxyViaHeader(response)
same_origin_requests = same_origin_requests + 1
else:
self.assertNotHasChromeProxyViaHeader(response)
cors_requests = cors_requests + 1
# Verify that both CORS and same origin requests were seen.
self.assertNotEqual(0, same_origin_requests)
self.assertNotEqual(0, cors_requests)
# Verify that when an origin times out using Data Saver, the request is
# fetched directly and data saver is bypassed only for one request.
def testOriginTimeoutBlockOnce(self):
with TestDriver() as test_driver:
test_driver.AddChromeArg('--enable-spdy-proxy-auth')
# Load URL that times out when the proxy server tries to access it.
test_driver.LoadURL('http://chromeproxy-test.appspot.com/blackhole')
responses = test_driver.GetHTTPResponses()
self.assertNotEqual(0, len(responses))
for response in responses:
self.assertNotHasChromeProxyViaHeader(response)
# Load HTTP page and check that Data Saver is used.
test_driver.LoadURL('http://check.googlezip.net/test.html')
responses = test_driver.GetHTTPResponses()
self.assertNotEqual(0, len(responses))
for response in responses:
self.assertHasChromeProxyViaHeader(response)
# Verify that when Chrome receives a 4xx response through a Data Reduction
# Proxy that doesn't set a proper via header, Chrome bypasses all proxies and
# retries the request over direct.
def testMissingViaHeader4xxBypass(self):
with TestDriver() as test_driver:
test_driver.AddChromeArg('--enable-spdy-proxy-auth')
# Set the primary Data Reduction Proxy to be the test server, which does
# not add any Via headers.
test_driver.AddChromeArg('--data-reduction-proxy-http-proxies='
'https://chromeproxy-test.appspot.com;'
'http://compress.googlezip.net')
# Load a page that will come back with a 4xx response code and without the
# proper via header. Chrome should bypass all proxies and retry the
# request.
test_driver.LoadURL(
'http://chromeproxy-test.appspot.com/default?respStatus=414')
responses = test_driver.GetHTTPResponses()
self.assertNotEqual(0, len(responses))
for response in responses:
self.assertNotHasChromeProxyViaHeader(response)
self.assertEqual(u'http/1.1', response.protocol)
# Check that the BlockTypePrimary histogram has a single entry in the
# MissingViaHeader4xx category (which is enum value 4), to make sure that
# the bypass was caused by the missing via header logic and not something
# else.
histogram = test_driver.GetHistogram(
"DataReductionProxy.BlockTypePrimary")
self.assertEqual(1, histogram['count'])
self.assertIn({'count': 1, 'high': 5, 'low': 4}, histogram['buckets'])
# Verify that the Data Reduction Proxy understands the "exp" directive.
def testExpDirectiveBypass(self):
# If it was attempted to run with another experiment, skip this test.
if common.ParseFlags().browser_args and ('--data-reduction-proxy-experiment'
in common.ParseFlags().browser_args):
self.skipTest('This test cannot be run with other experiments.')
with TestDriver() as test_driver:
test_driver.AddChromeArg('--enable-spdy-proxy-auth')
test_driver.AddChromeArg('--data-reduction-proxy-experiment=test')
# Verify that loading a page other than the specific exp directive test
# page loads through the proxy without being bypassed.
test_driver.LoadURL('http://check.googlezip.net/test.html')
responses = test_driver.GetHTTPResponses()
self.assertNotEqual(0, len(responses))
for response in responses:
self.assertHasChromeProxyViaHeader(response)
# Verify that loading the exp directive test page with "exp=test" triggers
# a bypass.
test_driver.LoadURL('http://check.googlezip.net/exp/')
responses = test_driver.GetHTTPResponses()
self.assertNotEqual(0, len(responses))
for response in responses:
self.assertNotHasChromeProxyViaHeader(response)
# Verify that loading the same test page without setting "exp=test" loads
# through the proxy without being bypassed.
with TestDriver() as test_driver:
test_driver.AddChromeArg('--enable-spdy-proxy-auth')
test_driver.LoadURL('http://check.googlezip.net/exp/')
responses = test_driver.GetHTTPResponses()
self.assertNotEqual(0, len(responses))
for response in responses:
self.assertHasChromeProxyViaHeader(response)
if __name__ == '__main__':
IntegrationTest.RunAllTests()