/*
* #%L
* Wisdom-Framework
* %%
* Copyright (C) 2013 - 2014 Wisdom Framework
* %%
* 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.
* #L%
*/
package org.wisdom.maven.osgi;
import aQute.bnd.osgi.Constants;
import com.google.common.collect.ImmutableList;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.DefaultArtifact;
import org.junit.Test;
import java.io.File;
import java.util.Properties;
import static org.assertj.core.api.Assertions.assertThat;
public class DependencyEmbedderTest {
TestReporter reporter = new TestReporter();
@Test
public void testSimpleEmbedding() {
Properties instructions = new Properties();
instructions.setProperty(DependencyEmbedder.EMBED_DEPENDENCY, "*:acme-sample");
DependencyEmbedder dependencyEmbedder = new DependencyEmbedder(instructions, reporter);
final Artifact acme = create("acme", "acme-sample", "1");
ProjectDependencies dependencies = new ProjectDependencies(
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme),
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme)
);
Properties properties = dependencyEmbedder.generate(instructions, dependencies);
assertThat(properties.getProperty(Constants.INCLUDE_RESOURCE))
.contains("@" + acme.getFile().getAbsolutePath());
assertThat(properties.getProperty(Constants.BUNDLE_CLASSPATH)).isNull();
}
@Test
public void testSimpleEmbeddingSpecifyingInline() {
Properties instructions = new Properties();
instructions.setProperty(DependencyEmbedder.EMBED_DEPENDENCY, "*:acme-sample;inline=true");
DependencyEmbedder dependencyEmbedder = new DependencyEmbedder(instructions, reporter);
final Artifact acme = create("acme", "acme-sample", "1");
ProjectDependencies dependencies = new ProjectDependencies(
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme),
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme)
);
Properties properties = dependencyEmbedder.generate(instructions, dependencies);
assertThat(properties.getProperty(Constants.INCLUDE_RESOURCE))
.contains("@" + acme.getFile().getAbsolutePath());
assertThat(properties.getProperty(Constants.BUNDLE_CLASSPATH)).isNull();
}
@Test
public void testEmbeddingWithoutMatch() {
Properties instructions = new Properties();
instructions.setProperty(DependencyEmbedder.EMBED_DEPENDENCY, "*:acme-sample-missing");
DependencyEmbedder dependencyEmbedder = new DependencyEmbedder(instructions, reporter);
final Artifact acme = create("acme", "acme-sample", "1");
ProjectDependencies dependencies = new ProjectDependencies(
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme),
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme)
);
Properties properties = dependencyEmbedder.generate(instructions, dependencies);
assertThat(properties.getProperty(Constants.INCLUDE_RESOURCE)).isNull();
assertThat(properties.getProperty(Constants.BUNDLE_CLASSPATH)).isNull();
}
@Test
public void testSimpleEmbeddingNoInline() {
Properties instructions = new Properties();
instructions.setProperty(DependencyEmbedder.EMBED_DEPENDENCY, "*:acme-sample;inline=false");
DependencyEmbedder dependencyEmbedder = new DependencyEmbedder(instructions, reporter);
final Artifact acme = create("acme", "acme-sample", "1");
ProjectDependencies dependencies = new ProjectDependencies(
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme),
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme)
);
Properties properties = dependencyEmbedder.generate(instructions, dependencies);
assertThat(properties.getProperty(Constants.INCLUDE_RESOURCE))
.contains(acme.getFile().getAbsolutePath())
.doesNotContain("@");
assertThat(properties.getProperty(Constants.BUNDLE_CLASSPATH))
.contains(".,").contains(acme.getFile().getName());
}
@Test
public void testSimpleEmbeddingInlinePath() {
Properties instructions = new Properties();
instructions.setProperty(DependencyEmbedder.EMBED_DEPENDENCY, "*:acme-sample;inline=images/**");
DependencyEmbedder dependencyEmbedder = new DependencyEmbedder(instructions, reporter);
final Artifact acme = create("acme", "acme-sample", "1");
ProjectDependencies dependencies = new ProjectDependencies(
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme),
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme)
);
Properties properties = dependencyEmbedder.generate(instructions, dependencies);
assertThat(properties.getProperty(Constants.INCLUDE_RESOURCE))
.contains("@" + acme.getFile().getAbsolutePath() + "!/images/**");
assertThat(properties.getProperty(Constants.BUNDLE_CLASSPATH)).isNull();
}
@Test
public void testMultiEmbedding() {
Properties instructions = new Properties();
instructions.setProperty(DependencyEmbedder.EMBED_DEPENDENCY, "acme:*");
DependencyEmbedder dependencyEmbedder = new DependencyEmbedder(instructions, reporter);
final Artifact acme = create("acme", "acme-sample", "1");
final Artifact acme2 = create("acme", "acme-sample-2", "1");
ProjectDependencies dependencies = new ProjectDependencies(
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme, acme2),
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme, acme2)
);
Properties properties = dependencyEmbedder.generate(instructions, dependencies);
assertThat(properties.getProperty(Constants.INCLUDE_RESOURCE))
.contains("@" + acme.getFile().getAbsolutePath())
.contains("@" + acme2.getFile().getAbsolutePath());
assertThat(properties.getProperty(Constants.BUNDLE_CLASSPATH)).isNull();
}
@Test
public void testMultiEmbeddingNoInline() {
Properties instructions = new Properties();
instructions.setProperty(DependencyEmbedder.EMBED_DEPENDENCY, "acme:*;inline=false");
DependencyEmbedder dependencyEmbedder = new DependencyEmbedder(instructions, reporter);
final Artifact acme = create("acme", "acme-sample", "1");
final Artifact acme2 = create("acme", "acme-sample-2", "1");
ProjectDependencies dependencies = new ProjectDependencies(
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme, acme2),
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme, acme2)
);
Properties properties = dependencyEmbedder.generate(instructions, dependencies);
assertThat(properties.getProperty(Constants.INCLUDE_RESOURCE))
.contains(acme.getFile().getAbsolutePath())
.contains(acme2.getFile().getAbsolutePath())
.doesNotContain("@");
assertThat(properties.getProperty(Constants.BUNDLE_CLASSPATH))
.contains(".,")
.contains(acme.getFile().getName())
.contains(acme2.getFile().getName());
}
private Artifact create(String g, String a, String v) {
DefaultArtifact artifact = new MavenArtifact();
artifact.setGroupId(g);
artifact.setArtifactId(a);
artifact.setVersion(v);
artifact.setFile(new File("target/junk/" + a + "-" + v + ".jar"));
return artifact;
}
@Test
public void tesMultiEmbeddingInlinePath() {
Properties instructions = new Properties();
instructions.setProperty(DependencyEmbedder.EMBED_DEPENDENCY, "acme:*;inline=images/**");
DependencyEmbedder dependencyEmbedder = new DependencyEmbedder(instructions, reporter);
final Artifact acme = create("acme", "acme-sample", "1");
final Artifact acme2 = create("acme", "acme-sample-2", "1");
ProjectDependencies dependencies = new ProjectDependencies(
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme, acme2),
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme, acme2)
);
Properties properties = dependencyEmbedder.generate(instructions, dependencies);
assertThat(properties.getProperty(Constants.INCLUDE_RESOURCE))
.contains("@" + acme.getFile().getAbsolutePath() + "!/images/**")
.contains("@" + acme2.getFile().getAbsolutePath() + "!/images/**");
assertThat(properties.getProperty(Constants.BUNDLE_CLASSPATH)).isNull();
}
@Test
public void testScopeFiltering() {
Properties instructions = new Properties();
instructions.setProperty(DependencyEmbedder.EMBED_DEPENDENCY, "acme:*;scope=provided");
DependencyEmbedder dependencyEmbedder = new DependencyEmbedder(instructions, reporter);
final Artifact acme = create("acme", "acme-sample", "1");
acme.setScope("provided");
final Artifact acme2 = create("acme", "acme-sample-2", "1");
acme2.setScope("compile");
ProjectDependencies dependencies = new ProjectDependencies(
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme, acme2),
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme, acme2)
);
Properties properties = dependencyEmbedder.generate(instructions, dependencies);
assertThat(properties.getProperty(Constants.INCLUDE_RESOURCE))
.contains("@" + acme.getFile().getAbsolutePath())
.doesNotContain("@" + acme2.getFile().getAbsolutePath());
assertThat(properties.getProperty(Constants.BUNDLE_CLASSPATH)).isNull();
}
@Test
public void testGroupIdAndVersionFiltering() {
Properties instructions = new Properties();
instructions.setProperty(DependencyEmbedder.EMBED_DEPENDENCY, "acme:*:*:1");
DependencyEmbedder dependencyEmbedder = new DependencyEmbedder(instructions, reporter);
Artifact acme = create("acme", "acme-sample", "1");
acme.setScope("provided");
Artifact acme2 = create("acme", "acme-sample-2", "1");
ProjectDependencies dependencies = new ProjectDependencies(
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme, acme2),
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme, acme2)
);
Properties properties = dependencyEmbedder.generate(instructions, dependencies);
assertThat(properties.getProperty(Constants.INCLUDE_RESOURCE))
.contains("@" + acme.getFile().getAbsolutePath())
.contains("@" + acme2.getFile().getAbsolutePath());
assertThat(properties.getProperty(Constants.BUNDLE_CLASSPATH)).isNull();
instructions.setProperty(DependencyEmbedder.EMBED_DEPENDENCY, "acme:*:*:2");
dependencyEmbedder = new DependencyEmbedder(instructions, reporter);
acme = create("acme", "acme-sample", "2");
acme.setScope("provided");
acme2 = create("acme", "acme-sample-2", "1");
dependencies = new ProjectDependencies(
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme, acme2),
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme, acme2)
);
properties = dependencyEmbedder.generate(instructions, dependencies);
assertThat(properties.getProperty(Constants.INCLUDE_RESOURCE))
.contains("@" + acme.getFile().getAbsolutePath())
.doesNotContain("@" + acme2.getFile().getAbsolutePath());
assertThat(properties.getProperty(Constants.BUNDLE_CLASSPATH)).isNull();
}
@Test
public void testTransitiveUsingEmbedTransitive() {
Properties instructions = new Properties();
instructions.setProperty(DependencyEmbedder.EMBED_DEPENDENCY, "acme:acme-sample,deps:*");
instructions.setProperty(DependencyEmbedder.EMBED_TRANSITIVE, "True");
DependencyEmbedder dependencyEmbedder = new DependencyEmbedder(instructions, reporter);
final Artifact deps = create("deps", "acme-deps", "1");
final Artifact acme = create("acme", "acme-sample", "1");
acme.setDependencyTrail(ImmutableList.of(deps.getId(), acme.getId()));
final Artifact acme2 = create("acme", "acme-sample-2", "1");
ProjectDependencies dependencies = new ProjectDependencies(
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme, acme2),
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme, acme2, deps)
);
Properties properties = dependencyEmbedder.generate(instructions, dependencies);
assertThat(properties.getProperty(Constants.INCLUDE_RESOURCE))
.contains("@" + acme.getFile().getAbsolutePath())
.contains("@" + deps.getFile().getAbsolutePath())
.doesNotContain("@" + acme2.getFile().getAbsolutePath());
assertThat(properties.getProperty(Constants.BUNDLE_CLASSPATH)).isNull();
}
@Test
public void testTransitiveWithoutEmbedTransitive() {
Properties instructions = new Properties();
instructions.setProperty(DependencyEmbedder.EMBED_DEPENDENCY, "acme:acme-sample,deps:*");
instructions.setProperty(DependencyEmbedder.EMBED_TRANSITIVE, "false");
DependencyEmbedder dependencyEmbedder = new DependencyEmbedder(instructions, reporter);
final Artifact deps = create("deps", "acme-deps", "1");
final Artifact acme = create("acme", "acme-sample", "1");
acme.setDependencyTrail(ImmutableList.of(deps.getId(), acme.getId()));
final Artifact acme2 = create("acme", "acme-sample-2", "1");
ProjectDependencies dependencies = new ProjectDependencies(
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme, acme2),
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme, acme2, deps)
);
Properties properties = dependencyEmbedder.generate(instructions, dependencies);
assertThat(properties.getProperty(Constants.INCLUDE_RESOURCE))
.contains("@" + acme.getFile().getAbsolutePath())
.doesNotContain("@" + deps.getFile().getAbsolutePath())
.doesNotContain("@" + acme2.getFile().getAbsolutePath());
assertThat(properties.getProperty(Constants.BUNDLE_CLASSPATH)).isNull();
}
@Test
public void testTransitiveUsingTransitiveAttribute() {
Properties instructions = new Properties();
instructions.setProperty(DependencyEmbedder.EMBED_DEPENDENCY, "acme:acme-sample,deps:*;transitive=true");
DependencyEmbedder dependencyEmbedder = new DependencyEmbedder(instructions, reporter);
final Artifact deps = create("deps", "acme-deps", "1");
final Artifact acme = create("acme", "acme-sample", "1");
acme.setDependencyTrail(ImmutableList.of(deps.getId(), acme.getId()));
final Artifact acme2 = create("acme", "acme-sample-2", "1");
ProjectDependencies dependencies = new ProjectDependencies(
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme, acme2),
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme, acme2, deps)
);
Properties properties = dependencyEmbedder.generate(instructions, dependencies);
assertThat(properties.getProperty(Constants.INCLUDE_RESOURCE))
.contains("@" + acme.getFile().getAbsolutePath())
.contains("@" + deps.getFile().getAbsolutePath())
.doesNotContain("@" + acme2.getFile().getAbsolutePath());
assertThat(properties.getProperty(Constants.BUNDLE_CLASSPATH)).isNull();
}
@Test
public void testTransitiveUsingEmbedTransitiveAndNoInline() {
Properties instructions = new Properties();
instructions.setProperty(DependencyEmbedder.EMBED_DEPENDENCY, "acme:acme-sample;inline=false,"
+ "deps:*;inline=false");
instructions.setProperty(DependencyEmbedder.EMBED_TRANSITIVE, "True");
DependencyEmbedder dependencyEmbedder = new DependencyEmbedder(instructions, reporter);
final Artifact deps = create("deps", "acme-deps", "1");
final Artifact acme = create("acme", "acme-sample", "1");
acme.setDependencyTrail(ImmutableList.of(deps.getId(), acme.getId()));
final Artifact acme2 = create("acme", "acme-sample-2", "1");
ProjectDependencies dependencies = new ProjectDependencies(
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme, acme2),
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme, acme2, deps)
);
Properties properties = dependencyEmbedder.generate(instructions, dependencies);
assertThat(properties.getProperty(Constants.INCLUDE_RESOURCE))
.contains(acme.getFile().getAbsolutePath())
.contains(deps.getFile().getAbsolutePath())
.doesNotContain("@")
.doesNotContain(acme2.getFile().getName());
assertThat(properties.getProperty(Constants.BUNDLE_CLASSPATH)).contains(acme.getFile().getName(),
deps.getFile().getName(), "., ");
}
@Test
public void testExclusionOfTransitiveDependencies() {
Properties instructions = new Properties();
instructions.setProperty(DependencyEmbedder.EMBED_DEPENDENCY, "acme:acme-sample," +
"deps:*;exclude=*:acme-deps-excluded");
instructions.setProperty(DependencyEmbedder.EMBED_TRANSITIVE, "True");
DependencyEmbedder dependencyEmbedder = new DependencyEmbedder(instructions, reporter);
final Artifact deps = create("deps", "acme-deps", "1");
final Artifact excluded = create("deps", "acme-deps-excluded", "1");
final Artifact acme = create("acme", "acme-sample", "1");
acme.setDependencyTrail(ImmutableList.of(deps.getId(), acme.getId()));
final Artifact acme2 = create("acme", "acme-sample-2", "1");
ProjectDependencies dependencies = new ProjectDependencies(
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme, acme2),
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme, acme2, deps, excluded)
);
Properties properties = dependencyEmbedder.generate(instructions, dependencies);
assertThat(properties.getProperty(Constants.INCLUDE_RESOURCE))
.contains("@" + acme.getFile().getAbsolutePath())
.contains("@" + deps.getFile().getAbsolutePath())
.doesNotContain("@" + acme2.getFile().getAbsolutePath())
.doesNotContain("@" + excluded.getFile().getAbsolutePath());
assertThat(properties.getProperty(Constants.BUNDLE_CLASSPATH)).isNull();
}
@Test
public void testExclusion() {
Properties instructions = new Properties();
instructions.setProperty(DependencyEmbedder.EMBED_DEPENDENCY,
"*;exclude=:acme-sample-2|:wisdom-api");
DependencyEmbedder dependencyEmbedder = new DependencyEmbedder(instructions, reporter);
final Artifact deps = create("deps", "acme-deps", "1");
final Artifact acme = create("acme", "acme-sample", "1");
acme.setDependencyTrail(ImmutableList.of(deps.getId(), acme.getId()));
final Artifact acme2 = create("acme", "acme-sample-2", "1");
ProjectDependencies dependencies = new ProjectDependencies(
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme, acme2),
ImmutableList.of(create("org.wisdom-framework", "wisdom-api", "1"),
acme, acme2, deps)
);
Properties properties = dependencyEmbedder.generate(instructions, dependencies);
assertThat(properties.getProperty(Constants.INCLUDE_RESOURCE))
.contains("@" + acme.getFile().getAbsolutePath())
.doesNotContain("deps")
.doesNotContain("wisdom-api")
.doesNotContain("@" + acme2.getFile().getAbsolutePath());
assertThat(properties.getProperty(Constants.BUNDLE_CLASSPATH)).isNull();
}
private class TestReporter implements Reporter {
@Override
public void error(String msg) {
System.err.println("ERROR : " + msg);
}
@Override
public void warn(String msg) {
System.err.println("WARNING : " + msg);
}
}
}