From 16a6b57ceac396609f1563cf33eeaa3057de4ec4 Mon Sep 17 00:00:00 2001 From: Ulf Adams Date: Wed, 18 Mar 2015 17:29:37 +0000 Subject: Open source ConfigurationTestCase. -- MOS_MIGRATED_REVID=88944458 --- .../build/lib/analysis/BazelAnalysisMock.java | 6 + .../build/lib/analysis/util/AnalysisMock.java | 9 ++ .../lib/analysis/util/ConfigurationTestCase.java | 174 +++++++++++++++++++++ 3 files changed, 189 insertions(+) create mode 100644 src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java (limited to 'src') 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 getOptionOverrides() { return ImmutableList.of(); } + + @Override + public ImmutableList> 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 getOptionOverrides(); + public abstract ImmutableList> getBuildOptions(); + public static class Delegate extends AnalysisMock { private final AnalysisMock delegate; @@ -55,5 +59,10 @@ public abstract class AnalysisMock { public Collection getOptionOverrides() { return delegate.getOptionOverrides(); } + + @Override + public ImmutableList> 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 multiCpus; + } + + protected SkyframeExecutor skyframeExecutor; + protected Map clientEnv; + protected ConfigurationFactory configurationFactory; + protected Path workspace; + protected ImmutableList> 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.of(), + ImmutableList.of(), + Predicates.alwaysFalse(), + Preprocessor.Factory.Supplier.NullSupplier.INSTANCE, + ImmutableMap.of(), + ImmutableList.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.>builder() + .addAll(buildOptionClasses) + .add(TestOptions.class) + .build()); + parser.parse(args); + ImmutableSortedSet 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); + } +} -- cgit v1.2.3