aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/test/java/com/google/devtools/build/lib/analysis
diff options
context:
space:
mode:
authorGravatar gregce <gregce@google.com>2017-04-18 18:56:03 +0200
committerGravatar Klaus Aehlig <aehlig@google.com>2017-04-19 10:47:01 +0200
commit9484d958ecc94b35182f92e5be31e7a1270b861b (patch)
treeb329cfdb9bbf6e1283e01ad418c0ce6d4d15e34f /src/test/java/com/google/devtools/build/lib/analysis
parent0b103074bf63b5dfe1b5a9b0bea8db63985a8deb (diff)
Fix crash on graph cycle in configuration loading
PiperOrigin-RevId: 153473961
Diffstat (limited to 'src/test/java/com/google/devtools/build/lib/analysis')
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationTest.java58
1 files changed, 58 insertions, 0 deletions
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<? extends Fragment> creates() {
+ return CppConfiguration.class;
+ }
+
+ @Override
+ public ImmutableSet<Class<? extends FragmentOptions>> requiredOptions() {
+ return ImmutableSet.<Class<? extends FragmentOptions>>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 <no location>: cycle detected in extension files: ",
+ " foo/BUILD",
+ ".-> //skylark:one.bzl",
+ "| //skylark:two.bzl",
+ "`-- //skylark:one.bzl"));
+ }
}