Skip to content

Commit

Permalink
[ggj][infra][2/5] feat: integrate java-diff-util library with dummy t…
Browse files Browse the repository at this point in the history
…est (#290)

* add fileDiffUtils

* add new dummy unit test

* format

* add assertUtils

* format

* move dummy test to separate folder

* add compare strings method in diffUtils

* format

* dummy test pass

* reformat

* add simple strings comparison

* group test framework helpers together

* feedback

* cleanup

* typo
  • Loading branch information
xiaozhenliu-gg5 authored Sep 16, 2020
1 parent 156d61d commit da3a8a4
Show file tree
Hide file tree
Showing 7 changed files with 157 additions and 28 deletions.
1 change: 1 addition & 0 deletions BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ JAVA_SRCS = [
TEST_SRCS = [
"//src/test/java/com/google/api/generator/engine:engine_files",
"//src/test/java/com/google/api/generator/gapic:gapic_files",
"//src/test/java/com/google/api/generator/test/framework:framework_files",
]

# ============= Proto wrappers =================
Expand Down
1 change: 1 addition & 0 deletions dependencies.properties
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ maven.com_google_code_findbugs_jsr305=com.google.code.findbugs:jsr305:3.0.0
maven.com_google_auto_value_auto_value=com.google.auto.value:auto-value:1.7.2
maven.com_google_auto_value_auto_value_annotations=com.google.auto.value:auto-value-annotations:1.7.2
maven.com_google_protobuf_protobuf_java=com.google.protobuf:protobuf-java:3.12.2
maven.io_github_java_diff_utils=io.github.java-diff-utils:java-diff-utils:4.0
maven.javax_annotation_api=javax.annotation:javax.annotation-api:1.3.2
maven.javax_validation_javax_validation_api=javax.validation:validation-api:2.0.1.Final

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,12 @@ filegroup(
[java_test(
name = test_name,
srcs = ["{0}.java".format(test_name)],
data = ["//src/test/java/com/google/api/generator/gapic/dummy/goldens:goldens_files"],
test_class = "com.google.api.generator.gapic.dummy.{0}".format(test_name),
deps = [
"//src/main/java/com/google/api/generator/engine/ast",
"//src/main/java/com/google/api/generator/engine/writer",
"//src/test/java/com/google/api/generator/test/framework",
"@junit_junit//jar",
],
) for test_name in TESTS]
Original file line number Diff line number Diff line change
Expand Up @@ -14,14 +14,15 @@

package com.google.api.generator.gapic.dummy;

import static junit.framework.Assert.assertEquals;

import com.google.api.generator.engine.ast.BlockComment;
import com.google.api.generator.engine.ast.ClassDefinition;
import com.google.api.generator.engine.ast.CommentStatement;
import com.google.api.generator.engine.ast.LineComment;
import com.google.api.generator.engine.ast.ScopeNode;
import com.google.api.generator.engine.writer.JavaWriterVisitor;
import com.google.api.generator.test.framework.Assert;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import org.junit.Test;

Expand All @@ -33,6 +34,9 @@ public class FileDiffInfraDummyTest {
// created.
//
// TODO(xiaozhenliu): remove this test class once the file-diff infra is in place and well-tested.
private static final String GOLDENFILES_DIRECTORY =
"src/test/java/com/google/api/generator/gapic/dummy/goldens/";

@Test
public void simpleClass() {
ClassDefinition classDef =
Expand All @@ -47,7 +51,9 @@ public void simpleClass() {
.build();
JavaWriterVisitor visitor = new JavaWriterVisitor();
classDef.accept(visitor);
assertEquals(visitor.write(), EXPECTED_CLASS_STRING_SIMPLE);
Path goldenFilePath =
Paths.get(GOLDENFILES_DIRECTORY, "FileDiffInfraDummyTestSimpleClass.golden");
Assert.assertCodeEquals(goldenFilePath, visitor.write());
}

@Test
Expand All @@ -63,7 +69,18 @@ public void classWithHeader() {
.build();
JavaWriterVisitor visitor = new JavaWriterVisitor();
classDef.accept(visitor);
assertEquals(visitor.write(), EXPECTED_CLASS_STRING_WITH_HEADER);
Path goldenFilePath =
Paths.get(GOLDENFILES_DIRECTORY, "FileDiffInfraDummyTestClassWithHeader.golden");
Assert.assertCodeEquals(goldenFilePath, visitor.write());
}

// Add a simple test for two strings comparison.
@Test
public void simpleLineComment() {
JavaWriterVisitor visitor = new JavaWriterVisitor();
LineComment lineComment = LineComment.withComment("test strings comparison.");
lineComment.accept(visitor);
Assert.assertCodeEquals("// test strings comparison.", visitor.write());
}

private static final String APACHE_LICENSE_STRING =
Expand All @@ -77,28 +94,4 @@ public void classWithHeader() {
+ "WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"
+ "See the License for the specific language governing permissions and\n"
+ "limitations under the License.";

private static final String EXPECTED_CLASS_STRING_SIMPLE =
"package com.google.showcase.v1beta1.stub;\n\n"
+ "// This is a test class for file-diff infra\n"
+ "public class EchoStubSettings {}\n";

private static final String EXPECTED_CLASS_STRING_WITH_HEADER =
"/*\n"
+ " * Copyright 2020 Google LLC\n"
+ " *\n"
+ " * Licensed under the Apache License, Version 2.0 (the \"License\");\n"
+ " * you may not use this file except in compliance with the License.\n"
+ " * You may obtain a copy of the License at\n"
+ " *\n"
+ " * https://www.apache.org/licenses/LICENSE-2.0\n"
+ " *\n"
+ " * Unless required by applicable law or agreed to in writing, software\n"
+ " * distributed under the License is distributed on an \"AS IS\" BASIS,\n"
+ " * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n"
+ " * See the License for the specific language governing permissions and\n"
+ " * limitations under the License.\n"
+ " */\n\n"
+ "package com.google.showcase.v1beta1.stub;\n\n"
+ "public class EchoStubSettings {}\n";
}
44 changes: 44 additions & 0 deletions src/test/java/com/google/api/generator/test/framework/Assert.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
// Copyright 2020 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.api.generator.test.framework;

import java.nio.file.Path;
import java.util.List;
import junit.framework.AssertionFailedError;

public class Assert {
/**
* Assert that the generated code is identical with the content in corresponding golden file. The
* differences will be emitted to the test-logs if any.
*
* @param goldenPath the path of the golden file.
* @param codegen the generated source code.
*/
public static void assertCodeEquals(Path goldenPath, String codegen) {
List<String> diffList = Differ.diff(goldenPath, codegen);
if (!diffList.isEmpty()) {
throw new AssertionFailedError("Differences found: \n" + String.join("\n", diffList));
}
}

// Assert that two strings are identical, else throw AssertionFailedError and emit the
// differences to the test-logs.
public static void assertCodeEquals(String expected, String codegen) {
List<String> diffList = Differ.diff(expected, codegen);
if (!diffList.isEmpty()) {
throw new AssertionFailedError("Differences found: \n" + String.join("\n", diffList));
}
}
}
17 changes: 17 additions & 0 deletions src/test/java/com/google/api/generator/test/framework/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package(default_visibility = ["//visibility:public"])

filegroup(
name = "framework_files",
srcs = glob(["*.java"]),
)

java_library(
name = "framework",
srcs = [
":framework_files",
],
deps = [
"@io_github_java_diff_utils//jar",
"@junit_junit//jar",
],
)
71 changes: 71 additions & 0 deletions src/test/java/com/google/api/generator/test/framework/Differ.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
// Copyright 2020 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.api.generator.test.framework;

import com.github.difflib.DiffUtils;
import com.github.difflib.UnifiedDiffUtils;
import com.github.difflib.algorithm.DiffException;
import com.github.difflib.patch.Patch;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.List;

public class Differ {
private static final String LINE_SPLITTER = "\\r?\\n";

public static List<String> diff(Path goldenFilePath, String codegen) {
List<String> revised = Arrays.asList(codegen.split(LINE_SPLITTER));
List<String> original = null;
try {
original = Files.readAllLines(goldenFilePath);
} catch (IOException e) {
throw new GoldenFileReadException(
String.format("Error occurs when reading golden file %s", goldenFilePath));
}
return diffTwoStringLists(original, revised);
}

public static List<String> diff(String expectedStr, String actualStr) {
List<String> revised = Arrays.asList(actualStr.split(LINE_SPLITTER));
List<String> original = Arrays.asList(expectedStr.split(LINE_SPLITTER));
return diffTwoStringLists(original, revised);
}

private static List<String> diffTwoStringLists(List<String> original, List<String> revised) {
Patch<String> diff = null;
try {
diff = DiffUtils.diff(original, revised);
} catch (DiffException e) {
throw new ComputeDiffException("Could not compute the differences.");
}
List<String> unifiedDiff =
UnifiedDiffUtils.generateUnifiedDiff("golden", "codegen", original, diff, 2);
return unifiedDiff;
}

private static class GoldenFileReadException extends RuntimeException {
public GoldenFileReadException(String errorMessage) {
super(errorMessage);
}
}

private static class ComputeDiffException extends RuntimeException {
public ComputeDiffException(String errorMessage) {
super(errorMessage);
}
}
}

0 comments on commit da3a8a4

Please sign in to comment.