| #!/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() |