/**
 * 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.hdfs.server.namenode;

import org.apache.hadoop.hdfs.server.namenode.INode;
import org.apache.hadoop.hdfs.DFSUtil;
import org.apache.hadoop.fs.Path;

import org.junit.Test;

import java.util.Arrays;

import static org.junit.Assert.*;


/**
 * 
 */
public class TestPathComponents {

  @Test
  public void testBytes2ByteArray() throws Exception {
    testString("/");
    testString("/file");
    testString("/directory/");
    testString("//");
    testString("/dir//file");
    testString("/dir/dir1//");
  }

  public void testString(String str) throws Exception {
    String pathString = str;
    byte[][] oldPathComponents = INode.getPathComponents(pathString);
    byte[][] newPathComponents = 
                DFSUtil.bytes2byteArray(pathString.getBytes("UTF-8"),
                                        (byte) Path.SEPARATOR_CHAR);
    if (oldPathComponents[0] == null) {
      assertTrue(oldPathComponents[0] == newPathComponents[0]);
    } else {
      assertTrue("Path components do not match for " + pathString,
                  Arrays.deepEquals(oldPathComponents, newPathComponents));
    }
  }
}
