Skip to content

Commit

Permalink
WIP
Browse files Browse the repository at this point in the history
  • Loading branch information
fmeum committed Sep 4, 2022
1 parent f2e646a commit 546b2cd
Show file tree
Hide file tree
Showing 2 changed files with 221 additions and 51 deletions.
11 changes: 10 additions & 1 deletion src/test/java/com/google/devtools/build/lib/analysis/BUILD
Expand Up @@ -412,9 +412,18 @@ java_test(
"//src/main/java/com/google/devtools/build/lib/actions",
"//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
"//src/main/java/com/google/devtools/build/lib/analysis:configured_target",
"//src/test/java/com/google/devtools/build/lib/analysis/util:util",
"//src/main/java/com/google/devtools/build/lib/bazel/bzlmod:resolution_impl",
"//src/main/java/com/google/devtools/build/lib/bazel/repository:repository_options",
"//src/main/java/com/google/devtools/build/lib/cmdline",
"//src/main/java/com/google/devtools/build/lib/events",
"//src/main/java/com/google/devtools/build/lib/skyframe:precomputed_value",
"//src/main/java/com/google/devtools/build/lib/skyframe:repository_mapping_value",
"//src/main/java/com/google/devtools/build/lib/vfs",
"//src/main/java/com/google/devtools/build/skyframe",
"//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
"//src/test/java/com/google/devtools/build/lib/analysis/util",
"//src/test/java/com/google/devtools/build/lib/bazel/bzlmod:util",
"//src/test/java/com/google/devtools/build/lib/skyframe:testutil",
"//third_party:junit4",
"//third_party:truth",
],
Expand Down
Expand Up @@ -24,15 +24,19 @@
import com.google.devtools.build.lib.bazel.bzlmod.FakeRegistry;
import com.google.devtools.build.lib.bazel.bzlmod.ModuleFileFunction;
import com.google.devtools.build.lib.bazel.repository.RepositoryOptions.CheckDirectDepsMode;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.RepositoryMapping;
import com.google.devtools.build.lib.cmdline.RepositoryName;
import com.google.devtools.build.lib.skyframe.PrecomputedValue;
import com.google.devtools.build.lib.skyframe.PrecomputedValue.Injected;
import com.google.devtools.build.lib.skyframe.RepositoryMappingValue;
import com.google.devtools.build.lib.skyframe.util.SkyframeExecutorTestUtils;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.skyframe.EvaluationResult;
import com.google.devtools.build.skyframe.SkyKey;
import java.io.IOException;
import java.util.Map;
import java.util.stream.Collectors;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
Expand Down Expand Up @@ -60,86 +64,243 @@ protected ImmutableList<Injected> extraPrecomputedValues() {
BazelModuleResolutionFunction.CHECK_DIRECT_DEPENDENCIES, CheckDirectDepsMode.WARNING));
}

@Before
public void setupModules() throws Exception {
@Test
public void testRunfilesLibraryUsersCollectedInRunfilesProvider() throws Exception {
setBuildLanguageOptions("--enable_bzlmod");
scratch.overwriteFile(
"MODULE.bazel",
scratch.file("MODULE.bazel",
"module()",
"bazel_dep(name='java_user',version='1.0')");
"bazel_dep(name='starlark_non_user',version='1.0')");
registry
// .addModule(
// createModuleKey("a", "1.0"),
// "module(name='a',version='1.0')")
// .addModule(
// createModuleKey("b", "1.0"),
// "module(name='b',version='1.0')")
// .addModule(
// createModuleKey("c", "1.0"),
// "module(name='c',version='1.0')")
.addModule(
createModuleKey("utils", "1.0"),
"module(name='utils',version='1.0')",
"bazel_dep(name='bar_user',version='1.0')")
.addModule(
createModuleKey("cc_user", "1.0"),
"module(name='cc_user',version='1.0')",
"bazel_dep(name='utils',version='1.0')")
.addModule(
createModuleKey("cc_non_user", "1.0"),
"module(name='cc_non_user',version='1.0')",
"bazel_dep(name='cc_user',version='1.0')")
.addModule(
createModuleKey("java_user", "1.0"),
"module(name='java_user',version='1.0')")
"module(name='java_user',version='1.0')",
"bazel_dep(name='utils',version='1.0')")
.addModule(
createModuleKey("java_non_user", "1.0"),
"module(name='java_non_user',version='1.0')",
"bazel_dep(name='java_user',version='1.0')")
.addModule(
createModuleKey("bar_user", "1.0"),
"module(name='bar_user',version='1.0')",
"bazel_dep(name='utils',version='1.0')",
"register_toolchains('//:bar_toolchain')")
.addModule(
createModuleKey("starlark_user", "1.0"),
"module(name='starlark_user',version='1.0')",
"bazel_dep(name='utils',version='1.0')")
.addModule(
createModuleKey("starlark_tool_user", "1.0"),
"module(name='starlark_tool_user',version='1.0')",
"bazel_dep(name='utils',version='1.0')")
.addModule(
createModuleKey("java_no_user", "1.0"),
"module(name='java_no_user',version='1.0')",
"bazel_dep(name='java_user',version='1.0')");
createModuleKey("starlark_non_user", "1.0"),
"module(name='starlark_non_user',version='1.0')",
"bazel_dep(name='utils',version='1.0')",
"bazel_dep(name='starlark_user',version='1.0')",
"bazel_dep(name='starlark_tool_user',version='1.0')",
"bazel_dep(name='java_non_user',version='1.0')",
"bazel_dep(name='cc_non_user',version='1.0')",
"bazel_dep(name='bar_user',version='1.0')");

scratch.file(moduleRoot.getRelative("utils~1.0").getRelative("WORKSPACE").getPathString());
scratch.file(moduleRoot.getRelative("utils~1.0").getRelative("BUILD").getPathString(),
"load(':utils.bzl', 'runfiles_lib')",
"runfiles_lib(name='runfiles_lib',visibility=['//visibility:public'])");
scratch.file(
moduleRoot.getRelative("utils~1.0").getRelative("utils.bzl").getPathString(),
"def _runfiles_lib_impl(ctx):",
" fake_output_jar = ctx.actions.declare_file(ctx.attr.name + '.jar')",
" ctx.actions.write(fake_output_jar, '')",
" return [",
" CcInfo(),",
" JavaInfo(output_jar = fake_output_jar, compile_jar = None),",
" RunfilesLibraryInfo(),",
" ]",
"runfiles_lib = rule(_runfiles_lib_impl)",
"",
"def _starlark_rule_impl(ctx):",
// Explicitly do not merge in runfiles, just create a new runfiles object.
" return [DefaultInfo(runfiles = ctx.runfiles())]",
"starlark_rule = rule(",
" implementation = _starlark_rule_impl,",
" attrs = {",
" 'deps': attr.label_list(),",
" 'tool_deps': attr.label_list(cfg = 'exec'),",
" },",
" toolchains = ['@bar_user//:toolchain_type'],",
")");

scratch.file(moduleRoot.getRelative("cc_user~1.0").getRelative("WORKSPACE").getPathString());
scratch.file(
moduleRoot.getRelative("cc_user~1.0").getRelative("BUILD").getPathString(),
"cc_library(",
" name = 'cc_user',",
" deps = ['@utils//:runfiles_lib'],",
" visibility = ['//visibility:public'],",
")");

scratch.file(
moduleRoot.getRelative("cc_non_user~1.0").getRelative("WORKSPACE").getPathString());
scratch.file(
moduleRoot.getRelative("cc_non_user~1.0").getRelative("BUILD").getPathString(),
"cc_library(",
" name = 'cc_non_user',",
" deps = ['@cc_user//:cc_user'],",
")");

scratch.file(moduleRoot.getRelative("java_user~1.0").getRelative("WORKSPACE").getPathString());
scratch.file(
moduleRoot.getRelative("java_user~1.0").getRelative("BUILD").getPathString(),
"load(':java_runfiles_lib.bzl', 'java_runfiles_lib')",
"java_library(",
" name = 'java_user',",
" runtime_deps = [':java_runfiles_lib'],",
" runtime_deps = ['@utils//:runfiles_lib'],",
" visibility = ['//visibility:public'],",
")");
scratch.file(
moduleRoot.getRelative("java_user~1.0").getRelative("java_runfiles_lib.bzl").getPathString(),
"def _java_runfiles_lib_impl(ctx):",
" return [",
" JavaInfo(output_jar = None, compile_jar = None),",
" RunfilesLibraryInfo(),",
" ]",
"java_runfiles_lib = rule(_java_runfiles_lib_impl)");

scratch.file(moduleRoot.getRelative("java_no_user~1.0").getRelative("WORKSPACE").getPathString());
scratch.file(
moduleRoot.getRelative("java_no_user~1.0").getRelative("BUILD").getPathString(),
moduleRoot.getRelative("java_non_user~1.0").getRelative("WORKSPACE").getPathString());
scratch.file(
moduleRoot.getRelative("java_non_user~1.0").getRelative("BUILD").getPathString(),
"java_library(",
" name = 'java_no_user',",
" name = 'java_non_user',",
" srcs = ['Lib.java'],",
" deps = ['@java_user//:java_user],",
" deps = ['@java_user//:java_user'],",
")");

scratch.file(moduleRoot.getRelative("starlark_user~1.0").getRelative("WORKSPACE").getPathString());
scratch.file(
moduleRoot.getRelative("starlark_user~1.0").getRelative("BUILD").getPathString(),
"load(':java_runfiles_lib.bzl', 'java_runfiles_lib')",
moduleRoot.getRelative("bar_user~1.0").getRelative("WORKSPACE").getPathString());
scratch.file(
moduleRoot.getRelative("bar_user~1.0").getRelative("BUILD").getPathString(),
"load(':toolchain.bzl', 'bar_toolchain')",
"java_library(",
" name = 'java_user',",
" runtime_deps = [':java_runfiles_lib'],",
" name = 'bar_user',",
" srcs = ['Runtime.java'],",
" deps = ['@utils//:runfiles_lib'],",
")",
"bar_toolchain(",
" name = 'bar',",
" runtime = ':bar_user',",
")",
"toolchain_type(name = 'toolchain_type')",
"toolchain(",
" name = 'bar_toolchain',",
" toolchain = ':bar',",
" toolchain_type = ':toolchain_type',",
")");
scratch.file(
moduleRoot.getRelative("bar_user~1.0").getRelative("toolchain.bzl").getPathString(),
"def _bar_toolchain_impl(ctx):",
" return [platform_common.ToolchainInfo(type = 'bar')]",
"bar_toolchain = rule(",
" implementation = _bar_toolchain_impl,",
" attrs = {'runtime': attr.label()},",
")");

scratch.file(
moduleRoot.getRelative("starlark_user~1.0").getRelative("WORKSPACE").getPathString());
scratch.file(
moduleRoot.getRelative("starlark_user~1.0").getRelative("BUILD").getPathString(),
"load('@utils//:utils.bzl', 'starlark_rule')",
"starlark_rule(",
" name = 'starlark_user',",
" deps = ['@utils//:runfiles_lib'],",
" visibility = ['//visibility:public'],",
")");

scratch.file(
moduleRoot.getRelative("starlark_user~1.0").getRelative("java_runfiles_lib.bzl").getPathString(),
"def _java_runfiles_lib_impl(ctx):",
" return [",
" JavaInfo(output_jar = None, compile_jar = None),",
" RunfilesLibraryInfo(),",
" ]",
"java_runfiles_lib = rule(_java_runfiles_lib_impl)");
moduleRoot.getRelative("starlark_tool_user~1.0").getRelative("WORKSPACE").getPathString());
scratch.file(
moduleRoot.getRelative("starlark_tool_user~1.0").getRelative("BUILD").getPathString(),
"load('@utils//:utils.bzl', 'starlark_rule')",
"starlark_rule(",
" name = 'starlark_tool_user',",
" deps = ['@utils//:runfiles_lib'],",
" visibility = ['//visibility:public'],",
")");

scratch.file(
moduleRoot.getRelative("starlark_non_user~1.0").getRelative("WORKSPACE").getPathString());
scratch.file(
moduleRoot.getRelative("starlark_non_user~1.0").getRelative("BUILD").getPathString(),
"load('@utils//:utils.bzl', 'starlark_rule')",
"starlark_rule(",
" name = 'starlark_non_user',",
" deps = [",
" '@starlark_user//:starlark_user',",
" '@java_non_user//:java_non_user',",
" '@cc_non_user//:cc_non_user',",
" ],",
" tool_deps = [",
" '@starlark_tool_user//:starlark_tool_user',",
" '@utils//:runfiles_lib',",
" ],",
" visibility = ['//visibility:public'],",
")");

assertThat(getRunfilesLibraryUsers("@@utils~1.0//:runfiles_lib")).isEmpty();

RepositoryName ccUser = RepositoryName.createUnvalidated("cc_user~1.0");
Map<RepositoryName, RepositoryMapping> ccUserRunfilesLibraryUsers = getRunfilesLibraryUsers(
"@@cc_user~1.0//:cc_user");
RepositoryMapping ccUserMapping = getRepositoryMapping(ccUser);
assertThat(ccUserRunfilesLibraryUsers).containsExactly(ccUser, ccUserMapping);

Map<RepositoryName, RepositoryMapping> ccNonUserRunfilesLibraryUsers = getRunfilesLibraryUsers(
"@@cc_non_user~1.0//:cc_non_user");
assertThat(ccNonUserRunfilesLibraryUsers).containsExactly(ccUser, ccUserMapping);

RepositoryName javaUser = RepositoryName.createUnvalidated("java_user~1.0");
Map<RepositoryName, RepositoryMapping> javaUserRunfilesLibraryUsers = getRunfilesLibraryUsers(
"@@java_user~1.0//:java_user");
RepositoryMapping javaUserMapping = getRepositoryMapping(javaUser);
assertThat(javaUserRunfilesLibraryUsers).containsExactly(javaUser, javaUserMapping);

Map<RepositoryName, RepositoryMapping> javaNonUserRunfilesLibraryUsers = getRunfilesLibraryUsers(
"@@java_non_user~1.0//:java_non_user");
assertThat(javaNonUserRunfilesLibraryUsers).containsExactly(javaUser, javaUserMapping);

RepositoryName barUser = RepositoryName.createUnvalidated("bar_user~1.0");
Map<RepositoryName, RepositoryMapping> barUserRunfilesLibraryUsers = getRunfilesLibraryUsers(
"@@bar_user~1.0//:bar_user");
RepositoryMapping barUserMapping = getRepositoryMapping(barUser);
assertThat(barUserRunfilesLibraryUsers).containsExactly(barUser, barUserMapping);

RepositoryName starlarkUser = RepositoryName.createUnvalidated("starlark_user~1.0");
Map<RepositoryName, RepositoryMapping> starlarkUserRunfilesLibraryUsers = getRunfilesLibraryUsers(
"@@starlark_user~1.0//:starlark_user");
RepositoryMapping starlarkUserMapping = getRepositoryMapping(starlarkUser);
assertThat(starlarkUserRunfilesLibraryUsers).containsExactly(starlarkUser, starlarkUserMapping);

Map<RepositoryName, RepositoryMapping> starlarkNonUserRunfilesLibraryUsers = getRunfilesLibraryUsers(
"@@starlark_non_user~1.0//:starlark_non_user");
assertThat(starlarkNonUserRunfilesLibraryUsers).containsExactly(
javaUser, javaUserMapping, ccUser, ccUserMapping, starlarkUser, starlarkUserMapping,
barUser, barUserMapping);
}

@Test
public void testNoRunfilesLibraryUsers() throws Exception {
assertThat(getRunfilesLibraryUsers("@java_no_user//:java_no_user").keySet()).containsExactly(
RepositoryName.MAIN);
private RepositoryMapping getRepositoryMapping(RepositoryName ccUser)
throws InterruptedException {
SkyKey key = RepositoryMappingValue.key(ccUser);
EvaluationResult<RepositoryMappingValue> result = SkyframeExecutorTestUtils.evaluate(
getSkyframeExecutor(), key, /*keepGoing=*/ false, reporter);
return result.get(key).getRepositoryMapping();
}

private Map<RepositoryName, RepositoryMapping> getRunfilesLibraryUsers(String label)
throws Exception {
ConfiguredTarget target = getConfiguredTarget(label);
ConfiguredTarget target = getConfiguredTarget(Label.parseCanonical(label), targetConfig);
RunfilesProvider runfilesProvider = target.getProvider(RunfilesProvider.class);

assertThat(runfilesProvider).isNotNull();
Expand Down

0 comments on commit 546b2cd

Please sign in to comment.