| // Copyright 2015 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.packages; | |
| import static com.google.common.collect.ImmutableList.toImmutableList; | |
| import static com.google.common.truth.Truth.assertThat; | |
| import com.google.devtools.build.lib.events.util.EventCollectionApparatus; | |
| import com.google.devtools.build.lib.packages.util.PackageFactoryApparatus; | |
| import com.google.devtools.build.lib.testutil.Scratch; | |
| import com.google.devtools.build.lib.vfs.Path; | |
| import com.google.devtools.build.lib.vfs.PathFragment; | |
| import com.google.devtools.build.lib.vfs.Root; | |
| import com.google.devtools.build.lib.vfs.RootedPath; | |
| import org.junit.Before; | |
| import org.junit.Test; | |
| import org.junit.runner.RunWith; | |
| import org.junit.runners.JUnit4; | |
| /** | |
| * Unit tests for PackageGroup. | |
| */ | |
| @RunWith(JUnit4.class) | |
| public class PackageGroupTest { | |
| private Scratch scratch = new Scratch("/workspace"); | |
| private EventCollectionApparatus events = new EventCollectionApparatus(); | |
| private PackageFactoryApparatus packages = new PackageFactoryApparatus(events.reporter()); | |
| private Root root; | |
| @Before | |
| public void setUp() throws Exception { | |
| root = Root.fromPath(scratch.dir("")); | |
| } | |
| @Test | |
| public void testDoesNotFailHorribly() throws Exception { | |
| scratch.file("fruits/BUILD", "package_group(name = 'apple', packages = ['//random'])"); | |
| getPackageGroup("fruits", "apple"); | |
| } | |
| // Regression test for: "Package group with empty name causes Blaze exception" | |
| @Test | |
| public void testEmptyPackageGroupNameDoesNotThrow() throws Exception { | |
| scratch.file("strawberry/BUILD", "package_group(name = '', packages=[])"); | |
| events.setFailFast(false); | |
| getPackage("strawberry"); | |
| events.assertContainsError("package group has invalid name"); | |
| } | |
| @Test | |
| public void testAbsolutePackagesWork() throws Exception { | |
| scratch.file( | |
| "fruits/BUILD", | |
| "package_group(name = 'apple',", | |
| " packages = ['//vegetables'])"); | |
| scratch.file("vegetables/BUILD"); | |
| scratch.file("fruits/vegetables/BUILD"); | |
| PackageGroup grp = getPackageGroup("fruits", "apple"); | |
| assertThat(grp.contains(getPackage("vegetables"))).isTrue(); | |
| assertThat(grp.contains(getPackage("fruits/vegetables"))).isFalse(); | |
| } | |
| @Test | |
| public void testPackagesWithoutDoubleSlashDoNotWork() throws Exception { | |
| scratch.file( | |
| "fruits/BUILD", | |
| "package_group(name = 'apple',", | |
| " packages = ['vegetables'])"); | |
| scratch.file("vegetables/BUILD"); | |
| scratch.file("fruits/vegetables/BUILD"); | |
| events.setFailFast(false); | |
| getPackageGroup("fruits", "apple"); | |
| events.assertContainsError("invalid package name 'vegetables'"); | |
| } | |
| @Test | |
| public void testPackagesWithRepositoryDoNotWork() throws Exception { | |
| scratch.file( | |
| "fruits/BUILD", | |
| "package_group(name = 'banana',", | |
| " packages = ['@veggies//:cucumber'])"); | |
| events.setFailFast(false); | |
| getPackageGroup("fruits", "banana"); | |
| events.assertContainsError("invalid package name '@veggies//:cucumber'"); | |
| } | |
| @Test | |
| public void testAllPackagesInMainRepositoryDoesNotWork() throws Exception { | |
| scratch.file( | |
| "fruits/BUILD", | |
| "package_group(name = 'apple',", | |
| " packages = ['@//...'])"); | |
| events.setFailFast(false); | |
| getPackageGroup("fruits", "apple"); | |
| events.assertContainsError("invalid package name '@//...'"); | |
| } | |
| @Test | |
| public void testTargetNameAsPackageDoesNotWork1() throws Exception { | |
| scratch.file( | |
| "fruits/BUILD", | |
| "package_group(name = 'apple',", | |
| " packages = ['//vegetables:carrot'])"); | |
| scratch.file("vegetables/BUILD"); | |
| scratch.file("fruits/vegetables/BUILD"); | |
| events.setFailFast(false); | |
| getPackageGroup("fruits", "apple"); | |
| events.assertContainsError("invalid package name '//vegetables:carrot'"); | |
| } | |
| @Test | |
| public void testTargetNameAsPackageDoesNotWork2() throws Exception { | |
| scratch.file( | |
| "fruits/BUILD", "package_group(name = 'apple',", " packages = [':carrot'])"); | |
| scratch.file("vegetables/BUILD"); | |
| scratch.file("fruits/vegetables/BUILD"); | |
| events.setFailFast(false); | |
| getPackageGroup("fruits", "apple"); | |
| events.assertContainsError("invalid package name ':carrot'"); | |
| } | |
| @Test | |
| public void testAllBeneathSpecificationWorks() throws Exception { | |
| scratch.file( | |
| "fruits/BUILD", | |
| "package_group(name = 'maracuja',", | |
| " packages = ['//tropics/...'])"); | |
| getPackageGroup("fruits", "maracuja"); | |
| } | |
| @Test | |
| public void testNegative() throws Exception { | |
| scratch.file("one/BUILD"); | |
| scratch.file("two/BUILD"); | |
| scratch.file("three/BUILD"); | |
| scratch.file("four/BUILD"); | |
| scratch.file( | |
| "test/BUILD", | |
| "package_group(", | |
| " name = 'packages',", | |
| " packages = [", | |
| " '//one',", | |
| " '//two',", | |
| " '-//three',", | |
| " '-//four',", | |
| " ],", | |
| ")"); | |
| PackageGroup grp = getPackageGroup("test", "packages"); | |
| assertThat(grp.contains(getPackage("one"))).isTrue(); | |
| assertThat(grp.contains(getPackage("two"))).isTrue(); | |
| assertThat(grp.contains(getPackage("three"))).isFalse(); | |
| assertThat(grp.contains(getPackage("four"))).isFalse(); | |
| } | |
| @Test | |
| public void testNegative_noSubpackages() throws Exception { | |
| scratch.file("pkg/BUILD"); | |
| scratch.file("pkg/one/BUILD"); | |
| scratch.file("pkg/one/two/BUILD"); | |
| scratch.file( | |
| "test/BUILD", | |
| "package_group(", | |
| " name = 'packages',", | |
| " packages = [", | |
| " '//pkg/...',", | |
| " '-//pkg/one',", | |
| " ],", | |
| ")"); | |
| PackageGroup grp = getPackageGroup("test", "packages"); | |
| assertThat(grp.contains(getPackage("pkg"))).isTrue(); | |
| assertThat(grp.contains(getPackage("pkg/one"))).isFalse(); | |
| assertThat(grp.contains(getPackage("pkg/one/two"))).isTrue(); | |
| } | |
| @Test | |
| public void testNegative_subpackages() throws Exception { | |
| scratch.file("pkg/BUILD"); | |
| scratch.file("pkg/one/BUILD"); | |
| scratch.file("pkg/one/two/BUILD"); | |
| scratch.file( | |
| "test/BUILD", | |
| "package_group(", | |
| " name = 'packages',", | |
| " packages = [", | |
| " '//pkg/...',", | |
| " '-//pkg/one/...',", | |
| " ],", | |
| ")"); | |
| PackageGroup grp = getPackageGroup("test", "packages"); | |
| assertThat(grp.contains(getPackage("pkg"))).isTrue(); | |
| assertThat(grp.contains(getPackage("pkg/one"))).isFalse(); | |
| assertThat(grp.contains(getPackage("pkg/one/two"))).isFalse(); | |
| } | |
| @Test | |
| public void testNegative_everything() throws Exception { | |
| scratch.file("pkg/BUILD"); | |
| scratch.file("pkg/one/BUILD"); | |
| scratch.file("pkg/one/two/BUILD"); | |
| scratch.file( | |
| "test/BUILD", | |
| "package_group(", | |
| " name = 'packages',", | |
| " packages = [", | |
| " '-//...',", | |
| " ],", | |
| ")"); | |
| PackageGroup grp = getPackageGroup("test", "packages"); | |
| assertThat(grp.contains(getPackage("pkg"))).isFalse(); | |
| assertThat(grp.contains(getPackage("pkg/one"))).isFalse(); | |
| assertThat(grp.contains(getPackage("pkg/one/two"))).isFalse(); | |
| } | |
| @Test | |
| public void testEverythingSpecificationWorks() throws Exception { | |
| scratch.file("fruits/BUILD", "package_group(name = 'mango', packages = ['//...'])"); | |
| PackageGroup packageGroup = getPackageGroup("fruits", "mango"); | |
| assertThat( | |
| packageGroup.getPackageSpecifications().containedPackages().collect(toImmutableList())) | |
| .containsExactly(PackageSpecification.everything().toString()); | |
| } | |
| @Test | |
| public void testDuplicatePackage() throws Exception { | |
| scratch.file("pkg/BUILD"); | |
| scratch.file("one/two/BUILD"); | |
| scratch.file( | |
| "test/BUILD", | |
| "package_group(", | |
| " name = 'packages',", | |
| " packages = [", | |
| " '//one/two',", | |
| " '//one/two',", | |
| " ],", | |
| ")"); | |
| PackageGroup grp = getPackageGroup("test", "packages"); | |
| assertThat(grp.contains(getPackage("one/two"))).isTrue(); | |
| } | |
| private Package getPackage(String packageName) throws Exception { | |
| PathFragment buildFileFragment = PathFragment.create(packageName).getRelative("BUILD"); | |
| Path buildFile = scratch.resolve(buildFileFragment.getPathString()); | |
| return packages.createPackage(packageName, RootedPath.toRootedPath(root, buildFile)); | |
| } | |
| private PackageGroup getPackageGroup(String pkg, String name) throws Exception { | |
| return (PackageGroup) getPackage(pkg).getTarget(name); | |
| } | |
| } |