/*
* Copyright 2016 Grzegorz Grzybek
*
* Licensed 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.ops4j.pax.url.mvn;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.maven.settings.Proxy;
import org.apache.maven.settings.Settings;
import org.eclipse.aether.repository.RepositoryPolicy;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.AbstractHandler;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.ops4j.pax.url.mvn.internal.AetherBasedResolver;
import org.ops4j.pax.url.mvn.internal.config.MavenConfigurationImpl;
import org.ops4j.util.property.PropertiesPropertyResolver;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertThat;
/**
* Test cases for connection and read timeouts
*/
public class AetherSnapshotUpdatesTest {
private static Server server;
private static int port;
private static boolean someoneDeploysNewerSnapshot = false;
private static Map<String, Integer> HITS = new HashMap<>();
@BeforeClass
public static void startJetty() throws Exception {
server = new Server(0);
server.setHandler(new AbstractHandler() {
@Override
public void handle(String target, Request baseRequest, HttpServletRequest request,
HttpServletResponse response) throws IOException, ServletException {
try {
if (request.getRequestURI().endsWith("maven-metadata.xml")) {
String[] split = request.getRequestURI().split("/");
int version = Integer.parseInt(split[split.length - 2].split("-")[0]);
String ts1 = someoneDeploysNewerSnapshot ? "20161017111010" : "20161017101010";
String ts2 = someoneDeploysNewerSnapshot ? "20161017.111010" : "20161017.101010";
String nr = someoneDeploysNewerSnapshot ? "2" : "1";
response.setStatus(HttpServletResponse.SC_OK);
StringWriter sw = new StringWriter();
sw.append("<metadata>\n");
sw.append(" <groupId>org.ops4j.pax.web</groupId>\n");
sw.append(" <artifactId>pax-web-api</artifactId>\n");
sw.append(" <version>1-SNAPSHOT</version>\n");
sw.append(" <versioning>\n");
sw.append(" <snapshot>\n");
sw.append(" <timestamp>" + ts2 + "</timestamp>\n");
sw.append(" <buildNumber>" + nr + "</buildNumber>\n");
sw.append(" </snapshot>\n");
sw.append(" <lastUpdated>" + ts1 + "</lastUpdated>\n");
sw.append(" <snapshotVersions>\n");
sw.append(" <snapshotVersion>\n");
sw.append(" <extension>jar</extension>\n");
sw.append(" <value>1-" + ts2 + "-" + nr + "</value>\n");
sw.append(" <updated>" + ts1 + "</updated>\n");
sw.append(" </snapshotVersion>\n");
sw.append(" </snapshotVersions>\n");
sw.append(" </versioning>\n");
sw.append("</metadata>\n");
response.getOutputStream().write(sw.toString().getBytes("UTF-8"));
} else if (request.getRequestURI().endsWith(".jar")) {
response.setStatus(HttpServletResponse.SC_OK);
response.getOutputStream().write(0x42);
}
} finally {
if (!HITS.containsKey(request.getRequestURI())) {
HITS.put(request.getRequestURI(), 0);
}
HITS.put(request.getRequestURI(), HITS.get(request.getRequestURI()) + 1);
baseRequest.setHandled(true);
}
}
});
server.start();
port = server.getConnectors()[0].getLocalPort();
}
@Before
public void init() {
HITS.clear();
someoneDeploysNewerSnapshot = false;
}
@Test
public void updatePolicyAlways() throws Exception {
final MavenConfigurationImpl mavenConfiguration = basicMavenConfiguration(RepositoryPolicy.UPDATE_POLICY_ALWAYS);
AetherBasedResolver resolver = new AetherBasedResolver(mavenConfiguration);
resolver.resolve("org.ops4j.pax.web", "pax-web-api",
"", "jar", "1-SNAPSHOT");
resolver.resolve("org.ops4j.pax.web", "pax-web-api",
"", "jar", "1-SNAPSHOT");
resolver.resolve("org.ops4j.pax.web", "pax-web-api",
"", "jar", "1-SNAPSHOT");
assertThat(HITS.get("/repository/org/ops4j/pax/web/pax-web-api/1-SNAPSHOT/maven-metadata.xml"),
equalTo(3));
assertThat(HITS.get("/repository/org/ops4j/pax/web/pax-web-api/1-SNAPSHOT/pax-web-api-1-20161017.101010-1.jar"),
equalTo(1));
}
@Test
public void updatePolicyNever() throws Exception {
final MavenConfigurationImpl mavenConfiguration = basicMavenConfiguration(RepositoryPolicy.UPDATE_POLICY_NEVER);
AetherBasedResolver resolver = new AetherBasedResolver(mavenConfiguration);
resolver.resolve("org.ops4j.pax.web", "pax-web-api",
"", "jar", "1-SNAPSHOT");
resolver.resolve("org.ops4j.pax.web", "pax-web-api",
"", "jar", "1-SNAPSHOT");
resolver.resolve("org.ops4j.pax.web", "pax-web-api",
"", "jar", "1-SNAPSHOT");
assertThat(HITS.get("/repository/org/ops4j/pax/web/pax-web-api/1-SNAPSHOT/maven-metadata.xml"),
equalTo(1));
assertThat(HITS.get("/repository/org/ops4j/pax/web/pax-web-api/1-SNAPSHOT/pax-web-api-1-20161017.101010-1.jar"),
equalTo(1));
}
@Test
public void updatePolicyAlwaysWithSnapshotUpdatedRemotely() throws Exception {
final MavenConfigurationImpl mavenConfiguration = basicMavenConfiguration(RepositoryPolicy.UPDATE_POLICY_ALWAYS);
AetherBasedResolver resolver = new AetherBasedResolver(mavenConfiguration);
resolver.resolve("org.ops4j.pax.web", "pax-web-api",
"", "jar", "1-SNAPSHOT");
someoneDeploysNewerSnapshot = true;
resolver.resolve("org.ops4j.pax.web", "pax-web-api",
"", "jar", "1-SNAPSHOT");
resolver.resolve("org.ops4j.pax.web", "pax-web-api",
"", "jar", "1-SNAPSHOT");
assertThat(HITS.get("/repository/org/ops4j/pax/web/pax-web-api/1-SNAPSHOT/maven-metadata.xml"),
equalTo(3));
assertThat(HITS.get("/repository/org/ops4j/pax/web/pax-web-api/1-SNAPSHOT/pax-web-api-1-20161017.101010-1.jar"),
equalTo(1));
assertThat(HITS.get("/repository/org/ops4j/pax/web/pax-web-api/1-SNAPSHOT/pax-web-api-1-20161017.111010-2.jar"),
equalTo(1));
}
@Test
public void updatePolicyNeverWithSnapshotUpdatedRemotely() throws Exception {
final MavenConfigurationImpl mavenConfiguration = basicMavenConfiguration(RepositoryPolicy.UPDATE_POLICY_NEVER);
AetherBasedResolver resolver = new AetherBasedResolver(mavenConfiguration);
resolver.resolve("org.ops4j.pax.web", "pax-web-api",
"", "jar", "1-SNAPSHOT");
someoneDeploysNewerSnapshot = true;
resolver.resolve("org.ops4j.pax.web", "pax-web-api",
"", "jar", "1-SNAPSHOT");
resolver.resolve("org.ops4j.pax.web", "pax-web-api",
"", "jar", "1-SNAPSHOT");
assertThat(HITS.size(), equalTo(2));
assertThat(HITS.get("/repository/org/ops4j/pax/web/pax-web-api/1-SNAPSHOT/maven-metadata.xml"),
equalTo(1));
assertThat(HITS.get("/repository/org/ops4j/pax/web/pax-web-api/1-SNAPSHOT/pax-web-api-1-20161017.101010-1.jar"),
equalTo(1));
}
@AfterClass
public static void stopJetty() throws Exception {
server.stop();
}
private MavenConfigurationImpl basicMavenConfiguration(String globalUpdatePolicy) {
Properties properties = new Properties();
properties.setProperty("pid.localRepository", "target/" + UUID.randomUUID().toString());
properties.setProperty("pid.timeout", "1000");
properties.setProperty("pid.repositories", "http://everfree-forest/repository@id=single-repo@snapshots");
properties.setProperty("pid.globalChecksumPolicy", "ignore");
properties.setProperty("pid.globalUpdatePolicy", globalUpdatePolicy);
properties.setProperty("pid.connection.retryCount", "0");
MavenConfigurationImpl mavenConfiguration = new MavenConfigurationImpl(new PropertiesPropertyResolver(properties), "pid");
mavenConfiguration.setSettings(settingsWithProxy());
return mavenConfiguration;
}
private Settings settingsWithProxy()
{
Settings settings = new Settings();
Proxy proxy = new Proxy();
proxy.setId("proxy");
proxy.setHost("localhost");
proxy.setPort(port);
proxy.setProtocol("http");
settings.setProxies(Collections.singletonList(proxy));
return settings;
}
}