package io.takari.maven.plugins.testproperties;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.DefaultArtifact;
import org.apache.maven.artifact.handler.ArtifactHandler;
import org.apache.maven.artifact.handler.DefaultArtifactHandler;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.execution.ProjectDependencyGraph;
import org.apache.maven.plugin.MojoExecution;
import org.apache.maven.plugin.descriptor.PluginDescriptor;
import org.apache.maven.project.MavenProject;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import com.google.common.base.Charsets;
import com.google.common.hash.HashCode;
import com.google.common.hash.Hashing;
import com.google.common.io.Files;
import io.takari.incrementalbuild.maven.testing.IncrementalBuildRule;
import io.takari.maven.testing.TestResources;
public class TestPropertiesMojoTest {
@Rule
public final TestResources resources = new TestResources();
@Rule
public final IncrementalBuildRule mojos = new IncrementalBuildRule();
@Rule
public final TemporaryFolder temp = new TemporaryFolder();
private MojoExecution newMojoExecution() throws IOException {
MojoExecution execution = mojos.newMojoExecution("testProperties");
PluginDescriptor pluginDescriptor = execution.getMojoDescriptor().getPluginDescriptor();
ArtifactHandler handler = new DefaultArtifactHandler("jar");
DefaultArtifact workspaceResolver = new DefaultArtifact("io.takari.m2e.workspace", "org.eclipse.m2e.workspace.cli", "1", Artifact.SCOPE_COMPILE, ".jar", null, handler);
workspaceResolver.setFile(new File("target/workspaceResolver.jar").getCanonicalFile());
List<Artifact> pluginArtifacts = new ArrayList<>(pluginDescriptor.getArtifacts());
pluginArtifacts.add(workspaceResolver);
pluginDescriptor.setArtifacts(pluginArtifacts);
return execution;
}
@Test
public void testIncremental() throws Exception {
File basedir = resources.getBasedir("testproperties/basic");
final MavenProject project = mojos.readMavenProject(basedir);
MavenSession session = mojos.newMavenSession(project);
session.setProjectDependencyGraph(new ProjectDependencyGraph() {
@Override
public List<MavenProject> getUpstreamProjects(MavenProject project, boolean transitive) {
return Collections.emptyList();
}
@Override
public List<MavenProject> getSortedProjects() {
return Collections.singletonList(project);
}
@Override
public List<MavenProject> getDownstreamProjects(MavenProject project, boolean transitive) {
return Collections.emptyList();
}
});
mojos.executeMojo(session, project, newMojoExecution());
mojos.assertBuildOutputs(basedir, "target/test-classes/test.properties", "target/workspacestate.properties");
File testProperties = new File(basedir, "target/test-classes/test.properties");
File workspaceState = new File(basedir, "target/workspacestate.properties");
long testPropertiesLastmodified = testProperties.lastModified();
long workspaceStateLastmodified = workspaceState.lastModified();
HashCode testPropertiesSha1 = Files.hash(testProperties, Hashing.sha1());
HashCode workspaceStateSha1 = Files.hash(workspaceState, Hashing.sha1());
mojos.executeMojo(session, project, newMojoExecution());
// mojos.assertCarriedOverOutputs(basedir, "target/test-classes/test.properties", "target/workspacestate.properties");
Assert.assertEquals(testPropertiesLastmodified, testProperties.lastModified());
Assert.assertEquals(workspaceStateLastmodified, workspaceState.lastModified());
Assert.assertEquals(testPropertiesSha1, sha1(basedir, "target/test-classes/test.properties"));
Assert.assertEquals(workspaceStateSha1, sha1(basedir, "target/workspacestate.properties"));
}
@Test
public void testOffline() throws Exception {
File basedir = resources.getBasedir("testproperties/basic");
MavenProject project = mojos.readMavenProject(basedir);
MavenSession session = mojos.newMavenSession(project);
session.getRequest().setOffline(true);
mojos.executeMojo(session, project, newMojoExecution());
Assert.assertEquals("true", readProperties(basedir).get("offline"));
session.getRequest().setOffline(false);
mojos.executeMojo(session, project, newMojoExecution());
Assert.assertEquals("false", readProperties(basedir).get("offline"));
}
@Test
public void testUpdateSnapshots() throws Exception {
File basedir = resources.getBasedir("testproperties/basic");
MavenProject project = mojos.readMavenProject(basedir);
MavenSession session = mojos.newMavenSession(project);
session.getRequest().setUpdateSnapshots(true);
mojos.executeMojo(session, project, newMojoExecution());
Assert.assertEquals("true", readProperties(basedir).get("updateSnapshots"));
session.getRequest().setUpdateSnapshots(false);
mojos.executeMojo(session, project, newMojoExecution());
Assert.assertEquals("false", readProperties(basedir).get("updateSnapshots"));
}
@Test
public void testCustomTestPropertiesFile() throws Exception {
File basedir = resources.getBasedir("testproperties/custom-test-properties-file");
MavenProject project = mojos.readMavenProject(basedir);
MavenSession session = mojos.newMavenSession(project);
mojos.executeMojo(session, project, newMojoExecution());
Assert.assertEquals("value", readProperties(basedir).get("custom"));
TestResources.cp(basedir, "src/test/modified-test.properties", "src/test/test.properties");
mojos.executeMojo(session, project, newMojoExecution());
Assert.assertEquals("modified-value", readProperties(basedir).get("custom"));
}
@Test
public void testWorkspaceStateIncludesThisProjectJarArtifact() throws Exception {
File basedir = resources.getBasedir();
MavenProject project = mojos.readMavenProject(basedir);
MavenSession session = mojos.newMavenSession(project);
mojos.executeMojo(session, project, newMojoExecution());
Map<String, String> state = TestResources.readProperties(basedir, "target/workspacestate.properties");
Assert.assertEquals(new File(basedir, "pom.xml").getCanonicalPath(), state.get("test:test:pom::1"));
Assert.assertEquals(new File(basedir, "target/classes").getCanonicalPath(), state.get("test:test:jar::1"));
}
private HashCode sha1(File basedir, String path) throws IOException {
return Files.hash(new File(basedir, path), Hashing.sha1());
}
private Map<String, String> readProperties(File basedir) throws IOException {
return TestResources.readProperties(basedir, "target/test-classes/test.properties");
}
@Test
public void testWorkspaceResolver() throws Exception {
File basedir = resources.getBasedir();
MavenProject project = mojos.readMavenProject(basedir);
MavenSession session = mojos.newMavenSession(project);
mojos.newDependency(basedir).setGroupId("io.takari.m2e.workspace").setArtifactId("org.eclipse.m2e.workspace.cli").addTo(project);
mojos.executeMojo(session, project, newMojoExecution());
Map<String, String> properties = readProperties(basedir);
Assert.assertEquals(basedir.getCanonicalPath(), properties.get("workspaceResolver"));
}
@Test
public void testDependencyProperties() throws Exception {
File basedir = resources.getBasedir();
MavenProject project = mojos.readMavenProject(basedir);
MavenSession session = mojos.newMavenSession(project);
Assert.assertTrue(new File(basedir, "src/test").mkdirs());
try (OutputStream os = new FileOutputStream(new File(basedir, "src/test/test.properties"))) {
BufferedWriter w = new BufferedWriter(new OutputStreamWriter(os, Charsets.UTF_8));
w.write("ga=${g:a}");
w.newLine();
w.write("ga_tests=${g:a:tests}");
w.newLine();
w.flush();
}
File ga = temp.newFile().getCanonicalFile();
File ga_tests = temp.newFile().getCanonicalFile();
mojos.newDependency(ga).setGroupId("g").setArtifactId("a").addTo(project);
mojos.newDependency(ga_tests).setGroupId("g").setArtifactId("a").setClassifier("tests").addTo(project);
mojos.executeMojo(session, project, "testProperties");
Map<String, String> properties = readProperties(basedir);
Assert.assertEquals(ga.getCanonicalPath().replace('\\', '/'), properties.get("ga"));
Assert.assertEquals(ga_tests.getCanonicalPath().replace('\\', '/'), properties.get("ga_tests"));
}
@Test
public void testClasspathScope() throws Exception {
File basedir = resources.getBasedir();
MavenProject project = mojos.readMavenProject(basedir);
MavenSession session = mojos.newMavenSession(project);
File providedScoped = temp.newFile("provided.jar").getCanonicalFile();
File testScoped = temp.newFile("test.jar").getCanonicalFile();
mojos.newDependency(providedScoped).setGroupId("g").setArtifactId("provided").setScope("provided").addTo(project);
mojos.newDependency(testScoped).setGroupId("g").setArtifactId("test").setScope("test").addTo(project);
mojos.executeMojo(session, project, "testProperties");
Map<String, String> properties = readProperties(basedir);
Assert.assertEquals(new File(basedir, "target/classes").getCanonicalPath(), properties.get("classpath"));
}
}