package capsule; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import java.util.HashMap; import java.util.Map; import java.util.Properties; import org.eclipse.aether.repository.Proxy; import org.eclipse.aether.repository.RemoteRepository; import org.junit.Test; /** * @author Paolo Di Tommaso <paolo.ditommaso@gmail.com> * @author adrien.lauer@gmail.com */ public class SystemProxySelectorTest { @Test public void testProxyWithEnvProperties() { Map<String, String> env = new HashMap<>(); env.put("http_proxy", "my.proxy.com:8080"); env.put("https_proxy", "secure.proxy.com:8888"); SystemProxySelector selector = new SystemProxySelector(env, new Properties(), null); assertEquals(2, selector.getCount()); RemoteRepository repo = new RemoteRepository.Builder("bar", null, "https://oss.sonatype.org/service/foo-bar-0.14.3.jar").build(); Proxy proxy = selector.getProxy(repo); assertEquals("https", proxy.getType()); assertEquals("secure.proxy.com", proxy.getHost()); assertEquals(8888, proxy.getPort()); repo = new RemoteRepository.Builder("bar", null, "http://oss.sonatype.org/service/foo-bar-0.14.3.jar").build(); proxy = selector.getProxy(repo); assertEquals("http", proxy.getType()); assertEquals("my.proxy.com", proxy.getHost()); assertEquals(8080, proxy.getPort()); } @Test public void testProxyWithEnvPropertiesAndDefaultPorts() { Map<String, String> env = new HashMap<>(); env.put("http_proxy", "http://my.proxy.com"); env.put("https_proxy", "https://secure.proxy.com"); SystemProxySelector selector = new SystemProxySelector(env, new Properties(), null); assertEquals(2, selector.getCount()); RemoteRepository repo = new RemoteRepository.Builder("bar", null, "https://oss.sonatype.org/service/foo-bar-0.14.3.jar").build(); Proxy proxy = selector.getProxy(repo); assertEquals("https", proxy.getType()); assertEquals("secure.proxy.com", proxy.getHost()); assertEquals(443, proxy.getPort()); repo = new RemoteRepository.Builder("bar", null, "http://oss.sonatype.org/service/foo-bar-0.14.3.jar").build(); proxy = selector.getProxy(repo); assertEquals("http", proxy.getType()); assertEquals("my.proxy.com", proxy.getHost()); assertEquals(80, proxy.getPort()); } @Test public void testProxyWithEnvPropertiesAndNoProxyHosts() { Map<String, String> env = new HashMap<>(); env.put("http_proxy", "http://my.proxy.com"); env.put("https_proxy", "https://secure.proxy.com"); env.put("no_proxy", "*.foo.com,localhost"); SystemProxySelector selector = new SystemProxySelector(env, new Properties(), null); assertEquals(2, selector.getCount()); RemoteRepository repo = new RemoteRepository.Builder("bar", null, "http://localhost/service/foo-bar-0.14.3.jar").build(); Proxy proxy = selector.getProxy(repo); assertNull(proxy); RemoteRepository repo2 = new RemoteRepository.Builder("bar", null, "https://oss.sonatype.org/service/foo-bar-0.14.3.jar").build(); Proxy proxy2 = selector.getProxy(repo2); assertEquals("https", proxy2.getType()); assertEquals("secure.proxy.com", proxy2.getHost()); assertEquals(443, proxy2.getPort()); } @Test public void testProxyWithEnvPropertiesAndCredentials() { Map<String, String> env = new HashMap<>(); env.put("https_proxy", "https://user:password@secure.proxy.com"); SystemProxySelector selector = new SystemProxySelector(env, new Properties(), null); assertEquals(1, selector.getCount()); RemoteRepository repo = new RemoteRepository.Builder("bar", null, "https://oss.sonatype.org/service/foo-bar-0.14.3.jar").build(); Proxy proxy = selector.getProxy(repo); assertEquals("https", proxy.getType()); assertEquals("secure.proxy.com", proxy.getHost()); assertEquals(443, proxy.getPort()); assertNotNull(proxy.getAuthentication()); assertEquals("username=user, password=***", proxy.getAuthentication().toString()); // no way to retrieve password } @Test public void testProxyWithSystemPropertiesAndCredentials() { Properties props = new Properties(); props.setProperty("https.proxyHost", "secure.host.name"); props.setProperty("https.proxyUser", "user"); props.setProperty("https.proxyPassword", "password"); SystemProxySelector selector = new SystemProxySelector(new HashMap(), props, null); assertEquals(1, selector.getCount()); RemoteRepository repo = new RemoteRepository.Builder("bar", null, "https://oss.sonatype.org/service/foo-bar-0.14.3.jar").build(); Proxy proxy = selector.getProxy(repo); assertEquals("https", proxy.getType()); assertEquals("secure.host.name", proxy.getHost()); assertEquals(443, proxy.getPort()); assertNotNull(proxy.getAuthentication()); assertEquals("username=user, password=***", proxy.getAuthentication().toString()); // no way to retrieve password } @Test public void testProxyWithSystemPropertiesAndDefaultPorts() { Properties props = new Properties(); props.setProperty("http.proxyHost", "foo.host.name"); props.setProperty("https.proxyHost", "secure.host.name"); SystemProxySelector selector = new SystemProxySelector(new HashMap(), props, null); assertEquals(2, selector.getCount()); RemoteRepository repo = new RemoteRepository.Builder("bar", null, "https://oss.sonatype.org/service/foo-bar-0.14.3.jar").build(); Proxy proxy = selector.getProxy(repo); assertEquals("https", proxy.getType()); assertEquals("secure.host.name", proxy.getHost()); assertEquals(443, proxy.getPort()); repo = new RemoteRepository.Builder("bar", null, "http://oss.sonatype.org/service/foo-bar-0.14.3.jar").build(); proxy = selector.getProxy(repo); assertEquals("http", proxy.getType()); assertEquals("foo.host.name", proxy.getHost()); assertEquals(80, proxy.getPort()); } @Test public void testProxyWithSystemPropertiesAndCustomPorts() { // environment conf Map<String, String> env = new HashMap<>(); env.put("http_proxy", "env1.proxy.com:8080"); env.put("https_proxy", "env2.secure.com:8888"); // system properties Properties props = new Properties(); props.setProperty("http.proxyHost", "prop1.host.name"); props.setProperty("http.proxyPort", "8081"); props.setProperty("https.proxyHost", "prop2.secure.name"); props.setProperty("https.proxyPort", "9091"); // it must use the proxy defined in the system properties // because it is supposed to override the one defined with environment variables SystemProxySelector selector = new SystemProxySelector(env, props, null); assertEquals(4, selector.getCount()); RemoteRepository repo = new RemoteRepository.Builder("bar", null, "https://oss.sonatype.org/service/foo-bar-0.14.3.jar").build(); Proxy proxy = selector.getProxy(repo); assertEquals("https", proxy.getType()); assertEquals("prop2.secure.name", proxy.getHost()); assertEquals(9091, proxy.getPort()); repo = new RemoteRepository.Builder("bar", null, "http://oss.sonatype.org/service/foo-bar-0.14.3.jar").build(); proxy = selector.getProxy(repo); assertEquals("http", proxy.getType()); assertEquals("prop1.host.name", proxy.getHost()); assertEquals(8081, proxy.getPort()); } @Test public void testParseProxy() { assertArrayEquals(new String[]{"foo.bar.org", "81"}, SystemProxySelector.parseProxy("foo.bar.org", "81")); assertArrayEquals(new String[]{"foo.bar.org", "8080"}, SystemProxySelector.parseProxy("foo.bar.org:8080", "91")); assertArrayEquals(new String[]{"foo.com", "81"}, SystemProxySelector.parseProxy("http://foo.com", "81")); assertArrayEquals(new String[] {"foo.com", "81"}, SystemProxySelector.parseProxy("http://foo.com/", "81")); assertArrayEquals(new String[]{"foo.com", "81"}, SystemProxySelector.parseProxy("http://foo.com/hello", "81")); assertArrayEquals(new String[]{"foo.com", "8080"}, SystemProxySelector.parseProxy("http://foo.com:8080", "81")); assertArrayEquals(new String[]{"foo.com", "8080"}, SystemProxySelector.parseProxy("http://foo.com:8080/", "81")); assertArrayEquals(new String[]{"foo.com", "8080"}, SystemProxySelector.parseProxy("http://foo.com:8080/hello", "81")); assertArrayEquals(new String[]{"foo.com", "81"}, SystemProxySelector.parseProxy("http://user:password@foo.com", "81")); assertArrayEquals(new String[]{"foo.com", "8080"}, SystemProxySelector.parseProxy("http://user:password@foo.com:8080", "81")); } @Test public void testParseCredentials() { assertNull(SystemProxySelector.parseCredentials("foo.bar.org")); assertNull(SystemProxySelector.parseCredentials("foo.bar.org:8080")); assertNull(SystemProxySelector.parseCredentials("http://foo.com")); assertNull(SystemProxySelector.parseCredentials("http://foo.com:8080")); assertArrayEquals(new String[]{"user", "password"}, SystemProxySelector.parseCredentials("user:password@foo.com")); assertArrayEquals(new String[]{"user", "password"}, SystemProxySelector.parseCredentials("user:password@foo.com:8080")); assertArrayEquals(new String[]{"user", "password"}, SystemProxySelector.parseCredentials("http://user:password@foo.com")); assertArrayEquals(new String[]{"user", "password"}, SystemProxySelector.parseCredentials("http://user:password@foo.com:8080")); assertArrayEquals(new String[]{"user", null}, SystemProxySelector.parseCredentials("http://user@foo.com:8080")); assertArrayEquals(new String[]{"user", "password"}, SystemProxySelector.parseCredentials("http://user:password@foo.com:8080/")); assertArrayEquals(new String[]{"user", null}, SystemProxySelector.parseCredentials("http://user@foo.com:8080/")); } }