1 package com.atlassian.httpclient.apache.httpcomponents.proxy;
2
3 import com.atlassian.httpclient.api.factory.Scheme;
4 import org.junit.Test;
5 import org.junit.runner.RunWith;
6 import org.junit.runners.Parameterized;
7
8 import java.net.InetSocketAddress;
9 import java.net.Proxy;
10 import java.net.URI;
11 import java.util.List;
12
13 import static com.atlassian.httpclient.api.factory.Scheme.HTTP;
14 import static com.atlassian.httpclient.api.factory.Scheme.HTTPS;
15 import static org.junit.Assert.assertEquals;
16 import static org.junit.Assert.assertTrue;
17
18 @RunWith(Parameterized.class)
19 public abstract class NoProxyHostsTestBase {
20
21 @Parameterized.Parameters(name = "{0}")
22 public static Object[][] data() {
23 return new Object[][] { { HTTP }, { HTTPS } };
24 }
25
26 @Parameterized.Parameter()
27 public Scheme scheme;
28
29 @Test
30 public void blankNonProxyHosts() {
31 setProxyDetails("localhost", 3128, "");
32
33 ProxyConfig config = newProxyConfig();
34
35 assertProxy(assertSingleProxy(config.toProxySelector().select(toUri(scheme, "://foo.bar:9887"))),
36 Proxy.Type.HTTP, "localhost", 3128);
37 }
38
39 @Test
40 public void mixedNonProxyHosts() {
41 setProxyDetails("localhost", 3128, "foo.*|bar|bing");
42
43 ProxyConfig config = newProxyConfig();
44
45 assertEquals(Proxy.NO_PROXY, assertSingleProxy(config.toProxySelector().select(toUri(scheme, "://foo.bar:9887"))));
46 assertEquals(Proxy.NO_PROXY, assertSingleProxy(config.toProxySelector().select(toUri(scheme, "://foo.baz:9887"))));
47 assertEquals(Proxy.NO_PROXY, assertSingleProxy(config.toProxySelector().select(toUri(scheme, "://foo.bing:9887"))));
48 assertEquals(Proxy.NO_PROXY, assertSingleProxy(config.toProxySelector().select(toUri(scheme, "://bing:9887"))));
49 assertProxy(assertSingleProxy(config.toProxySelector().select(toUri(scheme, "://bar2:9887"))),
50 Proxy.Type.HTTP, "localhost", 3128);
51 }
52
53 @Test
54 public void mixedNonProxyHostsWithMixedCase() {
55 setProxyDetails("localhost", 3128, "FOO.*|bar|BING");
56
57 ProxyConfig config = newProxyConfig();
58
59 assertEquals(Proxy.NO_PROXY, assertSingleProxy(config.toProxySelector().select(toUri(scheme, "://FOO.BAR:9887"))));
60 assertEquals(Proxy.NO_PROXY, assertSingleProxy(config.toProxySelector().select(toUri(scheme, "://fOo.bAz:9887"))));
61 assertEquals(Proxy.NO_PROXY, assertSingleProxy(config.toProxySelector().select(toUri(scheme, "://foo.bing:9887"))));
62 assertEquals(Proxy.NO_PROXY, assertSingleProxy(config.toProxySelector().select(toUri(scheme, "://bing:9887"))));
63 assertProxy(assertSingleProxy(config.toProxySelector().select(toUri(scheme, "://bar2:9887"))),
64 Proxy.Type.HTTP, "localhost", 3128);
65 }
66
67 @Test
68 public void multipleNonProxyHosts() {
69 setProxyDetails("localhost", 3128, "foo.bar|foo.baz");
70
71 ProxyConfig config = newProxyConfig();
72
73 assertEquals(Proxy.NO_PROXY, assertSingleProxy(config.toProxySelector().select(toUri(scheme, "://foo.bar:9887"))));
74 assertEquals(Proxy.NO_PROXY, assertSingleProxy(config.toProxySelector().select(toUri(scheme, "://foo.baz:9887"))));
75 assertProxy(assertSingleProxy(config.toProxySelector().select(toUri(scheme, "://foo.bing:9887"))),
76 Proxy.Type.HTTP, "localhost", 3128);
77 }
78
79 @Test
80 public void singleNonProxyHosts() {
81 setProxyDetails("localhost", 3128, "foo.bar");
82
83 ProxyConfig config = newProxyConfig();
84
85 assertEquals(Proxy.NO_PROXY, assertSingleProxy(config.toProxySelector().select(toUri(scheme, "://foo.bar:9887"))));
86 assertProxy(assertSingleProxy(config.toProxySelector().select(toUri(scheme, "://foo.baz:9887"))),
87 Proxy.Type.HTTP, "localhost", 3128);
88 }
89
90 @Test
91 public void wildcardNonProxyHosts() {
92 setProxyDetails("localhost", 3128, "foo.*|baz.*");
93
94 ProxyConfig config = newProxyConfig();
95
96 assertEquals(Proxy.NO_PROXY, assertSingleProxy(config.toProxySelector().select(toUri(scheme, "://foo.bar:9887"))));
97 assertEquals(Proxy.NO_PROXY, assertSingleProxy(config.toProxySelector().select(toUri(scheme, "://foo.baz:9887"))));
98 assertEquals(Proxy.NO_PROXY, assertSingleProxy(config.toProxySelector().select(toUri(scheme, "://foo.bing:9887"))));
99 assertEquals(Proxy.NO_PROXY, assertSingleProxy(config.toProxySelector().select(toUri(scheme, "://baz.bar.com:9887"))));
100 }
101
102 protected abstract ProxyConfig newProxyConfig();
103
104 protected abstract void setProxyDetails(String proxyHost, int proxyPort, String nonProxyHosts);
105
106 private void assertProxy(Proxy proxy, Proxy.Type proxyType, String proxyHost, int proxyPort) {
107 assertEquals(proxyType, proxy.type());
108 assertTrue(proxy.address() instanceof InetSocketAddress);
109 assertEquals(proxyHost, ((InetSocketAddress) proxy.address()).getHostName());
110 assertEquals(proxyPort, ((InetSocketAddress) proxy.address()).getPort());
111 }
112
113 private Proxy assertSingleProxy(List<Proxy> proxies) {
114 assertEquals(1, proxies.size());
115 return proxies.get(0);
116 }
117
118 private URI toUri(Scheme scheme, String urlSuffix) {
119 return URI.create(scheme.schemeName() + urlSuffix);
120 }
121 }