package org.jboss.shrinkwrap.resolver.impl.maven.integration;
import java.io.File;
import org.jboss.shrinkwrap.resolver.api.InvalidConfigurationFileException;
import org.jboss.shrinkwrap.resolver.api.NoResolvedResultException;
import org.jboss.shrinkwrap.resolver.api.Resolvers;
import org.jboss.shrinkwrap.resolver.api.maven.ConfigurableMavenResolverSystem;
import org.jboss.shrinkwrap.resolver.api.maven.Maven;
import org.jboss.shrinkwrap.resolver.api.maven.repository.MavenChecksumPolicy;
import org.jboss.shrinkwrap.resolver.api.maven.repository.MavenRemoteRepositories;
import org.jboss.shrinkwrap.resolver.impl.maven.bootstrap.MavenSettingsBuilder;
import org.jboss.shrinkwrap.resolver.impl.maven.util.TestFileUtil;
import org.jboss.shrinkwrap.resolver.impl.maven.util.ValidationUtil;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* Ensures that remote repositories can be added without modifying settings.xml. This test will fail outside the presence of
* an internet connection and access to repo1.maven.org as well as repository.jboss.org
*
* @author <a href="mailto:marsu_pilami@msn.com">Marc-Antoine Gouillart</a>
*/
public class AdditionalRemoteRepositoryTestCase {
private static final String FAKE_REPO = "target/disabled-central-repo";
private static final String FAKE_SETTINGS = "target/settings/profile/settings.xml";
@BeforeClass
public static void setRemoteRepository() {
System.setProperty(MavenSettingsBuilder.ALT_GLOBAL_SETTINGS_XML_LOCATION, FAKE_SETTINGS);
System.setProperty(MavenSettingsBuilder.ALT_USER_SETTINGS_XML_LOCATION, FAKE_SETTINGS);
System.setProperty(MavenSettingsBuilder.ALT_LOCAL_REPOSITORY_LOCATION, FAKE_REPO);
}
/**
* Cleanup, remove the repositories from previous tests
*/
@Before
@After
// For debugging you might want to temporarily remove the @After lifecycle call just to sanity-check for yourself
// the repo
public void cleanup() throws Exception {
TestFileUtil.removeDirectory(new File(FAKE_REPO));
}
/**
* Ensures that we can contact Maven Central, i.e. web is accessible (as a control test)
*/
@Test
public void control1() {
// This should resolve from Maven Central
final File file = Maven.configureResolver().withClassPathResolution(false).resolve("junit:junit:4.11")
.withoutTransitivity().asSingle(File.class);
// Ensure we get JUnit
new ValidationUtil("junit").validate(file);
final File localRepo = new File(FAKE_REPO);
// Ensure we're pulling from the alternate repo we've designated above
Assert.assertTrue(file.getAbsolutePath().contains(localRepo.getAbsolutePath()));
}
/**
* Ensures the artifact we will fetch in the actual tests is no present in any default repositories.
*/
@Test(expected = NoResolvedResultException.class)
public void control2() {
final File file = Maven.configureResolver().withClassPathResolution(false).withMavenCentralRepo(false)
.resolve("junit:junit:4.11").withoutTransitivity().asSingle(File.class);
new ValidationUtil("junit").validate(file);
final File localRepo = new File(FAKE_REPO);
Assert.assertTrue(file.getAbsolutePath().contains(localRepo.getAbsolutePath()));
}
/**
* Ensures we can resolve an artifact from an explicitly pom-declared repository (this repo will be overloaded in a test)
*/
@Test
public void control3() {
File[] files = Resolvers.use(ConfigurableMavenResolverSystem.class).withMavenCentralRepo(false).loadPomFromFile(
"target/poms/test-remote-overload.xml").importCompileAndRuntimeDependencies().resolve().withTransitivity()
.as(File.class);
Assert.assertNotEquals("there were 0 dependencies!", 0, files.length);
}
/**
* Ensures the artifact we will fetch in the actual tests is no present in any default repositories.
*/
@Test(expected = InvalidConfigurationFileException.class)
public void control4() {
final File file = Maven.configureResolver().withClassPathResolution(false)
.withMavenCentralRepo(false).loadPomFromFile("pom.xml").resolve("junit:junit").withoutTransitivity().asSingle(File.class);
new ValidationUtil("junit").validate(file);
final File localRepo = new File(FAKE_REPO);
Assert.assertTrue(file.getAbsolutePath().contains(localRepo.getAbsolutePath()));
}
/**
* Tests the addition of a remote repository
*/
@Test
public void shouldFindArtifactWithExplicitRemoteRepository() throws Exception {
final File file = Maven.configureResolver()
.withClassPathResolution(false).withMavenCentralRepo(false)
.withRemoteRepo("jboss", "https://repository.jboss.org/nexus/content/repositories/releases/", "default")
.resolve("org.hornetq:hornetq-core:2.0.0.GA")
.withoutTransitivity().asSingle(File.class);
final File localRepo = new File(FAKE_REPO);
// Ensure we're pulling from the alternate repo we've designated above
Assert.assertTrue(file.getAbsolutePath().contains(localRepo.getAbsolutePath()));
}
/**
* Tests the addition of a remote repository through the builder API
*/
@Test
public void shouldFindArtifactWithExplicitRemoteRepositoryBuilder() throws Exception {
final File file = Maven
.configureResolver()
.withClassPathResolution(false)
.withMavenCentralRepo(false)
.withRemoteRepo(
MavenRemoteRepositories.createRemoteRepository("jboss",
"https://repository.jboss.org/nexus/content/repositories/releases/", "default")
.setChecksumPolicy(MavenChecksumPolicy.CHECKSUM_POLICY_IGNORE))
.resolve("org.hornetq:hornetq-core:2.0.0.GA")
.withoutTransitivity()
.asSingle(File.class);
final File localRepo = new File(FAKE_REPO);
// Ensure we're pulling from the alternate repo we've designated above
Assert.assertTrue(file.getAbsolutePath().contains(localRepo.getAbsolutePath()));
}
/**
* Test behaviour with an invalid URL
*/
@Test(expected = IllegalArgumentException.class)
public void shouldThrowIllegalArgumentException4() throws Exception {
Maven.configureResolver()
.withClassPathResolution(false).withMavenCentralRepo(false)
.withRemoteRepo("jboss", "wrong://repository.jboss.org/nexus/content/repositories/releases/", "default")
.loadPomFromFile("pom.xml").resolve("org.hornetq:hornetq-core:2.0.0.GA")
.withoutTransitivity().asSingle(File.class);
}
/**
* Test behaviour with a wrong URL
*/
@Test(expected = NoResolvedResultException.class)
public void shouldThrowNoResolvedResultException() throws Exception {
Maven.configureResolver()
.withClassPathResolution(false).withMavenCentralRepo(false)
.withRemoteRepo("jboss", "https://repository123.jboss.org/nexus/content/repositories/releases/", "default")
.resolve("org.hornetq:hornetq-core:2.0.0.GA")
.withoutTransitivity().asSingle(File.class);
}
/**
* Test behaviour with a null repository ID
*/
@Test(expected = IllegalArgumentException.class)
public void shouldThrowIllegalArgumentException1() throws Exception {
Maven.configureResolver()
.withClassPathResolution(false).withMavenCentralRepo(false)
.withRemoteRepo(null, "https://repository.jboss.org/nexus/content/repositories/releases/", "default")
.loadPomFromFile("pom.xml").resolve("org.hornetq:hornetq-core:2.0.0.GA")
.withoutTransitivity().asSingle(File.class);
}
/**
* Test behaviour with a null URL
*/
@Test(expected = IllegalArgumentException.class)
public void shouldThrowIllegalArgumentException5() throws Exception {
Maven.configureResolver()
.withClassPathResolution(false).withMavenCentralRepo(false)
.withRemoteRepo("jboss", (String) null, "default").loadPomFromFile("pom.xml")
.resolve("org.hornetq:hornetq-core:2.0.0.GA")
.withoutTransitivity().asSingle(File.class);
}
/**
* Test behaviour with a non default layout (which is impossible in Maven 3)
*/
@Test(expected = IllegalArgumentException.class)
public void shouldThrowIllegalArgumentException2() throws Exception {
Maven.configureResolver()
.withClassPathResolution(false).withMavenCentralRepo(false)
.withRemoteRepo("jboss", "https://repository.jboss.org/nexus/content/repositories/releases/", "legacy")
.loadPomFromFile("pom.xml").resolve("org.hornetq:hornetq-core:2.0.0.GA")
.withoutTransitivity().asSingle(File.class);
}
/**
* Test behaviour with a null layout
*/
@Test(expected = IllegalArgumentException.class)
public void shouldThrowIllegalArgumentException3() throws Exception {
Maven.configureResolver()
.withClassPathResolution(false).withMavenCentralRepo(false)
.withRemoteRepo("jboss", "https://repository.jboss.org/nexus/content/repositories/releases/", null)
.loadPomFromFile("pom.xml").resolve("org.hornetq:hornetq-core:2.0.0.GA")
.withoutTransitivity().asSingle(File.class);
}
/**
* This test overloads a valid (tested in a control test) repository by a non-working repository. Artifact should
* therefore not resolve.
*/
@Test(expected = NoResolvedResultException.class)
public void shouldOverloadRepository() throws Exception {
Resolvers.use(ConfigurableMavenResolverSystem.class)
.withMavenCentralRepo(false)
.withRemoteRepo("test-repository", "http://127.0.0.1", "default")
.withClassPathResolution(false)
.loadPomFromFile("target/poms/test-remote-overload.xml")
.importCompileAndRuntimeDependencies().resolve()
.withTransitivity().as(File.class);
}
/**
* This test overloads Maven Central repository
*
* @throws Exception
*/
@Test(expected = NoResolvedResultException.class)
public void shouldOverloadCentral() throws Exception {
Maven.configureResolver()
.withRemoteRepo("central", "http://127.0.0.1", "default")
.withClassPathResolution(false).resolve("junit:junit:4.11")
.withTransitivity().as(File.class);
}
}