/* * 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.internal; import java.io.IOException; import java.util.Collections; import java.util.Properties; import java.util.UUID; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.maven.settings.Profile; import org.apache.maven.settings.Proxy; import org.apache.maven.settings.Repository; import org.apache.maven.settings.Settings; import org.eclipse.aether.RepositoryException; import org.eclipse.aether.resolution.ArtifactResolutionException; import org.eclipse.aether.transfer.ArtifactNotFoundException; import org.eclipse.aether.transfer.ArtifactTransferException; 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.BeforeClass; import org.junit.Test; 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.*; /** * Test cases for consecutive resolution attempts */ public class AetherResolutionWithHintsTest { private static Server server; private static int port; private static ExecutorService pool = Executors.newFixedThreadPool(1); @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 { int port = baseRequest.getUri().getPort(); if (port == 3333) { // explicit timeout Thread.sleep(2000); } response.setStatus(HttpServletResponse.SC_NOT_FOUND); } catch (Exception ignored) { } finally { baseRequest.setHandled(true); } } }); server.start(); port = server.getConnectors()[0].getLocalPort(); } @Test public void hintedResolution() throws Exception { final MavenConfigurationImpl mavenConfiguration = mavenConfiguration(); mavenConfiguration.setSettings(settingsWithProxy()); AetherBasedResolver resolver = new AetherBasedResolver(mavenConfiguration); try { resolver.resolve("org.ops4j.pax.web", "pax-web-api", "", "jar", "1"); fail("Resolution should fail"); } catch (IOException e) { RepositoryException exception = resolver.findAetherException(e); assertNotNull(exception); assertTrue(exception instanceof ArtifactResolutionException); ArtifactResolutionException are = (ArtifactResolutionException) exception; assertThat(are.getResult().getExceptions().size(), equalTo(3)); assertTrue("Non-retryable exception", are.getResult().getExceptions().get(0) instanceof ArtifactNotFoundException); assertTrue("Non-retryable exception", are.getResult().getExceptions().get(1) instanceof ArtifactNotFoundException); assertTrue("Retryable exception", are.getResult().getExceptions().get(2) instanceof ArtifactTransferException); assertFalse("Retryable exception", are.getResult().getExceptions().get(2) instanceof ArtifactNotFoundException); try { // try again with exception hint resolver.resolve("org.ops4j.pax.web", "pax-web-api", "", "jar", "1", e); fail("Resolution should fail"); } catch (IOException e2) { exception = resolver.findAetherException(e2); assertNotNull(exception); assertTrue(exception instanceof ArtifactResolutionException); are = (ArtifactResolutionException) exception; assertThat(are.getResult().getExceptions().size(), equalTo(1)); assertTrue("Retryable exception", are.getResult().getExceptions().get(0) instanceof ArtifactTransferException); assertFalse("Retryable exception", are.getResult().getExceptions().get(0) instanceof ArtifactNotFoundException); } } finally { resolver.close(); } } @AfterClass public static void stopJetty() throws Exception { server.stop(); pool.shutdown(); } private MavenConfigurationImpl mavenConfiguration() { Properties properties = new Properties(); properties.setProperty("pid.localRepository", "target/" + UUID.randomUUID().toString()); properties.setProperty("pid.globalChecksumPolicy", "ignore"); properties.setProperty("pid.timeout", "1000"); properties.setProperty("pid.connection.retryCount", "0"); return new MavenConfigurationImpl(new PropertiesPropertyResolver(properties), "pid"); } 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)); Profile defaultProfile = new Profile(); defaultProfile.setId("default"); Repository repo1 = new Repository(); repo1.setId("repo1"); repo1.setUrl("http://localhost:1111/repository"); Repository repo2 = new Repository(); repo2.setId("repo2"); repo2.setUrl("http://localhost:2222/repository"); Repository repo3 = new Repository(); repo3.setId("repo3"); repo3.setUrl("http://localhost:3333/repository"); defaultProfile.addRepository(repo1); defaultProfile.addRepository(repo2); defaultProfile.addRepository(repo3); settings.addProfile(defaultProfile); settings.addActiveProfile("default"); return settings; } }