package betsy.common.timeouts; import java.io.File; import java.io.FileWriter; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import java.util.Objects; import betsy.common.tasks.FileTasks; import betsy.common.timeouts.timeout.Timeout; import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.Logger; import org.apache.log4j.spi.LoggingEvent; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.assertEquals; /** * @author Christoph Broeker * @version 1.0 */ public class PropertiesTest { private Timeout timeout; private Path properties; private TestAppender testAppender; private static final Logger LOGGER = Logger.getLogger(Properties.class); @BeforeClass public static void setUpClass() { String transitionFolder = "transition_folder"; FileTasks.mkdirs(Paths.get(transitionFolder)); File properties = new File("timeout.properties"); if (properties.exists()) { FileTasks.copyFileIntoFolder(properties.toPath(), Paths.get(transitionFolder)); FileTasks.deleteFile(properties.toPath()); } } @AfterClass public static void tearDownClass() { File properties = new File("timeout.properties"); FileTasks.deleteFile(properties.toPath()); String transitionFolder = "transition_folder"; Path currentRelativePath = Paths.get(""); FileTasks.copyFilesInFolderIntoOtherFolder(Paths.get(transitionFolder), currentRelativePath); FileTasks.deleteDirectory(Paths.get(transitionFolder)); } @Before public void setUp() throws Exception { timeout = new Timeout("ode", "deploy", 20000, 2000); properties = Paths.get("timeouts.properties"); testAppender = new TestAppender(); LOGGER.addAppender(testAppender); } @After public void tearDown() throws Exception { timeout = null; Files.deleteIfExists(properties); properties = null; LOGGER.removeAllAppenders(); testAppender = null; } @Test public void testWriteToProperties() throws Exception { ArrayList<Timeout> timeouts = new ArrayList<>(); timeouts.add(timeout); Properties.read(properties, timeouts); List<Timeout> readTimeouts = Properties.read(properties, timeouts); for (Timeout actualTimeout : readTimeouts) { assertEquals(timeout.getKey(), actualTimeout.getKey()); assertEquals(timeout.getTimeoutInMs(), actualTimeout.getTimeoutInMs()); assertEquals(timeout.getTimeToRepetitionInMs(), actualTimeout.getTimeToRepetitionInMs()); } } @Test public void testWriteToPropertiesExtendedValues() throws Exception { ArrayList<Timeout> timeouts = new ArrayList<>(); timeouts.add(timeout); Timeout testTimeout = new Timeout("tomcat", "start", 20000, 2000); Properties.write(properties, timeouts); List<Timeout> readTimeouts = Properties.read(properties, timeouts); for (Timeout actualTimeout : readTimeouts) { assertEquals(timeout.getKey(), actualTimeout.getKey()); assertEquals(timeout.getTimeoutInMs(), actualTimeout.getTimeoutInMs()); assertEquals(timeout.getTimeToRepetitionInMs(), actualTimeout.getTimeToRepetitionInMs()); } timeouts.remove(timeout); timeout.setValue(5000); timeout.setTimeToRepetition(500); timeouts.add(testTimeout); Properties.write(properties, timeouts); timeouts.add(timeout); List<Timeout> readNewTimeouts = Properties.read(properties, timeouts); for (Timeout actualTimeout : readNewTimeouts) { if (Objects.equals(actualTimeout.getKey(), timeout.getKey())) { assertEquals(timeout.getKey(), actualTimeout.getKey()); assertEquals(timeout.getTimeoutInMs(), actualTimeout.getTimeoutInMs()); assertEquals(timeout.getTimeToRepetitionInMs(), actualTimeout.getTimeToRepetitionInMs()); } else { assertEquals(testTimeout.getKey(), actualTimeout.getKey()); assertEquals(testTimeout.getTimeoutInMs(), actualTimeout.getTimeoutInMs()); assertEquals(testTimeout.getTimeToRepetitionInMs(), actualTimeout.getTimeToRepetitionInMs()); } } } @Test public void testReadFromProperties() throws Exception { ArrayList<Timeout> timeouts = new ArrayList<>(); timeouts.add(timeout); List<Timeout> readTimeouts = Properties.read(properties, timeouts); for (Timeout actualTimeout : readTimeouts) { assertEquals(timeout.getKey(), actualTimeout.getKey()); assertEquals(timeout.getTimeoutInMs(), actualTimeout.getTimeoutInMs()); assertEquals(timeout.getTimeToRepetitionInMs(), actualTimeout.getTimeToRepetitionInMs()); } } @Test public void testReadFromPropertiesReadable() throws Exception { ArrayList<Timeout> timeouts = new ArrayList<>(); timeouts.add(timeout); properties.toFile().setReadable(false); Properties.read(properties, timeouts); assertEquals("The file " + properties.toString() + " is not readable.", testAppender.messages.get(0)); } @Test public void testReadFromPropertiesTimeoutNumberFormat() throws Exception { ArrayList<Timeout> timeouts = new ArrayList<>(); timeouts.add(timeout); java.util.Properties timeoutProperties = System.getProperties(); FileWriter writer = new FileWriter(properties.toString()); timeoutProperties.setProperty(timeout.getKey() + ".value", "test"); timeoutProperties.setProperty(timeout.getKey() + ".timeToRepetition", "test"); timeoutProperties.store(writer, "Timeout_properties"); writer.close(); Properties.read(properties, timeouts); assertEquals("The timeout with the key " + timeout.getKey() + " was not read from the properties. The timeout have to be an integer.", testAppender.messages.get(0)); assertEquals("The timeToRepetition with the key " + timeout.getKey() + " was not read from the properties. The timeToRepetition have to be an integer.", testAppender.messages.get(1)); } class TestAppender extends AppenderSkeleton { public List<String> messages = new ArrayList<>(); @Override protected void append(LoggingEvent event) { messages.add(event.getMessage().toString()); } @Override public void close() { messages = null; } @Override public boolean requiresLayout() { return false; } } }