diff options
author | 2017-11-02 19:21:55 -0400 | |
---|---|---|
committer | 2017-11-03 09:53:30 -0400 | |
commit | 3f2f480f0bcdd26d3efbe982836cf8f3597341dd (patch) | |
tree | 8e077fe1397b279743a7db16b50bc087c580ec57 /src/test/java/com/google/devtools/build/lib/rules/apple/XcodeConfigTest.java | |
parent | 430612b11d1257ea52a4986d22e653c11ad0428a (diff) |
Open-source the remainder of non-legacy Apple/Objc java tests
RELNOTES: None.
PiperOrigin-RevId: 174397203
Diffstat (limited to 'src/test/java/com/google/devtools/build/lib/rules/apple/XcodeConfigTest.java')
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/rules/apple/XcodeConfigTest.java | 716 |
1 files changed, 716 insertions, 0 deletions
diff --git a/src/test/java/com/google/devtools/build/lib/rules/apple/XcodeConfigTest.java b/src/test/java/com/google/devtools/build/lib/rules/apple/XcodeConfigTest.java new file mode 100644 index 0000000000..93c1dabfc5 --- /dev/null +++ b/src/test/java/com/google/devtools/build/lib/rules/apple/XcodeConfigTest.java @@ -0,0 +1,716 @@ +// Copyright 2017 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.rules.apple; + +import static com.google.common.truth.Truth.assertThat; + +import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.analysis.ConfiguredTarget; +import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget; +import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; +import com.google.devtools.build.lib.packages.ConfiguredAttributeMapper; +import com.google.devtools.build.lib.syntax.Type; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** + * Unit tests for the {@code xcode_config} rule. + */ +@RunWith(JUnit4.class) +public class XcodeConfigTest extends BuildViewTestCase { + + @Test + public void testEmptyConfig_noVersionFlag() throws Exception { + scratch.file("xcode/BUILD", + "xcode_config(name = 'foo',)"); + useConfiguration("--xcode_version_config=//xcode:foo"); + + assertIosSdkVersion(AppleCommandLineOptions.DEFAULT_IOS_SDK_VERSION); + } + + @Test + public void testDefaultVersion() throws Exception { + scratch.file("xcode/BUILD", + "xcode_config(", + " name = 'foo',", + " default = ':version512',", + " versions = [':version512', ':version64'],", + ")", + "", + "xcode_version(", + " name = 'version512',", + " version = '5.1.2',", + " aliases = ['5', '5.1'],", + ")", + "", + "xcode_version(", + " name = 'version64',", + " version = '6.4',", + " aliases = ['6.0', 'foo', '6'],", + ")"); + useConfiguration("--xcode_version_config=//xcode:foo"); + + assertXcodeVersion("5.1.2"); + } + + @Test + public void testConfigAlias_configSetting() throws Exception { + scratch.file("skylark/BUILD"); + scratch.file("skylark/version_retriever.bzl", + "def _version_retriever_impl(ctx):", + " xcode_properties = ctx.attr.dep[apple_common.XcodeProperties]", + " version = xcode_properties.xcode_version", + " return struct(providers = [config_common.FeatureFlagInfo(value=version)])", + "", + "version_retriever = rule(", + " implementation = _version_retriever_impl,", + " attrs = {'dep': attr.label()},", + ")"); + + scratch.file("xcode/BUILD", + "load('//skylark:version_retriever.bzl', 'version_retriever')", + "version_retriever(", + " name = 'flag_propagator',", + " dep = ':alias',", + ")", + "", + "xcode_config(", + " name = 'config',", + " default = ':version512',", + " versions = [':version512', ':version64', ':version12'],", + ")", + "", + "xcode_config_alias(", + " name = 'alias'", + ")", + "", + "xcode_version(", + " name = 'version512',", + " version = '5.1.2',", + " aliases = ['5', '5.1'],", + ")", + "", + "xcode_version(", + " name = 'version64',", + " version = '6.4',", + " aliases = ['6.0', 'six', '6'],", + ")", + "", + "xcode_version(", + " name = 'version12',", + " version = '12',", + ")", + "config_setting(name = 'xcode_5_1_2',", + " flag_values = {':flag_propagator': '5.1.2'})", + "config_setting(name = 'xcode_6_4',", + " flag_values = {':flag_propagator': '6.4'})", + "genrule(", + " name = 'gen',", + " srcs = [],", + " outs = ['out'],", + " cmd = select({", + " ':xcode_5_1_2': '5.1.2',", + " ':xcode_6_4': '6.4',", + " '//conditions:default': 'none'", + " }))"); + + useConfiguration("--xcode_version_config=//xcode:config"); + assertThat(getMapper("//xcode:gen").get("cmd", Type.STRING)).isEqualTo("5.1.2"); + + useConfiguration("--xcode_version_config=//xcode:config", "--xcode_version=6.4"); + assertThat(getMapper("//xcode:gen").get("cmd", Type.STRING)).isEqualTo("6.4"); + + useConfiguration("--xcode_version_config=//xcode:config", "--xcode_version=6"); + assertThat(getMapper("//xcode:gen").get("cmd", Type.STRING)).isEqualTo("6.4"); + + useConfiguration("--xcode_version_config=//xcode:config", "--xcode_version=12"); + assertThat(getMapper("//xcode:gen").get("cmd", Type.STRING)).isEqualTo("none"); + } + + @Test + public void testDefaultVersion_configSetting() throws Exception { + scratch.file("skylark/BUILD"); + scratch.file("skylark/version_retriever.bzl", + "def _version_retriever_impl(ctx):", + " xcode_properties = ctx.attr.dep[apple_common.XcodeProperties]", + " version = xcode_properties.xcode_version", + " return struct(providers = [config_common.FeatureFlagInfo(value=version)])", + "", + "version_retriever = rule(", + " implementation = _version_retriever_impl,", + " attrs = {'dep': attr.label()},", + ")"); + + scratch.file("xcode/BUILD", + "load('//skylark:version_retriever.bzl', 'version_retriever')", + "version_retriever(", + " name = 'flag_propagator',", + " dep = ':alias',", + ")", + "xcode_config_alias(", + " name = 'alias'", + ")", + "xcode_config(", + " name = 'foo',", + " default = ':version512',", + " versions = [':version512', ':version64'],", + ")", + "", + "xcode_version(", + " name = 'version512',", + " version = '5.1.2',", + " aliases = ['5', '5.1'],", + ")", + "", + "xcode_version(", + " name = 'version64',", + " version = '6.4',", + " aliases = ['6.0', 'foo', '6'],", + ")", + "config_setting(name = 'xcode_5_1_2',", + " flag_values = {':flag_propagator': '5.1.2'})", + "config_setting(name = 'xcode_6_4',", + " flag_values = {':flag_propagator': '6.4'})", + "genrule(", + " name = 'gen',", + " srcs = [],", + " outs = ['out'],", + " cmd = select({", + " ':xcode_5_1_2': '5.1.2',", + " ':xcode_6_4': '6.4',", + " '//conditions:default': 'none'", + " }))"); + + useConfiguration("--xcode_version_config=//xcode:foo"); + assertThat(getMapper("//xcode:gen").get("cmd", Type.STRING)).isEqualTo("5.1.2"); + + useConfiguration("--xcode_version_config=//xcode:foo", "--xcode_version=6.4"); + assertThat(getMapper("//xcode:gen").get("cmd", Type.STRING)).isEqualTo("6.4"); + } + + @Test + public void testRequiresDefined_validVersion() throws Exception { + scratch.file("xcode/BUILD", + "xcode_config(", + " name = 'foo',", + " require_defined_version = 1,", + " versions = [':version512'],", + " default = ':version512',", + ")", + "", + "xcode_version(", + " name = 'version512',", + " version = '5.1.2',", + " aliases = ['5', '5.1'],", + ")"); + useConfiguration("--xcode_version=5.1.2", "--xcode_version_config=//xcode:foo"); + + assertXcodeVersion("5.1.2"); + } + + @Test + public void testRequiresDefined_validAlias_dottedVersion() throws Exception { + scratch.file("xcode/BUILD", + "xcode_config(", + " name = 'foo',", + " require_defined_version = 1,", + " versions = [':version512'],", + " default = ':version512',", + ")", + "", + "xcode_version(", + " name = 'version512',", + " version = '5.1.2',", + " aliases = ['5', '5.1'],", + ")"); + useConfiguration("--xcode_version=5", "--xcode_version_config=//xcode:foo"); + + assertXcodeVersion("5.1.2"); + } + + @Test + public void testRequiresDefined_validAlias_nonNumerical() throws Exception { + scratch.file("xcode/BUILD", + "xcode_config(", + " name = 'foo',", + " require_defined_version = 1,", + " versions = [':version512'],", + " default = ':version512',", + ")", + "", + "xcode_version(", + " name = 'version512',", + " version = '5.1.2',", + " aliases = ['valid_version'],", + ")"); + useConfiguration("--xcode_version=valid_version", "--xcode_version_config=//xcode:foo"); + + assertXcodeVersion("5.1.2"); + } + + @Test + public void testRequiresDefined_validDefault() throws Exception { + scratch.file("xcode/BUILD", + "xcode_config(", + " name = 'foo',", + " default = ':version512',", + " versions = [':version512'],", + ")", + "", + "xcode_version(", + " name = 'version512',", + " version = '5.1.2',", + " aliases = ['5', '5.1'],", + ")"); + useConfiguration("--xcode_version_config=//xcode:foo"); + + assertXcodeVersion("5.1.2"); + } + + @Test + public void testInvalidXcodeSpecified() throws Exception { + scratch.file("xcode/BUILD", + "xcode_config(", + " name = 'foo',", + " require_defined_version = 1,", + " versions = [':version512'],", + " default = ':version512',", + ")", + "", + "xcode_version(", + " name = 'version512',", + " version = '5.1.2',", + " aliases = ['5', '5.1'],", + ")"); + useConfiguration("--xcode_version=6"); + reporter.removeHandler(failFastHandler); + getConfiguredTarget("//xcode:foo"); + assertContainsEvent("6 matches no alias in the config"); + } + + @Test + public void testRequiresDefault() throws Exception { + scratch.file("xcode/BUILD", + "xcode_config(", + " name = 'foo',", + " require_defined_version = 1,", + " versions = [':version512'],", + ")", + "", + "xcode_version(", + " name = 'version512',", + " version = '5.1.2',", + " aliases = ['5', '5.1'],", + ")"); + reporter.removeHandler(failFastHandler); + getConfiguredTarget("//xcode:foo"); + assertContainsEvent("default version must be specified"); + } + + @Test + public void testDuplicateAliases_definedVersion() throws Exception { + scratch.file("xcode/BUILD", + "xcode_config(", + " name = 'foo',", + " versions = [':version512', ':version5'],", + " default = ':version512'", + ")", + "", + "xcode_version(", + " name = 'version512',", + " version = '5.1.2',", + " aliases = ['5', '5.1'],", + ")", + "", + "xcode_version(", + " name = 'version5',", + " version = '5',", + " aliases = ['5', '5.0', 'foo'],", + ")"); + reporter.removeHandler(failFastHandler); + getConfiguredTarget("//xcode:foo"); + assertContainsEvent( + "'5' is registered to multiple labels (//xcode:version512, //xcode:version5)"); + } + + @Test + public void testVersionAliasedToItself() throws Exception { + scratch.file("xcode/BUILD", + "xcode_config(", + " name = 'foo',", + " versions = [':version512'],", + " default = ':version512',", + ")", + "", + "xcode_version(", + " name = 'version512',", + " version = '5.1.2',", + " aliases = ['5', '5.1', '5.1.2'],", + ")"); + useConfiguration("--xcode_version_config=//xcode:foo"); + + assertXcodeVersion("5.1.2"); + } + + @Test + public void testDuplicateVersionNumbers() throws Exception { + scratch.file("xcode/BUILD", + "xcode_config(", + " name = 'foo',", + " versions = [':version512', ':version5'],", + " default = ':version512',", + ")", + "", + "xcode_version(", + " name = 'version512',", + " version = '5.1.2',", + " aliases = ['5', '5.1'],", + ")", + "", + "xcode_version(", + " name = 'version5',", + " version = '5.1.2',", + " aliases = ['foo'],", + ")"); + useConfiguration("--xcode_version=5"); + reporter.removeHandler(failFastHandler); + getConfiguredTarget("//xcode:foo"); + assertContainsEvent( + "'5.1.2' is registered to multiple labels (//xcode:version512, //xcode:version5)"); + } + + @Test + public void testVersionConflictsWithAlias() throws Exception { + scratch.file("xcode/BUILD", + "xcode_config(", + " name = 'foo',", + " versions = [':version512', ':version5'],", + " default = ':version512',", + ")", + "", + "xcode_version(", + " name = 'version512',", + " version = '5',", + " aliases = ['5.1'],", + ")", + "", + "xcode_version(", + " name = 'version5',", + " version = '5.1.3',", + " aliases = ['5'],", + ")"); + + reporter.removeHandler(failFastHandler); + getConfiguredTarget("//xcode:foo"); + assertContainsEvent( + "'5' is registered to multiple labels (//xcode:version512, //xcode:version5)"); + } + + @Test + public void testDefaultIosSdkVersion() throws Exception { + scratch.file("xcode/BUILD", + "xcode_config(", + " name = 'foo',", + " default = ':version512',", + " versions = [':version512', ':version64'],", + ")", + "", + "xcode_version(", + " name = 'version512',", + " version = '5.1.2',", + " aliases = ['5', '5.1'],", + " default_ios_sdk_version = '7.1'", + ")", + "", + "xcode_version(", + " name = 'version64',", + " version = '6.4',", + " aliases = ['6.0', 'foo', '6'],", + " default_ios_sdk_version = '43.0'", + ")"); + useConfiguration("--xcode_version_config=//xcode:foo"); + + assertXcodeVersion("5.1.2"); + assertIosSdkVersion("7.1"); + } + + @Test + public void testDefaultSdkVersions() throws Exception { + scratch.file("xcode/BUILD", + "xcode_config(", + " name = 'foo',", + " default = ':version512',", + " versions = [':version512', ':version64'],", + ")", + "", + "xcode_version(", + " name = 'version512',", + " version = '5.1.2',", + " aliases = ['5', '5.1'],", + " default_ios_sdk_version = '101',", + " default_watchos_sdk_version = '102',", + " default_tvos_sdk_version = '103',", + " default_macos_sdk_version = '104',", + ")", + "", + "xcode_version(", + " name = 'version64',", + " version = '6.4',", + " aliases = ['6.0', 'foo', '6'],", + " default_ios_sdk_version = '43.0'", + ")"); + useConfiguration("--xcode_version_config=//xcode:foo"); + + assertXcodeVersion("5.1.2"); + ImmutableMap<ApplePlatform, String> platformToVersion = + ImmutableMap.<ApplePlatform, String>builder() + .put(ApplePlatform.IOS_SIMULATOR, "101") + .put(ApplePlatform.WATCHOS_SIMULATOR, "102") + .put(ApplePlatform.TVOS_SIMULATOR, "103") + .put(ApplePlatform.MACOS, "104") + .build(); + for (ApplePlatform platform : platformToVersion.keySet()) { + DottedVersion version = DottedVersion.fromString(platformToVersion.get(platform)); + assertThat(getSdkVersionForPlatform(platform)).isEqualTo(version); + assertThat(getMinimumOsVersionForPlatform(platform)).isEqualTo(version); + } + } + + @Test + public void testDefaultSdkVersions_selectedXcode() throws Exception { + scratch.file("xcode/BUILD", + "xcode_config(", + " name = 'foo',", + " default = ':version512',", + " versions = [':version512', ':version64'],", + ")", + "", + "xcode_version(", + " name = 'version512',", + " version = '5.1.2',", + " aliases = ['5', '5.1'],", + " default_ios_sdk_version = '7.1'", + ")", + "", + "xcode_version(", + " name = 'version64',", + " version = '6.4',", + " aliases = ['6.0', 'foo', '6'],", + " default_ios_sdk_version = '43',", + " default_watchos_sdk_version = '44',", + " default_tvos_sdk_version = '45',", + " default_macos_sdk_version = '46',", + ")"); + useConfiguration("--xcode_version=6", "--xcode_version_config=//xcode:foo"); + + assertXcodeVersion("6.4"); + ImmutableMap<ApplePlatform, String> platformToVersion = + ImmutableMap.<ApplePlatform, String>builder() + .put(ApplePlatform.IOS_SIMULATOR, "43") + .put(ApplePlatform.WATCHOS_SIMULATOR, "44") + .put(ApplePlatform.TVOS_SIMULATOR, "45") + .put(ApplePlatform.MACOS, "46") + .build(); + for (ApplePlatform platform : platformToVersion.keySet()) { + DottedVersion version = DottedVersion.fromString(platformToVersion.get(platform)); + assertThat(getSdkVersionForPlatform(platform)).isEqualTo(version); + assertThat(getMinimumOsVersionForPlatform(platform)).isEqualTo(version); + } + } + + @Test + public void testOverrideDefaultSdkVersions() throws Exception { + scratch.file("xcode/BUILD", + "xcode_config(", + " name = 'foo',", + " default = ':version512',", + " versions = [':version512', ':version64'],", + ")", + "", + "xcode_version(", + " name = 'version512',", + " version = '5.1.2',", + " aliases = ['5', '5.1'],", + " default_ios_sdk_version = '7.1'", + ")", + "", + "xcode_version(", + " name = 'version64',", + " version = '6.4',", + " aliases = ['6.0', 'foo', '6'],", + " default_ios_sdk_version = '101',", + " default_watchos_sdk_version = '102',", + " default_tvos_sdk_version = '103',", + " default_macos_sdk_version = '104',", + ")"); + useConfiguration("--xcode_version=6", "--xcode_version_config=//xcode:foo", + "--ios_sdk_version=15.3", "--watchos_sdk_version=15.4", + "--tvos_sdk_version=15.5", "--macos_sdk_version=15.6"); + + assertXcodeVersion("6.4"); + ImmutableMap<ApplePlatform, String> platformToVersion = + ImmutableMap.<ApplePlatform, String>builder() + .put(ApplePlatform.IOS_SIMULATOR, "15.3") + .put(ApplePlatform.WATCHOS_SIMULATOR, "15.4") + .put(ApplePlatform.TVOS_SIMULATOR, "15.5") + .put(ApplePlatform.MACOS, "15.6") + .build(); + for (ApplePlatform platform : platformToVersion.keySet()) { + DottedVersion version = DottedVersion.fromString(platformToVersion.get(platform)); + assertThat(getSdkVersionForPlatform(platform)).isEqualTo(version); + assertThat(getMinimumOsVersionForPlatform(platform)).isEqualTo(version); + } + } + + @Test + public void testXcodeVersionFromSkylarkByAlias() throws Exception { + scratch.file("x/BUILD", + "load('//x:r.bzl', 'r')", + "xcode_config_alias(name='a')", + "xcode_config(name='c', default=':v', versions=[':v'])", + "xcode_version(", + " name = 'v',", + " version = '0.0',", + " default_ios_sdk_version = '1.0',", + " default_tvos_sdk_version = '2.0',", + " default_macos_sdk_version = '3.0',", + " default_watchos_sdk_version = '4.0',", + ")", + "r(name='r')"); + scratch.file("x/r.bzl", + "def _impl(ctx):", + " conf = ctx.attr._xcode[apple_common.XcodeVersionConfig]", + " ios = ctx.fragments.apple.multi_arch_platform(apple_common.platform_type.ios)", + " tvos = ctx.fragments.apple.multi_arch_platform(apple_common.platform_type.tvos)", + " return struct(", + " xcode = conf.xcode_version(),", + " ios_sdk = conf.sdk_version_for_platform(ios),", + " tvos_sdk = conf.sdk_version_for_platform(tvos),", + " macos_min = conf.minimum_os_for_platform_type(apple_common.platform_type.macos),", + " watchos_min = conf.minimum_os_for_platform_type(apple_common.platform_type.watchos),", + " )", + "r = rule(implementation = _impl,", + " attrs = { '_xcode': attr.label(default = Label('//x:a'))},", + " fragments = ['apple'],", + ")"); + + useConfiguration( + "--xcode_version_config=//x:c", + "--tvos_sdk_version=2.5", + "--watchos_minimum_os=4.5"); + ConfiguredTarget r = getConfiguredTarget("//x:r"); + assertThat(r.get("xcode").toString()).isEqualTo("0.0"); + assertThat(r.get("ios_sdk").toString()).isEqualTo("1.0"); + assertThat(r.get("tvos_sdk").toString()).isEqualTo("2.5"); + assertThat(r.get("macos_min").toString()).isEqualTo("3.0"); + assertThat(r.get("watchos_min").toString()).isEqualTo("4.5"); + } + + @Test + public void testDefaultWithoutVersion() throws Exception { + scratch.file("xcode/BUILD", + "xcode_config(", + " name = 'foo',", + " default = ':version512',", + ")", + "", + "xcode_version(", + " name = 'version512',", + " version = '5.1.2',", + " aliases = ['5', '5.1', '5.1.2'],", + ")"); + + reporter.removeHandler(failFastHandler); + getConfiguredTarget("//xcode:foo"); + assertContainsEvent( + "default label '//xcode:version512' must be contained in versions attribute"); + } + + @Test + public void testVersionDoesNotContainDefault() throws Exception { + scratch.file("xcode/BUILD", + "xcode_config(", + " name = 'foo',", + " default = ':version512',", + " versions = [':version6'],", + ")", + "", + "xcode_version(", + " name = 'version512',", + " version = '5.1.2',", + " aliases = ['5', '5.1', '5.1.2'],", + ")", + "", + "xcode_version(", + " name = 'version6',", + " version = '6.0',", + ")"); + reporter.removeHandler(failFastHandler); + getConfiguredTarget("//xcode:foo"); + assertContainsEvent("must be contained in versions attribute"); + } + + @Test + public void testInvalidBitcodeVersion() throws Exception { + scratch.file("xcode/BUILD", + "xcode_config(", + " name = 'foo',", + " default = ':version512',", + " versions = [':version512'],", + ")", + "", + "xcode_version(", + " name = 'version512',", + " version = '5.1.2',", + ")"); + + useConfiguration("--apple_bitcode=embedded", "--apple_split_cpu=arm64"); + + reporter.removeHandler(failFastHandler); + getConfiguredTarget("//xcode:foo"); + assertContainsEvent("apple_bitcode mode 'embedded' is unsupported"); + } + + private DottedVersion getSdkVersionForPlatform(ApplePlatform platform) throws Exception { + ConfiguredTarget xcodeConfig = getConfiguredTarget("//xcode:foo"); + XcodeConfigProvider provider = xcodeConfig.get(XcodeConfigProvider.PROVIDER); + return provider.getSdkVersionForPlatform(platform); + } + + private DottedVersion getMinimumOsVersionForPlatform(ApplePlatform platform) throws Exception { + ConfiguredTarget xcodeConfig = getConfiguredTarget("//xcode:foo"); + XcodeConfigProvider provider = xcodeConfig.get(XcodeConfigProvider.PROVIDER); + return provider.getMinimumOsForPlatformType(platform.getType()); + } + + private void assertXcodeVersion(String version) throws Exception { + ConfiguredTarget xcodeConfig = getConfiguredTarget("//xcode:foo"); + XcodeConfigProvider provider = xcodeConfig.get(XcodeConfigProvider.PROVIDER); + assertThat(provider.getXcodeVersion()).isEqualTo(DottedVersion.fromString(version)); + } + + private void assertIosSdkVersion(String version) throws Exception { + assertThat(getSdkVersionForPlatform(ApplePlatform.IOS_SIMULATOR)) + .isEqualTo(DottedVersion.fromString(version)); + } + + /** + * Returns a ConfiguredAttributeMapper bound to the given rule with the target configuration. + */ + private ConfiguredAttributeMapper getMapper(String label) throws Exception { + return ((RuleConfiguredTarget) getConfiguredTarget(label)).getAttributeMapper(); + } +} |