1/*
2 * Copyright (C) 2010 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package libcore.java.net;
18
19import static java.net.InetSocketAddress.createUnresolved;
20import java.net.Proxy;
21import java.net.ProxySelector;
22import java.net.URI;
23import java.net.URISyntaxException;
24import java.util.Arrays;
25import junit.framework.TestCase;
26
27public final class ProxySelectorTest extends TestCase {
28
29    private ProxySelector proxySelector;
30
31    private URI httpUri;
32    private URI ftpUri;
33    private URI httpsUri;
34    private URI socketUri;
35    private URI otherUri;
36
37    protected void setUp() throws Exception {
38        super.setUp();
39        proxySelector = ProxySelector.getDefault();
40        httpUri = new URI("http://android.com");
41        ftpUri = new URI("ftp://android.com");
42        httpsUri = new URI("https://android.com");
43        socketUri = new URI("socket://android.com");
44        otherUri = new URI("other://android.com");
45    }
46
47    @Override protected void tearDown() throws Exception {
48        System.clearProperty("ftp.proxyHost");
49        System.clearProperty("ftp.proxyPort");
50        System.clearProperty("ftp.nonProxyHosts");
51        System.clearProperty("http.proxyHost");
52        System.clearProperty("http.proxyPort");
53        System.clearProperty("http.nonProxyHosts");
54        System.clearProperty("https.proxyHost");
55        System.clearProperty("https.proxyPort");
56        System.clearProperty("https.nonProxyHosts");
57        System.clearProperty("other.proxyHost");
58        System.clearProperty("other.proxyPort");
59        System.clearProperty("socket.proxyHost");
60        System.clearProperty("socket.proxyPort");
61        System.clearProperty("proxyHost");
62        System.clearProperty("proxyPort");
63    }
64
65    public void testNoProxySystemProperty() throws URISyntaxException {
66        assertEquals(Arrays.asList(Proxy.NO_PROXY), proxySelector.select(ftpUri));
67        assertEquals(Arrays.asList(Proxy.NO_PROXY), proxySelector.select(httpUri));
68        assertEquals(Arrays.asList(Proxy.NO_PROXY), proxySelector.select(httpsUri));
69        assertEquals(Arrays.asList(Proxy.NO_PROXY), proxySelector.select(socketUri));
70        assertEquals(Arrays.asList(Proxy.NO_PROXY), proxySelector.select(otherUri));
71    }
72
73    public void testProxyHostOnly() throws URISyntaxException {
74        System.setProperty("ftp.proxyHost", "a");
75        System.setProperty("http.proxyHost", "b");
76        System.setProperty("https.proxyHost", "c");
77        System.setProperty("other.proxyHost", "d");
78        System.setProperty("socket.proxyHost", "d");
79        assertEquals(Arrays.asList(new Proxy(Proxy.Type.HTTP, createUnresolved("a", 80))),
80                proxySelector.select(ftpUri));
81        assertEquals(Arrays.asList(new Proxy(Proxy.Type.HTTP, createUnresolved("b", 80))),
82                proxySelector.select(httpUri));
83        assertEquals(Arrays.asList(new Proxy(Proxy.Type.HTTP, createUnresolved("c", 443))),
84                proxySelector.select(httpsUri));
85        assertEquals(Arrays.asList(Proxy.NO_PROXY), proxySelector.select(otherUri));
86        assertEquals(Arrays.asList(Proxy.NO_PROXY), proxySelector.select(socketUri));
87    }
88
89    public void testProxyHostPort() throws URISyntaxException {
90        System.setProperty("ftp.proxyHost", "a");
91        System.setProperty("ftp.proxyPort", "1001");
92        System.setProperty("http.proxyHost", "b");
93        System.setProperty("http.proxyPort", "1002");
94        System.setProperty("https.proxyHost", "c");
95        System.setProperty("https.proxyPort", "1003");
96        System.setProperty("other.proxyHost", "d");
97        System.setProperty("other.proxyPort", "1004");
98        System.setProperty("socket.proxyHost", "e");
99        System.setProperty("socket.proxyPort", "1005");
100        assertEquals(Arrays.asList(new Proxy(Proxy.Type.HTTP, createUnresolved("a", 1001))),
101                proxySelector.select(ftpUri));
102        assertEquals(Arrays.asList(new Proxy(Proxy.Type.HTTP, createUnresolved("b", 1002))),
103                proxySelector.select(httpUri));
104        assertEquals(Arrays.asList(new Proxy(Proxy.Type.HTTP, createUnresolved("c", 1003))),
105                proxySelector.select(httpsUri));
106        assertEquals(Arrays.asList(Proxy.NO_PROXY), proxySelector.select(socketUri));
107        assertEquals(Arrays.asList(Proxy.NO_PROXY), proxySelector.select(otherUri));
108    }
109
110    public void testProxyPortOnly() throws URISyntaxException {
111        System.setProperty("ftp.proxyPort", "1001");
112        System.setProperty("http.proxyPort", "1002");
113        System.setProperty("https.proxyPort", "1003");
114        System.setProperty("other.proxyPort", "1004");
115        System.setProperty("socket.proxyPort", "1005");
116        assertEquals(Arrays.asList(Proxy.NO_PROXY), proxySelector.select(ftpUri));
117        assertEquals(Arrays.asList(Proxy.NO_PROXY), proxySelector.select(httpUri));
118        assertEquals(Arrays.asList(Proxy.NO_PROXY), proxySelector.select(httpsUri));
119        assertEquals(Arrays.asList(Proxy.NO_PROXY), proxySelector.select(socketUri));
120        assertEquals(Arrays.asList(Proxy.NO_PROXY), proxySelector.select(otherUri));
121    }
122
123    public void testHttpsDoesNotUseHttpProperties() throws URISyntaxException {
124        System.setProperty("http.proxyHost", "a");
125        System.setProperty("http.proxyPort", "1001");
126        assertEquals(Arrays.asList(Proxy.NO_PROXY), proxySelector.select(httpsUri));
127    }
128
129    public void testProxyHost() throws URISyntaxException {
130        System.setProperty("proxyHost", "a");
131        assertEquals(Arrays.asList(new Proxy(Proxy.Type.HTTP, createUnresolved("a", 80))),
132                proxySelector.select(ftpUri));
133        assertEquals(Arrays.asList(new Proxy(Proxy.Type.HTTP, createUnresolved("a", 80))),
134                proxySelector.select(httpUri));
135        assertEquals(Arrays.asList(new Proxy(Proxy.Type.HTTP, createUnresolved("a", 443))),
136                proxySelector.select(httpsUri));
137        assertEquals(Arrays.asList(Proxy.NO_PROXY), proxySelector.select(socketUri));
138        assertEquals(Arrays.asList(Proxy.NO_PROXY), proxySelector.select(otherUri));
139    }
140
141    public void testHttpProxyHostPreferredOverProxyHost() throws URISyntaxException {
142        System.setProperty("http.proxyHost", "a");
143        System.setProperty("proxyHost", "b");
144        assertEquals(Arrays.asList(new Proxy(Proxy.Type.HTTP, createUnresolved("a", 80))),
145                proxySelector.select(httpUri));
146    }
147
148    public void testSocksProxyHost() throws URISyntaxException {
149        System.setProperty("socksProxyHost", "a");
150        assertEquals(Arrays.asList(new Proxy(Proxy.Type.SOCKS, createUnresolved("a", 1080))),
151                proxySelector.select(ftpUri));
152        assertEquals(Arrays.asList(new Proxy(Proxy.Type.SOCKS, createUnresolved("a", 1080))),
153                proxySelector.select(httpUri));
154        assertEquals(Arrays.asList(new Proxy(Proxy.Type.SOCKS, createUnresolved("a", 1080))),
155                proxySelector.select(httpsUri));
156        assertEquals(Arrays.asList(new Proxy(Proxy.Type.SOCKS, createUnresolved("a", 1080))),
157                proxySelector.select(socketUri));
158        assertEquals(Arrays.asList(Proxy.NO_PROXY), proxySelector.select(otherUri));
159    }
160
161    public void testSocksProxyHostAndPort() throws URISyntaxException {
162        System.setProperty("socksProxyHost", "a");
163        System.setProperty("socksProxyPort", "1001");
164        assertEquals(Arrays.asList(new Proxy(Proxy.Type.SOCKS, createUnresolved("a", 1001))),
165                proxySelector.select(ftpUri));
166        assertEquals(Arrays.asList(new Proxy(Proxy.Type.SOCKS, createUnresolved("a", 1001))),
167                proxySelector.select(httpUri));
168        assertEquals(Arrays.asList(new Proxy(Proxy.Type.SOCKS, createUnresolved("a", 1001))),
169                proxySelector.select(httpsUri));
170        assertEquals(Arrays.asList(new Proxy(Proxy.Type.SOCKS, createUnresolved("a", 1001))),
171                proxySelector.select(socketUri));
172        assertEquals(Arrays.asList(Proxy.NO_PROXY), proxySelector.select(otherUri));
173    }
174
175    public void testNonProxyHostsFtp() throws URISyntaxException {
176        System.setProperty("ftp.nonProxyHosts", "*.com");
177        System.setProperty("ftp.proxyHost", "a");
178        assertEquals(Arrays.asList(new Proxy(Proxy.Type.HTTP, createUnresolved("a", 80))),
179                proxySelector.select(new URI("ftp://foo.net")));
180        assertEquals(Arrays.asList(Proxy.NO_PROXY),
181                proxySelector.select(new URI("ftp://foo.com")));
182    }
183
184    public void testNonProxyHostsHttp() throws URISyntaxException {
185        System.setProperty("http.nonProxyHosts", "*.com");
186        System.setProperty("http.proxyHost", "a");
187        assertEquals(Arrays.asList(new Proxy(Proxy.Type.HTTP, createUnresolved("a", 80))),
188                proxySelector.select(new URI("http://foo.net")));
189        assertEquals(Arrays.asList(Proxy.NO_PROXY),
190                proxySelector.select(new URI("http://foo.com")));
191    }
192
193    public void testNonProxyHostsHttps() throws URISyntaxException {
194        System.setProperty("https.nonProxyHosts", "*.com");
195        System.setProperty("https.proxyHost", "a");
196        assertEquals(Arrays.asList(new Proxy(Proxy.Type.HTTP, createUnresolved("a", 443))),
197                proxySelector.select(new URI("https://foo.net")));
198        assertEquals(Arrays.asList(Proxy.NO_PROXY),
199                proxySelector.select(new URI("https://foo.com")));
200    }
201
202    public void testSchemeCaseSensitive() throws URISyntaxException {
203        System.setProperty("http.proxyHost", "a");
204        assertEquals(Arrays.asList(new Proxy(Proxy.Type.HTTP, createUnresolved("a", 80))),
205                proxySelector.select(new URI("HTTP://foo.net")));
206    }
207}
208