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