mirror of
https://github.com/klzgrad/naiveproxy.git
synced 2024-12-01 01:36:09 +03:00
359 lines
10 KiB
Python
359 lines
10 KiB
Python
|
#!/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()
|