package org.apache.sentry.core.db;
/*
 * 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.
 */


import org.apache.sentry.core.model.db.AccessURI;
import org.junit.Test;

public class TestURI {

  @Test(expected=IllegalArgumentException.class)
  public void testBadUriEmpty() {
    new AccessURI("");
  }
  @Test(expected=IllegalArgumentException.class)
  public void testBadUriNull() {
    new AccessURI(null);
  }

  @Test(expected=IllegalArgumentException.class)
  public void testBadUriNoFilePrefix() {
    new AccessURI("/");
  }

  @Test(expected=IllegalArgumentException.class)
  public void testBadUriIncorrectFilePrefix() {
    new AccessURI("file:/some/path");
  }

  @Test(expected=IllegalArgumentException.class)
  public void testBadUriIncorrectHdfsPrefix() {
    new AccessURI("hdfs:/some/path");
  }

  @Test
  public void testUriSwiftPrefix() {
    new AccessURI("swift:///some/path");
  }

  @Test
  public void testS3Uri() {
    new AccessURI("s3://my-bucket/my/funny/picture.jpg");
  }

  @Test
  public void testS3UriWithAuthority() {
    new AccessURI("s3n://123:456@my-bucket/my/funny/picture.jpg");
  }

  @Test
  public void testUriWithAuthority() {
    new AccessURI("hdfs://localhost:9999/some/path");
  }

}
