/**
 * 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.common;

import java.io.IOException;
import java.net.URI;

import junit.framework.TestCase;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * This is a unit test, which tests {@link Util#stringAsURI(String)}
 * for Windows and Unix style file paths.
 */
public class TestGetUriFromString extends TestCase {
  private static final Log LOG = LogFactory.getLog(TestGetUriFromString.class);

  private static final String RELATIVE_FILE_PATH = "relativeFilePath";
  private static final String ABSOLUTE_PATH_UNIX = "/tmp/file1";
  private static final String ABSOLUTE_PATH_WINDOWS =
    "C:\\Documents and Settings\\All Users";
  private static final String URI_FILE_SCHEMA = "file";
  private static final String URI_PATH_UNIX = "/var/www";
  private static final String URI_PATH_WINDOWS =
    "/C:/Documents%20and%20Settings/All%20Users";
  private static final String URI_UNIX = URI_FILE_SCHEMA + "://"
      + URI_PATH_UNIX;
  private static final String URI_WINDOWS = URI_FILE_SCHEMA + "://"
      + URI_PATH_WINDOWS;

  /**
   * Test for a relative path, os independent
   * @throws IOException 
   */
  public void testRelativePathAsURI() throws IOException {
    URI u = Util.stringAsURI(RELATIVE_FILE_PATH);
    LOG.info("Uri: " + u);
    assertNotNull(u);
  }

  /**
   * Test for an OS dependent absolute paths.
   * @throws IOException 
   */
  public void testAbsolutePathAsURI() throws IOException {
    URI u = null;
    u = Util.stringAsURI(ABSOLUTE_PATH_WINDOWS);
    assertNotNull(
        "Uri should not be null for Windows path" + ABSOLUTE_PATH_WINDOWS, u);
    assertEquals(URI_FILE_SCHEMA, u.getScheme());
    u = Util.stringAsURI(ABSOLUTE_PATH_UNIX);
    assertNotNull("Uri should not be null for Unix path" + ABSOLUTE_PATH_UNIX, u);
    assertEquals(URI_FILE_SCHEMA, u.getScheme());
  }

  /**
   * Test for a URI
   * @throws IOException 
   */
  public void testURI() throws IOException {
    LOG.info("Testing correct Unix URI: " + URI_UNIX);
    URI u = Util.stringAsURI(URI_UNIX);
    LOG.info("Uri: " + u);    
    assertNotNull("Uri should not be null at this point", u);
    assertEquals(URI_FILE_SCHEMA, u.getScheme());
    assertEquals(URI_PATH_UNIX, u.getPath());

    LOG.info("Testing correct windows URI: " + URI_WINDOWS);
    u = Util.stringAsURI(URI_WINDOWS);
    LOG.info("Uri: " + u);
    assertNotNull("Uri should not be null at this point", u);
    assertEquals(URI_FILE_SCHEMA, u.getScheme());
    assertEquals(URI_PATH_WINDOWS.replace("%20", " "), u.getPath());
  }
}
