// 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.cmdline; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertNull; import com.google.devtools.build.lib.cmdline.LabelValidator.PackageAndTarget; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; /** * Tests for {@link LabelValidator}. */ @RunWith(JUnit4.class) public class LabelValidatorTest { private PackageAndTarget newFooTarget() { return new PackageAndTarget("foo", "foo"); } private PackageAndTarget newBarTarget() { return new PackageAndTarget("bar", "bar"); } @Test public void testValidatePackageName() throws Exception { // OK: assertNull(LabelValidator.validatePackageName("foo")); assertNull(LabelValidator.validatePackageName("Foo")); assertNull(LabelValidator.validatePackageName("FOO")); assertNull(LabelValidator.validatePackageName("foO")); assertNull(LabelValidator.validatePackageName("foo-bar")); assertNull(LabelValidator.validatePackageName("Foo-Bar")); assertNull(LabelValidator.validatePackageName("FOO-BAR")); assertNull(LabelValidator.validatePackageName("bar.baz")); assertNull(LabelValidator.validatePackageName("a/..b")); assertNull(LabelValidator.validatePackageName("a/.b")); assertNull(LabelValidator.validatePackageName("a/b.")); assertNull(LabelValidator.validatePackageName("a/b..")); assertNull(LabelValidator.validatePackageName("a$( )/b..")); // Bad: assertEquals( "package names may not start with '/'", LabelValidator.validatePackageName("/foo")); assertEquals("package names may not end with '/'", LabelValidator.validatePackageName("foo/")); assertEquals(LabelValidator.PACKAGE_NAME_ERROR, LabelValidator.validatePackageName("foo:bar")); assertEquals( LabelValidator.PACKAGE_NAME_ERROR, LabelValidator.validatePackageName("baz@12345")); assertEquals( LabelValidator.PACKAGE_NAME_DOT_ERROR, LabelValidator.validatePackageName("bar/../baz")); assertEquals( LabelValidator.PACKAGE_NAME_DOT_ERROR, LabelValidator.validatePackageName("bar/..")); assertEquals( LabelValidator.PACKAGE_NAME_DOT_ERROR, LabelValidator.validatePackageName("../bar")); assertEquals( LabelValidator.PACKAGE_NAME_DOT_ERROR, LabelValidator.validatePackageName("bar/...")); assertEquals( LabelValidator.PACKAGE_NAME_DOT_ERROR, LabelValidator.validatePackageName("bar/./baz")); assertEquals( LabelValidator.PACKAGE_NAME_DOT_ERROR, LabelValidator.validatePackageName("bar/.")); assertEquals( LabelValidator.PACKAGE_NAME_DOT_ERROR, LabelValidator.validatePackageName("./bar")); } @Test public void testValidateTargetName() throws Exception { assertNull(LabelValidator.validateTargetName("foo")); assertNull(LabelValidator.validateTargetName("foo+bar")); assertNull(LabelValidator.validateTargetName("foo_bar")); assertNull(LabelValidator.validateTargetName("foo=bar")); assertNull(LabelValidator.validateTargetName("foo-bar")); assertNull(LabelValidator.validateTargetName("foo.bar")); assertNull(LabelValidator.validateTargetName("foo@bar")); assertNull(LabelValidator.validateTargetName("foo~bar")); assertNull(LabelValidator.validateTargetName("foo#bar")); assertEquals("target names may not end with '/'", LabelValidator.validateTargetName("foo/")); assertEquals("target names may not contain ':'", LabelValidator.validateTargetName("bar:baz")); assertEquals("target names may not contain ':'", LabelValidator.validateTargetName("bar:")); assertEquals("target names may not contain '&'", LabelValidator.validateTargetName("bar&")); } @Test public void testValidateAbsoluteLabel() throws Exception { PackageAndTarget emptyPackage = new PackageAndTarget("", "bar"); assertEquals(emptyPackage, LabelValidator.validateAbsoluteLabel("//:bar")); assertEquals(emptyPackage, LabelValidator.validateAbsoluteLabel("@repo//:bar")); assertEquals(new PackageAndTarget("foo", "bar"), LabelValidator.validateAbsoluteLabel("@repo//foo:bar")); assertEquals(new PackageAndTarget("foo", "bar"), LabelValidator.validateAbsoluteLabel("@//foo:bar")); emptyPackage = new PackageAndTarget("", "b$() ar"); assertEquals(emptyPackage, LabelValidator.validateAbsoluteLabel("//:b$() ar")); assertEquals(emptyPackage, LabelValidator.validateAbsoluteLabel("@repo//:b$() ar")); assertEquals(new PackageAndTarget("f$( )oo", "b$() ar"), LabelValidator.validateAbsoluteLabel("@repo//f$( )oo:b$() ar")); assertEquals(new PackageAndTarget("f$( )oo", "b$() ar"), LabelValidator.validateAbsoluteLabel("@//f$( )oo:b$() ar")); } @Test public void testPackageAndTargetHashCode_distinctButEqualObjects() { PackageAndTarget fooTarget1 = newFooTarget(); PackageAndTarget fooTarget2 = newFooTarget(); assertNotSame(fooTarget1, fooTarget2); assertEquals("Should have same hash code", fooTarget2.hashCode(), fooTarget1.hashCode()); } @Test public void testPackageAndTargetEquals_distinctButEqualObjects() { PackageAndTarget fooTarget1 = newFooTarget(); PackageAndTarget fooTarget2 = newFooTarget(); assertNotSame(fooTarget1, fooTarget2); assertEquals("Should be equal", fooTarget2, fooTarget1); } @Test public void testPackageAndTargetEquals_unequalObjects() { assertFalse("should be unequal", newFooTarget().equals(newBarTarget())); } @Test public void testPackageAndTargetToString() { assertEquals("//foo:foo", newFooTarget().toString()); assertEquals("//bar:bar", newBarTarget().toString()); } @Test public void testSlashlessLabel_infersTargetNameFromRepoName() throws Exception { assertEquals("//:foo", LabelValidator.parseAbsoluteLabel("@foo").toString()); } }