package com.lazerycode.jmeter.properties;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.spi.LoggingEvent;
import ch.qos.logback.core.Appender;
import com.lazerycode.jmeter.exceptions.IOException;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.artifact.DefaultArtifact;
import org.junit.Test;
import org.mockito.ArgumentMatcher;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileInputStream;
import java.net.URL;
import java.util.HashMap;
import java.util.Properties;
import static com.lazerycode.jmeter.properties.ConfigurationFiles.GLOBAL_PROPERTIES;
import static com.lazerycode.jmeter.properties.ConfigurationFiles.JMETER_PROPERTIES;
import static org.hamcrest.core.Is.is;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.assertThat;
import static org.mockito.Matchers.argThat;
import static org.mockito.Mockito.*;
import static org.slf4j.Logger.ROOT_LOGGER_NAME;
public class PropertiesFileTest {
private final URL sourcePropertiesFile = this.getClass().getResource("/testSource.properties");
private final URL additionsPropertiesFile = this.getClass().getResource("/testAdditions.properties");
private final URL emptyPropertiesFile = this.getClass().getResource("/empty.properties");
private final URL fakeJAR = this.getClass().getResource("/fakejar.jar");
private final File invalidPropertiesFile = new File("/invalid/directory/foo/bar");
private static final boolean REPLACE_ALL_PROPERTIES = true;
private static final boolean MERGE_PROPERTIES = false;
@Test(expected = IOException.class)
public void invalidPropertiesFileThrowsIOException() throws Exception {
new PropertiesFile(invalidPropertiesFile);
}
@Test
public void canCreateAValidPropertiesFilesObject() throws Exception {
PropertiesFile propertiesFile = new PropertiesFile(new File(sourcePropertiesFile.toURI()));
Properties initialProperties = propertiesFile.getProperties();
assertThat(initialProperties.getProperty("log_level.jmeter"), is(equalTo("INFO")));
assertThat(initialProperties.getProperty("log_level.jmeter.junit"), is(equalTo("DEBUG")));
assertThat(initialProperties.size(), is(equalTo(2)));
}
@Test
public void emptyPropertiesObjectIsCreatedIfArtifactDoesNotExist() throws Exception {
PropertiesFile propertiesFile = new PropertiesFile(null, JMETER_PROPERTIES);
Properties initialProperties = propertiesFile.getProperties();
assertThat(initialProperties.size(), is(equalTo(0)));
}
@Test(expected = IOException.class)
public void ifTheArtifactIsInvalidAnIOExceptionWillBeThrown() throws Exception {
Artifact artifact = new DefaultArtifact("g.i.d:a.i.d:1.0-SNAPSHOT").setFile(invalidPropertiesFile);
PropertiesFile propertiesFile = new PropertiesFile(artifact, JMETER_PROPERTIES);
Properties initialProperties = propertiesFile.getProperties();
assertThat(initialProperties.size(), is(equalTo(0)));
}
@Test
public void emptyPropertiesObjectIsCreatedIfFileShouldNotBeCreatedIfItDoesNotExist() throws Exception {
Artifact artifact = new DefaultArtifact("g.i.d:a.i.d:1.0-SNAPSHOT").setFile(invalidPropertiesFile);
PropertiesFile propertiesFile = new PropertiesFile(artifact, GLOBAL_PROPERTIES);
Properties initialProperties = propertiesFile.getProperties();
assertThat(initialProperties.size(), is(equalTo(0)));
}
@Test
public void createAPropertiesFileObjectUsingAnArtifact() throws Exception {
Artifact jarFile = new DefaultArtifact("g.i.d:a.i.d:1.0-SNAPSHOT").setFile(new File(fakeJAR.getFile()));
PropertiesFile propertiesFile = new PropertiesFile(jarFile, JMETER_PROPERTIES);
Properties initialProperties = propertiesFile.getProperties();
assertThat(initialProperties.size(), is(equalTo(73)));
}
@Test
public void mergeValidPropertiesFromAListWithEmptyValuesTest() throws Exception {
HashMap<String, String> customProperties = new HashMap<>();
customProperties.put("log_level.jmeter.control", null);
customProperties.put("log_level.jmeter", "");
customProperties.put("log_level.jmeter.junit", " ");
PropertiesFile propertiesFile = new PropertiesFile(new File(sourcePropertiesFile.toURI()));
propertiesFile.addAndOverwriteProperties(customProperties);
Properties modifiedProperties = propertiesFile.getProperties();
assertThat(modifiedProperties.getProperty("log_level.jmeter"), is(equalTo("INFO")));
assertThat(modifiedProperties.getProperty("log_level.jmeter.junit"), is(equalTo("DEBUG")));
assertThat(modifiedProperties.size(), is(equalTo(2)));
}
@Test
public void mergeValidPropertiesFromListTest() throws Exception {
HashMap<String, String> customProperties = new HashMap<>();
customProperties.put("log_level.jmeter.control", "INFO");
customProperties.put("log_level.jmeter", "DEBUG");
PropertiesFile propertiesFile = new PropertiesFile(new File(sourcePropertiesFile.toURI()));
propertiesFile.addAndOverwriteProperties(customProperties);
Properties modifiedProperties = propertiesFile.getProperties();
assertThat(modifiedProperties.getProperty("log_level.jmeter"), is(equalTo("DEBUG")));
assertThat(modifiedProperties.getProperty("log_level.jmeter.control"), is(equalTo("INFO")));
assertThat(modifiedProperties.getProperty("log_level.jmeter.junit"), is(equalTo("DEBUG")));
assertThat(modifiedProperties.size(), is(equalTo(3)));
}
@Test
public void mergeValidPropertiesFromFileTest() throws Exception {
HashMap<String, String> customProperties = new HashMap<String, String>();
customProperties.put("log_level.jmeter.control", "INFO");
customProperties.put("log_level.jmeter", "DEBUG");
PropertiesFile propertiesFile = new PropertiesFile(new File(sourcePropertiesFile.toURI()));
propertiesFile.loadProvidedPropertiesIfAvailable(new File(additionsPropertiesFile.getFile()), MERGE_PROPERTIES);
Properties modifiedProperties = propertiesFile.getProperties();
assertThat(modifiedProperties.getProperty("log_level.jmeter"), is(equalTo("INFO")));
assertThat(modifiedProperties.getProperty("log_level.jmeter.junit"), is(equalTo("INFO")));
assertThat(modifiedProperties.getProperty("log_level.jmeter.control"), is(equalTo("DEBUG")));
assertThat(modifiedProperties.getProperty("log_level.jmeter.testbeans"), is(equalTo("DEBUG")));
assertThat(modifiedProperties.size(), is(equalTo(4)));
}
@Test
public void replaceValidPropertiesFromFileTest() throws Exception {
HashMap<String, String> customProperties = new HashMap<String, String>();
customProperties.put("log_level.jmeter.control", "INFO");
customProperties.put("log_level.jmeter", "DEBUG");
PropertiesFile propertiesFile = new PropertiesFile(new File(sourcePropertiesFile.toURI()));
propertiesFile.loadProvidedPropertiesIfAvailable(new File(additionsPropertiesFile.getFile()), REPLACE_ALL_PROPERTIES);
Properties modifiedProperties = propertiesFile.getProperties();
assertThat(modifiedProperties.getProperty("log_level.jmeter.junit"), is(equalTo("INFO")));
assertThat(modifiedProperties.getProperty("log_level.jmeter.control"), is(equalTo("DEBUG")));
assertThat(modifiedProperties.getProperty("log_level.jmeter.testbeans"), is(equalTo("DEBUG")));
assertThat(modifiedProperties.size(), is(equalTo(3)));
}
@Test
public void fileIgnoredIfItIsNotAvailableTest() throws Exception {
HashMap<String, String> customProperties = new HashMap<String, String>();
customProperties.put("log_level.jmeter.control", "INFO");
customProperties.put("log_level.jmeter", "DEBUG");
PropertiesFile propertiesFile = new PropertiesFile(new File(sourcePropertiesFile.toURI()));
propertiesFile.loadProvidedPropertiesIfAvailable(invalidPropertiesFile, MERGE_PROPERTIES);
Properties modifiedProperties = propertiesFile.getProperties();
assertThat(modifiedProperties.getProperty("log_level.jmeter"), is(equalTo("INFO")));
assertThat(modifiedProperties.getProperty("log_level.jmeter.junit"), is(equalTo("DEBUG")));
assertThat(modifiedProperties.size(), is(equalTo(2)));
}
@Test(expected = IOException.class)
public void tryingToWriteToAnInvalidFileThrowsAnIOException() throws Exception {
PropertiesFile propertiesFile = new PropertiesFile(new File(sourcePropertiesFile.toURI()));
propertiesFile.writePropertiesToFile(invalidPropertiesFile);
}
@Test
public void canWritePropertiesToAFile() throws Exception {
File writtenProperties = File.createTempFile("output", ".properties");
writtenProperties.deleteOnExit();
PropertiesFile propertiesFile = new PropertiesFile(new File(sourcePropertiesFile.toURI()));
propertiesFile.writePropertiesToFile(writtenProperties);
Properties readWrittenProperties = new Properties();
try (FileInputStream writtenPropertiesInputStream = new FileInputStream(writtenProperties)) {
readWrittenProperties.load(writtenPropertiesInputStream);
}
assertThat(readWrittenProperties.getProperty("log_level.jmeter"), is(equalTo("INFO")));
assertThat(readWrittenProperties.getProperty("log_level.jmeter.junit"), is(equalTo("DEBUG")));
assertThat(readWrittenProperties.size(), is(equalTo(2)));
}
@Test
public void nothingWrittenToFileIfThereAreNoProperties() throws Exception {
PropertiesFile propertiesFile = new PropertiesFile(new File(emptyPropertiesFile.toURI()));
assertThat(propertiesFile.getProperties().size(), is(equalTo(0)));
propertiesFile.writePropertiesToFile(invalidPropertiesFile);
assertThat(invalidPropertiesFile.exists(), is(equalTo(false)));
}
@Test
public void reservedPropertiesAreStrippedOutBeforeWritingFile() throws Exception {
HashMap<String, String> reservedProperties = new HashMap<>();
reservedProperties.put("java.class.path", "/foo/bar");
reservedProperties.put("user.dir", "/bar/foo");
reservedProperties.put("jmeterengine.remote.system.exit", "true");
reservedProperties.put("jmeterengine.stopfail.system.exit", "true");
File writtenProperties = File.createTempFile("output", ".properties");
writtenProperties.deleteOnExit();
PropertiesFile propertiesFile = new PropertiesFile(new File(sourcePropertiesFile.toURI()));
propertiesFile.addAndOverwriteProperties(reservedProperties);
assertThat(propertiesFile.getProperties().size(), is(equalTo(6)));
propertiesFile.writePropertiesToFile(writtenProperties);
Properties readWrittenProperties = new Properties();
try (FileInputStream writtenPropertiesInputStream = new FileInputStream(writtenProperties)) {
readWrittenProperties.load(writtenPropertiesInputStream);
}
assertThat(readWrittenProperties.getProperty("log_level.jmeter"), is(equalTo("INFO")));
assertThat(readWrittenProperties.getProperty("log_level.jmeter.junit"), is(equalTo("DEBUG")));
assertThat(readWrittenProperties.size(), is(equalTo(2)));
}
@Test
public void nothingWrittenToFileIfAllPropertiesAreReserved() throws Exception {
HashMap<String, String> reservedProperties = new HashMap<>();
reservedProperties.put("java.class.path", "/foo/bar");
reservedProperties.put("user.dir", "/bar/foo");
reservedProperties.put("jmeterengine.remote.system.exit", "true");
reservedProperties.put("jmeterengine.stopfail.system.exit", "true");
PropertiesFile propertiesFile = new PropertiesFile(new File(emptyPropertiesFile.toURI()));
propertiesFile.addAndOverwriteProperties(reservedProperties);
assertThat(propertiesFile.getProperties().size(), is(equalTo(4)));
propertiesFile.writePropertiesToFile(invalidPropertiesFile);
assertThat(propertiesFile.getProperties().size(), is(equalTo(0)));
assertThat(invalidPropertiesFile.exists(), is(equalTo(false)));
}
@Test
public void usersAreWarnedOfPotentialPropertyNameErrors() throws Exception {
final String EXPECTED_LOG_ENTRY = "You have set a property called 'log_level.JMETER' which is very similar to 'log_level.jmeter'!";
Logger root = (Logger) LoggerFactory.getLogger(ROOT_LOGGER_NAME);
final Appender mockAppender = mock(Appender.class);
when(mockAppender.getName()).thenReturn("MOCK");
root.addAppender(mockAppender);
HashMap<String, String> customProperties = new HashMap<>();
customProperties.put("log_level.JMETER", "DEBUG");
PropertiesFile propertiesFile = new PropertiesFile(new File(sourcePropertiesFile.toURI()));
propertiesFile.addAndOverwriteProperties(customProperties);
verify(mockAppender).doAppend(argThat(new ArgumentMatcher() {
@Override
public boolean matches(final Object argument) {
return ((LoggingEvent) argument).getFormattedMessage().equals(EXPECTED_LOG_ENTRY);
}
}));
Properties modifiedProperties = propertiesFile.getProperties();
assertThat(modifiedProperties.getProperty("log_level.jmeter"), is(equalTo("INFO")));
assertThat(modifiedProperties.getProperty("log_level.jmeter.junit"), is(equalTo("DEBUG")));
assertThat(modifiedProperties.getProperty("log_level.JMETER"), is(equalTo("DEBUG")));
assertThat(modifiedProperties.size(), is(equalTo(3)));
}
}