/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.pmd; import com.liferay.portal.kernel.test.CaptureHandler; import com.liferay.portal.kernel.test.JDKLoggerTestUtil; import com.liferay.portal.kernel.test.ci.AutoBalanceTestCase; import com.liferay.portal.kernel.util.GetterUtil; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; import java.util.Properties; import java.util.logging.Level; import java.util.logging.LogRecord; import net.sourceforge.pmd.ant.Formatter; import net.sourceforge.pmd.ant.PMDTask; import net.sourceforge.pmd.ant.SourceLanguage; import net.sourceforge.pmd.lang.java.typeresolution.ClassTypeResolver; import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.Project; import org.apache.tools.ant.types.FileSet; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; /** * @author Shuyang Zhou */ public class PMDTest extends AutoBalanceTestCase { @Before public void setUp() throws IOException { try (FileReader fileReader = new FileReader( new File(_PROJECT_DIR, "/tools/sdk/build.properties"))) { _buildProperties.load(fileReader); } try (FileReader fileReader = new FileReader( new File(_PROJECT_DIR, "build.properties"))) { _buildProperties.load(fileReader); } _pmdTask.setProject(new Project()); _pmdTask.setShortFilenames(true); _pmdTask.setThreads( GetterUtil.get(_buildProperties.getProperty("pmd.threads"), 2)); FileSet fileSet = new FileSet(); fileSet.setDir(new File(_PROJECT_DIR)); fileSet.setIncludes(_buildProperties.getProperty("pmd.java.includes")); fileSet.setExcludes(_buildProperties.getProperty("pmd.java.excludes")); if (isCIMode()) { DirectoryScanner directoryScanner = fileSet.getDirectoryScanner( _pmdTask.getProject()); String[] slicedIncludedFiles = slice( directoryScanner.getIncludedFiles()); fileSet = new FileSet(); fileSet.setDir(new File(_PROJECT_DIR)); fileSet.setIncludes( StringUtil.merge(slicedIncludedFiles, StringPool.COMMA)); } _pmdTask.addFileset(fileSet); Formatter formatter = new Formatter(); _logFilePath = Files.createTempFile(null, null); formatter.setToFile(_logFilePath.toFile()); formatter.setType("text"); _pmdTask.addFormatter(formatter); _pmdTask.setRuleSetFiles( StringUtil.replace( _buildProperties.getProperty("pmd.java.ruleset"), "${sdk.dir}", _PROJECT_DIR + "/tools/sdk")); } @After public void tearDown() throws IOException { Files.delete(_logFilePath); } @Test public void testPMDJava() throws IOException { SourceLanguage sourceLanguage = new SourceLanguage(); sourceLanguage.setName("java"); sourceLanguage.setVersion( _buildProperties.getProperty("ant.build.javac.source")); _pmdTask.addConfiguredSourceLanguage(sourceLanguage); CaptureHandler captureHandler = JDKLoggerTestUtil.configureJDKLogger( ClassTypeResolver.class.getName(), Level.SEVERE); try { _pmdTask.execute(); List<LogRecord> logRecords = captureHandler.getLogRecords(); if (!logRecords.isEmpty()) { AssertionError assertionError = new AssertionError( "PMD Java log error"); for (LogRecord logRecord : logRecords) { assertionError.addSuppressed( new Throwable( logRecord.getMessage(), logRecord.getThrown())); } throw assertionError; } List<String> list = Files.readAllLines( _logFilePath, Charset.defaultCharset()); Assert.assertTrue(list.toString(), list.isEmpty()); } finally { captureHandler.close(); } } private static final String _PROJECT_DIR = "../../../"; private final Properties _buildProperties = new Properties(); private Path _logFilePath; private final PMDTask _pmdTask = new PMDTask(); }