blob: f04adff383f29647c113795709649bec411222d5 [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.geode.test.golden;
import static org.apache.geode.distributed.ConfigurationProperties.LOG_LEVEL;
import static org.apache.geode.distributed.ConfigurationProperties.MCAST_PORT;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import org.junit.After;
import org.junit.Before;
import org.apache.geode.distributed.internal.DistributionConfig;
import org.apache.geode.test.process.ProcessWrapper;
/**
* Test framework for launching processes and comparing output to expected golden output.
*
* @since GemFire 4.1.1
*/
public abstract class GoldenTestCase {
/** Use to enable debug output in the JUnit process */
protected static final String DEBUG_PROPERTY = "golden.test.DEBUG";
protected static final boolean DEBUG = Boolean.getBoolean(DEBUG_PROPERTY);
private static final String LOG4J_CONFIGURATION_FILE_PROPERTY = "log4j.configurationFile";
private static final String LOG4J_CONFIG_URL_STRING =
GoldenTestCase.class.getResource("log4j2-test.xml").toString();
private static final String[] JVM_ARGS = new String[] {
"-D" + LOG4J_CONFIGURATION_FILE_PROPERTY + "=" + LOG4J_CONFIG_URL_STRING};
private final List<ProcessWrapper> processes = new ArrayList<>();
@Before
public final void setUpGoldenTest() throws Exception {
subSetUp();
}
@After
public final void tearDownGoldenTest() throws Exception {
try {
for (ProcessWrapper process : processes) {
process.destroy();
printProcessOutput(process, true);
}
} finally {
processes.clear();
}
subTearDown();
}
/**
* Override this for additional set up.
*
*/
public void subSetUp() throws Exception {
// override me
}
/**
* Override this for additional tear down after destroying all processes and printing output.
*
*/
public void subTearDown() throws Exception {
// override me
}
protected final ProcessWrapper createProcessWrapper(
final ProcessWrapper.Builder processWrapperBuilder, final Class<?> main) {
final ProcessWrapper processWrapper =
processWrapperBuilder.jvmArguments(JVM_ARGS).mainClass(main).build();
processes.add(processWrapper);
return processWrapper;
}
/**
* Creates and returns a new GoldenComparator instance. Default implementation is
* RegexGoldenComparator. Override if you need a different implementation such as
* StringGoldenComparator.
*/
protected GoldenComparator createGoldenComparator() {
return new RegexGoldenComparator(expectedProblemLines());
}
/**
* Returns an array of expected problem strings. Without overriding this, any line with warning,
* error or severe will cause the test to fail. By default, null is returned.
*
* (see PartitionedRegionTest which expects a WARNING log message)
*/
protected String[] expectedProblemLines() {
return null;
}
protected void assertOutputMatchesGoldenFile(final String actualOutput,
final String goldenFileName) throws IOException {
GoldenComparator comparator = createGoldenComparator();
comparator.assertOutputMatchesGoldenFile(actualOutput, goldenFileName);
}
protected final void assertOutputMatchesGoldenFile(final ProcessWrapper process,
final String goldenFileName) throws IOException {
GoldenComparator comparator = createGoldenComparator();
comparator.assertOutputMatchesGoldenFile(process.getOutput(), goldenFileName);
}
protected final Properties createProperties() {
Properties properties = new Properties();
properties.setProperty(DistributionConfig.GEMFIRE_PREFIX + MCAST_PORT, "0");
properties.setProperty(DistributionConfig.GEMFIRE_PREFIX + LOG_LEVEL, "warning");
properties.setProperty("file.encoding", "UTF-8");
return editProperties(properties);
}
/**
* Override this to modify the properties that were created by createProperties().
*/
protected Properties editProperties(final Properties properties) {
return properties;
}
protected final void outputLine(final String string) {
System.out.println(string);
}
protected final void printProcessOutput(final ProcessWrapper process,
final boolean ignoreStopped) {
debug(process.getOutput(ignoreStopped), "OUTPUT");
}
protected static void debug(final String output, final String title) {
debug("------------------ BEGIN " + title + " ------------------");
debug(output);
debug("------------------- END " + title + " -------------------");
}
protected static void debug(final String string) {
if (DEBUG) {
System.out.println(string);
}
}
}