1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 package org.apache.hc.client5.http.impl.routing;
29
30 import java.net.InetAddress;
31 import java.net.InetSocketAddress;
32 import java.net.Proxy;
33 import java.net.ProxySelector;
34 import java.net.URI;
35 import java.util.ArrayList;
36 import java.util.List;
37
38 import org.apache.hc.client5.http.HttpRoute;
39 import org.apache.hc.client5.http.SchemePortResolver;
40 import org.apache.hc.client5.http.protocol.HttpClientContext;
41 import org.apache.hc.core5.http.HttpHost;
42 import org.junit.jupiter.api.Assertions;
43 import org.junit.jupiter.api.BeforeEach;
44 import org.junit.jupiter.api.Test;
45 import org.mockito.ArgumentMatchers;
46 import org.mockito.Mockito;
47
48
49
50
51 @SuppressWarnings("boxing")
52 class TestSystemDefaultRoutePlanner {
53
54 private SchemePortResolver schemePortResolver;
55 private ProxySelector proxySelector;
56 private SystemDefaultRoutePlanner routePlanner;
57
58 @BeforeEach
59 void setup() {
60 schemePortResolver = Mockito.mock(SchemePortResolver.class);
61 proxySelector = Mockito.mock(ProxySelector.class);
62 routePlanner = new SystemDefaultRoutePlanner(schemePortResolver, proxySelector);
63 }
64
65 @Test
66 void testDirect() throws Exception {
67 final HttpHost target = new HttpHost("http", "somehost", 80);
68
69 final HttpClientContext context = HttpClientContext.create();
70 final HttpRoute route = routePlanner.determineRoute(target, context);
71
72 Assertions.assertEquals(target, route.getTargetHost());
73 Assertions.assertEquals(1, route.getHopCount());
74 Assertions.assertFalse(route.isSecure());
75 Mockito.verify(schemePortResolver, Mockito.never()).resolve(ArgumentMatchers.any());
76 }
77
78 @Test
79 void testDirectDefaultPort() throws Exception {
80 final HttpHost target = new HttpHost("https", "somehost", -1);
81 Mockito.when(schemePortResolver.resolve(target)).thenReturn(443);
82
83 final HttpClientContext context = HttpClientContext.create();
84 final HttpRoute route = routePlanner.determineRoute(target, context);
85
86 Assertions.assertEquals(new HttpHost("https", "somehost", 443), route.getTargetHost());
87 Assertions.assertEquals(1, route.getHopCount());
88 Assertions.assertTrue(route.isSecure());
89 }
90
91 @Test
92 void testProxy() throws Exception {
93
94 final InetAddress ia = InetAddress.getByAddress(new byte[] {
95 (byte)127, (byte)0, (byte)0, (byte)1
96 });
97 final InetSocketAddress isa1 = new InetSocketAddress(ia, 11111);
98 final InetSocketAddress isa2 = new InetSocketAddress(ia, 22222);
99
100 final List<Proxy> proxies = new ArrayList<>(2);
101 proxies.add(new Proxy(Proxy.Type.HTTP, isa1));
102 proxies.add(new Proxy(Proxy.Type.HTTP, isa2));
103
104 Mockito.when(proxySelector.select(new URI("http://somehost:80"))).thenReturn(proxies);
105
106 final HttpHost target = new HttpHost("http", "somehost", 80);
107
108 final HttpClientContext context = HttpClientContext.create();
109 final HttpRoute route = routePlanner.determineRoute(target, context);
110
111 Assertions.assertEquals(target, route.getTargetHost());
112 Assertions.assertEquals(2, route.getHopCount());
113 Assertions.assertEquals(isa1.getPort(), route.getProxyHost().getPort());
114 }
115
116 }