/* * SoapUI, Copyright (C) 2004-2016 SmartBear Software * * Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent * versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * * http://ec.europa.eu/idabc/eupl * * Unless required by applicable law or agreed to in writing, software distributed under the Licence is * distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the Licence for the specific language governing permissions and limitations * under the Licence. */ package com.eviware.soapui.impl.wsdl.support.http; import com.eviware.soapui.impl.settings.SettingsImpl; import com.eviware.soapui.impl.wsdl.submit.transports.http.support.methods.ExtendedGetMethod; import com.eviware.soapui.model.settings.Settings; import com.eviware.soapui.settings.ProxySettings; import org.apache.http.HttpException; import org.apache.http.HttpHost; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.conn.routing.HttpRoute; import org.apache.http.conn.routing.HttpRoutePlanner; import org.junit.After; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import java.net.InetSocketAddress; import java.net.Proxy; import java.net.ProxySelector; import java.net.URI; import java.util.List; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.core.Is.is; import static org.hamcrest.core.IsNull.nullValue; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; public class ProxyUtilsTestCase { private static final String URL = "http://example.com"; public static final String SYSTEM_PROPERTY_PROXY_HOST = "systempropertyhost.com"; public static final String SYSTEM_PROPERTY_PROXY_PORT = "1"; public static final String MANUAL_SETTING_PROXY_HOST = "manualsettingshost.com"; public static final String MANUAL_SETTING_PROXY_PORT = "2"; public static final String AUTOMATIC_PROXY_HOST = "autosettingshost.com"; public static final String AUTOMATIC_PROXY_PORT = "3"; private HttpUriRequest httpMethod; /* FIXME This will do nslookups which will not always mach of natural reasons since test.com is a real domain What is the purpose of this? */ @Test @Ignore public void testExcludes() { assertFalse(ProxyUtils.excludes(new String[]{""}, "www.test.com", 8080)); assertTrue(ProxyUtils.excludes(new String[]{"test.com"}, "www.test.com", 8080)); assertFalse(ProxyUtils.excludes(new String[]{"test2.com"}, "www.test.com", 8080)); assertTrue(ProxyUtils.excludes(new String[]{"test.com:8080"}, "www.test.com", 8080)); assertFalse(ProxyUtils.excludes(new String[]{"test2.com:8080"}, "www.test.com", 8080)); assertFalse(ProxyUtils.excludes(new String[]{"test.com:8081"}, "www.test.com", 8080)); assertTrue(ProxyUtils.excludes(new String[]{"test.com:8080", "test.com:8081"}, "www.test.com", 8080)); assertTrue(ProxyUtils.excludes(new String[]{"test.com:8080", "test.com"}, "www.test.com", 8080)); } @Before public void setup() { clearProxySystemProperties(); httpMethod = new ExtendedGetMethod(); } @After public void teardown() { ProxyUtils.setAutoProxy(false); ProxyUtils.setProxyEnabled(false); } @Test public void givenProxyEnabledAndProxyPropertiesSetThenSetAutoProxy() { ProxyUtils.setProxyEnabled(true); ProxyUtils.setAutoProxy(true); setProxySystemProperties(); ProxyUtils.setGlobalProxy(manualSettings()); assertGlobalProxyHost(SYSTEM_PROPERTY_PROXY_HOST); assertHttpClientProxyHost(SYSTEM_PROPERTY_PROXY_HOST); } @Test public void givenAutomaticProxyDetectionAndProxyPropertiesSetThenSetAutoProxy() { ProxyUtils.setProxyEnabled(true); ProxyUtils.setAutoProxy(true); setProxySystemProperties(); ProxyUtils.setGlobalProxy(emptySettings()); assertGlobalProxyHost(SYSTEM_PROPERTY_PROXY_HOST); assertHttpClientProxyHost(SYSTEM_PROPERTY_PROXY_HOST); } @Test public void givenProxyDisabledThenUseNoProxy() { ProxyUtils.setProxyEnabled(false); ProxyUtils.setAutoProxy(false); setProxySystemProperties(); ProxyUtils.setGlobalProxy(emptySettings()); assertGlobalProxyHost(null); assertHttpClientProxyHost(null); } @Test public void givenProxyEnabledAndManuallyConfiguredThenSetProxy() { ProxyUtils.setProxyEnabled(true); ProxyUtils.setAutoProxy(false); manualSettings(); ProxyUtils.setGlobalProxy(manualSettings()); assertGlobalProxyHost(MANUAL_SETTING_PROXY_HOST); assertHttpClientProxyHost(MANUAL_SETTING_PROXY_HOST); } @Test public void givenAutomaticProxyDetectionAndNoProxyAvailableThenSetDirectProxyType() { ProxyUtils.setProxyEnabled(true); ProxyUtils.setAutoProxy(true); ProxyUtils.setGlobalProxy(manualSettings()); assertGlobalProxyHost(null); assertHttpClientProxyHost(null); } @Test public void forceDirectConnectionOverridesManualProxySettings() { ProxyUtils.setProxyEnabled(true); ProxyUtils.setAutoProxy(false); ProxyUtils.setForceDirectConnection(httpMethod.getParams()); ProxyUtils.setGlobalProxy(manualSettings()); assertGlobalProxyHost(MANUAL_SETTING_PROXY_HOST); assertHttpClientProxyHost(null); } @Test public void forceDirectConnectionOverridesAutomaticProxySettings() { ProxyUtils.setProxyEnabled(true); ProxyUtils.setAutoProxy(true); setProxySystemProperties(); ProxyUtils.setForceDirectConnection(httpMethod.getParams()); ProxyUtils.setGlobalProxy(emptySettings()); assertGlobalProxyHost(SYSTEM_PROPERTY_PROXY_HOST); assertHttpClientProxyHost(null); } @Test @Ignore // To run this test manually set the environment variable http_proxy to "environmentshost.com" public void givenAutomaticProxyDetectionAndEnvironmentProxySetThenUseTheEnvironmentProxy() { ProxyUtils.setProxyEnabled(true); ProxyUtils.setAutoProxy(true); ProxyUtils.setGlobalProxy(manualSettings()); assertGlobalProxyHost("environmentshost.com"); assertHttpClientProxyHost("environmentshost.com"); } private Settings emptySettings() { return new SettingsImpl(); } private Settings manualSettings() { Settings settings = emptySettings(); settings.setString(ProxySettings.HOST, MANUAL_SETTING_PROXY_HOST); settings.setString(ProxySettings.PORT, MANUAL_SETTING_PROXY_PORT); return settings; } private void clearProxySystemProperties() { System.clearProperty("http.proxyHost"); System.clearProperty("http.proxyPort"); } private void setProxySystemProperties() { System.setProperty("http.proxyHost", SYSTEM_PROPERTY_PROXY_HOST); System.setProperty("http.proxyPort", SYSTEM_PROPERTY_PROXY_PORT); } private void assertHttpClientProxyHost(String expectedProxyHost) { HttpRoutePlanner routePlanner = HttpClientSupport.getHttpClient().getRoutePlanner(); HttpRoute httpRoute = null; try { httpRoute = routePlanner.determineRoute(new HttpHost("soapui.org"), httpMethod, null); } catch (HttpException e) { e.printStackTrace(); fail(e.getMessage()); } if (expectedProxyHost == null) { assertThat(httpRoute.getProxyHost(), is(nullValue())); } else { assertThat(expectedProxyHost, is(httpRoute.getProxyHost().getHostName())); } } private void assertGlobalProxyHost(String expectedProxyHost) { ProxySelector proxySelector = ProxySelector.getDefault(); Proxy globalProxy = null; if (proxySelector != null) { List<Proxy> globalProxies = proxySelector.select(URI.create("http://soapui.org/")); assertThat(globalProxies.size(), is(1)); globalProxy = globalProxies.get(0); } if (expectedProxyHost == null) { if (proxySelector != null) { assertThat(globalProxy.type(), is(Proxy.Type.DIRECT)); } } else { assertThat(proxySelector, is(not(nullValue()))); assertThat(globalProxy.type(), is(Proxy.Type.HTTP)); assertThat(expectedProxyHost, is(((InetSocketAddress) globalProxy.address()).getHostName())); } } }