aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Ulf Adams <ulfjack@google.com>2015-03-18 17:29:37 +0000
committerGravatar Han-Wen Nienhuys <hanwen@google.com>2015-03-20 14:27:02 +0000
commit16a6b57ceac396609f1563cf33eeaa3057de4ec4 (patch)
treeb86437d1280415d03acfe968cc659a18f5cf17a6 /src
parent830af4ca3ad02de3901dbbd790713753668b2b0e (diff)
Open source ConfigurationTestCase.
-- MOS_MIGRATED_REVID=88944458
Diffstat (limited to 'src')
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/BazelAnalysisMock.java6
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java9
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java174
3 files changed, 189 insertions, 0 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/BazelAnalysisMock.java b/src/test/java/com/google/devtools/build/lib/analysis/BazelAnalysisMock.java
index be20313548..98b687a072 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/BazelAnalysisMock.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/BazelAnalysisMock.java
@@ -17,6 +17,7 @@ import com.google.common.base.Functions;
import com.google.common.collect.ImmutableList;
import com.google.common.io.ByteStreams;
import com.google.devtools.build.lib.analysis.config.ConfigurationFactory;
+import com.google.devtools.build.lib.analysis.config.FragmentOptions;
import com.google.devtools.build.lib.analysis.util.AnalysisMock;
import com.google.devtools.build.lib.bazel.rules.BazelConfiguration;
import com.google.devtools.build.lib.bazel.rules.BazelConfigurationCollection;
@@ -86,4 +87,9 @@ public class BazelAnalysisMock extends AnalysisMock {
public Collection<String> getOptionOverrides() {
return ImmutableList.of();
}
+
+ @Override
+ public ImmutableList<Class<? extends FragmentOptions>> getBuildOptions() {
+ throw new UnsupportedOperationException();
+ }
}
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java
index c411695605..5dc17eb581 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/AnalysisMock.java
@@ -13,7 +13,9 @@
// limitations under the License.
package com.google.devtools.build.lib.analysis.util;
+import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.analysis.config.ConfigurationFactory;
+import com.google.devtools.build.lib.analysis.config.FragmentOptions;
import com.google.devtools.build.lib.packages.util.MockToolsConfig;
import java.io.IOException;
@@ -34,6 +36,8 @@ public abstract class AnalysisMock {
public abstract Collection<String> getOptionOverrides();
+ public abstract ImmutableList<Class<? extends FragmentOptions>> getBuildOptions();
+
public static class Delegate extends AnalysisMock {
private final AnalysisMock delegate;
@@ -55,5 +59,10 @@ public abstract class AnalysisMock {
public Collection<String> getOptionOverrides() {
return delegate.getOptionOverrides();
}
+
+ @Override
+ public ImmutableList<Class<? extends FragmentOptions>> getBuildOptions() {
+ return delegate.getBuildOptions();
+ }
}
}
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
new file mode 100644
index 0000000000..70c5a86422
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java
@@ -0,0 +1,174 @@
+// Copyright 2015 Google Inc. 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.util;
+
+import com.google.common.base.Predicates;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSortedSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Maps;
+import com.google.devtools.build.lib.analysis.BlazeDirectories;
+import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationCollection;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationKey;
+import com.google.devtools.build.lib.analysis.config.BuildOptions;
+import com.google.devtools.build.lib.analysis.config.ConfigurationFactory;
+import com.google.devtools.build.lib.analysis.config.FragmentOptions;
+import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
+import com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition;
+import com.google.devtools.build.lib.packages.PackageFactory;
+import com.google.devtools.build.lib.packages.Preprocessor;
+import com.google.devtools.build.lib.packages.util.MockToolsConfig;
+import com.google.devtools.build.lib.pkgcache.PackageCacheOptions;
+import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
+import com.google.devtools.build.lib.skyframe.DiffAwareness;
+import com.google.devtools.build.lib.skyframe.PrecomputedValue;
+import com.google.devtools.build.lib.skyframe.SequencedSkyframeExecutor;
+import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
+import com.google.devtools.build.lib.testutil.FoundationTestCase;
+import com.google.devtools.build.lib.testutil.TestConstants;
+import com.google.devtools.build.lib.testutil.TestRuleClassProvider;
+import com.google.devtools.build.lib.util.BlazeClock;
+import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
+import com.google.devtools.build.lib.vfs.Path;
+import com.google.devtools.build.lib.vfs.PathFragment;
+import com.google.devtools.build.skyframe.SkyFunction;
+import com.google.devtools.build.skyframe.SkyFunctionName;
+import com.google.devtools.common.options.Converters;
+import com.google.devtools.common.options.Option;
+import com.google.devtools.common.options.Options;
+import com.google.devtools.common.options.OptionsBase;
+import com.google.devtools.common.options.OptionsParser;
+
+import java.lang.reflect.Field;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * Testing framework for tests which check ConfigurationFactory.
+ */
+public abstract class ConfigurationTestCase extends FoundationTestCase {
+
+ public static final class TestOptions extends OptionsBase {
+ @Option(name = "multi_cpu",
+ converter = Converters.CommaSeparatedOptionListConverter.class,
+ allowMultiple = true,
+ defaultValue = "",
+ category = "semantics",
+ help = "Additional target CPUs.")
+ public List<String> multiCpus;
+ }
+
+ protected SkyframeExecutor skyframeExecutor;
+ protected Map<String, String> clientEnv;
+ protected ConfigurationFactory configurationFactory;
+ protected Path workspace;
+ protected ImmutableList<Class<? extends FragmentOptions>> buildOptionClasses;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ workspace = rootDirectory;
+ clientEnv = Maps.newHashMap();
+
+ ConfiguredRuleClassProvider ruleClassProvider = TestRuleClassProvider.getRuleClassProvider();
+ PathPackageLocator pkgLocator = new PathPackageLocator(rootDirectory);
+ final PackageFactory pkgFactory;
+ BlazeDirectories directories = new BlazeDirectories(outputBase, outputBase, rootDirectory);
+ pkgFactory = new PackageFactory(ruleClassProvider);
+ AnalysisTestUtil.DummyWorkspaceStatusActionFactory workspaceStatusActionFactory =
+ new AnalysisTestUtil.DummyWorkspaceStatusActionFactory(directories);
+ skyframeExecutor = SequencedSkyframeExecutor.create(reporter, pkgFactory,
+ new TimestampGranularityMonitor(BlazeClock.instance()), directories,
+ workspaceStatusActionFactory,
+ ruleClassProvider.getBuildInfoFactories(), ImmutableSet.<Path>of(),
+ ImmutableList.<DiffAwareness.Factory>of(),
+ Predicates.<PathFragment>alwaysFalse(),
+ Preprocessor.Factory.Supplier.NullSupplier.INSTANCE,
+ ImmutableMap.<SkyFunctionName, SkyFunction>of(),
+ ImmutableList.<PrecomputedValue.Injected>of()
+ );
+
+ skyframeExecutor.preparePackageLoading(pkgLocator,
+ Options.getDefaults(PackageCacheOptions.class).defaultVisibility, true,
+ ruleClassProvider.getDefaultsPackageContent(), UUID.randomUUID());
+
+ AnalysisMock analysisMock = getAnalysisMock();
+ analysisMock.setupMockClient(new MockToolsConfig(rootDirectory));
+ configurationFactory = analysisMock.createConfigurationFactory();
+ buildOptionClasses = analysisMock.getBuildOptions();
+ }
+
+ protected AnalysisMock getAnalysisMock() {
+ try {
+ Class<?> providerClass = Class.forName(TestConstants.TEST_ANALYSIS_MOCK);
+ Field instanceField = providerClass.getField("INSTANCE");
+ return (AnalysisMock) instanceField.get(null);
+ } catch (Exception e) {
+ throw new IllegalStateException(e);
+ }
+ }
+
+ protected void checkError(String expectedMessage, String... options) throws Exception {
+ reporter.removeHandler(failFastHandler);
+ try {
+ create(options);
+ fail();
+ } catch (InvalidConfigurationException e) {
+ assertContainsEvent(expectedMessage);
+ }
+ }
+
+ protected BuildConfigurationCollection createCollection(ConfigurationFactory factory,
+ String... args) throws Exception {
+ OptionsParser parser = OptionsParser.newOptionsParser(
+ ImmutableList.<Class<? extends OptionsBase>>builder()
+ .addAll(buildOptionClasses)
+ .add(TestOptions.class)
+ .build());
+ parser.parse(args);
+ ImmutableSortedSet<String> multiCpu = ImmutableSortedSet.copyOf(
+ parser.getOptions(TestOptions.class).multiCpus);
+
+ factory.forbidSanityCheck();
+ BuildOptions buildOptions = BuildOptions.of(buildOptionClasses, parser);
+ BuildConfigurationCollection collection =
+ skyframeExecutor.createConfigurations(factory,
+ new BuildConfigurationKey(buildOptions,
+ new BlazeDirectories(outputBase, outputBase, workspace), clientEnv, multiCpu));
+ return collection;
+ }
+
+ protected BuildConfigurationCollection createCollection(String... args) throws Exception {
+ return createCollection(configurationFactory, args);
+ }
+
+ protected BuildConfiguration create(ConfigurationFactory factory, String... args)
+ throws Exception {
+ return Iterables.getOnlyElement(createCollection(factory, args).getTargetConfigurations());
+ }
+
+ protected BuildConfiguration create(String... args)
+ throws Exception {
+ return create(configurationFactory, args);
+ }
+
+ protected BuildConfiguration createHost(String... args) throws Exception {
+ return create(args).getConfiguration(ConfigurationTransition.HOST);
+ }
+}