blob: 79e3cdbc4aced1991eeea7674faffe3211304c95 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2015 Tasktop Technologies and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.commons.repositories.http.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import java.io.IOException;
import java.util.concurrent.atomic.AtomicReference;
import javax.net.ssl.SSLException;
import javax.net.ssl.TrustManager;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.Credentials;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;
import org.eclipse.mylyn.commons.core.net.SslSupport;
import org.eclipse.mylyn.commons.core.net.TrustAllTrustManager;
import org.eclipse.mylyn.commons.core.operations.IOperationMonitor;
import org.eclipse.mylyn.commons.repositories.core.RepositoryLocation;
import org.eclipse.mylyn.commons.repositories.core.auth.AuthenticationType;
import org.eclipse.mylyn.commons.repositories.core.auth.UserCredentials;
import org.eclipse.mylyn.commons.repositories.http.core.CommonHttpClient;
import org.eclipse.mylyn.commons.repositories.http.core.CommonHttpResponse;
import org.eclipse.mylyn.commons.repositories.http.core.HttpRequestProcessor;
import org.eclipse.mylyn.commons.repositories.http.core.HttpUtil;
import org.eclipse.mylyn.commons.sdk.util.CommonTestUtil;
import org.eclipse.mylyn.internal.commons.repositories.http.core.PollingSslProtocolSocketFactory;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
/**
* @author Steffen Pingel
*/
public class CommonHttpClientTest {
@BeforeClass
public static void setUpClass() {
if (CommonTestUtil.fixProxyConfiguration()) {
CommonTestUtil.dumpSystemInfo(System.err);
}
}
@Test
@Ignore
public void testCertificateAuthenticationCertificate() throws Exception {
if (CommonTestUtil.isCertificateAuthBroken() || CommonTestUtil.isBehindProxy()) {
System.err.println("Skipped CommonHttpClientTest.testCertificateAuthenticationCertificate() due to incompatible JVM");
return; // skip test
}
if (!CommonTestUtil.hasCertificateCredentials()) {
System.err.println("Skipped CommonHttpClientTest.testCertificateAuthenticationCertificate() due to missing credentials");
return; // skip test
}
RepositoryLocation location = new RepositoryLocation();
location.setUrl("https://mylyn.org/secure/index.txt");
location.setCredentials(AuthenticationType.CERTIFICATE, CommonTestUtil.getCertificateCredentials());
HttpGet request = new HttpGet(location.getUrl());
CommonHttpClient client = new CommonHttpClient(location);
HttpResponse response = client.execute(request, null);
try {
assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
assertEquals("secret\n", EntityUtils.toString(response.getEntity()));
} finally {
HttpUtil.release(request, response, null);
}
}
@Test(expected = SSLException.class)
@Ignore
public void testCertificateAuthenticationCertificateReset() throws Exception {
if (CommonTestUtil.isCertificateAuthBroken() || CommonTestUtil.isBehindProxy()) {
// bug 369805
System.err.println("Skipped CommonHttpClientTest.testCertificateAuthenticationCertificateReset due to incompatible JVM");
throw new SSLException(""); // skip test
}
if (!CommonTestUtil.hasCertificateCredentials()) {
System.err.println("Skipped CommonHttpClientTest.testCertificateAuthenticationCertificate() due to missing credentials");
throw new SSLException(""); // skip test
}
RepositoryLocation location = new RepositoryLocation();
location.setUrl("https://mylyn.org/secure/index.txt");
location.setCredentials(AuthenticationType.CERTIFICATE, CommonTestUtil.getCertificateCredentials());
HttpGet request = new HttpGet(location.getUrl());
CommonHttpClient client = new CommonHttpClient(location);
// work-around for bug 369805
Scheme oldScheme = setUpDefaultFactory(client);
try {
try {
HttpResponse response = client.execute(request, null);
try {
assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
} finally {
HttpUtil.release(request, response, null);
}
} catch (SSLException e) {
throw new IllegalStateException("Unexpected exception", e);
}
location.setCredentials(AuthenticationType.CERTIFICATE, null);
// the request should now fail
request = new HttpGet(location.getUrl());
HttpResponse response = client.execute(request, null);
HttpUtil.release(request, response, null);
} finally {
tearDownDefaultFactory(client, oldScheme);
}
}
@Test(expected = SSLException.class)
public void testCertificateAuthenticationNoCertificate() throws Exception {
if (!CommonTestUtil.isHttpsProxyBroken()) {
System.err.println("Skipped CommonHttpClientTest.testCertificateAuthenticationNoCertificate() due to broken https proxy");
throw new SSLException(""); // skip test
}
RepositoryLocation location = new RepositoryLocation();
location.setUrl("https://mylyn.org/secure/index.txt");
HttpGet request = new HttpGet(location.getUrl());
CommonHttpClient client = new CommonHttpClient(location);
// work-around for bug 369805
Scheme oldScheme = setUpDefaultFactory(client);
try {
HttpResponse response = client.execute(request, null);
HttpUtil.release(request, response, null);
} finally {
tearDownDefaultFactory(client, oldScheme);
}
}
@Test
public void testExecuteGet() throws IOException {
RepositoryLocation location = new RepositoryLocation("http://mylyn.org");
CommonHttpClient client = new CommonHttpClient(location);
Integer result = client.executeGet("/", null, new HttpRequestProcessor<Integer>() {
@Override
protected Integer doProcess(CommonHttpResponse response, IOperationMonitor monitor) throws IOException {
return response.getStatusCode();
}
});
assertEquals(HttpStatus.SC_OK, result.intValue());
}
@Test
public void testGetRequest() throws Exception {
RepositoryLocation location = new RepositoryLocation();
location.setUrl("http://mylyn.org/");
HttpGet request = new HttpGet(location.getUrl());
CommonHttpClient client = new CommonHttpClient(location);
HttpResponse response = client.execute(request, null);
try {
assertEquals(HttpStatus.SC_OK, response.getStatusLine().getStatusCode());
} finally {
HttpUtil.release(request, response, null);
}
}
@Test
public void testHttpAuthenticationTypeHttp() throws Exception {
RepositoryLocation location = new RepositoryLocation();
location.setUrl("http://mylyn.org/");
location.setCredentials(AuthenticationType.HTTP, new UserCredentials("username", "password"));
HttpGet request = new HttpGet(location.getUrl());
CommonHttpClient client = new CommonHttpClient(location);
HttpResponse response = client.execute(request, null);
try {
AuthScope authScope = new AuthScope("mylyn.org", 80, AuthScope.ANY_REALM);
Credentials httpCredentials = client.getHttpClient().getCredentialsProvider().getCredentials(authScope);
assertEquals(new UsernamePasswordCredentials("username", "password"), httpCredentials);
} finally {
HttpUtil.release(request, response, null);
}
}
@Test
public void testHttpAuthenticationTypeRepository() throws Exception {
RepositoryLocation location = new RepositoryLocation();
location.setUrl("http://mylyn.org/");
location.setCredentials(AuthenticationType.REPOSITORY, new UserCredentials("username", "password"));
HttpGet request = new HttpGet(location.getUrl());
CommonHttpClient client = new CommonHttpClient(location);
AuthScope authScope = new AuthScope("mylyn.org", 80, AuthScope.ANY_REALM);
// credentials should be ignored
HttpResponse response = client.execute(request, null);
try {
Credentials httpCredentials = client.getHttpClient().getCredentialsProvider().getCredentials(authScope);
assertEquals(null, httpCredentials);
} finally {
HttpUtil.release(request, response, null);
}
client.setHttpAuthenticationType(AuthenticationType.REPOSITORY);
// credentials should now be used
response = client.execute(request, null);
try {
Credentials httpCredentials = client.getHttpClient().getCredentialsProvider().getCredentials(authScope);
assertEquals(new UsernamePasswordCredentials("username", "password"), httpCredentials);
} finally {
HttpUtil.release(request, response, null);
}
}
@Test
public void testHttpContextPerThread() throws Exception {
RepositoryLocation location = new RepositoryLocation("http://mylyn.org/");
final CommonHttpClient client = new CommonHttpClient(location);
final AtomicReference<HttpContext> otherThreadContext = new AtomicReference<HttpContext>();
Thread t = new Thread() {
@Override
public void run() {
otherThreadContext.set(client.getContext());
};
};
t.start();
t.join();
assertNotNull(otherThreadContext.get());
assertNotNull(client.getContext());
assertFalse(otherThreadContext.get() == client.getContext());
}
private Scheme setUpDefaultFactory(CommonHttpClient client) {
PollingSslProtocolSocketFactory factory = new PollingSslProtocolSocketFactory(new SslSupport(
new TrustManager[] { new TrustAllTrustManager() }, null, null, null));
Scheme oldScheme = client.getHttpClient()
.getConnectionManager()
.getSchemeRegistry()
.register(new Scheme("https", 443, factory)); //$NON-NLS-1$
return oldScheme;
}
private void tearDownDefaultFactory(CommonHttpClient client, Scheme oldScheme) {
client.getHttpClient().getConnectionManager().getSchemeRegistry().register(oldScheme);
}
}