aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/test/java/com
diff options
context:
space:
mode:
authorGravatar Greg Estren <gregce@google.com>2016-08-09 22:36:51 +0000
committerGravatar Yue Gan <yueg@google.com>2016-08-10 08:38:45 +0000
commit373e3e28274cca5b87f48abe33884edb84016dd3 (patch)
tree61744785eadf07f70d0a9a3264c00cf992441190 /src/test/java/com
parenteff8b365c172b7e904ac6f7bba0c893fed7c91a8 (diff)
Implements dynamic split transitions on latebound attributes.
With this change, dynamic configs are at full feature parity for split transitions (minus some small differences in composed transitions from BuildConfigurationCollection.configurationHook). -- MOS_MIGRATED_REVID=129802414
Diffstat (limited to 'src/test/java/com')
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java21
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java17
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/LateBoundSplitUtil.java157
3 files changed, 192 insertions, 3 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java b/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java
index b1539f8766..d48756ad1b 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/BuildViewTest.java
@@ -37,6 +37,7 @@ import com.google.devtools.build.lib.actions.Actions;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.FailAction;
import com.google.devtools.build.lib.analysis.BuildView.AnalysisResult;
+import com.google.devtools.build.lib.analysis.config.ConfigurationFactory;
import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
import com.google.devtools.build.lib.analysis.util.AnalysisMock;
import com.google.devtools.build.lib.analysis.util.BuildViewTestBase;
@@ -58,6 +59,7 @@ import com.google.devtools.build.skyframe.NotifyingHelper.Listener;
import com.google.devtools.build.skyframe.NotifyingHelper.Order;
import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.TrackingAwaiter;
+
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.concurrent.CountDownLatch;
@@ -1252,6 +1254,25 @@ public class BuildViewTest extends BuildViewTestBase {
+ "required config fragments: Jvm");
}
+ @Test
+ public void lateBoundSplitAttributeConfigs() throws Exception {
+ useRuleClassProvider(LateBoundSplitUtil.getRuleClassProvider());
+ // Register the latebound split fragment with the config creation environment.
+ useConfigurationFactory(new ConfigurationFactory(
+ ruleClassProvider.getConfigurationCollectionFactory(),
+ ruleClassProvider.getConfigurationFragments()));
+
+ scratch.file("foo/BUILD",
+ "rule_with_latebound_split(",
+ " name = 'foo')",
+ "sh_binary(",
+ " name = 'latebound_dep',",
+ " srcs = ['latebound_dep.sh'])");
+ update("//foo:foo");
+ assertNotNull(getConfiguredTarget("//foo:foo"));
+ // TODO(bazel-team): also check that the dep is created in each expected configuration.
+ }
+
/** Runs the same test with the reduced loading phase. */
@TestSpec(size = Suite.SMALL_TESTS)
@RunWith(JUnit4.class)
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java b/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java
index 239e2f12ad..7f1538464d 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java
@@ -18,6 +18,8 @@ import static org.junit.Assert.assertNotNull;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ListMultimap;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
import com.google.devtools.build.lib.analysis.util.AnalysisTestCase;
import com.google.devtools.build.lib.analysis.util.TestAspects;
@@ -31,14 +33,14 @@ import com.google.devtools.build.lib.packages.NoSuchPackageException;
import com.google.devtools.build.lib.packages.NoSuchTargetException;
import com.google.devtools.build.lib.packages.NoSuchThingException;
import com.google.devtools.build.lib.packages.Target;
-
+import java.util.List;
+import java.util.Set;
+import javax.annotation.Nullable;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
-import javax.annotation.Nullable;
-
/**
* Tests for {@link DependencyResolver}.
*
@@ -80,6 +82,15 @@ public class DependencyResolverTest extends AnalysisTestCase {
throw new IllegalStateException(e);
}
}
+
+ @Nullable
+ @Override
+ protected List<BuildConfiguration> getConfigurations(
+ Set<Class<? extends BuildConfiguration.Fragment>> fragments,
+ Iterable<BuildOptions> buildOptions) {
+ throw new UnsupportedOperationException(
+ "this functionality is covered by analysis-phase integration tests");
+ }
};
}
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/LateBoundSplitUtil.java b/src/test/java/com/google/devtools/build/lib/analysis/LateBoundSplitUtil.java
new file mode 100644
index 0000000000..a6a2480786
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/analysis/LateBoundSplitUtil.java
@@ -0,0 +1,157 @@
+// Copyright 2016 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.analysis;
+
+import static com.google.devtools.build.lib.packages.Attribute.attr;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildOptions;
+import com.google.devtools.build.lib.analysis.config.ConfigurationEnvironment;
+import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
+import com.google.devtools.build.lib.analysis.config.FragmentOptions;
+import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
+import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.packages.Attribute;
+import com.google.devtools.build.lib.packages.AttributeMap;
+import com.google.devtools.build.lib.packages.BuildType;
+import com.google.devtools.build.lib.packages.Rule;
+import com.google.devtools.build.lib.packages.RuleClass;
+import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
+import com.google.devtools.build.lib.testutil.UnknownRuleConfiguredTarget;
+import com.google.devtools.build.lib.util.FileTypeSet;
+import com.google.devtools.common.options.Option;
+
+import java.util.List;
+
+/**
+ * Rule and configuration class definitions for testing late-bound split attributes.
+ */
+public class LateBoundSplitUtil {
+ /**
+ * A custom {@link FragmentOptions} with the option to be split.
+ */
+ public static class Options extends FragmentOptions { // public for options loader
+ @Option(
+ name = "foo",
+ defaultValue = "",
+ category = "undocumented"
+ )
+ public String fooFlag;
+
+ @Override
+ public List<Attribute.SplitTransition<BuildOptions>> getPotentialSplitTransitions() {
+ return ImmutableList.<Attribute.SplitTransition<BuildOptions>>of(SIMPLE_SPLIT);
+ }
+ }
+
+ /**
+ * The split.
+ */
+ private static final Attribute.SplitTransition<BuildOptions> SIMPLE_SPLIT =
+ new Attribute.SplitTransition<BuildOptions>() {
+ @Override
+ public List<BuildOptions> split(BuildOptions buildOptions) {
+ BuildOptions split1 = buildOptions.clone();
+ split1.get(Options.class).fooFlag = "one";
+ BuildOptions split2 = buildOptions.clone();
+ split2.get(Options.class).fooFlag = "two";
+ return ImmutableList.<BuildOptions>of(split1, split2);
+ }
+
+ @Override
+ public boolean defaultsToSelf() {
+ return false;
+ }
+ };
+
+ /**
+ * The {@link BuildConfiguration.Fragment} that contains the options.
+ */
+ private static class Fragment extends BuildConfiguration.Fragment {
+ }
+
+ /**
+ * The fragment's loader.
+ */
+ static class FragmentLoader implements ConfigurationFragmentFactory {
+ @Override
+ public BuildConfiguration.Fragment create(ConfigurationEnvironment env,
+ BuildOptions buildOptions)
+ throws InvalidConfigurationException {
+ return new Fragment();
+ }
+
+ @Override
+ public Class<? extends BuildConfiguration.Fragment> creates() {
+ return Fragment.class;
+ }
+
+ @Override
+ public ImmutableSet<Class<? extends FragmentOptions>> requiredOptions() {
+ return ImmutableSet.<Class<? extends FragmentOptions>>of(Options.class);
+ }
+ }
+
+ /**
+ * The resolver that chooses the late-bound attribute's value.
+ */
+ private static final Attribute.LateBoundLabel<BuildConfiguration> SIMPLE_LATEBOUND_RESOLVER =
+ new Attribute.LateBoundLabel<BuildConfiguration>() {
+ @Override
+ public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
+ return Label.parseAbsoluteUnchecked("//foo:latebound_dep");
+ }
+ };
+
+ /**
+ * A custom rule that applies a late-bound split attribute.
+ */
+ static class RuleWithLateBoundSplitAttribute implements RuleDefinition {
+ @Override
+ public RuleClass build(RuleClass.Builder builder, RuleDefinitionEnvironment environment) {
+ return builder
+ .add(attr(":latebound_split_attr", BuildType.LABEL)
+ .allowedFileTypes(FileTypeSet.ANY_FILE)
+ .allowedRuleClasses(Attribute.ANY_RULE)
+ .cfg(SIMPLE_SPLIT)
+ .value(SIMPLE_LATEBOUND_RESOLVER))
+ .requiresConfigurationFragments(Fragment.class)
+ .build();
+ }
+
+ @Override
+ public Metadata getMetadata() {
+ return RuleDefinition.Metadata.builder()
+ .name("rule_with_latebound_split")
+ .ancestors(BaseRuleClasses.RuleBase.class)
+ .factoryClass(UnknownRuleConfiguredTarget.class)
+ .build();
+ }
+ }
+
+ /**
+ * Returns a rule class provider with standard test setup plus the above rules/configs.
+ */
+ static ConfiguredRuleClassProvider getRuleClassProvider() {
+ ConfiguredRuleClassProvider.Builder builder = new ConfiguredRuleClassProvider.Builder();
+ TestRuleClassProvider.addStandardRules(builder);
+ builder.addRuleDefinition(new RuleWithLateBoundSplitAttribute());
+ builder.addConfigurationFragment(new FragmentLoader());
+ builder.addConfigurationOptions(Options.class);
+ return builder.build();
+ }
+} \ No newline at end of file