# 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 Fallback(IntegrationTest): # Ensure that when a carrier blocks using the secure proxy, requests fallback # to the HTTP proxy server. def testSecureProxyProbeFallback(self): with TestDriver() as test_driver: test_driver.AddChromeArg('--enable-spdy-proxy-auth') # Set the secure proxy check URL to the google.com favicon, which will be # interpreted as a secure proxy check failure since the response body is # not "OK". The google.com favicon is used because it will load reliably # fast, and there have been problems with chromeproxy-test.appspot.com # being slow and causing tests to flake. test_driver.AddChromeArg( '--data-reduction-proxy-secure-proxy-check-url=' 'http://www.google.com/favicon.ico') # Start chrome to begin the secure proxy check test_driver.LoadURL('http://www.google.com/favicon.ico') self.assertTrue( test_driver.SleepUntilHistogramHasEntry("DataReductionProxy.ProbeURL")) 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) self.assertEqual(u'http/1.1', response.protocol) # Verify that when Chrome receives a non-4xx response through a Data Reduction # Proxy that doesn't set a proper via header, Chrome falls back to the next # available proxy. def testMissingViaHeaderNon4xxFallback(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. The fallback Data Reduction Proxy is set to the # canonical Data Reduction Proxy target. test_driver.AddChromeArg('--data-reduction-proxy-http-proxies=' 'https://chromeproxy-test.appspot.com;' 'http://compress.googlezip.net') # Load a page that should fall back off of the test server proxy, and onto # the canonical proxy that will set the correct Via header. test_driver.LoadURL('http://chromeproxy-test.appspot.com/default') responses = test_driver.GetHTTPResponses() self.assertNotEqual(0, len(responses)) for response in responses: self.assertHasChromeProxyViaHeader(response) self.assertEqual(u'http/1.1', response.protocol) # Check that the BypassTypePrimary histogram has a single entry in the # MissingViaHeaderOther category (which is enum value 5), to make sure # that the bypass was caused by the missing via header logic and not # something else. histogram = test_driver.GetHistogram( "DataReductionProxy.BypassTypePrimary") self.assertEqual(1, histogram['count']) self.assertIn({'count': 1, 'high': 6, 'low': 5}, histogram['buckets']) # DataSaver uses a https proxy by default, if that fails it will fall back to # a http proxy; and if that fails, it will fall back to a direct connection def testHTTPToDirectFallback(self): with TestDriver() as test_driver: test_driver.AddChromeArg('--enable-spdy-proxy-auth') # set the primary (https) proxy to a bad one. # That will force DataSaver to the http proxy for normal page requests. test_driver.AddChromeArg('--spdy-proxy-auth-origin=' 'https://nonexistent.googlezip.net') test_driver.AddChromeArg('--data-reduction-proxy-http-proxies=' 'http://nonexistent.googlezip.net;' 'http://compress.googlezip.net') test_driver.LoadURL('http://check.googlezip.net/fallback/') responses = test_driver.GetHTTPResponses() self.assertNotEqual(0, len(responses)) for response in responses: self.assertEqual(80, response.port) test_driver.LoadURL('http://check.googlezip.net/block/') responses = test_driver.GetHTTPResponses() self.assertNotEqual(0, len(responses)) for response in responses: self.assertNotHasChromeProxyViaHeader(response) if __name__ == '__main__': IntegrationTest.RunAllTests()