blob: 3d6e8ec74791e0f459a32dfe39fb3283828a90ca [file] [log] [blame]
#!/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/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()