blob: b843824f11d2c951ba6bcb1edd3afe8dc43fbe0e [file] [log] [blame]
/*
* 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.configuration2.reloading;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import org.apache.commons.configuration2.ConfigurationAssert;
import org.apache.commons.configuration2.ex.ConfigurationRuntimeException;
import org.apache.commons.configuration2.io.FileHandler;
import org.apache.commons.configuration2.io.VFSFileSystem;
import org.apache.commons.vfs2.FileName;
import org.apache.commons.vfs2.FileObject;
import org.apache.commons.vfs2.FileSystemException;
import org.easymock.EasyMock;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
/**
* Test case for the VFSFileHandlerReloadingDetector class.
*
*/
public class TestVFSFileHandlerReloadingDetector
{
/** Constant for the name of the test property. */
private static final String PROPERTY = "string";
/** Constant for the XML fragment to be written. */
private static final String FMT_XML = "<configuration><" + PROPERTY
+ ">%s</" + PROPERTY + "></configuration>";
/** A helper object for creating temporary files. */
@Rule
public TemporaryFolder folder = new TemporaryFolder();
/**
* Writes a test configuration file containing a single property with the
* given value.
*
* @param file the file to be written
* @param value the value of the test property
* @throws IOException if an error occurs
*/
private void writeTestFile(final File file, final String value) throws IOException
{
final FileWriter out = new FileWriter(file);
out.write(String.format(FMT_XML, value));
out.close();
}
/**
* Tests whether the last modification date of an existing file can be
* obtained.
*/
@Test
public void testLastModificationDateExisting() throws IOException
{
final File file = folder.newFile();
writeTestFile(file, "value1");
final VFSFileHandlerReloadingDetector strategy =
new VFSFileHandlerReloadingDetector();
strategy.getFileHandler().setFile(file);
strategy.getFileHandler().setFileSystem(new VFSFileSystem());
final long modificationDate = strategy.getLastModificationDate();
assertEquals("Wrong modification date", file.lastModified(),
modificationDate);
}
/**
* Tests whether a non existing file is handled correctly.
*/
@Test
public void testLastModificationDateNonExisting()
{
final File file = ConfigurationAssert.getOutFile("NonExistingFile.xml");
final FileHandler handler = new FileHandler();
handler.setFileSystem(new VFSFileSystem());
handler.setFile(file);
final VFSFileHandlerReloadingDetector strategy =
new VFSFileHandlerReloadingDetector(handler);
assertEquals("Got a modification date", 0,
strategy.getLastModificationDate());
}
/**
* Tests whether an undefined file handler is handler correctly.
*/
@Test
public void testLastModificationDateUndefinedHandler()
{
final VFSFileHandlerReloadingDetector strategy =
new VFSFileHandlerReloadingDetector();
assertEquals("Got a modification date", 0,
strategy.getLastModificationDate());
}
/**
* Tests whether a file system exception is handled when accessing the file
* object.
*/
@Test
public void testLastModificationDateFileSystemEx()
throws FileSystemException
{
final FileObject fo = EasyMock.createMock(FileObject.class);
final FileName name = EasyMock.createMock(FileName.class);
EasyMock.expect(fo.exists()).andReturn(Boolean.TRUE);
EasyMock.expect(fo.getContent()).andThrow(
new FileSystemException("error"));
EasyMock.expect(fo.getName()).andReturn(name);
EasyMock.expect(name.getURI()).andReturn("someURI");
EasyMock.replay(fo, name);
final VFSFileHandlerReloadingDetector strategy =
new VFSFileHandlerReloadingDetector()
{
@Override
protected FileObject getFileObject()
{
return fo;
}
};
assertEquals("Got a modification date", 0,
strategy.getLastModificationDate());
EasyMock.verify(fo);
}
/**
* Tests a URI which cannot be resolved.
*/
@Test(expected = ConfigurationRuntimeException.class)
public void testLastModificationDateUnresolvableURI()
{
final VFSFileHandlerReloadingDetector strategy =
new VFSFileHandlerReloadingDetector()
{
@Override
protected String resolveFileURI()
{
return null;
}
};
strategy.getFileHandler().setFileSystem(new VFSFileSystem());
strategy.getFileHandler().setFileName("test.xml");
strategy.getLastModificationDate();
}
/**
* Tests whether the refresh delay is correctly passed to the base class.
*/
@Test
public void testGetRefreshDelay() throws Exception
{
final long delay = 20130325L;
final VFSFileHandlerReloadingDetector strategy =
new VFSFileHandlerReloadingDetector(null, delay);
assertNotNull("No file handler was created", strategy.getFileHandler());
assertEquals("Wrong refresh delay", delay, strategy.getRefreshDelay());
}
}