#!/usr/bin/env python # Copyright (c) 2012 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. """Generator script for proxy tests. See AndroidProxySelectorTest.java and net/proxy_resolution/proxy_config_service_android_unittest.cc To generate C++, run this script without arguments. To generate Java, run this script with -j argument. Note that this generator is not run as part of the build process because we are assuming that these test cases will not change often. """ import optparse test_cases = [ { "name": "NoProxy", "description" : "Test direct mapping when no proxy defined.", "properties" : { }, "mappings" : { "http://example.com/" : "DIRECT", "ftp://example.com/" : "DIRECT", "https://example.com/" : "DIRECT", } }, { "name": "HttpProxyHostAndPort", "description" : "Test http.proxyHost and http.proxyPort works.", "properties" : { "http.proxyHost" : "httpproxy.com", "http.proxyPort" : "8080", }, "mappings" : { "http://example.com/" : "PROXY httpproxy.com:8080", "ftp://example.com/" : "DIRECT", "https://example.com/" : "DIRECT", } }, { "name": "HttpProxyHostOnly", "description" : "We should get the default port (80) for proxied hosts.", "properties" : { "http.proxyHost" : "httpproxy.com", }, "mappings" : { "http://example.com/" : "PROXY httpproxy.com:80", "ftp://example.com/" : "DIRECT", "https://example.com/" : "DIRECT", } }, { "name": "HttpProxyPortOnly", "description" : "http.proxyPort only should not result in any hosts being proxied.", "properties" : { "http.proxyPort" : "8080", }, "mappings" : { "http://example.com/" : "DIRECT", "ftp://example.com/" : "DIRECT", "https://example.com/" : "DIRECT" } }, { "name": "HttpNonProxyHosts1", "description" : "Test that HTTP non proxy hosts are mapped correctly", "properties" : { "http.nonProxyHosts" : "slashdot.org", "http.proxyHost" : "httpproxy.com", "http.proxyPort" : "8080", }, "mappings" : { "http://example.com/" : "PROXY httpproxy.com:8080", "http://slashdot.org/" : "DIRECT", } }, { "name": "HttpNonProxyHosts2", "description" : "Test that | pattern works.", "properties" : { "http.nonProxyHosts" : "slashdot.org|freecode.net", "http.proxyHost" : "httpproxy.com", "http.proxyPort" : "8080", }, "mappings" : { "http://example.com/" : "PROXY httpproxy.com:8080", "http://slashdot.org/" : "DIRECT", "http://freecode.net/" : "DIRECT", } }, { "name": "HttpNonProxyHosts3", "description" : "Test that * pattern works.", "properties" : { "http.nonProxyHosts" : "*example.com", "http.proxyHost" : "httpproxy.com", "http.proxyPort" : "8080", }, "mappings" : { "http://example.com/" : "DIRECT", "http://www.example.com/" : "DIRECT", "http://slashdot.org/" : "PROXY httpproxy.com:8080", } }, { "name": "FtpNonProxyHosts", "description" : "Test that FTP non proxy hosts are mapped correctly", "properties" : { "ftp.nonProxyHosts" : "slashdot.org", "ftp.proxyHost" : "httpproxy.com", "ftp.proxyPort" : "8080", }, "mappings" : { "http://example.com/" : "DIRECT", "ftp://example.com/" : "PROXY httpproxy.com:8080", } }, { "name": "FtpProxyHostAndPort", "description" : "Test ftp.proxyHost and ftp.proxyPort works.", "properties" : { "ftp.proxyHost" : "httpproxy.com", "ftp.proxyPort" : "8080", }, "mappings" : { "ftp://example.com/" : "PROXY httpproxy.com:8080", "http://example.com/" : "DIRECT", "https://example.com/" : "DIRECT", } }, { "name": "FtpProxyHostOnly", "description" : "Test ftp.proxyHost and default port.", "properties" : { "ftp.proxyHost" : "httpproxy.com", }, "mappings" : { "ftp://example.com/" : "PROXY httpproxy.com:80", "http://example.com/" : "DIRECT", "https://example.com/" : "DIRECT", } }, { "name": "HttpsProxyHostAndPort", "description" : "Test https.proxyHost and https.proxyPort works.", "properties" : { "https.proxyHost" : "httpproxy.com", "https.proxyPort" : "8080", }, "mappings" : { "https://example.com/" : "PROXY httpproxy.com:8080", "http://example.com/" : "DIRECT", "ftp://example.com/" : "DIRECT", } }, { "name": "HttpsProxyHostOnly", "description" : "Test https.proxyHost and default port.", # Chromium differs from the Android platform by connecting to port 80 for # HTTPS connections by default, hence cpp-only. "cpp-only" : "", "properties" : { "https.proxyHost" : "httpproxy.com", }, "mappings" : { "https://example.com/" : "PROXY httpproxy.com:80", "http://example.com/" : "DIRECT", "ftp://example.com/" : "DIRECT", } }, { "name": "HttpProxyHostIPv6", "description" : "Test IPv6 https.proxyHost and default port.", "cpp-only" : "", "properties" : { "http.proxyHost" : "a:b:c::d:1", }, "mappings" : { "http://example.com/" : "PROXY [a:b:c::d:1]:80", "ftp://example.com/" : "DIRECT", } }, { "name": "HttpProxyHostAndPortIPv6", "description" : "Test IPv6 http.proxyHost and http.proxyPort works.", "cpp-only" : "", "properties" : { "http.proxyHost" : "a:b:c::d:1", "http.proxyPort" : "8080", }, "mappings" : { "http://example.com/" : "PROXY [a:b:c::d:1]:8080", "ftp://example.com/" : "DIRECT", } }, { "name": "HttpProxyHostAndInvalidPort", "description" : "Test invalid http.proxyPort does not crash.", "cpp-only" : "", "properties" : { "http.proxyHost" : "a:b:c::d:1", "http.proxyPort" : "65536", }, "mappings" : { "http://example.com/" : "DIRECT", "ftp://example.com/" : "DIRECT", } }, { "name": "DefaultProxyExplictPort", "description" : "Default http proxy is used if a scheme-specific one is not found.", "properties" : { "proxyHost" : "defaultproxy.com", "proxyPort" : "8080", "ftp.proxyHost" : "httpproxy.com", "ftp.proxyPort" : "8080", }, "mappings" : { "http://example.com/" : "PROXY defaultproxy.com:8080", "https://example.com/" : "PROXY defaultproxy.com:8080", "ftp://example.com/" : "PROXY httpproxy.com:8080", } }, { "name": "DefaultProxyDefaultPort", "description" : "Check that the default proxy port is as expected.", # Chromium differs from the Android platform by connecting to port 80 for # HTTPS connections by default, hence cpp-only. "cpp-only" : "", "properties" : { "proxyHost" : "defaultproxy.com", }, "mappings" : { "http://example.com/" : "PROXY defaultproxy.com:80", "https://example.com/" : "PROXY defaultproxy.com:80", } }, { "name": "FallbackToSocks", "description" : "SOCKS proxy is used if scheme-specific one is not found.", "properties" : { "http.proxyHost" : "defaultproxy.com", "socksProxyHost" : "socksproxy.com" }, "mappings" : { "http://example.com/" : "PROXY defaultproxy.com:80", "https://example.com/" : "SOCKS5 socksproxy.com:1080", "ftp://example.com" : "SOCKS5 socksproxy.com:1080", } }, { "name": "SocksExplicitPort", "description" : "SOCKS proxy port is used if specified", "properties" : { "socksProxyHost" : "socksproxy.com", "socksProxyPort" : "9000", }, "mappings" : { "http://example.com/" : "SOCKS5 socksproxy.com:9000", } }, { "name": "HttpProxySupercedesSocks", "description" : "SOCKS proxy is ignored if default HTTP proxy defined.", "properties" : { "proxyHost" : "defaultproxy.com", "socksProxyHost" : "socksproxy.com", "socksProxyPort" : "9000", }, "mappings" : { "http://example.com/" : "PROXY defaultproxy.com:80", } }, ] class GenerateCPlusPlus: """Generate C++ test cases""" def Generate(self): for test_case in test_cases: print ("TEST_F(ProxyConfigServiceAndroidTest, %s) {" % test_case["name"]) if "description" in test_case: self._GenerateDescription(test_case["description"]); self._GenerateConfiguration(test_case["properties"]) self._GenerateMappings(test_case["mappings"]) print "}" print "" def _GenerateDescription(self, description): print " // %s" % description def _GenerateConfiguration(self, properties): for key in sorted(properties.iterkeys()): print " AddProperty(\"%s\", \"%s\");" % (key, properties[key]) print " ProxySettingsChanged();" def _GenerateMappings(self, mappings): for url in sorted(mappings.iterkeys()): print " TestMapping(\"%s\", \"%s\");" % (url, mappings[url]) class GenerateJava: """Generate Java test cases""" def Generate(self): for test_case in test_cases: if test_case.has_key("cpp-only"): continue if "description" in test_case: self._GenerateDescription(test_case["description"]); print " @SmallTest" print " @Feature({\"AndroidWebView\"})" print " public void test%s() throws Exception {" % test_case["name"] self._GenerateConfiguration(test_case["properties"]) self._GenerateMappings(test_case["mappings"]) print " }" print "" def _GenerateDescription(self, description): print " /**" print " * %s" % description print " *" print " * @throws Exception" print " */" def _GenerateConfiguration(self, properties): for key in sorted(properties.iterkeys()): print " System.setProperty(\"%s\", \"%s\");" % ( key, properties[key]) def _GenerateMappings(self, mappings): for url in sorted(mappings.iterkeys()): mapping = mappings[url] if 'HTTPS' in mapping: mapping = mapping.replace('HTTPS', 'PROXY') print " checkMapping(\"%s\", \"%s\");" % (url, mapping) def main(): parser = optparse.OptionParser() parser.add_option("-j", "--java", action="store_true", dest="java"); (options, args) = parser.parse_args(); if options.java: generator = GenerateJava() else: generator = GenerateCPlusPlus() generator.Generate() if __name__ == '__main__': main()