package io.takari.maven.plugins.exportpackage;
import static io.takari.maven.testing.TestResources.create;
import static io.takari.maven.testing.TestResources.rm;
import static io.takari.maven.testing.TestResources.touch;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.TreeSet;
import org.codehaus.plexus.util.Os;
import org.junit.Assert;
import org.junit.Assume;
import org.junit.Rule;
import org.junit.Test;
import com.google.common.base.Charsets;
import com.google.common.io.Files;
import io.takari.incrementalbuild.maven.testing.IncrementalBuildRule;
import io.takari.maven.testing.TestResources;
public class ExportPackageMojoTest {
@Rule
public final TestResources resources = new TestResources();
@Rule
public final IncrementalBuildRule mojos = new IncrementalBuildRule();
@Test
public void testBasic() throws Exception {
File basedir = resources.getBasedir("exportpackage/basic");
// initial build
mkfile(basedir, "target/classes/exported/Exported.class");
mkfile(basedir, "target/classes/internal/Internal.class");
mojos.executeMojo(basedir, "export-package");
mojos.assertBuildOutputs(basedir, "target/classes/" + ExportPackageMojo.PATH_EXPORT_PACKAGE);
assertExportedPackages(basedir, "exported");
// no-change rebuild
mojos.executeMojo(basedir, "export-package");
mojos.assertCarriedOverOutputs(basedir, "target/classes/" + ExportPackageMojo.PATH_EXPORT_PACKAGE);
assertExportedPackages(basedir, "exported");
// change public and private classes
touch(basedir, "target/classes/exported/Exported.class");
touch(basedir, "target/classes/internal/Internal.class");
mojos.executeMojo(basedir, "export-package");
mojos.assertCarriedOverOutputs(basedir, "target/classes/" + ExportPackageMojo.PATH_EXPORT_PACKAGE);
assertExportedPackages(basedir, "exported");
// remove private class
rm(basedir, "target/classes/internal/Internal.class");
mojos.executeMojo(basedir, "export-package");
mojos.assertCarriedOverOutputs(basedir, "target/classes/" + ExportPackageMojo.PATH_EXPORT_PACKAGE);
assertExportedPackages(basedir, "exported");
// new public class
mkfile(basedir, "target/classes/exported/another/Exported.class");
mojos.executeMojo(basedir, "export-package");
mojos.assertBuildOutputs(basedir, "target/classes/" + ExportPackageMojo.PATH_EXPORT_PACKAGE);
assertExportedPackages(basedir, "exported", "exported.another");
// remove public class
rm(basedir, "target/classes/exported/another/Exported.class");
mojos.executeMojo(basedir, "export-package");
mojos.assertBuildOutputs(basedir, "target/classes/" + ExportPackageMojo.PATH_EXPORT_PACKAGE);
assertExportedPackages(basedir, "exported");
// remove last public class
rm(basedir, "target/classes/exported/Exported.class");
mojos.executeMojo(basedir, "export-package");
mojos.assertBuildOutputs(basedir, "target/classes/" + ExportPackageMojo.PATH_EXPORT_PACKAGE);
assertExportedPackages(basedir, new String[0]);
}
@Test
public void testNoClassesDirectory() throws Exception {
File basedir = resources.getBasedir("exportpackage/basic");
mojos.executeMojo(basedir, "export-package");
mojos.assertBuildOutputs(basedir, "target/classes/" + ExportPackageMojo.PATH_EXPORT_PACKAGE);
assertExportedPackages(basedir, new String[0]);
}
@Test
public void testBasic_symlinked() throws Exception {
Assume.assumeTrue(Os.isFamily(Os.FAMILY_UNIX));
File basedir = resources.getBasedir();
File orig = new File(basedir, "orig");
create(orig, "target/classes/exported/Class.class");
File symlink = java.nio.file.Files.createSymbolicLink(new File(basedir, "symlink").toPath(), orig.toPath()).toFile();
mojos.executeMojo(symlink, "export-package");
assertExportedPackages(symlink, "exported");
}
private void assertExportedPackages(File basedir, String... exportedPackages) throws IOException {
List<String> actual = Files.readLines(new File(basedir, "target/classes/" + ExportPackageMojo.PATH_EXPORT_PACKAGE), Charsets.UTF_8);
Assert.assertEquals(toString(Arrays.asList(exportedPackages)), toString(actual));
}
private String toString(Collection<String> strings) {
StringBuilder sb = new StringBuilder();
for (String string : new TreeSet<>(strings)) {
if (sb.length() > 0) {
sb.append('\n');
}
sb.append(string);
}
return sb.toString();
}
private void mkfile(File basedir, String relpath) throws IOException {
File file = new File(basedir, relpath);
file.getParentFile().mkdirs();
file.createNewFile();
}
}