/** * BSD-style license; for more info see http://pmd.sourceforge.net/license.html */ package net.sourceforge.pmd.cli; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.PrintStream; import org.junit.After; import org.junit.Before; import org.junit.BeforeClass; import net.sourceforge.pmd.PMD; /** * @author Romain Pelisse <belaran@gmail.com> * */ public abstract class BaseCLITest { protected static final String TEST_OUPUT_DIRECTORY = "target/cli-tests/"; // Points toward a folder with not many source files, to avoid actually PMD // and slowing down tests protected static final String SOURCE_FOLDER = "src/test/resources/net/sourceforge/pmd/cli"; protected PrintStream originalOut; protected PrintStream originalErr; /** * @throws java.lang.Exception */ @BeforeClass public static void setUp() throws Exception { System.setProperty(PMDCommandLineInterface.NO_EXIT_AFTER_RUN, "true"); File testOuputDir = new File(TEST_OUPUT_DIRECTORY); if (!testOuputDir.exists()) { assertTrue("failed to create output directory for test:" + testOuputDir.getAbsolutePath(), testOuputDir.mkdirs()); } } @Before public void setup() { originalOut = System.out; originalErr = System.err; } @After public void tearDown() { System.setOut(originalOut); System.setErr(originalErr); } protected void createTestOutputFile(String filename) { try { PrintStream out = new PrintStream(new FileOutputStream(filename)); System.setOut(out); System.setErr(out); } catch (FileNotFoundException e) { fail("Can't create file " + filename + " for test."); } } protected String runTest(String[] args, String testname) { return runTest(args, testname, 0); } protected String runTest(String[] args, String testname, int expectedExitCode) { String filename = TEST_OUPUT_DIRECTORY + testname + ".txt"; long start = System.currentTimeMillis(); createTestOutputFile(filename); System.out.println("Start running test " + testname); runPMDWith(args); checkStatusCode(expectedExitCode); System.out.println("Test finished successfully after " + (System.currentTimeMillis() - start) + "ms."); return filename; } protected void runPMDWith(String[] args) { PMD.main(args); } protected void checkStatusCode(int expectedExitCode) { int statusCode = getStatusCode(); if (statusCode != expectedExitCode) { fail("PMD failed with status code:" + statusCode); } } protected int getStatusCode() { return Integer.parseInt(System.getProperty(PMDCommandLineInterface.STATUS_CODE_PROPERTY)); } }