package org.wildfly.swarm.tools;
import java.util.HashSet;
import java.util.Set;
import java.util.function.Consumer;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.StringAsset;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.Before;
import org.junit.Test;
import org.wildfly.swarm.bootstrap.env.FractionManifest;
import org.wildfly.swarm.bootstrap.env.WildFlySwarmManifest;
import static org.fest.assertions.Assertions.assertThat;
/**
* @author Bob McWhirter
*/
public class DependencyManagerTest {
private static MockArtifactResolver RESOLVER = new MockArtifactResolver();
private static ArtifactSpec SERVLET_SPEC = simple("org.jboss.spec.javax.servlet:jboss-servlet-api_3.1_spec:jar:1.0.0.Final");
private static ArtifactSpec JAXRS_SPEC = simple("org.jboss.spec.javax.ws.rs:jboss-jaxrs-api_2.0_spec:1.0.0.Final", (config)->{
config.addDependency( SERVLET_SPEC );
});
private static ArtifactSpec COMMON_DEP = simple("org.useful:utility:1.0");
private static ArtifactSpec UNDERTOW_FRACTION = fraction("org.wildfly.swarm:undertow", (config) -> {
config.addDependency(SERVLET_SPEC);
config.addDependency(COMMON_DEP);
});
private static ArtifactSpec JAXRS_FRACTION = fraction("org.wildfly.swarm:jaxrs", (config) -> {
config.addDependency(JAXRS_SPEC);
config.addDependency(COMMON_DEP);
config.addDependency(UNDERTOW_FRACTION);
});
private DependencyManager manager;
@Before
public void setUp() {
this.manager = new DependencyManager(RESOLVER);
}
@Test
public void testNoSwarmJars() throws Exception {
// Explicitly asked-for dependencies are also the full resolved tree
DeclaredDependencies declaredDependencies = new DeclaredDependencies();
declaredDependencies.add(JAXRS_SPEC, SERVLET_SPEC);
declaredDependencies.add(COMMON_DEP);
manager.analyzeDependencies(false, declaredDependencies);
assertThat(manager.getRemovableDependencies()).isEmpty();
assertThat(manager.getDependencies()).containsOnly(JAXRS_SPEC, SERVLET_SPEC, COMMON_DEP);
WildFlySwarmManifest manifest = manager.getWildFlySwarmManifest();
// these are empty because we have not actually done any auto-detection.
assertThat(manifest.bootstrapArtifacts()).isEmpty();
assertThat(manifest.bootstrapModules()).isEmpty();
assertThat(manifest.getDependencies()).containsOnly(
SERVLET_SPEC.mavenGav(),
JAXRS_SPEC.mavenGav(),
COMMON_DEP.mavenGav() );
}
@Test
public void testAutodetectedSwarmJar() throws Exception {
// Explicitly asked-for dependencies are also the full resolved tree
DeclaredDependencies declaredDependencies = new DeclaredDependencies();
declaredDependencies.add(JAXRS_SPEC, SERVLET_SPEC);
declaredDependencies.add(COMMON_DEP);
declaredDependencies.add(JAXRS_FRACTION, JAXRS_SPEC);
declaredDependencies.add(JAXRS_FRACTION, COMMON_DEP);
declaredDependencies.add(JAXRS_FRACTION, UNDERTOW_FRACTION);
declaredDependencies.add(JAXRS_SPEC, SERVLET_SPEC);
manager.analyzeDependencies(true, declaredDependencies);
assertThat(manager.getRemovableDependencies()).containsOnly(JAXRS_FRACTION, UNDERTOW_FRACTION);
assertThat(manager.getDependencies()).containsOnly(JAXRS_FRACTION, UNDERTOW_FRACTION, JAXRS_SPEC, SERVLET_SPEC, COMMON_DEP);
WildFlySwarmManifest manifest = manager.getWildFlySwarmManifest();
assertThat(manifest.bootstrapArtifacts()).containsOnly( JAXRS_FRACTION.mavenGav(), UNDERTOW_FRACTION.mavenGav() );
assertThat(manifest.bootstrapModules()).containsOnly( "org.wildfly.swarm.jaxrs", "org.wildfly.swarm.undertow" );
// still includes the jaxrs-spec because it was explicit and we just can't know
assertThat(manifest.getDependencies()).containsOnly(
SERVLET_SPEC.mavenGav(),
JAXRS_SPEC.mavenGav(),
COMMON_DEP.mavenGav() );
}
@Test
public void testAutodetectedSwarmJarNoExplicitCommon() throws Exception {
// Explicitly asked-for dependencies are also the full resolved tree
DeclaredDependencies declaredDependencies = new DeclaredDependencies();
declaredDependencies.add(JAXRS_SPEC, SERVLET_SPEC);
declaredDependencies.add(JAXRS_FRACTION, JAXRS_SPEC);
declaredDependencies.add(JAXRS_FRACTION, COMMON_DEP);
declaredDependencies.add(JAXRS_FRACTION, UNDERTOW_FRACTION);
declaredDependencies.add(JAXRS_SPEC, SERVLET_SPEC);
manager.analyzeDependencies(true, declaredDependencies);
assertThat(manager.getRemovableDependencies()).containsOnly(JAXRS_FRACTION, UNDERTOW_FRACTION, COMMON_DEP);
assertThat(manager.getDependencies()).containsOnly(JAXRS_FRACTION, UNDERTOW_FRACTION, SERVLET_SPEC, JAXRS_SPEC, COMMON_DEP);
WildFlySwarmManifest manifest = manager.getWildFlySwarmManifest();
assertThat(manifest.bootstrapArtifacts()).containsOnly( JAXRS_FRACTION.mavenGav(), UNDERTOW_FRACTION.mavenGav() );
assertThat(manifest.bootstrapModules()).containsOnly( "org.wildfly.swarm.jaxrs", "org.wildfly.swarm.undertow" );
// still includes the jaxrs-spec because it was explicit and we just can't know
assertThat(manifest.getDependencies()).containsOnly( JAXRS_SPEC.mavenGav(), SERVLET_SPEC.mavenGav() );
}
@Test
public void testWithSwarmJarBeingOnlyUserOfDep() throws Exception {
// Only :jaxrs is the explicit resolved tree, but brings in jaxrs-spec and common dep
DeclaredDependencies declaredDependencies = new DeclaredDependencies();
declaredDependencies.add(JAXRS_FRACTION, JAXRS_SPEC);
declaredDependencies.add(JAXRS_FRACTION, COMMON_DEP);
declaredDependencies.add(JAXRS_FRACTION, UNDERTOW_FRACTION);
declaredDependencies.add(JAXRS_FRACTION, SERVLET_SPEC);
manager.analyzeDependencies(false, declaredDependencies);
assertThat(manager.getRemovableDependencies()).containsOnly(JAXRS_FRACTION, JAXRS_SPEC, UNDERTOW_FRACTION, SERVLET_SPEC, COMMON_DEP);
assertThat(manager.getDependencies()).containsOnly(JAXRS_FRACTION, JAXRS_SPEC, UNDERTOW_FRACTION, SERVLET_SPEC, COMMON_DEP);
WildFlySwarmManifest manifest = manager.getWildFlySwarmManifest();
assertThat(manifest.bootstrapArtifacts()).containsOnly(JAXRS_FRACTION.mavenGav(), UNDERTOW_FRACTION.mavenGav());
assertThat(manifest.bootstrapModules()).containsOnly("org.wildfly.swarm.jaxrs", "org.wildfly.swarm.undertow");
assertThat(manifest.getDependencies()).isEmpty();
}
@Test
public void testWithApplicationAlsoUsingDep() throws Exception {
// :jaxrs and common dep are explicit, implying application needs common
DeclaredDependencies declaredDependencies = new DeclaredDependencies();
declaredDependencies.add(JAXRS_FRACTION, JAXRS_SPEC);
declaredDependencies.add(JAXRS_FRACTION, COMMON_DEP);
declaredDependencies.add(JAXRS_FRACTION, UNDERTOW_FRACTION);
declaredDependencies.add(JAXRS_FRACTION, SERVLET_SPEC);
declaredDependencies.add(COMMON_DEP);
manager.analyzeDependencies(false, declaredDependencies);
assertThat(manager.getRemovableDependencies()).containsOnly(JAXRS_FRACTION, JAXRS_SPEC, UNDERTOW_FRACTION, SERVLET_SPEC);
assertThat(manager.getDependencies()).containsOnly(JAXRS_FRACTION, JAXRS_SPEC, COMMON_DEP, UNDERTOW_FRACTION, SERVLET_SPEC);
WildFlySwarmManifest manifest = manager.getWildFlySwarmManifest();
assertThat(manifest.bootstrapArtifacts()).containsOnly(JAXRS_FRACTION.mavenGav(), UNDERTOW_FRACTION.mavenGav());
assertThat(manifest.bootstrapModules()).containsOnly("org.wildfly.swarm.jaxrs", "org.wildfly.swarm.undertow");
assertThat( manifest.getDependencies() ).containsOnly( COMMON_DEP.mavenGav() );
}
@Test
public void testComparison() throws Exception {
Set<ArtifactSpec> samples = new HashSet<>();
samples.add(JAXRS_SPEC);
samples.add(COMMON_DEP);
ArtifactSpec sameCommonSpec = ArtifactSpec.fromMscGav("org.useful:utility:1.0");
assertThat(samples).contains(sameCommonSpec);
org.junit.Assert.assertFalse(samples.contains(SERVLET_SPEC));
}
private static ArtifactSpec simple(String gav) {
ArtifactSpec spec = ArtifactSpec.fromMscGav(gav);
RESOLVER.add(spec);
return spec;
}
private static ArtifactSpec simple(String gav, Consumer<MockArtifactResolver.Entry> config) {
ArtifactSpec spec = ArtifactSpec.fromMscGav(gav);
RESOLVER.add(spec, config);
return spec;
}
private static ArtifactSpec fraction(String ga, Consumer<MockArtifactResolver.Entry> config) {
String moduleName = ga.replace(':', '.');
String gav = ga + ":" + System.getProperty("project.version");
ArtifactSpec spec = ArtifactSpec.fromMscGav(gav);
JavaArchive jar = ShrinkWrap.create( JavaArchive.class );
StringBuilder yaml = new StringBuilder();
yaml.append( "module: " + moduleName );
jar.add(new StringAsset(yaml.toString()), FractionManifest.CLASSPATH_LOCATION );
RESOLVER.add(spec, jar, config);
return spec;
}
}