/*
 * Copyright 2014 Google Inc.
 *
 * Licensed 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 com.google.gwt.dev.util;

import com.google.gwt.util.tools.Utility;

import junit.framework.TestCase;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * Tests for {@link OutputFileSetOnDirectory}.
 */
public class OutputFileSetOnDirectoryTest extends TestCase {

  public void testCreateNewOutputStream() throws IOException {
    File work = Utility.makeTemporaryDirectory(null, "outputfileset");
    try {

      OutputFileSetOnDirectory output = new OutputFileSetOnDirectory(work, "test/");
      int tstamp = OutputFileSet.TIMESTAMP_UNAVAILABLE;

      output.createNewOutputStream("path/to/file", tstamp).close();
      assertTrue(new File(work, "test/path/to/file").exists());

      output.createNewOutputStream("path/../to/file", tstamp).close();
      assertTrue(new File(work, "test/to/file").exists());

      output.createNewOutputStream("/../path/../to/./file", tstamp).close();
      assertTrue(new File(work, "to/file").exists());

    } finally {
      Util.recursiveDelete(work, false);
    }
  }

  public void testNewFileEqualTimestampOverwrites() throws IOException {
    File work = Utility.makeTemporaryDirectory(null, "outputfileset");
    try {
      OutputFileSetOnDirectory output = new OutputFileSetOnDirectory(work, "test/");

      OutputStream firstStream = output.createNewOutputStream("path/to/file", 1000);
      assertTrue(firstStream instanceof FileOutputStream);
      firstStream.close();

      OutputStream secondStream = output.createNewOutputStream("path/to/file", 1000);
      assertTrue(secondStream instanceof FileOutputStream);
      secondStream.close();
    } finally {
      Util.recursiveDelete(work, false);
    }
  }

  public void testNewFileOlderTimestampOverwrites() throws IOException {
    File work = Utility.makeTemporaryDirectory(null, "outputfileset");
    try {
      OutputFileSetOnDirectory output = new OutputFileSetOnDirectory(work, "test/");

      OutputStream firstStream = output.createNewOutputStream("path/to/file", 2000);
      assertTrue(firstStream instanceof FileOutputStream);
      firstStream.close();

      OutputStream secondStream = output.createNewOutputStream("path/to/file", 1000);
      assertTrue(secondStream instanceof FileOutputStream);
      secondStream.close();
    } finally {
      Util.recursiveDelete(work, false);
    }
  }
}
