| // 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 com.google.common.truth.Truth.assertThat; |
| 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 static org.junit.Assert.fail; |
| |
| 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..")); |
| |
| // 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("bar baz")); |
| assertEquals(LabelValidator.PACKAGE_NAME_ERROR, LabelValidator.validatePackageName("foo:bar")); |
| assertEquals( |
| LabelValidator.PACKAGE_NAME_ERROR, LabelValidator.validatePackageName("baz@12345")); |
| assertEquals(LabelValidator.PACKAGE_NAME_ERROR, LabelValidator.validatePackageName("baz(foo)")); |
| assertEquals(LabelValidator.PACKAGE_NAME_ERROR, LabelValidator.validatePackageName("bazfoo)")); |
| |
| 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")); |
| |
| 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:baz")); |
| assertEquals("target names may not contain ':'", |
| LabelValidator.validateTargetName("bar:")); |
| assertEquals("target names may not contain '&'", |
| LabelValidator.validateTargetName("bar&")); |
| assertEquals("target names may not contain '$'", |
| LabelValidator.validateTargetName("baz$a")); |
| assertEquals("target names may not contain '('", |
| LabelValidator.validateTargetName("baz(foo)")); |
| assertEquals("target names may not contain ')'", |
| LabelValidator.validateTargetName("bazfoo)")); |
| } |
| |
| @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")); |
| |
| try { |
| LabelValidator.validateAbsoluteLabel("@foo"); |
| fail("Should not have been able to validate @foo"); |
| } catch (LabelValidator.BadLabelException expected) { |
| assertThat(expected.getMessage()).contains("invalid fully-qualified label"); |
| } |
| } |
| |
| @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()); |
| } |
| } |