/* * Copyright 2012-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.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSortedSet; import java.nio.file.Path; import java.nio.file.Paths; import org.hamcrest.Matchers; import org.junit.Test; public class BuildTargetTest { private static final Path ROOT = Paths.get("/opt/src/buck"); @Test public void testRootBuildTarget() { BuildTarget rootTarget = BuildTarget.builder(ROOT, "//", "fb4a").build(); assertEquals("fb4a", rootTarget.getShortNameAndFlavorPostfix()); assertEquals("//", rootTarget.getBaseName()); assertEquals(Paths.get(""), rootTarget.getBasePath()); assertEquals("//:fb4a", rootTarget.getFullyQualifiedName()); assertEquals("//:fb4a", rootTarget.toString()); } @Test public void testBuildTargetTwoLevelsDeep() { BuildTarget rootTarget = BuildTarget.builder(ROOT, "//java/com/facebook", "fb4a").build(); assertEquals("fb4a", rootTarget.getShortNameAndFlavorPostfix()); assertEquals("//java/com/facebook", rootTarget.getBaseName()); assertEquals(Paths.get("java/com/facebook"), rootTarget.getBasePath()); assertEquals("//java/com/facebook:fb4a", rootTarget.getFullyQualifiedName()); assertEquals("//java/com/facebook:fb4a", rootTarget.toString()); } @Test public void testEqualsNullReturnsFalse() { BuildTarget utilTarget = BuildTarget.builder(ROOT, "//src/com/facebook/buck/util", "util").build(); assertNotNull(utilTarget); } @Test public void testEqualsOtherBuildTarget() { BuildTarget utilTarget1 = BuildTarget.builder(ROOT, "//src/com/facebook/buck/util", "util").build(); assertEquals(utilTarget1, utilTarget1); BuildTarget utilTarget2 = BuildTarget.builder(ROOT, "//src/com/facebook/buck/util", "util").build(); assertEquals(utilTarget1, utilTarget2); } @Test public void testNotEquals() { BuildTarget utilTarget = BuildTarget.builder(ROOT, "//src/com/facebook/buck/util", "util").build(); BuildTarget ioTarget = BuildTarget.builder(ROOT, "//src/com/facebook/buck/util", "io").build(); assertFalse(utilTarget.equals(ioTarget)); } @Test public void testBuildTargetWithFlavor() { BuildTarget target = BuildTarget.builder(ROOT, "//foo/bar", "baz").addFlavors(InternalFlavor.of("dex")).build(); assertEquals("baz#dex", target.getShortNameAndFlavorPostfix()); assertEquals(ImmutableSortedSet.of(InternalFlavor.of("dex")), target.getFlavors()); assertTrue(target.isFlavored()); } @Test public void testBuildTargetWithoutFlavor() { BuildTarget target = BuildTarget.builder(ROOT, "//foo/bar", "baz").build(); assertEquals(target.getShortNameAndFlavorPostfix(), "baz"); assertEquals(ImmutableSortedSet.<Flavor>of(), target.getFlavors()); assertFalse(target.isFlavored()); } @Test public void testFlavorIsValid() { try { BuildTarget.builder(ROOT, "//foo/bar", "baz").addFlavors(InternalFlavor.of("d!x")).build(); fail("Should have thrown IllegalArgumentException."); } catch (IllegalArgumentException e) { assertEquals("Invalid characters in flavor name: d!x", e.getMessage()); } } @Test public void testShortNameCannotContainHashWhenFlavorSet() { try { BuildTarget.builder(ROOT, "//foo/bar", "baz#dex") .addFlavors(InternalFlavor.of("src-jar")) .build(); fail("Should have thrown IllegalArgumentException."); } catch (IllegalArgumentException e) { assertEquals("Build target name cannot contain '#' but was: baz#dex.", e.getMessage()); } } @Test(expected = IllegalArgumentException.class) public void testShortNamesMustNotContainTheFlavorSeparator() { @SuppressWarnings("unused") BuildTarget unused = BuildTarget.builder(ROOT, "//foo/bar", "baz#dex").build(); } @Test public void testFlavorDefaultsToNoneIfNotSet() { assertEquals( ImmutableSet.<Flavor>of(), BuildTarget.builder(ROOT, "//foo/bar", "baz").build().getFlavors()); } @Test public void testGetUnflavoredTarget() { UnflavoredBuildTarget unflavoredTarget = UnflavoredBuildTarget.builder() .setBaseName("//foo/bar") .setShortName("baz") .setCellPath(ROOT) .build(); BuildTarget flavoredTarget = BuildTarget.builder(ROOT, "//foo/bar", "baz").addFlavors(InternalFlavor.of("biz")).build(); assertEquals(unflavoredTarget, flavoredTarget.getUnflavoredBuildTarget()); } @Test public void testNumbersAreValidFlavors() { @SuppressWarnings("unused") BuildTarget unused = BuildTarget.builder(ROOT, "//foo", "bar").addFlavors(InternalFlavor.of("1234")).build(); } @Test public void testAppendingFlavors() { Flavor aaa = InternalFlavor.of("aaa"); Flavor biz = InternalFlavor.of("biz"); BuildTarget flavoredTarget = BuildTarget.builder(ROOT, "//foo/bar", "baz").addFlavors(biz).build(); BuildTarget appendedFlavor = flavoredTarget.withAppendedFlavors(aaa); assertThat(appendedFlavor, Matchers.not(Matchers.equalTo(flavoredTarget))); ImmutableSortedSet<Flavor> expectedFlavors = ImmutableSortedSet.of(biz, aaa); assertThat(appendedFlavor.getFlavors(), Matchers.equalTo(expectedFlavors)); } @Test public void unflavoredBuildTargetsAreInterned() { UnflavoredBuildTarget target1 = UnflavoredBuildTarget.builder() .setCellPath(ROOT) .setBaseName("//foo") .setShortName("bar") .build(); UnflavoredBuildTarget target2 = UnflavoredBuildTarget.builder() .setCellPath(ROOT) .setBaseName("//foo") .setShortName("bar") .build(); assertSame(target1, target2); } }