aboutsummaryrefslogtreecommitdiff
path: root/value/src/it/functional/src/test/java/com/google/auto/value/GradleTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'value/src/it/functional/src/test/java/com/google/auto/value/GradleTest.java')
-rw-r--r--value/src/it/functional/src/test/java/com/google/auto/value/GradleTest.java187
1 files changed, 187 insertions, 0 deletions
diff --git a/value/src/it/functional/src/test/java/com/google/auto/value/GradleTest.java b/value/src/it/functional/src/test/java/com/google/auto/value/GradleTest.java
new file mode 100644
index 00000000..f4eb5388
--- /dev/null
+++ b/value/src/it/functional/src/test/java/com/google/auto/value/GradleTest.java
@@ -0,0 +1,187 @@
+/*
+ * Copyright 2021 Google LLC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.google.auto.value;
+
+import static com.google.common.truth.Truth.assertThat;
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.common.collect.ImmutableList;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Optional;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Stream;
+import org.gradle.testkit.runner.BuildResult;
+import org.gradle.testkit.runner.GradleRunner;
+import org.gradle.util.GradleVersion;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class GradleTest {
+ @Rule public TemporaryFolder fakeProject = new TemporaryFolder();
+
+ private static final String BUILD_GRADLE_TEXT =
+ String.join(
+ "\n",
+ "plugins {",
+ " id 'java-library'",
+ "}",
+ "repositories {",
+ " maven { url = uri('${localRepository}') }",
+ "}",
+ "dependencies {",
+ " compileOnlyApi "
+ + " 'com.google.auto.value:auto-value-annotations:${autoValueVersion}'",
+ " annotationProcessor 'com.google.auto.value:auto-value:${autoValueVersion}'",
+ "}");
+
+ private static final String FOO_TEXT =
+ String.join(
+ "\n",
+ "package com.example;",
+ "",
+ "import com.google.auto.value.AutoValue;",
+ "",
+ "@AutoValue",
+ "abstract class Foo {",
+ " abstract String bar();",
+ "",
+ " static Foo of(String bar) {",
+ " return new AutoValue_Foo(bar);",
+ " }",
+ "}");
+
+ private static final Optional<File> GRADLE_INSTALLATION = getGradleInstallation();
+
+ @Test
+ public void basic() throws IOException {
+ String autoValueVersion = System.getProperty("autoValueVersion");
+ assertThat(autoValueVersion).isNotNull();
+ String localRepository = System.getProperty("localRepository");
+ assertThat(localRepository).isNotNull();
+
+ // Set up the fake Gradle project.
+ String buildGradleText = expandSystemProperties(BUILD_GRADLE_TEXT);
+ writeFile(fakeProject.newFile("build.gradle").toPath(), buildGradleText);
+ Path srcDir = fakeProject.newFolder("src", "main", "java", "com", "example").toPath();
+ writeFile(srcDir.resolve("Foo.java"), FOO_TEXT);
+
+ // Build it the first time.
+ BuildResult result1 = buildFakeProject();
+ assertThat(result1.getOutput())
+ .contains(
+ "Full recompilation is required because no incremental change information is"
+ + " available");
+ Path output =
+ fakeProject
+ .getRoot()
+ .toPath()
+ .resolve("build/classes/java/main/com/example/AutoValue_Foo.class");
+ assertThat(Files.exists(output)).isTrue();
+
+ // Add a source file to the project.
+ String barText = FOO_TEXT.replace("Foo", "Bar");
+ Path barFile = srcDir.resolve("Bar.java");
+ writeFile(barFile, barText);
+
+ // Build it a second time.
+ BuildResult result2 = buildFakeProject();
+ assertThat(result2.getOutput()).doesNotContain("Full recompilation is required");
+
+ // Remove the second source file and build a third time. If incremental annotation processing
+ // is not working, this will produce a message like this:
+ // Full recompilation is required because com.google.auto.value.processor.AutoValueProcessor
+ // is not incremental
+ Files.delete(barFile);
+ BuildResult result3 = buildFakeProject();
+ assertThat(result3.getOutput()).doesNotContain("Full recompilation is required");
+ }
+
+ private BuildResult buildFakeProject() throws IOException {
+ GradleRunner runner =
+ GradleRunner.create()
+ .withProjectDir(fakeProject.getRoot())
+ .withArguments("--info", "compileJava");
+ if (GRADLE_INSTALLATION.isPresent()) {
+ runner.withGradleInstallation(GRADLE_INSTALLATION.get());
+ } else {
+ runner.withGradleVersion(GradleVersion.current().getVersion());
+ }
+ return runner.build();
+ }
+
+ private static Optional<File> getGradleInstallation() {
+ String gradleHome = System.getenv("GRADLE_HOME");
+ if (gradleHome != null) {
+ File gradleHomeFile = new File(gradleHome);
+ if (gradleHomeFile.isDirectory()) {
+ return Optional.of(new File(gradleHome));
+ }
+ }
+ try {
+ Path gradleExecutable = Paths.get("/usr/bin/gradle");
+ Path gradleLink = gradleExecutable.resolveSibling(Files.readSymbolicLink(gradleExecutable));
+ if (!gradleLink.endsWith("bin/gradle")) {
+ return Optional.empty();
+ }
+ Path installationPath = gradleLink.getParent().getParent();
+ if (!Files.isDirectory(installationPath)) {
+ return Optional.empty();
+ }
+ Optional<Path> coreJar;
+ Pattern corePattern = Pattern.compile("gradle-core-([0-9]+)\\..*\\.jar");
+ try (Stream<Path> files = Files.walk(installationPath.resolve("lib"))) {
+ coreJar =
+ files
+ .filter(
+ p -> {
+ Matcher matcher = corePattern.matcher(p.getFileName().toString());
+ if (matcher.matches()) {
+ int version = Integer.parseInt(matcher.group(1));
+ if (version >= 5) {
+ return true;
+ }
+ }
+ return false;
+ })
+ .findFirst();
+ }
+ return coreJar.map(unused -> installationPath.toFile());
+ } catch (IOException e) {
+ return Optional.empty();
+ }
+ }
+
+ private static String expandSystemProperties(String s) {
+ for (String name : System.getProperties().stringPropertyNames()) {
+ String value = System.getProperty(name);
+ s = s.replace("${" + name + "}", value);
+ }
+ return s;
+ }
+
+ private static void writeFile(Path file, String text) throws IOException {
+ Files.write(file, ImmutableList.of(text), UTF_8);
+ }
+}