package org.mapfish.print.servlet.fileloader;
import com.google.common.io.Files;
import org.junit.After;
import org.junit.Test;
import org.mapfish.print.AbstractMapfishSpringTest;
import org.mapfish.print.IllegalFileAccessException;
import org.mapfish.print.config.Configuration;
import org.mapfish.print.config.WorkingDirectories;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
public abstract class AbstractConfigLoaderTest extends AbstractMapfishSpringTest {
protected static final File CONFIG_FILE = getFile(AbstractConfigLoaderTest.class, "config.yaml");
@Autowired
protected WorkingDirectories workingDirectories;
@After
public void tearDown() throws Exception {
final Iterable<File> children = Files.fileTreeTraverser().children(this.workingDirectories.getWorking());
for (File child : children) {
this.workingDirectories.removeDirectory(child);
}
}
protected abstract ConfigFileLoaderPlugin getLoader();
@Test
public void testAccessibleChildResource_InWorkingDir() throws Exception {
final Configuration configuration = getConfiguration();
assertAccessible(this.workingDirectories.getReports());
assertAccessible(this.workingDirectories.getWorking(configuration));
assertAccessible(this.workingDirectories.getJasperCompilation(configuration));
assertAccessible(this.workingDirectories.getTaskDirectory());
}
private Configuration getConfiguration() {
final Configuration configuration = new Configuration();
configuration.setConfigurationFile(CONFIG_FILE);
return configuration;
}
@Test
public void testLoadFileChildResource_InWorkingDir() throws Exception {
final Configuration configuration = getConfiguration();
final String resourceFileName = "resourceFile.txt";
final byte[] bytes = Files.toByteArray(getFile(FileConfigFileLoader.class, resourceFileName));
assertLoadable(bytes, this.workingDirectories.getReports());
assertLoadable(bytes, this.workingDirectories.getWorking(configuration));
assertLoadable(bytes, this.workingDirectories.getJasperCompilation(configuration));
assertLoadable(bytes, this.workingDirectories.getTaskDirectory());
}
protected void assertAccessible(File baseWorkingDir) throws IOException {
final File testFile = new File(baseWorkingDir, "testFile");
try {
testFile.getParentFile().mkdirs();
Files.touch(testFile);
assertTrue(testFile.getAbsolutePath() + " is not accessible", getLoader().isAccessible(CONFIG_FILE.toURI(),
testFile.getAbsolutePath()));
assertTrue(testFile.getAbsoluteFile().toURI().toString() + " is not accessible", getLoader().isAccessible(CONFIG_FILE.toURI
(), testFile.getAbsoluteFile().toURI().toString()));
assertTrue(testFile.toURI().toString() + " is not accessible", getLoader().isAccessible(CONFIG_FILE.toURI(), testFile.toURI().toString()));
} finally {
testFile.delete();
}
}
protected void assertLoadable(byte[] bytes, File baseWorkingDir) throws IOException {
final File testFile = new File(baseWorkingDir, "testFile");
try {
testFile.getParentFile().mkdirs();
Files.write(bytes, testFile);
assertArrayEquals(bytes, getLoader().loadFile(CONFIG_FILE.toURI(), testFile.getAbsolutePath()));
assertArrayEquals(bytes, getLoader().loadFile(CONFIG_FILE.toURI(), testFile.getAbsoluteFile().toURI().toString()));
assertArrayEquals(bytes, getLoader().loadFile(CONFIG_FILE.toURI(), testFile.toURI().toString()));
} finally {
testFile.delete();
}
}
protected void assertFileAccessException(URI configFileUri, String resource) throws IOException {
try {
getLoader().isAccessible(configFileUri, resource);
fail("Expected " + IllegalFileAccessException.class.getSimpleName());
} catch (IllegalFileAccessException e) {
// good
}
}
}