diff --git a/build.gradle b/build.gradle index 638eeed..9c708fa 100644 --- a/build.gradle +++ b/build.gradle @@ -1,3 +1,5 @@ +import java.nio.file.Files + plugins { id 'java-gradle-plugin' id 'net.woggioni.gradle.lombok' apply false @@ -57,10 +59,7 @@ java { targetCompatibility = JavaVersion.VERSION_1_8 } -jar { - manifest { - attributes "version" : archiveVersion.get() - } +tasks.named('processResources', ProcessResources) { from { configurations.named('embedded').map { it.collect { @@ -73,6 +72,12 @@ jar { } } +jar { + manifest { + attributes "version" : archiveVersion.get() + } +} + gradlePlugin { plugins { create("EnvelopePlugin") { @@ -100,4 +105,26 @@ wrapper { distributionType = Wrapper.DistributionType.ALL } +tasks.named('processTestResources') { ProcessResources it -> + doLast { + Files.newBufferedWriter(it.destinationDir.toPath().resolve('test-resources.txt')).withCloseable { writer -> + sourceSets.test.resources.sourceDirectories.each { srcDir -> + java.nio.file.Path srcPath = srcDir.toPath() + Files.walk(srcPath).forEach { + if(Files.isRegularFile(it) && srcPath != it) { + writer.write(srcPath.relativize(it).toString() + '\n') + } + } + } + } + } +} + +tasks.named('test', Test) { + systemProperty('test.gradle.user.home', temporaryDir) +} + +tasks.named("pluginUnderTestMetadata", PluginUnderTestMetadata) { + pluginClasspath.from(configurations.compileClasspath) +} diff --git a/src/main/java/net/woggioni/gradle/envelope/EnvelopePlugin.java b/src/main/java/net/woggioni/gradle/envelope/EnvelopePlugin.java index c30d4b8..b8f442b 100644 --- a/src/main/java/net/woggioni/gradle/envelope/EnvelopePlugin.java +++ b/src/main/java/net/woggioni/gradle/envelope/EnvelopePlugin.java @@ -30,7 +30,7 @@ public class EnvelopePlugin implements Plugin { t.getInputs().files(envelopeJarTaskProvider); t.setGroup("envelope"); t.setDescription("Run the application in the envelope jar"); - t.classpath(envelopeJarTaskProvider); + t.classpath(envelopeJarTaskProvider); }); } } diff --git a/src/test/java/net/woggioni/gradle/envelope/test/EnvelopePluginTest.java b/src/test/java/net/woggioni/gradle/envelope/test/EnvelopePluginTest.java new file mode 100644 index 0000000..39cc9f8 --- /dev/null +++ b/src/test/java/net/woggioni/gradle/envelope/test/EnvelopePluginTest.java @@ -0,0 +1,130 @@ +package net.woggioni.gradle.envelope.test; + +import lombok.Getter; +import lombok.Setter; +import lombok.SneakyThrows; +import org.apache.groovy.util.Arrays; +import org.gradle.testkit.runner.GradleRunner; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Timeout; +import org.junit.jupiter.api.io.TempDir; + +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.URL; +import java.nio.Buffer; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.security.MessageDigest; +import java.util.Optional; +import java.util.zip.ZipEntry; +import java.util.zip.ZipInputStream; + +import org.junit.jupiter.api.Assertions; +import static java.util.concurrent.TimeUnit.MINUTES; + +public class EnvelopePluginTest { + + private static URL getResource(String resourceName) { + return getResource(resourceName, null, null); + } + + private static URL getResource(String resourceName, ClassLoader cl) { + return getResource(resourceName, null, cl); + } + + private static URL getResource(String resourceName, Class cls) { + return getResource(resourceName, cls, null); + } + + private static URL getResource(String resourceName, Class cls, ClassLoader cl) { + URL result = null; + if(cl != null) { + result = cl.getResource(resourceName); + } + if(result == null && cls != null) { + result = cls.getClassLoader().getResource(resourceName); + } + if(result == null) { + result = EnvelopePluginTest.class.getClassLoader().getResource(resourceName); + } + return result; + } + +// @SneakyThrows +// private static void installResource(String root, String resourceName, Path destination) { +// Path outputFile = with { +// Path realDestination; +// if (Files.isSymbolicLink(destination)) { +// realDestination = destination.toRealPath(); +// } else { +// realDestination = destination; +// } +// realDestination = realDestination.resolve(resourceName); +// if(!Files.exists(realDestination)) { +// Files.createDirectories(realDestination.getParent()); +// realDestination; +// } else if(Files.isDirectory(realDestination)) { +// realDestination.resolve(resourceName.substring(1 + resourceName.lastIndexOf('/'))); +// } +// else if(Files.isRegularFile(realDestination)) { +// realDestination; +// } else throw new IllegalStateException("Path '${realDestination}' is neither a file nor a directory"); +// } +// String resourcePath = root + '/' + resourceName; +// URL res = getResource(resourcePath); +// if(res == null) throw new FileNotFoundException(resourceName); +// try(InputStream inputStream = res.openStream()) { +// Files.copy(inputStream, outputFile, StandardCopyOption.REPLACE_EXISTING); +// } +// } + + void invokeGradle(Path rootProjectDir, String... taskName) { + GradleRunner runner = GradleRunner.create() + .withDebug(true) + .withProjectDir(rootProjectDir.toFile()) + .withArguments(Arrays.concat(new String[] {"-s", "--info", "-g", testGradleHomeDir.toString()}, taskName)) + .withPluginClasspath(); + System.out.println(runner.build().getOutput()); + } + private Path testDir; + private static final Path testGradleHomeDir = Paths.get(System.getProperty("test.gradle.user.home")); + + @BeforeEach + @SneakyThrows + public void setup(@TempDir Path testDir) { + this.testDir = testDir; + String resourceFile = "test-resources.txt"; + try(BufferedReader reader = + Optional.ofNullable(getResource(resourceFile).openStream()) + .map(InputStreamReader::new) + .map(BufferedReader::new) + .orElseThrow(() -> new FileNotFoundException(resourceFile))) { + while(true) { + String line = reader.readLine(); + if(line == null) break; + Path destination = testDir.resolve(line); + Files.createDirectories(destination.getParent()); + Files.copy(getResource(line).openStream(), destination); + } + } + } + + @Test + void legacyTest() { + invokeGradle(testDir.resolve("test-project"), ":legacy-executable:envelopeRun"); + } + + @Test + void jpmsTest() { + invokeGradle(testDir.resolve("test-project"), ":jpms-executable:envelopeRun"); + } + +} diff --git a/src/test/resources/test-project/jpms-executable/build.gradle b/src/test/resources/test-project/jpms-executable/build.gradle new file mode 100644 index 0000000..d1a255d --- /dev/null +++ b/src/test/resources/test-project/jpms-executable/build.gradle @@ -0,0 +1,9 @@ +plugins { + id 'java-library' + id 'net.woggioni.gradle.envelope' +} + +envelopeJar { + mainClass = 'envelope.test.jpms.Main' + mainModule = 'envelope.test.jpms' +} \ No newline at end of file diff --git a/src/test/resources/test-project/jpms-executable/src/main/java/envelope/test/jpms/Main.java b/src/test/resources/test-project/jpms-executable/src/main/java/envelope/test/jpms/Main.java new file mode 100644 index 0000000..741840e --- /dev/null +++ b/src/test/resources/test-project/jpms-executable/src/main/java/envelope/test/jpms/Main.java @@ -0,0 +1,7 @@ +package envelope.test.jpms; + +public class Main { + public static void main(String[] args) { + System.out.println("Hello World!!"); + } +} \ No newline at end of file diff --git a/src/test/resources/test-project/jpms-executable/src/main/java/module-info.java b/src/test/resources/test-project/jpms-executable/src/main/java/module-info.java new file mode 100644 index 0000000..c6fcfaa --- /dev/null +++ b/src/test/resources/test-project/jpms-executable/src/main/java/module-info.java @@ -0,0 +1,3 @@ +module envelope.test.jpms { + exports envelope.test.jpms; +} \ No newline at end of file diff --git a/src/test/resources/test-project/legacy-executable/build.gradle b/src/test/resources/test-project/legacy-executable/build.gradle new file mode 100644 index 0000000..7cac30e --- /dev/null +++ b/src/test/resources/test-project/legacy-executable/build.gradle @@ -0,0 +1,8 @@ +plugins { + id 'java-library' + id 'net.woggioni.gradle.envelope' +} + +envelopeJar { + mainClass = 'envelope.test.legacy.Main' +} \ No newline at end of file diff --git a/src/test/resources/test-project/legacy-executable/src/main/java/envelope/test/legacy/Main.java b/src/test/resources/test-project/legacy-executable/src/main/java/envelope/test/legacy/Main.java new file mode 100644 index 0000000..4a0472d --- /dev/null +++ b/src/test/resources/test-project/legacy-executable/src/main/java/envelope/test/legacy/Main.java @@ -0,0 +1,7 @@ +package envelope.test.legacy; + +public class Main { + public static void main(String[] args) { + System.out.println("Hello World!!"); + } +} \ No newline at end of file diff --git a/src/test/resources/test-project/settings.gradle b/src/test/resources/test-project/settings.gradle new file mode 100644 index 0000000..6dd9ac9 --- /dev/null +++ b/src/test/resources/test-project/settings.gradle @@ -0,0 +1,2 @@ +include 'legacy-executable' +include 'jpms-executable' \ No newline at end of file