/*
* 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.commons.io;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import org.apache.commons.io.testtools.FileBasedTestCase;
import org.apache.commons.io.testtools.TestUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
/**
* This is used to test FileUtils for correctness.
*/
public class FileUtilsFileNewerTestCase extends FileBasedTestCase {
// Test data
private static final int FILE1_SIZE = 1;
private static final int FILE2_SIZE = 1024 * 4 + 1;
private final File m_testFile1;
private final File m_testFile2;
public FileUtilsFileNewerTestCase() {
m_testFile1 = new File(getTestDirectory(), "file1-test.txt");
m_testFile2 = new File(getTestDirectory(), "file2-test.txt");
}
/** @see junit.framework.TestCase#setUp() */
@Before
public void setUp() throws Exception {
getTestDirectory().mkdirs();
if (!m_testFile1.getParentFile().exists()) {
throw new IOException("Cannot create file " + m_testFile1
+ " as the parent directory does not exist");
}
try (final BufferedOutputStream output1 =
new BufferedOutputStream(new FileOutputStream(m_testFile1))) {
TestUtils.generateTestData(output1, (long) FILE1_SIZE);
}
if (!m_testFile2.getParentFile().exists()) {
throw new IOException("Cannot create file " + m_testFile2
+ " as the parent directory does not exist");
}
try (final BufferedOutputStream output =
new BufferedOutputStream(new FileOutputStream(m_testFile2))) {
TestUtils.generateTestData(output, (long) FILE2_SIZE);
}
}
/** @see junit.framework.TestCase#tearDown() */
@After
public void tearDown() throws Exception {
m_testFile1.delete();
m_testFile2.delete();
FileUtils.deleteDirectory(getTestDirectory());
}
/**
* Tests the <code>isFileNewer(File, *)</code> methods which a "normal" file.
*
* @see FileUtils#isFileNewer(File, long)
* @see FileUtils#isFileNewer(File, Date)
* @see FileUtils#isFileNewer(File, File)
*/
@Test
public void testIsFileNewer() {
if (!m_testFile1.exists()) {
throw new IllegalStateException("The m_testFile1 should exist");
}
final long fileLastModified = m_testFile1.lastModified();
final long TWO_SECOND = 2000;
testIsFileNewer("two second earlier is not newer" , m_testFile1, fileLastModified + TWO_SECOND, false);
testIsFileNewer("same time is not newer" , m_testFile1, fileLastModified, false);
testIsFileNewer("two second later is newer" , m_testFile1, fileLastModified - TWO_SECOND, true);
}
/**
* Tests the <code>isFileNewer(File, *)</code> methods which a not existing file.
*
* @see FileUtils#isFileNewer(File, long)
* @see FileUtils#isFileNewer(File, Date)
* @see FileUtils#isFileNewer(File, File)
*/
@Test
public void testIsFileNewerImaginaryFile() {
final File imaginaryFile = new File(getTestDirectory(), "imaginaryFile");
if (imaginaryFile.exists()) {
throw new IllegalStateException("The imaginary File exists");
}
testIsFileNewer("imaginary file can be newer" , imaginaryFile, m_testFile2.lastModified(), false);
}
/**
* Tests the <code>isFileNewer(File, *)</code> methods which the specified conditions.
*
* Creates :
* <ul>
* <li>a <code>Date</code> which represents the time reference</li>
* <li>a temporary file with the same last modification date as the time reference</li>
* </ul>
* Then compares (with the needed <code>isFileNewer</code> method) the last modification date of
* the specified file with the specified time reference, the created <code>Date</code> and the temporary
* file.
* <br>
* The test is successful if the three comparisons return the specified wanted result.
*
* @param description describes the tested situation
* @param file the file of which the last modification date is compared
* @param time the time reference measured in milliseconds since the epoch
* @param wantedResult the expected result
*
* @see FileUtils#isFileNewer(File, long)
* @see FileUtils#isFileNewer(File, Date)
* @see FileUtils#isFileNewer(File, File)
*/
protected void testIsFileNewer(final String description, final File file, final long time, final boolean wantedResult) {
assertEquals(description + " - time", wantedResult, FileUtils.isFileNewer(file, time));
assertEquals(description + " - date", wantedResult, FileUtils.isFileNewer(file, new Date(time)));
final File temporaryFile = m_testFile2;
temporaryFile.setLastModified(time);
assertEquals("The temporary file hasn't the right last modification date", time, temporaryFile.lastModified());
assertEquals(description + " - file", wantedResult, FileUtils.isFileNewer(file, temporaryFile));
}
/**
* Tests the <code>isFileNewer(File, long)</code> method without specifying a <code>File</code>.
* <br>
* The test is successful if the method throws an <code>IllegalArgumentException</code>.
*/
@Test(expected = IllegalArgumentException.class)
public void testIsFileNewerNoFile() {
FileUtils.isFileNewer(null,0);
fail("File not specified");
}
/**
* Tests the <code>isFileNewer(File, Date)</code> method without specifying a <code>Date</code>.
* <br>
* The test is successful if the method throws an <code>IllegalArgumentException</code>.
*/
@Test(expected = IllegalArgumentException.class)
public void testIsFileNewerNoDate() {
FileUtils.isFileNewer(m_testFile1, (Date) null);
fail("Date not specified");
}
/**
* Tests the <code>isFileNewer(File, File)</code> method without specifying a reference <code>File</code>.
* <br>
* The test is successful if the method throws an <code>IllegalArgumentException</code>.
*/
@Test(expected = IllegalArgumentException.class)
public void testIsFileNewerNoFileReference() {
FileUtils.isFileNewer(m_testFile1, (File) null);
fail("Reference file not specified");
}
}