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

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
import static org.junit.Assert.assertThat;

import java.io.File;
import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.LocalFileSystem;
import org.junit.Rule;
import org.junit.Test;


public class TestTemporaryPath {
  @Rule
  public TemporaryPath tmpDir = new TemporaryPath("foo.tmp", "bar.tmp");

  @Test
  public void testRoot() throws IOException {
    assertThat(tmpDir.getRootFile().exists(), is(true));
    assertThat(new File(tmpDir.getRootFileName()).exists(), is(true));
    assertThat(getFs().exists(tmpDir.getRootPath()), is(true));
  }

  @Test
  public void testFile() throws IOException {
    assertThat(tmpDir.getFile("foo").getParentFile(), is(tmpDir.getRootFile()));
    assertThat(tmpDir.getFile("foo").getName(), is("foo"));
    assertThat(tmpDir.getFile("foo").exists(), is(false));
  }

  @Test
  public void testPath() throws IOException {
    assertThat(tmpDir.getPath("foo").getParent(), is(tmpDir.getRootPath()));
    assertThat(tmpDir.getPath("foo").getName(), is("foo"));
    assertThat(getFs().exists(tmpDir.getPath("foo")), is(false));
  }

  @Test
  public void testFileName() {
    assertThat(new File(tmpDir.getRootFileName()), is(tmpDir.getRootFile()));
    assertThat(new File(tmpDir.getFileName("foo").toString()), is(tmpDir.getFile("foo")));
  }

  @Test
  public void testCopyResource() throws IOException {
    File dest = tmpDir.getFile("testfile");
    assertThat(dest.exists(), is(false));

    tmpDir.copyResourceFile("testfile");
    assertThat(dest.exists(), is(true));
  }

  @Test
  public void testCopyResourceNested() throws IOException {
    File dest = tmpDir.getFile("data.txt");
    assertThat(dest.exists(), is(false));

    tmpDir.copyResourceFile("testdir/data.txt");
    assertThat(dest.exists(), is(true));
  }
  
  @Test
  public void testGetDefaultConfiguration() {
    Configuration conf = tmpDir.getDefaultConfiguration();
    String fooDir = conf.get("foo.tmp");
    String barDir = conf.get("bar.tmp");

    assertThat(fooDir.startsWith(tmpDir.getRootFileName()), is(true));
    assertThat(barDir.startsWith(tmpDir.getRootFileName()), is(true));
    assertThat(fooDir, is(not(barDir)));
  }

  @Test
  public void testOverridePathProperties() {
    Configuration conf = new Configuration();
    conf.set("foo.tmp", "whatever");
    conf.set("other.dir", "/my/dir");

    tmpDir.overridePathProperties(conf);

    assertThat(conf.get("foo.tmp").startsWith(tmpDir.getRootFileName()), is(true));
    assertThat(conf.get("other.dir"), is("/my/dir"));
  }

  private LocalFileSystem getFs() throws IOException {
    return FileSystem.getLocal(new Configuration());
  }
}
