/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.it;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import org.apache.commons.io.FileUtils;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import net.sourceforge.pmd.PMD;
public class BinaryDistributionIT {
private static File getBinaryDistribution() {
return new File(".", "target/pmd-bin-" + PMD.VERSION + ".zip");
}
/**
* The temporary directory, to which the binary distribution will be extracted.
* It will be deleted again after the test.
*/
private static Path tempDir;
@BeforeClass
public static void setupTempDirectory() throws Exception {
tempDir = Files.createTempDirectory("pmd-it-test-");
if (getBinaryDistribution().exists()) {
ZipFileExtractor.extractZipFile(getBinaryDistribution().toPath(), tempDir);
}
}
@AfterClass
public static void cleanupTempDirectory() throws IOException {
if (tempDir != null && tempDir.toFile().exists()) {
FileUtils.forceDelete(tempDir.toFile());
}
}
@Test
public void testFileExistence() {
assertTrue(getBinaryDistribution().exists());
}
private Set<String> getExpectedFileNames() {
Set<String> result = new HashSet<>();
String basedir = "pmd-bin-" + PMD.VERSION + "/";
result.add(basedir);
result.add(basedir + "bin/run.sh");
result.add(basedir + "bin/pmd.bat");
result.add(basedir + "bin/cpd.bat");
result.add(basedir + "lib/pmd-core-" + PMD.VERSION + ".jar");
result.add(basedir + "lib/pmd-java-" + PMD.VERSION + ".jar");
return result;
}
@Test
public void testZipFileContent() throws IOException {
Set<String> expectedFileNames = getExpectedFileNames();
ZipFile zip = new ZipFile(getBinaryDistribution());
Enumeration<? extends ZipEntry> entries = zip.entries();
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
expectedFileNames.remove(entry.getName());
}
zip.close();
assertTrue(expectedFileNames.isEmpty());
}
@Test
public void runPMD() throws Exception {
String srcDir = new File(".", "src/test/resources/sample-source/").getAbsolutePath();
ExecutionResult result;
result = PMDExecutor.runPMD(tempDir, "-h");
result.assertExecutionResult(1, "apex, ecmascript, java, jsp, plsql, pom, vf, vm, wsdl, xml, xsl");
result = PMDExecutor.runPMDRules(tempDir, srcDir, "java-basic");
result.assertExecutionResult(4, "JumbledIncrementer.java:8:");
result = PMDExecutor.runPMDRules(tempDir, srcDir, "java-design");
result.assertExecutionResult(0, "");
}
@Test
public void runCPD() throws Exception {
String srcDir = new File(".", "src/test/resources/sample-source-cpd/").getAbsolutePath();
ExecutionResult result;
result = CpdExecutor.runCpd(tempDir, "-h");
result.assertExecutionResult(1, "Supported languages: [apex, cpp, cs, ecmascript, fortran, go, groovy, java, jsp, matlab, objectivec, perl, php, plsql, python, ruby, scala, swift, vf]");
result = CpdExecutor.runCpd(tempDir, "--minimum-tokens", "10", "--format", "text", "--files", srcDir);
result.assertExecutionResult(4, "Found a 10 line (55 tokens) duplication in the following files:");
result.assertExecutionResult(4, "Class1.java");
result.assertExecutionResult(4, "Class2.java");
result = CpdExecutor.runCpd(tempDir, "--minimum-tokens", "1000", "--format", "text", "--files", srcDir);
result.assertExecutionResult(0, "");
}
}