From b87c1babf4a1d0b9cdf417b8aaf8da8edc473766 Mon Sep 17 00:00:00 2001 From: Thibault Gagnaux Date: Wed, 30 Jun 2021 15:37:38 +0200 Subject: Adds first `SetupFregeCompilerTaks` with some tests --- .gitignore | 3 +- build.gradle | 8 +- settings.gradle | 1 + .../ch/fhnw/thga/gradleplugins/FregeExtension.java | 33 ++++++ .../ch/fhnw/thga/gradleplugins/FregeInitTask.java | 54 --------- .../ch/fhnw/thga/gradleplugins/FregePlugin.java | 25 ++-- .../thga/gradleplugins/SetupFregeCompilerTask.java | 43 +++++++ .../gradleplugins/FregePluginFunctionalTest.java | 126 ++++++++++++++++++--- 8 files changed, 212 insertions(+), 81 deletions(-) create mode 100644 settings.gradle create mode 100644 src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java delete mode 100644 src/main/java/ch/fhnw/thga/gradleplugins/FregeInitTask.java create mode 100644 src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeCompilerTask.java diff --git a/.gitignore b/.gitignore index e5712de..34670f9 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ build .project .classpath .settings -bin \ No newline at end of file +bin +.DS_Store \ No newline at end of file diff --git a/build.gradle b/build.gradle index 69dd68c..a0a97cf 100644 --- a/build.gradle +++ b/build.gradle @@ -7,11 +7,13 @@ repositories { } dependencies { - testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.2") - testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.7.2") - + testImplementation('org.junit.jupiter:junit-jupiter-api:5.7.2') + testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine:5.7.2') } +group = 'ch.fhnw.thga' +version = '0.0.1-SNAPSHOT' + gradlePlugin { plugins { fregePlugin { diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..772bbfe --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'frege-plugin' \ No newline at end of file diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java new file mode 100644 index 0000000..5e8834d --- /dev/null +++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java @@ -0,0 +1,33 @@ +package ch.fhnw.thga.gradleplugins; + +import javax.inject.Inject; + +import org.gradle.api.file.ProjectLayout; +import org.gradle.api.file.RegularFileProperty; +import org.gradle.api.provider.Property; +import org.gradle.api.provider.Provider; + +import groovy.transform.Internal; + +public abstract class FregeExtension { + public static final String DEFAULT_FREGE_EXTENSION_NAMESPACE = "frege"; + public static final String FREGE_VERSION_BUILD_FILE_KEY = "fregeVersion"; + public static final String FREGE_RELEASE_BUILD_FILE_KEY = "fregeRelease"; + public static final String FREGE_COMPILER_BUILD_FILE_KEY = "fregeCompilerPath"; + + public abstract Property getFregeVersion(); + + public abstract Property getFregeRelease(); + + public abstract RegularFileProperty getFregeCompilerPath(); + + @Internal + public Provider getDefaultJarName() { + return getFregeVersion().map(version -> version + ".jar"); + } + + @Inject + public FregeExtension(ProjectLayout projectLayout) { + getFregeCompilerPath().set(projectLayout.getProjectDirectory().file("lib/frege" + getDefaultJarName())); + } +} diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregeInitTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregeInitTask.java deleted file mode 100644 index e96bfb1..0000000 --- a/src/main/java/ch/fhnw/thga/gradleplugins/FregeInitTask.java +++ /dev/null @@ -1,54 +0,0 @@ -package ch.fhnw.thga.gradleplugins; - -import java.io.FileOutputStream; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.nio.channels.Channels; -import java.nio.channels.FileChannel; -import java.nio.channels.ReadableByteChannel; - -import org.apache.log4j.Logger; -import org.gradle.api.DefaultTask; -import org.gradle.api.file.ProjectLayout; -import org.gradle.api.file.RegularFile; -import org.gradle.api.file.RegularFileProperty; -import org.gradle.api.provider.Property; -import org.gradle.api.tasks.Input; -import org.gradle.api.tasks.OutputFile; -import org.gradle.api.tasks.TaskAction; - -public abstract class FregeInitTask extends DefaultTask { - private final static Logger LOGGER = Logger.getLogger(FregeInitTask.class.getName()); - private static final String DEFAULT_FREGE_VERSION = "3.25.84"; - private static final String DEFAULT_FREGE_RELEASE = "3.25alpha"; - - @Input - public abstract Property getFregeVersion(); - - @Input - public abstract Property getFregeRelease(); - - @OutputFile - public abstract RegularFileProperty getFregeCompilerJar(); - - public FregeInitTask() { - getFregeVersion().convention(DEFAULT_FREGE_VERSION); - getFregeRelease().convention(DEFAULT_FREGE_RELEASE); - getFregeCompilerJar().convention(getProject().getLayout().getBuildDirectory().file("lib/frege" + getFregeVersion() + ".jar")); - } - - @TaskAction - public void downloadFregeCompiler() { - try { - ReadableByteChannel readChannel = Channels.newChannel( - new URL("https://github.com/Frege/frege/releases/download/" + - getFregeRelease().get() + "/frege" + getFregeVersion() + ".jar").openStream()); - FileOutputStream fregeCompilerDestinationPath = new FileOutputStream(getFregeCompilerJar().get().getAsFile().getAbsolutePath()); - FileChannel writeChannel = fregeCompilerDestinationPath.getChannel(); - writeChannel.transferFrom(readChannel, 0, Long.MAX_VALUE); - } catch (Exception e) { - LOGGER.error(e.getMessage(), e.getCause()); - } - } -} diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java index 678a10c..ffa788f 100644 --- a/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java +++ b/src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java @@ -2,19 +2,28 @@ package ch.fhnw.thga.gradleplugins; import org.gradle.api.Plugin; import org.gradle.api.Project; -import org.gradle.api.artifacts.Configuration; +import org.gradle.api.file.RegularFile; +import org.gradle.api.provider.Property; public class FregePlugin implements Plugin { + public static final String SETUP_FREGE_COMPILER_TASK_NAME = "setupFregeCompiler"; + public static final String FREGE_PLUGIN_ID = "ch.fhnw.thga.frege"; + public static final String FREGE_EXTENSION_NAME = "frege"; @Override public void apply(Project project) { - project.getTasks().create("fregeInit", FregeInitTask.class); - Configuration fregeCompiler = project.getConfigurations().create("fregeCompiler", c -> { - c.setVisible(false); - c.setCanBeConsumed(false); - c.setCanBeResolved(true); - c.setDescription("The frege compiler"); - c.defaultDependencies(d -> d.add(project.getDependencies().create("frege3.25.84.jar"))); + FregeExtension extension = project.getExtensions().create(FREGE_EXTENSION_NAME, FregeExtension.class); + project.getTasks().register(SETUP_FREGE_COMPILER_TASK_NAME, SetupFregeCompilerTask.class, task -> { + task.getFregeVersion().set(extension.getFregeVersion()); + task.getFregeRelease().set(extension.getFregeRelease()); + task.getFregeCompilerPath().set(extension.getFregeCompilerPath()); }); + //Configuration fregeCompiler = project.getConfigurations().create("fregeCompiler", c -> { + // c.setVisible(false); + // c.setCanBeConsumed(false); + // c.setCanBeResolved(true); + // c.setDescription("The frege compiler"); + // c.defaultDependencies(d -> d.add(project.getDependencies().create("frege3.25.84.jar"))); + //}); } } diff --git a/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeCompilerTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeCompilerTask.java new file mode 100644 index 0000000..a7f48ba --- /dev/null +++ b/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeCompilerTask.java @@ -0,0 +1,43 @@ +package ch.fhnw.thga.gradleplugins; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.URL; +import java.nio.channels.Channels; +import java.nio.channels.FileChannel; +import java.nio.channels.ReadableByteChannel; + +import org.gradle.api.DefaultTask; +import org.gradle.api.GradleException; +import org.gradle.api.file.RegularFileProperty; +import org.gradle.api.provider.Property; +import org.gradle.api.tasks.Input; +import org.gradle.api.tasks.OutputFile; +import org.gradle.api.tasks.TaskAction; + +public abstract class SetupFregeCompilerTask extends DefaultTask { + + @Input + public abstract Property getFregeVersion(); + + @Input + public abstract Property getFregeRelease(); + + @OutputFile + public abstract RegularFileProperty getFregeCompilerPath(); + + @TaskAction + public void downloadFregeCompiler() { + try { + ReadableByteChannel readChannel = Channels.newChannel( + new URL("https://github.com/Frege/frege/releases/download/" + + getFregeRelease().get() + "/frege" + getFregeVersion().get() + ".jar").openStream()); + FileOutputStream fregeCompilerDestinationPath = new FileOutputStream(getFregeCompilerPath().get().getAsFile().getAbsolutePath()); + FileChannel writeChannel = fregeCompilerDestinationPath.getChannel(); + writeChannel.transferFrom(readChannel, 0, Long.MAX_VALUE); + System.out.println("Successfully downloaded compiler to" + getFregeCompilerPath().get()); + } catch (IOException e) { + throw new GradleException(e.getMessage()); + } + } +} diff --git a/src/test/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java b/src/test/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java index b93ba65..672b065 100644 --- a/src/test/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java +++ b/src/test/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java @@ -1,13 +1,22 @@ package ch.fhnw.thga.gradleplugins; +import static ch.fhnw.thga.gradleplugins.FregeExtension.FREGE_COMPILER_BUILD_FILE_KEY; +import static ch.fhnw.thga.gradleplugins.FregeExtension.FREGE_RELEASE_BUILD_FILE_KEY; +import static ch.fhnw.thga.gradleplugins.FregeExtension.FREGE_VERSION_BUILD_FILE_KEY; +import static ch.fhnw.thga.gradleplugins.FregePlugin.FREGE_EXTENSION_NAME; +import static ch.fhnw.thga.gradleplugins.FregePlugin.FREGE_PLUGIN_ID; +import static ch.fhnw.thga.gradleplugins.FregePlugin.SETUP_FREGE_COMPILER_TASK_NAME; +import static org.gradle.testkit.runner.TaskOutcome.SUCCESS; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.gradle.testkit.runner.TaskOutcome.SUCCESS; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; import org.gradle.api.Project; import org.gradle.testfixtures.ProjectBuilder; @@ -20,11 +29,13 @@ import org.junit.jupiter.api.io.TempDir; public class FregePluginFunctionalTest { @TempDir File testProjectDir; private File buildFile; + private File settingsFile; + private Project project; - private void writeFile(File destination, String content) throws IOException { + private void writeFile(File destination, String content, boolean append) throws IOException { BufferedWriter output = null; try { - output = new BufferedWriter(new FileWriter(destination)); + output = new BufferedWriter(new FileWriter(destination, append)); output.write(content); } finally { if (output != null) { @@ -33,22 +44,107 @@ public class FregePluginFunctionalTest { } } + private void writeToFile(File destination, String content) throws IOException { + writeFile(destination, content, false); + } + + private void appendToFile(File destination, String content) throws IOException { + writeFile(destination, content, true); + } + + private static String buildFilePluginString(String pluginId) { + return String.format("id '%s'", pluginId); + } + + private static String buildFileFregeExtension(String fregeVersion, String fregeRelease, + Optional compilerPath) { + String optionalCompilerPathLine = compilerPath.isPresent() ? String.format(" %s = %s\n", FREGE_COMPILER_BUILD_FILE_KEY, compilerPath.get()) : ""; + return String.format("%s {\n %s = %s\n %s = %s\n%s}\n", FREGE_EXTENSION_NAME, FREGE_VERSION_BUILD_FILE_KEY, + fregeVersion, FREGE_RELEASE_BUILD_FILE_KEY, fregeRelease, optionalCompilerPathLine); + } + + private static String writeBuildFilePlugins(Stream pluginIds) { + String plugins = pluginIds.map(pluginId -> buildFilePluginString(pluginId)).collect(Collectors.joining("\n ")); + return String.format("plugins {\n %s\n}\n", plugins); + } + + private void assertSetupFregeCompilerTask(String fregeConfig) throws Exception { + System.out.println(fregeConfig); + appendToFile(buildFile, fregeConfig); + assertTrue(project.getTasks().getByName(SETUP_FREGE_COMPILER_TASK_NAME) instanceof SetupFregeCompilerTask); + BuildResult result = GradleRunner.create().withProjectDir(testProjectDir).withPluginClasspath() + .withArguments(SETUP_FREGE_COMPILER_TASK_NAME).build(); + assertEquals(SUCCESS, result.task(":" + SETUP_FREGE_COMPILER_TASK_NAME).getOutcome()); + } + @BeforeEach void setup() throws Exception { buildFile = new File(testProjectDir, "build.gradle"); - String buildFileContent = "plugins {" + - "id 'ch.fhnw.thga.frege'" + - "}"; - writeFile(buildFile, buildFileContent); + settingsFile = new File(testProjectDir, "settings.gradle"); + writeToFile(buildFile, writeBuildFilePlugins(Stream.of(FREGE_PLUGIN_ID))); + writeToFile(settingsFile, "rootProject.name='frege-plugin'"); + project = ProjectBuilder.builder().withProjectDir(testProjectDir).build(); + project.getPluginManager().apply(FREGE_PLUGIN_ID); + } + + @Test + void given_single_plugin_id_then_it_is_correctly_converted_to_build_file_string() { + String pluginId = "frege"; + Stream pluginIds = Stream.of(pluginId); + String expected = "plugins {\n" + " id '" + pluginId + "'\n" + "}\n"; + assertEquals(expected, writeBuildFilePlugins(pluginIds)); } @Test - void given_frege_plugin_when_applying_then_latest_frege_compiler_is_downloaded_and_added_as_a_depenency() { - //Project project = ProjectBuilder.builder().withProjectDir(testProjectDir).build(); - //assertEquals(1, project.getConfigurations().getByName("fregeCompiler").getAllDependencies().size()); - BuildResult result = GradleRunner.create() - .withProjectDir(testProjectDir) - .build(); - assertEquals(SUCCESS, result.task("initFrege").getOutcome()); - } + void given_multiple_plugin_ids_then_they_are_correctly_converted_to_build_file_string() { + String fregeId = "frege"; + String javaId = "java"; + Stream pluginIds = Stream.of(fregeId, javaId); + String expected = "plugins {\n" + " id '" + fregeId + "'\n" + " id '" + javaId + "'\n" + "}\n"; + assertEquals(expected, writeBuildFilePlugins(pluginIds)); + } + + @Test + void given_default_plugin_ids_then_they_are_correctly_converted_to_build_file_string() { + String fregeId = "frege"; + String javaId = "java"; + Stream pluginIds = Stream.of(fregeId, javaId); + String expected = "plugins {\n" + " id '" + fregeId + "'\n" + " id '" + javaId + "'\n" + "}\n"; + assertEquals(expected, writeBuildFilePlugins(pluginIds)); + } + + @Test + void given_frege_version_and_frege_release_then_they_are_correctly_converted_to_build_file_string() { + String fregeVersion = "'3.25.84'"; + String fregeRelease = "'3.25alpha'"; + String expectedFregeConfig = FREGE_EXTENSION_NAME + " {\n" + " fregeVersion = " + fregeVersion + "\n" + + " fregeRelease = " + fregeRelease + "\n" + "}\n"; + assertEquals(expectedFregeConfig, buildFileFregeExtension(fregeVersion, fregeRelease, Optional.empty())); + } + + @Test + void given_frege_version_and_frege_release_and_frege_compiler_path_then_they_are_correctly_converted_to_build_file_string() { + String fregeVersion = "'3.25.84'"; + String fregeRelease = "'3.25alpha'"; + String fregeCompilerPath = "layout.projectDirectory.file('lib/frege3.25.84')"; + String expectedFregeConfig = + FREGE_EXTENSION_NAME + " {\n" + " fregeVersion = " + fregeVersion + "\n" + + " fregeRelease = " + fregeRelease + "\n" + + " fregeCompilerPath = " + fregeCompilerPath + "\n" + "}\n"; + assertEquals(expectedFregeConfig, buildFileFregeExtension(fregeVersion, fregeRelease, Optional.of(fregeCompilerPath))); + } + + @Test + void given_frege_compiler_version_3_25_84_and_3_25_alpha_release_without_frege_compiler_path_when_running_the_setup_frege_compiler_task_then_the_frege_compiler_is_correctly_setup() + throws Exception { + String fregeConfig = buildFileFregeExtension("'3.25.84'", "'3.25alpha'", Optional.empty()); + assertSetupFregeCompilerTask(fregeConfig); + } + + @Test + void given_frege_compiler_version_3_25_84_when_running_the_setup_frege_compiler_task_then_the_frege_compiler_is_correctly_setup() + throws Exception { + String fregeConfig = buildFileFregeExtension("'3.25.84'", "'3.25alpha'", Optional.of("layout.projectDirectory.file('lib/frege3.25.84')")); + assertSetupFregeCompilerTask(fregeConfig); + } } \ No newline at end of file -- cgit