blob: b0000a3661541ab5619fec0d82373bb958e0670d [file] [log] [blame]
// Copyright 2022 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.starlark;
import static com.google.common.truth.Truth.assertThat;
import com.google.common.io.Files;
import com.google.devtools.build.lib.actions.Action;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.util.ActionsTestUtil;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
import com.google.devtools.build.lib.testutil.Scratch;
import com.google.devtools.build.lib.testutil.TestConstants;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.runfiles.Runfiles;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/** Tests for using bind() with Starlark rules. */
@RunWith(JUnit4.class)
public class BindTest extends BuildViewTestCase {
@Before
public final void createFiles() throws Exception {
setupStarlarkRules(scratch);
scratch.file("test/BUILD",
"load('//rules:java_rules_skylark.bzl', 'java_library')",
"java_library(name = 'giraffe',",
" srcs = ['Giraffe.java'],",
")",
"java_library(name = 'safari',",
" srcs = ['Safari.java'],",
" deps = ['//external:long-horse'],",
")");
// We need to overwrite the Jdk BUILD file because the Starlark rules also depend on having a
// jar target here, which the built-in rules don't need, and which therefore isn't part of the
// mock Java setup.
scratch.overwriteFile(
TestConstants.TOOLS_REPOSITORY_SCRATCH + "tools/jdk/BUILD",
"load(':java_toolchain_alias.bzl', 'java_runtime_alias')",
"package(default_visibility = ['//visibility:public'])",
"java_runtime_alias(name = 'current_java_runtime')",
"toolchain_type(name = 'runtime_toolchain_type')",
"toolchain(",
" name = 'java_runtime_toolchain',",
" toolchain_type = ':runtime_toolchain_type',",
" toolchain = ':jdk',",
")",
"filegroup(name = 'java', srcs = ['bin/java'])",
"filegroup(name = 'jar', srcs = ['bin/jar'])",
"filegroup(name = 'javac', srcs = ['bin/javac'])",
"alias(name='host_jdk', actual=':jdk')",
"java_runtime(name = 'jdk', srcs = ['k8/empty', 'k8/empty2'], java_home = 'k8')",
"filegroup(name='toolchain', srcs=[])");
scratch.appendFile(
"WORKSPACE",
"register_toolchains('" + TestConstants.TOOLS_REPOSITORY + "//tools/jdk:all')",
"bind(",
" name = 'long-horse',",
" actual = '//test:giraffe',",
")");
}
@Test
public void testFilesToBuild() throws Exception {
invalidatePackages();
ConfiguredTarget giraffeTarget = getConfiguredTarget("//test:giraffe");
Artifact giraffeArtifact =
ActionsTestUtil.getFirstArtifactEndingWith(getFilesToBuild(giraffeTarget), "giraffe.jar");
ConfiguredTarget safariTarget = getConfiguredTarget("//test:safari");
Action safariAction = getGeneratingAction(
ActionsTestUtil.getFirstArtifactEndingWith(getFilesToBuild(safariTarget), "safari.jar"));
assertThat(safariAction.getInputs().toList()).contains(giraffeArtifact);
}
private static void setupStarlarkRules(Scratch scratch) throws IOException {
Runfiles runfiles = Runfiles.create();
scratch.file("rules/BUILD");
String rulesSourcePath =
runfiles.rlocation(TestConstants.BUILD_RULES_DATA_PATH + "java_rules_skylark.bzl");
Path rulesDestinationPath = scratch.resolve("rules/java_rules_skylark.bzl");
scratch.file(
rulesDestinationPath.getPathString(),
Files.asCharSource(new File(rulesSourcePath), Charset.defaultCharset()).read());
}
}