aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/com/google/devtools/build/lib/analysis/config/BuildConfigurationTest.java')
-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"));
+ }
}