Add BuildFileContentsGeneratorTest.

PiperOrigin-RevId: 413946076
diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD
index ce4056f..171341d 100644
--- a/src/test/java/com/google/devtools/build/lib/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/BUILD
@@ -28,6 +28,7 @@
         "//src/test/java/com/google/devtools/build/lib/dynamic:srcs",
         "//src/test/java/com/google/devtools/build/lib/events:srcs",
         "//src/test/java/com/google/devtools/build/lib/exec:srcs",
+        "//src/test/java/com/google/devtools/build/lib/generatedprojecttest:srcs",
         "//src/test/java/com/google/devtools/build/lib/generatedprojecttest/util:srcs",
         "//src/test/java/com/google/devtools/build/lib/graph:srcs",
         "//src/test/java/com/google/devtools/build/lib/io:srcs",
diff --git a/src/test/java/com/google/devtools/build/lib/generatedprojecttest/BUILD b/src/test/java/com/google/devtools/build/lib/generatedprojecttest/BUILD
new file mode 100644
index 0000000..800d997
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/generatedprojecttest/BUILD
@@ -0,0 +1,31 @@
+load("@rules_java//java:defs.bzl", "java_test")
+
+package(
+    default_testonly = 1,
+    default_visibility = ["//src:__subpackages__"],
+)
+
+licenses(["notice"])
+
+filegroup(
+    name = "srcs",
+    testonly = 0,
+    srcs = glob(["*"]),
+    visibility = ["//src:__subpackages__"],
+)
+
+# Unit test for BuildFileContentsGenerator
+java_test(
+    name = "BuildFileContentsGeneratorTest",
+    size = "small",
+    srcs = ["BuildFileContentsGeneratorTest.java"],
+    runtime_deps = ["//src/main/java/com/google/devtools/build/lib/bazel/rules"],
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib/vfs",
+        "//src/main/java/net/starlark/java/syntax",
+        "//src/test/java/com/google/devtools/build/lib/generatedprojecttest/util:testutil",
+        "//src/test/java/com/google/devtools/build/lib/testutil",
+        "//third_party:junit4",
+        "//third_party:truth",
+    ],
+)
diff --git a/src/test/java/com/google/devtools/build/lib/generatedprojecttest/BuildFileContentsGeneratorTest.java b/src/test/java/com/google/devtools/build/lib/generatedprojecttest/BuildFileContentsGeneratorTest.java
new file mode 100644
index 0000000..28996ba
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/generatedprojecttest/BuildFileContentsGeneratorTest.java
@@ -0,0 +1,92 @@
+// Copyright 2021 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.lib.generatedprojecttest;
+
+import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertThrows;
+
+import com.google.devtools.build.lib.generatedprojecttest.util.BuildFileContentsGenerator;
+import com.google.devtools.build.lib.generatedprojecttest.util.TestProjectBuilder;
+import com.google.devtools.build.lib.testutil.BuildRuleBuilder;
+import com.google.devtools.build.lib.testutil.Scratch;
+import com.google.devtools.build.lib.vfs.FileSystemUtils;
+import com.google.devtools.build.lib.vfs.Path;
+import java.io.IOException;
+import net.starlark.java.syntax.ParserInput;
+import net.starlark.java.syntax.StarlarkFile;
+import net.starlark.java.syntax.SyntaxError;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Tests for {@code BuildFileContentsGenerator}.
+ */
+@RunWith(JUnit4.class)
+public final class BuildFileContentsGeneratorTest {
+
+  /**
+   * The generator being tested.
+   */
+  private final BuildFileContentsGenerator generator = new BuildFileContentsGenerator();
+
+  @Test
+  public void testSetDefaultPackageVisibility() throws IllegalStateException {
+    generator.setDefaultPackageVisibility("//visibility:private");
+    assertThat(generator.getContents())
+        .startsWith("package(default_visibility = ['//visibility:private'])");
+  }
+
+  @Test
+  public void defaultPackageVisibilityIsAddedToStartOfBuildFile() throws IllegalStateException {
+    generator.addRule(new BuildRuleBuilder("java_library", generator.uniqueRuleName()));
+    generator.setDefaultPackageVisibility("//visibility:private");
+    assertThat(generator.getContents())
+        .startsWith("package(default_visibility = ['//visibility:private'])");
+  }
+
+  @Test
+  public void defaultPackageVisibilityDefaultsToPublic() throws IllegalStateException {
+    generator.addRule(new BuildRuleBuilder("java_library", generator.uniqueRuleName()));
+    assertThat(generator.getContents())
+        .startsWith("package(default_visibility = ['//visibility:public'])");
+  }
+
+  @Test
+  public void settingDefaultPackageVisibilityTwiceCausesException() throws IllegalStateException {
+    generator.setDefaultPackageVisibility("//visibility:private");
+    assertThrows(
+        IllegalStateException.class,
+        () -> generator.setDefaultPackageVisibility("//visibility:private"));
+  }
+
+  @Test
+  public void testContentsSyntax() throws IOException {
+    // TODO(blaze-team): (2012) write various simple generator examples to test the generated syntax
+    TestProjectBuilder builder = new TestProjectBuilder("tmp");
+    BuildFileContentsGenerator generator = new BuildFileContentsGenerator();
+    builder.createFileInDir("/a", "BUILD", generator);
+    Scratch scratch = builder.getScratch();
+    Path path = scratch.resolve("/tmp/a/BUILD");
+
+    byte[] bytes = FileSystemUtils.readWithKnownFileSize(path, path.getFileSize());
+    ParserInput input = ParserInput.fromLatin1(bytes, path.toString());
+    StarlarkFile file = StarlarkFile.parse(input);
+    for (SyntaxError error : file.errors()) {
+      System.err.println(error);
+    }
+    assertThat(file.ok()).isTrue();
+  }
+}