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

import static org.hamcrest.core.Is.is;
import static org.junit.Assert.assertThat;

import org.apache.hadoop.conf.Configuration;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

/**
 * Test FsShell -ls command.
 */
public class TestFsShellList {
  private static Configuration conf;
  private static FsShell shell;
  private static LocalFileSystem lfs;
  private static Path testRootDir;

  @BeforeClass
  public static void setup() throws Exception {
    conf = new Configuration();
    shell = new FsShell(conf);
    lfs = FileSystem.getLocal(conf);
    lfs.setVerifyChecksum(true);
    lfs.setWriteChecksum(true);

    String root = System.getProperty("test.build.data", "test/build/data");
    testRootDir = lfs.makeQualified(new Path(root, "testFsShellList"));
    assertThat(lfs.mkdirs(testRootDir), is(true));
  }

  @AfterClass
  public static void teardown() throws Exception {
    lfs.delete(testRootDir, true);
  }

  private void createFile(Path filePath) throws Exception {
    FSDataOutputStream out = lfs.create(filePath);
    out.writeChars("I am " + filePath);
    out.close();
    assertThat(lfs.exists(lfs.getChecksumFile(filePath)), is(true));
  }

  @Test
  public void testList() throws Exception {
    createFile(new Path(testRootDir, "abc"));
    String[] lsArgv = new String[]{"-ls", testRootDir.toString()};
    assertThat(shell.run(lsArgv), is(0));

    createFile(new Path(testRootDir, "abc\bd\tef"));
    createFile(new Path(testRootDir, "ghi"));
    createFile(new Path(testRootDir, "qq\r123"));
    lsArgv = new String[]{"-ls", testRootDir.toString()};
    assertThat(shell.run(lsArgv), is(0));

    lsArgv = new String[]{"-ls", "-q", testRootDir.toString()};
    assertThat(shell.run(lsArgv), is(0));
  }

  /*
  UGI params should take effect when we pass.
 */
  @Test(expected = IllegalArgumentException.class)
  public void testListWithUGI() throws Exception {
    FsShell fsShell = new FsShell(new Configuration());
    //Passing Dummy such that it should through IAE
    fsShell.getConf()
        .set(CommonConfigurationKeysPublic.HADOOP_SECURITY_AUTHENTICATION,
            "DUMMYAUTH");
    String[] lsArgv = new String[] {"-ls", testRootDir.toString()};
    fsShell.run(lsArgv);
  }
}
