// Copyright 2017 The Bazel Authors. All rights reserved.
//
// 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.devtools.build.benchmark.codegenerator;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import com.google.common.base.Joiner;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Scanner;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/** Test for {@link JavaCodeGeneratorHelper}. */
@RunWith(JUnit4.class)
public class JavaCodeGeneratorHelperTest {
private static final String RANDOM_CLASS_CONTENT = joinLines(
"package com.package.name;",
"",
"import java.lang.System;",
"import java.util.Random;",
"",
"public final class ClassName {",
" public static void PrintSth() {",
" Random rand = new Random();",
" int n = rand.nextInt(100);",
" System.out.format(\"This is method(%s) with random number(%d)\\n\", \"PrintSth\", n);",
" }",
"}");
private static final String RANDOM_CLASS_EXTRA_CONTENT = joinLines(
"package com.package.name;",
"",
"import java.lang.System;",
"import java.util.Random;",
"",
"public final class ClassNameExtra {",
" public static void PrintSth() {",
" Random rand = new Random();",
" int n = rand.nextInt(100);",
" System.out.format(\"This is method(%s) with random number(%d)\\n\", \"PrintSth\", n);",
" }",
"",
" public static void PrintSthElse() {",
" Random rand = new Random();",
" int n = rand.nextInt(100);",
" System.out.format(\"This is method(%s) with random number(%d)\\n\","
+ " \"PrintSthElse\", n);",
" }",
"}");
private static final String MAIN_CLASS_CONTENT = joinLines(
"package com.package.name;",
"",
"import java.lang.String;",
"",
"public class Main {",
" public static void main(String[] args) {",
" }",
"}");
private static final String DEPS_BUILD_FILE_CONTENT = joinLines(
"java_library(",
" name = 'Deps42',",
" srcs = glob([ 'com/example/deps42/*.java' ]),",
"<this is deps>",
" visibility = [ '//visibility:public' ],",
")");
private static final String TARGET_BUILD_FILE_CONTENT = joinLines(
"java_binary(",
" name = 'Target',",
" srcs = glob([ 'com/example/generated/*.java' ]),",
" main_class = 'com.example.generated.Main',",
"<this is deps>",
")");
private static final String DEPS_CLASS_CONTENT = joinLines(
"package com.example.deps42;",
"",
"import com.example.deps43.Deps43;",
"import java.lang.System;",
"import java.util.Random;",
"",
"public final class Deps42 {",
" public static void PrintSth() {",
" Random rand = new Random();",
" int n = rand.nextInt(100);",
" System.out.format(\"This is method(%s) with random number(%d)\\n\", \"PrintSth\", n);",
" }",
"",
" public static void CallNext() {",
" Deps43.PrintSth();",
" }",
"}");
private static final String DEPS_CLASS_EXTRA_CONTENT = joinLines(
"package com.example.deps42;",
"",
"import java.lang.System;",
"import java.util.Random;",
"",
"public final class Deps42 {",
" public static void PrintSth() {",
" Random rand = new Random();",
" int n = rand.nextInt(100);",
" System.out.format(\"This is method(%s) with random number(%d)\\n\", \"PrintSth\", n);",
" }",
"",
" public static void PrintSthElse() {",
" Random rand = new Random();",
" int n = rand.nextInt(100);",
" System.out.format(\"This is method(%s) with random number(%d)\\n\","
+ " \"PrintSthElse\", n);",
" }",
"}");
private static final String MAIN_CLASS_WITH_DEPS_CONTENT = joinLines(
"package com.example.generated;",
"",
"import com.example.deps1.Deps1;",
"import com.example.deps2.Deps2;",
"import com.example.deps3.Deps3;",
"import java.lang.String;",
"",
"public final class Main {",
" public static void main(String[] args) {",
" Deps1.PrintSth();",
" Deps2.PrintSth();",
" Deps3.PrintSth();",
" }",
"}");
@Rule public TemporaryFolder folder = new TemporaryFolder();
@Test
public void testWriteRandomClassToDir() throws IOException {
Path dir = folder.newFolder("WriteRandomClassToDir").toPath();
JavaCodeGeneratorHelper.writeRandomClassToDir(false, "ClassName", "com.package.name", dir);
Path javaFile = dir.resolve("com/package/name/ClassName.java");
assertTrue(javaFile.toFile().exists());
String content = new Scanner(javaFile).useDelimiter("\\Z").next();
assertEquals(RANDOM_CLASS_CONTENT, content);
}
@Test
public void testWriteRandomClassToDirExtraMethod() throws IOException {
Path dir = folder.newFolder("WriteRandomClassToDirExtraMethod").toPath();
JavaCodeGeneratorHelper.writeRandomClassToDir(true, "ClassNameExtra", "com.package.name", dir);
Path javaFile = dir.resolve("com/package/name/ClassNameExtra.java");
assertTrue(javaFile.toFile().exists());
String content = new Scanner(javaFile).useDelimiter("\\Z").next();
assertEquals(RANDOM_CLASS_EXTRA_CONTENT, content);
}
@Test
public void testWriteMainClassToDir() throws IOException {
Path dir = folder.newFolder("WriteMainClassToDir").toPath();
JavaCodeGeneratorHelper.writeMainClassToDir("com.package.name", dir);
Path javaFile = dir.resolve("com/package/name/Main.java");
assertTrue(javaFile.toFile().exists());
String content = new Scanner(javaFile).useDelimiter("\\Z").next();
assertEquals(MAIN_CLASS_CONTENT, content);
}
@Test
public void testBuildFileWithNextDeps() throws IOException {
Path dir = folder.newFolder("BuildFileWithNextDeps").toPath();
Files.createDirectories(dir);
JavaCodeGeneratorHelper.buildFileWithNextDeps(42, "<this is deps>", dir);
Path buildFile = dir.resolve("BUILD");
assertTrue(buildFile.toFile().exists());
String content = new Scanner(buildFile).useDelimiter("\\Z").next();
assertEquals(DEPS_BUILD_FILE_CONTENT, content);
}
@Test
public void testBuildFileWithMainClass() throws IOException {
Path dir = folder.newFolder("BuildFileWithMainClass").toPath();
Files.createDirectories(dir);
JavaCodeGeneratorHelper.buildFileWithMainClass("Target", "<this is deps>", dir);
Path buildFile = dir.resolve("BUILD");
assertTrue(buildFile.toFile().exists());
String content = new Scanner(buildFile).useDelimiter("\\Z").next();
assertEquals(TARGET_BUILD_FILE_CONTENT, content);
}
@Test
public void testTargetWithNextHelper() throws IOException {
Path dir = folder.newFolder("TargetWithNextHelper").toPath();
JavaCodeGeneratorHelper.targetWithNextHelper(42, true, dir);
Path javaFile = dir.resolve("com/example/deps42/Deps42.java");
assertTrue(javaFile.toFile().exists());
String content = new Scanner(javaFile).useDelimiter("\\Z").next();
assertEquals(DEPS_CLASS_CONTENT, content);
}
@Test
public void testTargetWithNextExtraHelper() throws IOException {
Path dir = folder.newFolder("TargetWithNextHelperExtra").toPath();
JavaCodeGeneratorHelper.targetWithNextExtraHelper(42, false, dir);
Path javaFile = dir.resolve("com/example/deps42/Deps42.java");
assertTrue(javaFile.toFile().exists());
String content = new Scanner(javaFile).useDelimiter("\\Z").next();
assertEquals(DEPS_CLASS_EXTRA_CONTENT, content);
}
@Test
public void testParallelDepsMainClassHelper() throws IOException {
Path dir = folder.newFolder("ParallelDepsMainClassHelper").toPath();
JavaCodeGeneratorHelper.parallelDepsMainClassHelper(4, dir);
Path javaFile = dir.resolve("com/example/generated/Main.java");
assertTrue(javaFile.toFile().exists());
String content = new Scanner(javaFile).useDelimiter("\\Z").next();
assertEquals(MAIN_CLASS_WITH_DEPS_CONTENT, content);
}
private static String joinLines(String... lines) {
return Joiner.on("\n").join(lines);
}
}