/* * Copyright 2014-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.model; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import com.facebook.buck.util.HumanReadableException; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSortedSet; import java.nio.file.Path; import java.nio.file.Paths; import org.junit.Test; public class BuildTargetsTest { private static final Path ROOT = Paths.get("/opt/src/buck"); @Test public void testCreateFlavoredBuildTarget() { BuildTarget fooBar = BuildTarget.builder(ROOT, "//foo", "bar").build(); BuildTarget fooBarBaz = BuildTargets.createFlavoredBuildTarget(fooBar.checkUnflavored(), InternalFlavor.of("baz")); assertTrue(fooBarBaz.isFlavored()); assertEquals("//foo:bar#baz", fooBarBaz.getFullyQualifiedName()); } @Test(expected = IllegalStateException.class) public void testCheckUnflavoredRejectsFlavoredBuildTarget() { BuildTarget fooBarBaz = BuildTarget.builder(ROOT, "//foo", "bar").addFlavors(InternalFlavor.of("baz")).build(); fooBarBaz.checkUnflavored(); } @Test public void propagateFlavorDomainWithSingleFlavor() { BuildTarget parent = BuildTargetFactory.newInstance("//:parent#flavor"); Flavor flavor = InternalFlavor.of("flavor"); FlavorDomain<?> domain = new FlavorDomain<>("test", ImmutableMap.of(flavor, "something")); BuildTarget child = BuildTargetFactory.newInstance("//:child"); ImmutableSortedSet<BuildTarget> result = BuildTargets.propagateFlavorDomains( parent, ImmutableList.of(domain), ImmutableList.of(child)); assertEquals( ImmutableSortedSet.of(BuildTarget.builder(child).addFlavors(flavor).build()), result); } @Test public void propagateFlavorDomainWithMultipleFlavors() { BuildTarget parent = BuildTargetFactory.newInstance("//:parent#flavor,flavor2"); Flavor flavor = InternalFlavor.of("flavor"); Flavor flavor2 = InternalFlavor.of("flavor2"); FlavorDomain<?> domain = new FlavorDomain<>("test", ImmutableMap.of(flavor, "something", flavor2, "something2")); BuildTarget child = BuildTargetFactory.newInstance("//:child"); ImmutableSortedSet<BuildTarget> result = BuildTargets.propagateFlavorDomains( parent, ImmutableList.of(domain), ImmutableList.of(child)); assertEquals( ImmutableSortedSet.of( BuildTarget.builder(child).addFlavors(flavor).addFlavors(flavor2).build()), result); } @Test public void propagateFlavorDomainFailsIfParentHasNoFlavor() { BuildTarget parent = BuildTargetFactory.newInstance("//:parent"); Flavor flavor = InternalFlavor.of("flavor"); FlavorDomain<?> domain = new FlavorDomain<>("test", ImmutableMap.of(flavor, "something")); BuildTarget child = BuildTargetFactory.newInstance("//:child"); try { BuildTargets.propagateFlavorDomains( parent, ImmutableList.of(domain), ImmutableList.of(child)); fail("should have thrown"); } catch (HumanReadableException e) { assertTrue(e.getMessage().contains("no flavor for")); } } @Test public void propagateFlavorDomainFailsIfChildAlreadyFlavored() { BuildTarget parent = BuildTargetFactory.newInstance("//:parent#flavor"); Flavor flavor = InternalFlavor.of("flavor"); FlavorDomain<?> domain = new FlavorDomain<>("test", ImmutableMap.of(flavor, "something")); BuildTarget child = BuildTargetFactory.newInstance("//:child#flavor"); try { BuildTargets.propagateFlavorDomains( parent, ImmutableList.of(domain), ImmutableList.of(child)); fail("should have thrown"); } catch (HumanReadableException e) { assertTrue(e.getMessage().contains("already has flavor")); } } }