From 9484d958ecc94b35182f92e5be31e7a1270b861b Mon Sep 17 00:00:00 2001 From: gregce Date: Tue, 18 Apr 2017 18:56:03 +0200 Subject: Fix crash on graph cycle in configuration loading PiperOrigin-RevId: 153473961 --- .../analysis/config/BuildConfigurationTest.java | 58 ++++++++++++++++++++++ 1 file changed, 58 insertions(+) (limited to 'src/test/java/com/google/devtools/build/lib/analysis') diff --git a/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationTest.java b/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationTest.java index d273f8c0f4..fe17b4773a 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationTest.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationTest.java @@ -26,6 +26,8 @@ import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment import com.google.devtools.build.lib.analysis.util.ConfigurationTestCase; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.RepositoryName; +import com.google.devtools.build.lib.packages.NoSuchPackageException; +import com.google.devtools.build.lib.packages.NoSuchTargetException; import com.google.devtools.build.lib.rules.cpp.CppConfiguration; import com.google.devtools.build.lib.rules.java.JavaConfiguration; import com.google.devtools.build.lib.rules.objc.J2ObjcConfiguration; @@ -372,4 +374,60 @@ public class BuildConfigurationTest extends ConfigurationTestCase { BuildConfiguration cfg = createHost("--define=foo=bar"); assertThat(cfg.getCommandLineBuildVariables().get("foo")).isEqualTo("bar"); } + + /** + * Returns a mock config fragment that loads the given label and does nothing else. + */ + private static ConfigurationFragmentFactory createMockFragmentWithLabelDep(final String label) { + return new ConfigurationFragmentFactory() { + @Override + public Fragment create(ConfigurationEnvironment env, BuildOptions buildOptions) + throws InvalidConfigurationException, InterruptedException { + try { + env.getTarget(Label.parseAbsoluteUnchecked(label)); + } catch (NoSuchPackageException e) { + fail("cannot load mock fragment's dep label " + label + ": " + e.getMessage()); + } catch (NoSuchTargetException e) { + fail("cannot load mock fragment's dep label " + label + ": " + e.getMessage()); + } + return new Fragment() {}; + } + + @Override + public Class creates() { + return CppConfiguration.class; + } + + @Override + public ImmutableSet> requiredOptions() { + return ImmutableSet.>of(); + } + }; + } + + @Test + public void depLabelCycleOnConfigurationLoading() throws Exception { + configurationFactory = + new ConfigurationFactory( + analysisMock.createConfigurationCollectionFactory(), + createMockFragmentWithLabelDep("//foo")); + getScratch().file("foo/BUILD", + "load('//skylark:one.bzl', 'one')", + "cc_library(name = 'foo')"); + getScratch().file("skylark/BUILD"); + getScratch().file("skylark/one.bzl", + "load('//skylark:two.bzl', 'two')", + "def one():", + " pass"); + getScratch().file("skylark/two.bzl", + "load('//skylark:one.bzl', 'one')", + "def two():", + " pass"); + checkError(String.join("\n", + "ERROR : cycle detected in extension files: ", + " foo/BUILD", + ".-> //skylark:one.bzl", + "| //skylark:two.bzl", + "`-- //skylark:one.bzl")); + } } -- cgit v1.2.3