package at.gv.egiz.param_tests; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.PrintStream; import java.net.URL; import org.apache.commons.io.output.TeeOutputStream; import org.apache.log4j.PropertyConfigurator; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.runner.Description; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.model.InitializationError; import at.gv.egiz.param_tests.serialization.SerializiationManager; import at.gv.egiz.param_tests.serialization.html.HTMLTestSummaryWriter; /** * Test suite which groups all available parameterized tests in * Suite.SuiteClasses-annotation. * * @author mtappler * */ @RunWith(Suite.class) @Suite.SuiteClasses({ PDFASignatureTest.class, SignaturePositionTest.class }) public class ParameterizedSignatureTestSuite { /** * variable to save the standard output PrintStream after * redirecting it, to be able to reset it afterwards, this should only be * necessary if this class is loaded and run dynamically (not using right * mouse -> Run As -> JUnit Test) */ private static PrintStream stdOutSave; /** * variable to save the standard error PrintStream after * redirecting it */ private static PrintStream stderrSave; /** * stream which logs everything which is written to stdout during test * execution */ private static ByteArrayOutputStream stdoutLog; /** * stream which logs everything which is written to stderr during test * execution */ private static ByteArrayOutputStream stderrLog; /** * the location of the log4j configuration */ private static final URL log4j = ParameterizedSignatureTestSuite.class .getResource("/log4j.properties"); /** * If set to true, logging will be configured, when this class is loaded. * This ensures that logging will be available in tests before logging is * configured by pdf-as. */ private static final boolean CONFIGURE_LOGGING = true; /** * Getter * * @return the byte array output stream which captures stdout */ public static ByteArrayOutputStream getStdoutLog() { // to avoid null NPE, if a test is started without testsuite return stdoutLog != null ? stdoutLog : new ByteArrayOutputStream(); } /** * Getter * * @return the byte array output stream which captures stderr */ public static ByteArrayOutputStream getStderrLog() { // to avoid null NPE return stderrLog != null ? stderrLog : new ByteArrayOutputStream(); } static { String testDir = System.getProperty("test.dir"); System.out.println("Running Tests from: " + testDir); } /** * Sets up the test run by redirecting stdout and stderr such that both are * written to the console and to a byte array output stream and configures * logging if the corresponding flag is set. * * @throws InitializationError * if no test directory is given via the system property * "test.dir" */ @BeforeClass public static void setUpClass() throws InitializationError { stdoutLog = new ByteArrayOutputStream(); TeeOutputStream teeStdOut = new TeeOutputStream(System.out, stdoutLog); stdOutSave = System.out; System.setOut(new PrintStream(teeStdOut)); stderrLog = new ByteArrayOutputStream(); TeeOutputStream teeStdErr = new TeeOutputStream(System.err, stderrLog); stderrSave = System.err; System.setErr(new PrintStream(teeStdErr)); if (CONFIGURE_LOGGING && log4j != null) { try { PropertyConfigurator.configure(new FileInputStream(log4j .getFile())); } catch (FileNotFoundException e) { e.printStackTrace(); } } String testDir = System.getProperty("test.dir"); if (testDir == null) throw new InitializationError("Test directory is not set"); SerializiationManager.getInstance().setTestSummaryWriter( new HTMLTestSummaryWriter(testDir)); } /** * Resets stdout and stderr redirection and serializes all test results. */ @AfterClass public static void tearDownClass() { System.setOut(stdOutSave); System.setErr(stderrSave); SerializiationManager.getInstance().serializeAll(); } }