/* ====================================================================
*
* Copyright (C) 2007 - 2015 GeoSolutions S.A.S.
* http://www.geo-solutions.it
*
* GPLv3 + Classpath exception
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program.
*
* ====================================================================
*
* This software consists of voluntary contributions made by developers
* of GeoSolutions. For more information on GeoSolutions, please see
* <http://www.geo-solutions.it/>.
*
*/
package it.geosolutions.geostore.services.rest.auditing;
import org.junit.Assert;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
final class AuditingTestsUtils {
static File randomDirectory(File original) {
return new File(original.getPath() + "-" + UUID.randomUUID().toString());
}
static void createDefaultConfiguration(File configurationDirectory, File configurationFilePath, File outputDirectory, File templatesDirectory) {
initDirectory(configurationDirectory);
System.setProperty(AuditingConfiguration.CONFIGURATION_PATH, configurationFilePath.getAbsolutePath());
String properties = propertiesToString(getDefaultProperties(outputDirectory, templatesDirectory));
createFile(configurationFilePath, properties);
}
static void initDirectory(File directory) {
deleteDirectory(directory);
createDirectory(directory);
}
static void createDirectory(File directory) {
try {
FileUtils.forceMkdir(directory);
} catch (Exception exception) {
throw new AuditingException(exception, "Error creating directory '%s'.", directory.getAbsolutePath());
}
}
static void deleteDirectory(File directory) {
deleteFile(directory);
}
static void deleteFile(File file) {
if (!file.getAbsolutePath().contains("auditing-tests")) {
throw new AuditingException("This path '%s' requested to delete looks suspicious.", file.getAbsolutePath());
}
try {
FileUtils.deleteQuietly(file);
} catch (Exception exception) {
throw new AuditingException(exception, "Error deleting file '%s'.", file.getAbsolutePath());
}
}
static void createFile(File file, String fileContent) {
deleteFile(file);
writeToFile(file, fileContent);
}
static void writeToFile(File file, String fileContent) {
try {
FileWriter writer = new FileWriter(file);
writer.write(fileContent);
writer.flush();
writer.close();
} catch (Exception exception) {
throw new AuditingException(exception, "Error writing content to file '%s'.", file.getAbsolutePath());
}
}
static String readFile(File file) {
try {
FileInputStream input = new FileInputStream(file);
byte[] data = new byte[(int) file.length()];
input.read(data);
input.close();
return new String(data).replaceAll("\\r\\n", "\n");
} catch (Exception exception) {
throw new AuditingException(exception, "Error reading file '%s' content.", file.getAbsolutePath());
}
}
static Map<String, String> getDefaultProperties(File outputDirectory, File templatesDirectory) {
Map<String, String> properties = new HashMap<String, String>();
properties.put(AuditingConfiguration.AUDIT_ENABLE, "true");
properties.put(AuditingConfiguration.MAX_RESQUEST_PER_FILE, "3");
properties.put(AuditingConfiguration.OUTPUT_DIRECTORY, outputDirectory.getAbsolutePath().replace("\\", "\\\\"));
properties.put(AuditingConfiguration.OUTPUT_FILES_EXTENSION, "txt");
properties.put(AuditingConfiguration.TEMPLATES_DIRECTORY, templatesDirectory.getAbsolutePath().replace("\\", "\\\\"));
properties.put(AuditingConfiguration.TEMPLATES_VERSION, "1");
return properties;
}
static String propertiesToString(Map<String, String> properties) {
StringBuilder stringBuilder = new StringBuilder();
for (Map.Entry<String, String> property : properties.entrySet()) {
stringBuilder.append(property.getKey()).append('=').append(property.getValue()).append("\n");
}
return stringBuilder.toString();
}
static void checkDirectoryContainsFiles(File directory, File... expectedFiles) {
Collection existingFiles = FileUtils.listFiles(directory, null, false);
Assert.assertEquals(existingFiles.size(), expectedFiles.length);
for (File expectedFile : expectedFiles) {
Assert.assertTrue(existingFiles.contains(expectedFile));
}
}
static void checkFileExistsWithContent(File file, String content) {
Assert.assertTrue(file.exists());
Assert.assertEquals(readFile(file).trim(), content.trim());
}
static void checkDirectoryIsEmpty(File directory) {
Assert.assertEquals(FileUtils.listFiles(directory, null, false).size(), 0);
}
static long checksum(File file) {
try {
return FileUtils.checksumCRC32(file);
} catch (Exception exception) {
throw new AuditingException(exception, "Error computing checksum of file '%s'.", file.getAbsolutePath());
}
}
static void waitFileChange(File file, long checksum, long timeoutInMs) throws InterruptedException {
for (int i = 0; i < timeoutInMs / 100; i++) {
if (checksum(file) != checksum) {
return;
}
Thread.sleep(100);
}
}
static void waitFileExists(File file, long timeoutInMs) throws InterruptedException {
for (int i = 0; i < timeoutInMs / 100; i++) {
if (file.exists()) {
return;
}
Thread.sleep(100);
}
}
}