aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThibault Gagnaux <tgagnaux@gmail.com>2021-06-30 15:37:38 +0200
committerThibault Gagnaux <tgagnaux@gmail.com>2021-06-30 15:37:38 +0200
commitb87c1babf4a1d0b9cdf417b8aaf8da8edc473766 (patch)
tree918b967b94b6963ae785ed276115eb247f774e84
parente7fc5336c818e6ce9f81069df73c258d116acc9f (diff)
downloadfrege-gradle-plugin-b87c1babf4a1d0b9cdf417b8aaf8da8edc473766.tar.gz
frege-gradle-plugin-b87c1babf4a1d0b9cdf417b8aaf8da8edc473766.tar.bz2
frege-gradle-plugin-b87c1babf4a1d0b9cdf417b8aaf8da8edc473766.zip
Adds first `SetupFregeCompilerTaks` with some tests
-rw-r--r--.gitignore3
-rw-r--r--build.gradle8
-rw-r--r--settings.gradle1
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/FregeExtension.java33
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/FregePlugin.java25
-rw-r--r--src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeCompilerTask.java (renamed from src/main/java/ch/fhnw/thga/gradleplugins/FregeInitTask.java)27
-rw-r--r--src/test/java/ch/fhnw/thga/gradleplugins/FregePluginFunctionalTest.java126
7 files changed, 177 insertions, 46 deletions
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<String> getFregeVersion();
+
+ public abstract Property<String> getFregeRelease();
+
+ public abstract RegularFileProperty getFregeCompilerPath();
+
+ @Internal
+ public Provider<String> 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/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<Project> {
+ 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/FregeInitTask.java b/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeCompilerTask.java
index e96bfb1..a7f48ba 100644
--- a/src/main/java/ch/fhnw/thga/gradleplugins/FregeInitTask.java
+++ b/src/main/java/ch/fhnw/thga/gradleplugins/SetupFregeCompilerTask.java
@@ -2,26 +2,20 @@ 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.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 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";
+public abstract class SetupFregeCompilerTask extends DefaultTask {
@Input
public abstract Property<String> getFregeVersion();
@@ -30,25 +24,20 @@ public abstract class FregeInitTask extends DefaultTask {
public abstract Property<String> 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"));
- }
+ 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() + ".jar").openStream());
- FileOutputStream fregeCompilerDestinationPath = new FileOutputStream(getFregeCompilerJar().get().getAsFile().getAbsolutePath());
+ 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);
- } catch (Exception e) {
- LOGGER.error(e.getMessage(), e.getCause());
+ 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<String> 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<String> 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<String> 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<String> 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<String> 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