| // Copyright 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. |
| |
| /** |
| * Test suite for Android's default ProxySelector implementation. The purpose of these tests |
| * is to check that the behaviour of the ProxySelector implementation matches what we have |
| * implemented in net/proxy_resolution/proxy_config_service_android.cc. |
| * |
| * IMPORTANT: These test cases are generated from net/android/tools/proxy_test_cases.py, so if any |
| * of these tests fail, please be sure to edit that file and regenerate the test cases here and also |
| * in net/proxy_resolution/proxy_config_service_android_unittests.cc if required. |
| */ |
| |
| package org.chromium.net; |
| |
| import android.os.Build; |
| import android.support.test.filters.SmallTest; |
| |
| import org.junit.Assert; |
| import org.junit.Before; |
| import org.junit.Test; |
| import org.junit.runner.RunWith; |
| |
| import org.chromium.base.test.BaseJUnit4ClassRunner; |
| import org.chromium.base.test.util.Feature; |
| |
| import java.net.Proxy; |
| import java.net.ProxySelector; |
| import java.net.URI; |
| import java.net.URISyntaxException; |
| import java.util.List; |
| import java.util.Properties; |
| |
| @RunWith(BaseJUnit4ClassRunner.class) |
| public class AndroidProxySelectorTest { |
| Properties mProperties; |
| |
| public AndroidProxySelectorTest() { |
| // Start with a clean slate in case there is a system proxy configured. |
| mProperties = new Properties(); |
| } |
| |
| @Before |
| public void setUp() { |
| System.setProperties(mProperties); |
| } |
| |
| static String toString(Proxy proxy) { |
| if (proxy.equals(Proxy.NO_PROXY)) return "DIRECT"; |
| // java.net.Proxy only knows about http and socks proxies. |
| Proxy.Type type = proxy.type(); |
| switch (type) { |
| case HTTP: |
| return "PROXY " + proxy.address().toString(); |
| case SOCKS: |
| return "SOCKS5 " + proxy.address().toString(); |
| case DIRECT: |
| return "DIRECT"; |
| default: |
| // If a new proxy type is supported in future, add a case to match it. |
| Assert.fail("Unknown proxy type" + type); |
| return "unknown://"; |
| } |
| } |
| |
| static String toString(List<Proxy> proxies) { |
| StringBuilder builder = new StringBuilder(); |
| for (Proxy proxy : proxies) { |
| if (builder.length() > 0) builder.append(';'); |
| builder.append(toString(proxy)); |
| } |
| return builder.toString(); |
| } |
| |
| static void checkMapping(String url, String expected) throws URISyntaxException { |
| URI uri = new URI(url); |
| List<Proxy> proxies = ProxySelector.getDefault().select(uri); |
| Assert.assertEquals("Mapping", expected, toString(proxies)); |
| } |
| |
| /** |
| * Test direct mapping when no proxy defined. |
| * |
| * @throws Exception |
| */ |
| @Test |
| @SmallTest |
| @Feature({"AndroidWebView"}) |
| public void testNoProxy() throws Exception { |
| checkMapping("ftp://example.com/", "DIRECT"); |
| checkMapping("http://example.com/", "DIRECT"); |
| checkMapping("https://example.com/", "DIRECT"); |
| } |
| |
| /** |
| * Test http.proxyHost and http.proxyPort works. |
| * |
| * @throws Exception |
| */ |
| @Test |
| @SmallTest |
| @Feature({"AndroidWebView"}) |
| public void testHttpProxyHostAndPort() throws Exception { |
| System.setProperty("http.proxyHost", "httpproxy.com"); |
| System.setProperty("http.proxyPort", "8080"); |
| checkMapping("ftp://example.com/", "DIRECT"); |
| checkMapping("http://example.com/", "PROXY httpproxy.com:8080"); |
| checkMapping("https://example.com/", "DIRECT"); |
| } |
| |
| /** |
| * We should get the default port (80) for proxied hosts. |
| * |
| * @throws Exception |
| */ |
| @Test |
| @SmallTest |
| @Feature({"AndroidWebView"}) |
| public void testHttpProxyHostOnly() throws Exception { |
| System.setProperty("http.proxyHost", "httpproxy.com"); |
| checkMapping("ftp://example.com/", "DIRECT"); |
| checkMapping("http://example.com/", "PROXY httpproxy.com:80"); |
| checkMapping("https://example.com/", "DIRECT"); |
| } |
| |
| /** |
| * http.proxyPort only should not result in any hosts being proxied. |
| * |
| * @throws Exception |
| */ |
| @Test |
| @SmallTest |
| @Feature({"AndroidWebView"}) |
| public void testHttpProxyPortOnly() throws Exception { |
| System.setProperty("http.proxyPort", "8080"); |
| checkMapping("ftp://example.com/", "DIRECT"); |
| checkMapping("http://example.com/", "DIRECT"); |
| checkMapping("https://example.com/", "DIRECT"); |
| } |
| |
| /** |
| * Test that HTTP non proxy hosts are mapped correctly |
| * |
| * @throws Exception |
| */ |
| @Test |
| @SmallTest |
| @Feature({"AndroidWebView"}) |
| public void testHttpNonProxyHosts1() throws Exception { |
| System.setProperty("http.nonProxyHosts", "slashdot.org"); |
| System.setProperty("http.proxyHost", "httpproxy.com"); |
| System.setProperty("http.proxyPort", "8080"); |
| checkMapping("http://example.com/", "PROXY httpproxy.com:8080"); |
| checkMapping("http://slashdot.org/", "DIRECT"); |
| } |
| |
| /** |
| * Test that | pattern works. |
| * |
| * @throws Exception |
| */ |
| @Test |
| @SmallTest |
| @Feature({"AndroidWebView"}) |
| public void testHttpNonProxyHosts2() throws Exception { |
| System.setProperty("http.nonProxyHosts", "slashdot.org|freecode.net"); |
| System.setProperty("http.proxyHost", "httpproxy.com"); |
| System.setProperty("http.proxyPort", "8080"); |
| checkMapping("http://example.com/", "PROXY httpproxy.com:8080"); |
| checkMapping("http://freecode.net/", "DIRECT"); |
| checkMapping("http://slashdot.org/", "DIRECT"); |
| } |
| |
| /** |
| * Test that * pattern works. |
| * |
| * @throws Exception |
| */ |
| @Test |
| @SmallTest |
| @Feature({"AndroidWebView"}) |
| public void testHttpNonProxyHosts3() throws Exception { |
| System.setProperty("http.nonProxyHosts", "*example.com"); |
| System.setProperty("http.proxyHost", "httpproxy.com"); |
| System.setProperty("http.proxyPort", "8080"); |
| // TODO(jbudorick): Find an appropriate upper bound for this. crbug.com/726360 |
| if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { |
| checkMapping("http://example.com/", "DIRECT"); |
| } |
| checkMapping("http://slashdot.org/", "PROXY httpproxy.com:8080"); |
| checkMapping("http://www.example.com/", "DIRECT"); |
| } |
| |
| /** |
| * Test that FTP non proxy hosts are mapped correctly |
| * |
| * @throws Exception |
| */ |
| @Test |
| @SmallTest |
| @Feature({"AndroidWebView"}) |
| public void testFtpNonProxyHosts() throws Exception { |
| System.setProperty("ftp.nonProxyHosts", "slashdot.org"); |
| System.setProperty("ftp.proxyHost", "httpproxy.com"); |
| System.setProperty("ftp.proxyPort", "8080"); |
| checkMapping("ftp://example.com/", "PROXY httpproxy.com:8080"); |
| checkMapping("http://example.com/", "DIRECT"); |
| } |
| |
| /** |
| * Test ftp.proxyHost and ftp.proxyPort works. |
| * |
| * @throws Exception |
| */ |
| @Test |
| @SmallTest |
| @Feature({"AndroidWebView"}) |
| public void testFtpProxyHostAndPort() throws Exception { |
| System.setProperty("ftp.proxyHost", "httpproxy.com"); |
| System.setProperty("ftp.proxyPort", "8080"); |
| checkMapping("ftp://example.com/", "PROXY httpproxy.com:8080"); |
| checkMapping("http://example.com/", "DIRECT"); |
| checkMapping("https://example.com/", "DIRECT"); |
| } |
| |
| /** |
| * Test ftp.proxyHost and default port. |
| * |
| * @throws Exception |
| */ |
| @Test |
| @SmallTest |
| @Feature({"AndroidWebView"}) |
| public void testFtpProxyHostOnly() throws Exception { |
| System.setProperty("ftp.proxyHost", "httpproxy.com"); |
| checkMapping("ftp://example.com/", "PROXY httpproxy.com:80"); |
| checkMapping("http://example.com/", "DIRECT"); |
| checkMapping("https://example.com/", "DIRECT"); |
| } |
| |
| /** |
| * Test https.proxyHost and https.proxyPort works. |
| * |
| * @throws Exception |
| */ |
| @Test |
| @SmallTest |
| @Feature({"AndroidWebView"}) |
| public void testHttpsProxyHostAndPort() throws Exception { |
| System.setProperty("https.proxyHost", "httpproxy.com"); |
| System.setProperty("https.proxyPort", "8080"); |
| checkMapping("ftp://example.com/", "DIRECT"); |
| checkMapping("http://example.com/", "DIRECT"); |
| checkMapping("https://example.com/", "PROXY httpproxy.com:8080"); |
| } |
| |
| /** |
| * Default http proxy is used if a scheme-specific one is not found. |
| * |
| * @throws Exception |
| */ |
| @Test |
| @SmallTest |
| @Feature({"AndroidWebView"}) |
| public void testDefaultProxyExplictPort() throws Exception { |
| System.setProperty("ftp.proxyHost", "httpproxy.com"); |
| System.setProperty("ftp.proxyPort", "8080"); |
| System.setProperty("proxyHost", "defaultproxy.com"); |
| System.setProperty("proxyPort", "8080"); |
| checkMapping("ftp://example.com/", "PROXY httpproxy.com:8080"); |
| checkMapping("http://example.com/", "PROXY defaultproxy.com:8080"); |
| checkMapping("https://example.com/", "PROXY defaultproxy.com:8080"); |
| } |
| |
| /** |
| * SOCKS proxy is used if scheme-specific one is not found. |
| * |
| * @throws Exception |
| */ |
| @Test |
| @SmallTest |
| @Feature({"AndroidWebView"}) |
| public void testFallbackToSocks() throws Exception { |
| System.setProperty("http.proxyHost", "defaultproxy.com"); |
| System.setProperty("socksProxyHost", "socksproxy.com"); |
| checkMapping("ftp://example.com", "SOCKS5 socksproxy.com:1080"); |
| checkMapping("http://example.com/", "PROXY defaultproxy.com:80"); |
| checkMapping("https://example.com/", "SOCKS5 socksproxy.com:1080"); |
| } |
| |
| /** |
| * SOCKS proxy port is used if specified |
| * |
| * @throws Exception |
| */ |
| @Test |
| @SmallTest |
| @Feature({"AndroidWebView"}) |
| public void testSocksExplicitPort() throws Exception { |
| System.setProperty("socksProxyHost", "socksproxy.com"); |
| System.setProperty("socksProxyPort", "9000"); |
| checkMapping("http://example.com/", "SOCKS5 socksproxy.com:9000"); |
| } |
| |
| /** |
| * SOCKS proxy is ignored if default HTTP proxy defined. |
| * |
| * @throws Exception |
| */ |
| @Test |
| @SmallTest |
| @Feature({"AndroidWebView"}) |
| public void testHttpProxySupercedesSocks() throws Exception { |
| System.setProperty("proxyHost", "defaultproxy.com"); |
| System.setProperty("socksProxyHost", "socksproxy.com"); |
| System.setProperty("socksProxyPort", "9000"); |
| checkMapping("http://example.com/", "PROXY defaultproxy.com:80"); |
| } |
| } |
| |