blob: 8fcbd25c06962e2c0979768778d51824c9396733 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.maven.wagon.tck.http;
import java.io.File;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import org.apache.maven.wagon.ConnectionException;
import org.apache.maven.wagon.Wagon;
import org.apache.maven.wagon.authentication.AuthenticationException;
import org.apache.maven.wagon.authentication.AuthenticationInfo;
import org.apache.maven.wagon.proxy.ProxyInfo;
import org.apache.maven.wagon.repository.Repository;
import org.apache.maven.wagon.tck.http.fixture.ServerFixture;
import org.codehaus.plexus.DefaultPlexusContainer;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.component.configurator.ComponentConfigurationException;
import org.codehaus.plexus.component.repository.exception.ComponentLifecycleException;
import org.codehaus.plexus.util.FileUtils;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static org.apache.maven.wagon.tck.http.util.TestUtil.getResource;
/**
*
*/
public abstract class HttpWagonTests {
private ServerFixture serverFixture;
private static PlexusContainer container;
private Wagon wagon;
private static WagonTestCaseConfigurator configurator;
private String baseUrl;
private static final Set<File> TMP_FILES = new HashSet<>();
private Repository repo;
private final Set<Object> notificationTargets = new HashSet<>();
// CHECKSTYLE_OFF: ConstantName
protected static final Logger logger = LoggerFactory.getLogger(HttpWagonTests.class);
// CHECKSTYLE_ON: ConstantName
@Before
public void beforeEach() throws Exception {
serverFixture = new ServerFixture(isSsl());
serverFixture.start();
wagon = (Wagon) container.lookup(Wagon.ROLE, configurator.getWagonHint());
}
@BeforeClass
public static void beforeAll() throws Exception {
File keystore = getResource(ServerFixture.SERVER_SSL_KEYSTORE_RESOURCE_PATH);
System.setProperty("javax.net.ssl.keyStore", keystore.getAbsolutePath());
System.setProperty("javax.net.ssl.keyStorePassword", ServerFixture.SERVER_SSL_KEYSTORE_PASSWORD);
System.setProperty("javax.net.ssl.trustStore", keystore.getAbsolutePath());
System.setProperty("javax.net.ssl.trustStorePassword", ServerFixture.SERVER_SSL_KEYSTORE_PASSWORD);
container = new DefaultPlexusContainer();
// container.initialize();
// container.start();
configurator = (WagonTestCaseConfigurator) container.lookup(WagonTestCaseConfigurator.class.getName());
}
@After
public void afterEach() {
try {
wagon.disconnect();
} catch (ConnectionException e) {
e.printStackTrace();
}
for (Object obj : notificationTargets) {
synchronized (obj) {
obj.notify();
}
}
if (serverFixture != null) {
try {
serverFixture.stop();
} catch (Exception e) {
e.printStackTrace();
}
}
try {
container.release(wagon);
} catch (ComponentLifecycleException e) {
e.printStackTrace();
}
}
@AfterClass
public static void afterAll() {
for (File f : TMP_FILES) {
if (f.exists()) {
try {
FileUtils.forceDelete(f);
} catch (IOException e) {
e.printStackTrace();
}
}
}
if (container != null) {
try {
container.release(configurator);
} catch (ComponentLifecycleException e) {
e.printStackTrace();
}
container.dispose();
}
}
protected void addNotificationTarget(final Object target) {
notificationTargets.add(target);
}
protected File newTempFile() throws IOException {
File f = File.createTempFile("wagon-target.", ".file");
f.deleteOnExit();
return f;
}
protected boolean isSsl() {
return false;
}
protected ProxyInfo newProxyInfo() {
ProxyInfo info = new ProxyInfo();
info.setType(isSsl() ? "https" : "http");
info.setHost(ServerFixture.SERVER_HOST);
info.setPort(getPort());
return info;
}
protected boolean isSupported() {
StackTraceElement[] elements = new Throwable().getStackTrace();
String testCaseId = null;
String lastMethodName = null;
for (StackTraceElement e : elements) {
if (!e.getClassName().startsWith(getClass().getPackage().getName())) {
testCaseId = lastMethodName;
break;
} else {
lastMethodName = e.getMethodName();
}
}
if (testCaseId == null || !configurator.isSupported(testCaseId)) {
logger.error("Cannot run test: " + testCaseId + ". Wagon under test does not support this test case.");
return false;
}
return true;
}
protected boolean initTest(final AuthenticationInfo auth, final ProxyInfo proxy)
throws ComponentConfigurationException, ConnectionException, AuthenticationException {
return initTest(getBaseUrl(), auth, proxy);
}
protected boolean initTest(final String baseUrl, final AuthenticationInfo auth, final ProxyInfo proxy)
throws ComponentConfigurationException, ConnectionException, AuthenticationException {
StackTraceElement[] elements = new Throwable().getStackTrace();
String testCaseId = null;
String lastMethodName = null;
for (StackTraceElement e : elements) {
if (!e.getClassName().startsWith(getClass().getPackage().getName())) {
testCaseId = lastMethodName;
break;
} else {
lastMethodName = e.getMethodName();
}
}
if (testCaseId == null || !configurator.configureWagonForTest(wagon, testCaseId)) {
logger.error("Cannot run test: " + testCaseId + ". Wagon under test does not support this test case.");
return false;
}
try {
serverFixture.start();
} catch (Exception e) {
throw new IllegalStateException("Failed to start: " + e.getMessage(), e);
}
repo = new Repository("test", baseUrl);
wagon.connect(repo, auth, proxy);
return true;
}
protected int getPort() {
return serverFixture.getHttpPort();
}
protected int getPortPropertyValue() {
return Integer.parseInt(System.getProperty("test.port", "-1"));
}
protected String getBaseUrl() {
if (baseUrl == null) {
StringBuilder sb = new StringBuilder();
sb.append(isSsl() ? "https" : "http");
sb.append("://" + ServerFixture.SERVER_HOST + ":");
sb.append(getPort());
baseUrl = sb.toString();
}
return baseUrl;
}
protected ServerFixture getServerFixture() {
return serverFixture;
}
protected static PlexusContainer getContainer() {
return container;
}
protected Wagon getWagon() {
return wagon;
}
protected static WagonTestCaseConfigurator getConfigurator() {
return configurator;
}
protected static Set<File> getTmpfiles() {
return TMP_FILES;
}
protected Repository getRepo() {
return repo;
}
}