/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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 org.apache.hadoop.registry.client.binding; import static org.apache.hadoop.registry.client.binding.RegistryPathUtils.*; import java.io.IOException; import java.util.List; import org.apache.hadoop.fs.PathNotFoundException; import org.apache.hadoop.registry.client.exceptions.InvalidPathnameException; import org.junit.Assert; import org.junit.Test; public class TestRegistryPathUtils extends Assert { public static final String EURO = "\u20AC"; @Test public void testFormatAscii() throws Throwable { String in = "hostname01101101-1"; assertConverted(in, in); } /* * Euro symbol */ @Test public void testFormatEuroSymbol() throws Throwable { assertConverted("xn--lzg", EURO); } @Test public void testFormatIdempotent() throws Throwable { assertConverted("xn--lzg", RegistryPathUtils.encodeForRegistry(EURO)); } @Test public void testFormatCyrillicSpaced() throws Throwable { assertConverted("xn--pa 3-k4di", "\u0413PA\u0414 3"); } protected void assertConverted(String expected, String in) { String out = RegistryPathUtils.encodeForRegistry(in); assertEquals("Conversion of " + in, expected, out); } @Test public void testPaths() throws Throwable { assertCreatedPathEquals("/", "/", ""); assertCreatedPathEquals("/", "", ""); assertCreatedPathEquals("/", "", "/"); assertCreatedPathEquals("/", "/", "/"); assertCreatedPathEquals("/a", "/a", ""); assertCreatedPathEquals("/a", "/", "a"); assertCreatedPathEquals("/a/b", "/a", "b"); assertCreatedPathEquals("/a/b", "/a/", "b"); assertCreatedPathEquals("/a/b", "/a", "/b"); assertCreatedPathEquals("/a/b", "/a", "/b/"); assertCreatedPathEquals("/a", "/a", "/"); assertCreatedPathEquals("/alice", "/", "/alice"); assertCreatedPathEquals("/alice", "/alice", "/"); } @Test public void testComplexPaths() throws Throwable { assertCreatedPathEquals("/", "", ""); assertCreatedPathEquals("/yarn/registry/users/hadoop/org-apache-hadoop", "/yarn/registry", "users/hadoop/org-apache-hadoop/"); } private static void assertCreatedPathEquals(String expected, String base, String path) throws IOException { String fullPath = createFullPath(base, path); assertEquals("\"" + base + "\" + \"" + path + "\" =\"" + fullPath + "\"", expected, fullPath); } @Test public void testSplittingEmpty() throws Throwable { assertEquals(0, split("").size()); assertEquals(0, split("/").size()); assertEquals(0, split("///").size()); } @Test public void testSplitting() throws Throwable { assertEquals(1, split("/a").size()); assertEquals(0, split("/").size()); assertEquals(3, split("/a/b/c").size()); assertEquals(3, split("/a/b/c/").size()); assertEquals(3, split("a/b/c").size()); assertEquals(3, split("/a/b//c").size()); assertEquals(3, split("//a/b/c/").size()); List<String> split = split("//a/b/c/"); assertEquals("a", split.get(0)); assertEquals("b", split.get(1)); assertEquals("c", split.get(2)); } @Test public void testParentOf() throws Throwable { assertEquals("/", parentOf("/a")); assertEquals("/", parentOf("/a/")); assertEquals("/a", parentOf("/a/b")); assertEquals("/a/b", parentOf("/a/b/c")); } @Test public void testLastPathEntry() throws Throwable { assertEquals("",lastPathEntry("/")); assertEquals("",lastPathEntry("//")); assertEquals("c",lastPathEntry("/a/b/c")); assertEquals("c",lastPathEntry("/a/b/c/")); } @Test(expected = PathNotFoundException.class) public void testParentOfRoot() throws Throwable { parentOf("/"); } @Test public void testValidPaths() throws Throwable { assertValidPath("/"); assertValidPath("/a/b/c"); assertValidPath("/users/drwho/org-apache-hadoop/registry/appid-55-55"); assertValidPath("/a50"); } @Test public void testInvalidPaths() throws Throwable { assertInvalidPath("/a_b"); assertInvalidPath("/UpperAndLowerCase"); assertInvalidPath("/space in string"); // Is this valid? assertInvalidPath("/50"); } private void assertValidPath(String path) throws InvalidPathnameException { validateZKPath(path); } private void assertInvalidPath(String path) throws InvalidPathnameException { try { validateElementsAsDNS(path); fail("path considered valid: " + path); } catch (InvalidPathnameException expected) { // expected } } }