/*
* Copyright 2015-present Facebook, Inc.
*
* 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.facebook.buck.apple;
import static com.facebook.buck.rules.TestCellBuilder.createCellRoots;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import com.facebook.buck.cxx.FrameworkDependencies;
import com.facebook.buck.io.ProjectFilesystem;
import com.facebook.buck.model.BuildTarget;
import com.facebook.buck.model.BuildTargetFactory;
import com.facebook.buck.model.Either;
import com.facebook.buck.rules.BuildRuleResolver;
import com.facebook.buck.rules.DefaultTargetNodeToBuildRuleTransformer;
import com.facebook.buck.rules.FakeSourcePath;
import com.facebook.buck.rules.TargetNode;
import com.facebook.buck.testutil.FakeProjectFilesystem;
import com.facebook.buck.testutil.TargetGraphFactory;
import com.google.common.collect.ImmutableSortedSet;
import org.junit.Test;
public class AppleBundleDescriptionTest {
private ProjectFilesystem filesystem = new FakeProjectFilesystem();
@Test
public void depsHaveFlavorsPropagated() {
BuildTarget bundleTarget = BuildTargetFactory.newInstance("//bar:bundle#iphoneos-x86_64");
BuildTarget unflavoredDep = BuildTargetFactory.newInstance("//bar:dep1");
BuildTarget unflavoredDepAfterPropagation =
BuildTargetFactory.newInstance("//bar:dep1#iphoneos-x86_64");
BuildTarget flavoredDep =
BuildTargetFactory.newInstance("//bar:dep2#iphoneos-x86_64,iphoneos-i386");
BuildTarget flavoredDepNotInDomain = BuildTargetFactory.newInstance("//bar:dep3#otherflavor");
BuildTarget flavoredDepNotInDomainAfterPropagation =
BuildTargetFactory.newInstance("//bar:dep3#iphoneos-x86_64,otherflavor");
BuildTarget watchDep = BuildTargetFactory.newInstance("//bar:watch#watch");
BuildTarget watchDepAfterPropagation =
BuildTargetFactory.newInstance("//bar:watch#watchos-armv7k");
BuildTarget binary = BuildTargetFactory.newInstance("//bar:binary");
AppleBundleDescription desc = FakeAppleRuleDescriptions.BUNDLE_DESCRIPTION;
AppleBundleDescriptionArg constructorArg =
AppleBundleDescriptionArg.builder()
.setName("bundle")
.setExtension(Either.ofLeft(AppleBundleExtension.BUNDLE))
.setInfoPlist(new FakeSourcePath("Info.plist"))
.setBinary(binary)
.setDeps(
ImmutableSortedSet.of(
binary, unflavoredDep, flavoredDep, flavoredDepNotInDomain, watchDep))
.build();
// Now call the find deps methods and verify it returns the targets with flavors.
ImmutableSortedSet.Builder<BuildTarget> implicitDeps = ImmutableSortedSet.naturalOrder();
desc.findDepsForTargetFromConstructorArgs(
bundleTarget,
createCellRoots(filesystem),
constructorArg,
implicitDeps,
ImmutableSortedSet.naturalOrder());
assertEquals(
ImmutableSortedSet.<BuildTarget>naturalOrder()
.add(unflavoredDepAfterPropagation)
.add(flavoredDep)
.add(flavoredDepNotInDomainAfterPropagation)
.add(watchDepAfterPropagation)
.build(),
implicitDeps.build());
}
@Test
public void depsHaveStripAndDebugFlavorsPropagated() {
BuildTarget bundleTargetWithStripFlavor =
BuildTargetFactory.newInstance("//bar:bundle#iphoneos-x86_64,strip-all,dwarf-and-dsym");
BuildTarget unflavoredDep = BuildTargetFactory.newInstance("//bar:dep1");
BuildTarget unflavoredDepAfterPropagation =
BuildTargetFactory.newInstance("//bar:dep1#iphoneos-x86_64,strip-all,dwarf-and-dsym");
BuildTarget flavoredDep =
BuildTargetFactory.newInstance("//bar:dep2#iphoneos-i386,strip-debug,dwarf");
BuildTarget flavoredDepNotInDomain = BuildTargetFactory.newInstance("//bar:dep3#otherflavor");
BuildTarget flavoredDepNotInDomainAfterPropagation =
BuildTargetFactory.newInstance(
"//bar:dep3#iphoneos-x86_64,strip-all,dwarf-and-dsym,otherflavor");
BuildTarget stripFlavorOnly = BuildTargetFactory.newInstance("//bar:dep4#strip-debug");
BuildTarget stripFlavorOnlyAfterPropagation =
BuildTargetFactory.newInstance("//bar:dep4#iphoneos-x86_64,strip-debug,dwarf-and-dsym");
BuildTarget debugFlavorOnly = BuildTargetFactory.newInstance("//bar:dep5#dwarf");
BuildTarget debugFlavorOnlyAfterPropagation =
BuildTargetFactory.newInstance("//bar:dep5#iphoneos-x86_64,strip-all,dwarf");
BuildTarget binary = BuildTargetFactory.newInstance("//bar:binary");
AppleBundleDescription desc = FakeAppleRuleDescriptions.BUNDLE_DESCRIPTION;
AppleBundleDescriptionArg constructorArg =
AppleBundleDescriptionArg.builder()
.setName("bundle")
.setExtension(Either.ofLeft(AppleBundleExtension.BUNDLE))
.setInfoPlist(new FakeSourcePath("Info.plist"))
.setBinary(binary)
.setDeps(
ImmutableSortedSet.<BuildTarget>naturalOrder()
.add(binary)
.add(unflavoredDep)
.add(flavoredDep)
.add(flavoredDepNotInDomain)
.add(stripFlavorOnly)
.add(debugFlavorOnly)
.build())
.build();
// Now call the find deps methods and verify it returns the targets with flavors.
ImmutableSortedSet.Builder<BuildTarget> implicitDeps = ImmutableSortedSet.naturalOrder();
desc.findDepsForTargetFromConstructorArgs(
bundleTargetWithStripFlavor,
createCellRoots(filesystem),
constructorArg,
implicitDeps,
ImmutableSortedSet.naturalOrder());
assertEquals(
ImmutableSortedSet.<BuildTarget>naturalOrder()
.add(unflavoredDepAfterPropagation)
.add(flavoredDep)
.add(flavoredDepNotInDomainAfterPropagation)
.add(stripFlavorOnlyAfterPropagation)
.add(debugFlavorOnlyAfterPropagation)
.build(),
implicitDeps.build());
}
@Test
public void metadataTraversalForFrameworkDependenciesAreTerminated() throws Exception {
BuildTarget binaryTarget = BuildTargetFactory.newInstance("//:binary");
TargetNode<?, ?> binaryNode = new AppleBinaryBuilder(binaryTarget).build();
BuildTarget bundleTarget = BuildTargetFactory.newInstance("//:bundle");
TargetNode<?, ?> bundleNode =
new AppleBundleBuilder(bundleTarget)
.setExtension(Either.ofLeft(AppleBundleExtension.BUNDLE))
.setInfoPlist(new FakeSourcePath("Info.plist"))
.setBinary(binaryTarget)
.build();
BuildRuleResolver buildRuleResolver =
new BuildRuleResolver(
TargetGraphFactory.newInstance(bundleNode, binaryNode),
new DefaultTargetNodeToBuildRuleTransformer());
assertTrue(
"Although querying a binary's framework dependencies should not return empty...",
buildRuleResolver
.requireMetadata(
binaryTarget.withFlavors(
FakeAppleRuleDescriptions.DEFAULT_MACOSX_X86_64_PLATFORM.getFlavor()),
FrameworkDependencies.class)
.isPresent());
assertFalse(
"Querying a bundle's framework dependencies should return empty.",
buildRuleResolver.requireMetadata(bundleTarget, FrameworkDependencies.class).isPresent());
}
}