diff --git a/config/pmd-main.xml b/config/pmd-main.xml index 70929fd85a6..7c05c751847 100644 --- a/config/pmd-main.xml +++ b/config/pmd-main.xml @@ -19,4 +19,11 @@ | //MethodDeclaration[@Name='getHashCodeBasedOnObjectContent' and ../../..[@Image='PropertyCacheFile']]"/> + + + + + + + diff --git a/config/suppressions.xml b/config/suppressions.xml index 965bd0609b9..50f22baf739 100644 --- a/config/suppressions.xml +++ b/config/suppressions.xml @@ -49,6 +49,7 @@ + diff --git a/pom.xml b/pom.xml index 6daece9a615..0dee3d56c68 100644 --- a/pom.xml +++ b/pom.xml @@ -2091,23 +2091,6 @@ com.puppycrawl.tools.checkstyle.MainTest - - - main - - createListener - - - - com.google.common.io.Closeables - - com.puppycrawl.tools.checkstyle.utils.CommonUtils - - com.puppycrawl.tools.checkstyle.api.RootModule - - org.apache.commons.logging - java.util.logging - 100 ${pitest.plugin.timeout.factor} ${pitest.plugin.timeout.constant} diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/Main.java b/src/main/java/com/puppycrawl/tools/checkstyle/Main.java index 51988066d28..df2e0d2b792 100644 --- a/src/main/java/com/puppycrawl/tools/checkstyle/Main.java +++ b/src/main/java/com/puppycrawl/tools/checkstyle/Main.java @@ -226,11 +226,14 @@ public static void main(String... args) throws IOException { } finally { // return exit code base on validation of Checker - if (errorCounter != 0 && !cliViolations) { - final LocalizedMessage errorCounterMessage = new LocalizedMessage(0, - Definitions.CHECKSTYLE_BUNDLE, ERROR_COUNTER, - new String[] {String.valueOf(errorCounter)}, null, Main.class, null); - System.out.println(errorCounterMessage.getMessage()); + // two ifs exist till https://github.com/hcoles/pitest/issues/377 + if (errorCounter != 0) { + if (!cliViolations) { + final LocalizedMessage errorCounterMessage = new LocalizedMessage(0, + Definitions.CHECKSTYLE_BUNDLE, ERROR_COUNTER, + new String[] {String.valueOf(errorCounter)}, null, Main.class, null); + System.out.println(errorCounterMessage.getMessage()); + } } if (exitStatus != 0) { System.exit(exitStatus); diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/AstTreeStringPrinterTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/AstTreeStringPrinterTest.java index 90dba9a0fce..91846463fb0 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/AstTreeStringPrinterTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/AstTreeStringPrinterTest.java @@ -42,7 +42,7 @@ protected String getPackageLocation() { @Test public void testIsProperUtilsClass() throws ReflectiveOperationException { - assertUtilsClassHasPrivateConstructor(AstTreeStringPrinter.class); + assertUtilsClassHasPrivateConstructor(AstTreeStringPrinter.class, true); } @Test diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/DefinitionsTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/DefinitionsTest.java index 5235e7a25eb..995f1b07514 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/DefinitionsTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/DefinitionsTest.java @@ -26,6 +26,6 @@ public class DefinitionsTest { @Test public void testIsProperUtilsClass() throws ReflectiveOperationException { - assertUtilsClassHasPrivateConstructor(Definitions.class); + assertUtilsClassHasPrivateConstructor(Definitions.class, true); } } diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/DetailNodeTreeStringPrinterTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/DetailNodeTreeStringPrinterTest.java index ec74142dc62..c2879c7d95d 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/DetailNodeTreeStringPrinterTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/DetailNodeTreeStringPrinterTest.java @@ -45,7 +45,7 @@ private static String getPath(String filename) { @Test public void testIsProperUtilsClass() throws ReflectiveOperationException { - assertUtilsClassHasPrivateConstructor(DetailNodeTreeStringPrinter.class); + assertUtilsClassHasPrivateConstructor(DetailNodeTreeStringPrinter.class, true); } @Test diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/MainTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/MainTest.java index b08e787aa05..9d9c99fc7a8 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/MainTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/MainTest.java @@ -25,11 +25,18 @@ import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.times; +import static org.powermock.api.mockito.PowerMockito.doNothing; import static org.powermock.api.mockito.PowerMockito.mock; +import static org.powermock.api.mockito.PowerMockito.mockStatic; +import static org.powermock.api.mockito.PowerMockito.verifyStatic; import static org.powermock.api.mockito.PowerMockito.when; import java.io.File; import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.nio.charset.StandardCharsets; @@ -52,11 +59,18 @@ import org.junit.contrib.java.lang.system.SystemErrRule; import org.junit.contrib.java.lang.system.SystemOutRule; import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import com.google.common.io.Closeables; import com.puppycrawl.tools.checkstyle.api.CheckstyleException; import com.puppycrawl.tools.checkstyle.api.Configuration; import com.puppycrawl.tools.checkstyle.api.LocalizedMessage; +import com.puppycrawl.tools.checkstyle.utils.CommonUtils; +@RunWith(PowerMockRunner.class) +@PrepareForTest({Main.class, CommonUtils.class, Closeables.class}) public class MainTest { private static final String USAGE = String.format(Locale.ROOT, "usage: java com.puppycrawl.tools.checkstyle.Main [options] -c " @@ -148,7 +162,7 @@ public void setUp() { @Test public void testIsProperUtilsClass() throws ReflectiveOperationException { - assertUtilsClassHasPrivateConstructor(Main.class); + assertUtilsClassHasPrivateConstructor(Main.class, false); } @Test @@ -387,8 +401,11 @@ public void testCreateNonExistingOutputFile() throws Exception { } @Test - public void testExistingTargetFilePlainOutputProperties() - throws Exception { + public void testExistingTargetFilePlainOutputProperties() throws Exception { + mockStatic(Closeables.class); + doNothing().when(Closeables.class); + Closeables.closeQuietly(any(InputStream.class)); + //exit.expectSystemExitWithStatus(0); exit.checkAssertionAfterwards(() -> { assertEquals(auditStartMessage.getMessage() + EOL @@ -398,6 +415,9 @@ public void testExistingTargetFilePlainOutputProperties() Main.main("-c", getPath("InputMainConfig-classname-prop.xml"), "-p", getPath("InputMainMycheckstyle.properties"), getPath("InputMain.java")); + + verifyStatic(times(2)); + Closeables.closeQuietly(any(InputStream.class)); } @Test @@ -511,6 +531,10 @@ public void testCreateListenerIllegalStateException() throws Exception { @Test public void testCreateListenerWithLocationIllegalStateException() throws Exception { + mockStatic(CommonUtils.class); + doNothing().when(CommonUtils.class); + CommonUtils.close(any(OutputStream.class)); + final Method method = Main.class.getDeclaredMethod("createListener", String.class, String.class); method.setAccessible(true); @@ -530,6 +554,9 @@ public void testCreateListenerWithLocationIllegalStateException() throws Excepti // method creates output folder FileUtils.deleteQuietly(new File(outDir)); } + + verifyStatic(times(1)); + CommonUtils.close(any(OutputStream.class)); } @Test @@ -840,6 +867,7 @@ public void testCustomRootModule() throws Exception { }); Main.main("-c", getPath("InputMainConfig-custom-root-module.xml"), getPath("InputMain.java")); + assertTrue(TestRootModuleChecker.isDestroyed()); } @Test diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/api/AbstractLoaderTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/api/AbstractLoaderTest.java index da97c42f9d7..5dc96982785 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/api/AbstractLoaderTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/api/AbstractLoaderTest.java @@ -51,7 +51,7 @@ public void testParserConfiguratedSuccefully() throws Exception { @Test public void testIsProperUtilsClass() throws ReflectiveOperationException { assertUtilsClassHasPrivateConstructor( - AbstractLoader.FeaturesForVerySecureJavaInstallations.class); + AbstractLoader.FeaturesForVerySecureJavaInstallations.class, true); } private static final class DummyLoader extends AbstractLoader { diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/api/JavadocTokenTypesTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/api/JavadocTokenTypesTest.java index 45c635458d4..190565cf4bc 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/api/JavadocTokenTypesTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/api/JavadocTokenTypesTest.java @@ -26,6 +26,6 @@ public class JavadocTokenTypesTest { @Test public void testIsProperUtilsClass() throws ReflectiveOperationException { - assertUtilsClassHasPrivateConstructor(JavadocTokenTypes.class); + assertUtilsClassHasPrivateConstructor(JavadocTokenTypes.class, true); } } diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/api/TokenTypesTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/api/TokenTypesTest.java index e4979f108da..051aea24115 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/api/TokenTypesTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/api/TokenTypesTest.java @@ -36,6 +36,6 @@ public void testGetShortDescription() { @Test public void testIsProperUtilsClass() throws ReflectiveOperationException { - assertUtilsClassHasPrivateConstructor(TokenTypes.class); + assertUtilsClassHasPrivateConstructor(TokenTypes.class, true); } } diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/AbstractJavadocCheckTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/AbstractJavadocCheckTest.java index 00b66d7dc40..9bc909954e9 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/AbstractJavadocCheckTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/AbstractJavadocCheckTest.java @@ -168,7 +168,7 @@ public void testPositionOnlyComments() @Test public void testBlockCommentPositionHasPrivateConstr() throws Exception { - TestUtils.assertUtilsClassHasPrivateConstructor(BlockCommentPosition.class); + TestUtils.assertUtilsClassHasPrivateConstructor(BlockCommentPosition.class, true); } @Test diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/utils/BlockTagUtilsTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/utils/BlockTagUtilsTest.java index 7e85c8641db..9a8185fe5ee 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/utils/BlockTagUtilsTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/utils/BlockTagUtilsTest.java @@ -34,7 +34,7 @@ public class BlockTagUtilsTest { @Test public void testHasPrivateConstructor() throws Exception { - TestUtils.assertUtilsClassHasPrivateConstructor(BlockTagUtils.class); + TestUtils.assertUtilsClassHasPrivateConstructor(BlockTagUtils.class, true); } @Test diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/utils/InlineTagUtilsTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/utils/InlineTagUtilsTest.java index 14b9d00d9a0..224fdb04e5d 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/utils/InlineTagUtilsTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/checks/javadoc/utils/InlineTagUtilsTest.java @@ -36,7 +36,7 @@ public class InlineTagUtilsTest { @Test public void testHasPrivateConstructor() throws Exception { - TestUtils.assertUtilsClassHasPrivateConstructor(InlineTagUtils.class); + TestUtils.assertUtilsClassHasPrivateConstructor(InlineTagUtils.class, true); } @Test diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/doclets/TokenTypesDocletTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/doclets/TokenTypesDocletTest.java index 9bed1b975c6..5b07c4d5412 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/doclets/TokenTypesDocletTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/doclets/TokenTypesDocletTest.java @@ -51,7 +51,7 @@ private static String getPath(String filename) { @Test public void testIsProperUtilsClass() throws ReflectiveOperationException { - assertUtilsClassHasPrivateConstructor(TokenTypesDoclet.class); + assertUtilsClassHasPrivateConstructor(TokenTypesDoclet.class, true); } @Test diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/internal/TestUtils.java b/src/test/java/com/puppycrawl/tools/checkstyle/internal/TestUtils.java index 11f6e35b05c..57e5a2b4281 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/internal/TestUtils.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/internal/TestUtils.java @@ -47,10 +47,11 @@ private TestUtils() { /** * Verifies that utils class has private constructor and invokes it to satisfy code coverage. */ - public static void assertUtilsClassHasPrivateConstructor(final Class utilClass) + public static void assertUtilsClassHasPrivateConstructor(final Class utilClass, + boolean checkConstructorIsPrivate) throws ReflectiveOperationException { final Constructor constructor = utilClass.getDeclaredConstructor(); - if (!Modifier.isPrivate(constructor.getModifiers())) { + if (checkConstructorIsPrivate && !Modifier.isPrivate(constructor.getModifiers())) { Assert.fail("Constructor is not private"); } constructor.setAccessible(true); diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/utils/AnnotationUtilityTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/utils/AnnotationUtilityTest.java index a1703a0f1b2..1879c567342 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/utils/AnnotationUtilityTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/utils/AnnotationUtilityTest.java @@ -36,7 +36,7 @@ public class AnnotationUtilityTest { @Test public void testIsProperUtilsClass() throws ReflectiveOperationException { try { - assertUtilsClassHasPrivateConstructor(AnnotationUtility.class); + assertUtilsClassHasPrivateConstructor(AnnotationUtility.class, true); } catch (InvocationTargetException ex) { assertEquals("do not instantiate.", ex.getCause().getMessage()); diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/utils/CheckUtilsTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/utils/CheckUtilsTest.java index 69a78be1943..c82ed7848bc 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/utils/CheckUtilsTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/utils/CheckUtilsTest.java @@ -44,7 +44,7 @@ public class CheckUtilsTest { @Test public void testIsProperUtilsClass() throws ReflectiveOperationException { - assertUtilsClassHasPrivateConstructor(CheckUtils.class); + assertUtilsClassHasPrivateConstructor(CheckUtils.class, true); } @Test diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/utils/CommonUtilsTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/utils/CommonUtilsTest.java index e5919dcad17..674544011e6 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/utils/CommonUtilsTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/utils/CommonUtilsTest.java @@ -54,7 +54,7 @@ public class CommonUtilsTest { @Test public void testIsProperUtilsClass() throws ReflectiveOperationException { - assertUtilsClassHasPrivateConstructor(CommonUtils.class); + assertUtilsClassHasPrivateConstructor(CommonUtils.class, true); } /** diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/utils/JavadocUtilsTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/utils/JavadocUtilsTest.java index 18af252237f..fb98a0986e4 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/utils/JavadocUtilsTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/utils/JavadocUtilsTest.java @@ -217,7 +217,7 @@ public void testEmptyJavadocCommentAst() { @Test public void testIsProperUtilsClass() throws ReflectiveOperationException { - assertUtilsClassHasPrivateConstructor(JavadocUtils.class); + assertUtilsClassHasPrivateConstructor(JavadocUtils.class, true); } @Test diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/utils/ModuleReflectionUtilsTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/utils/ModuleReflectionUtilsTest.java index c8bd363c6f4..bc2ce91bb7a 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/utils/ModuleReflectionUtilsTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/utils/ModuleReflectionUtilsTest.java @@ -43,7 +43,7 @@ public class ModuleReflectionUtilsTest { @Test public void testIsProperUtilsClass() throws ReflectiveOperationException { - assertUtilsClassHasPrivateConstructor(ModuleReflectionUtils.class); + assertUtilsClassHasPrivateConstructor(ModuleReflectionUtils.class, true); } @Test diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/utils/ScopeUtilsTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/utils/ScopeUtilsTest.java index 724e9849b93..dc5490ef97c 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/utils/ScopeUtilsTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/utils/ScopeUtilsTest.java @@ -34,7 +34,7 @@ public class ScopeUtilsTest { @Test public void testIsProperUtilsClass() throws ReflectiveOperationException { - assertUtilsClassHasPrivateConstructor(ScopeUtils.class); + assertUtilsClassHasPrivateConstructor(ScopeUtils.class, true); } @Test diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/utils/TokenUtilsTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/utils/TokenUtilsTest.java index 97b0c1ed541..cf3f4b01002 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/utils/TokenUtilsTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/utils/TokenUtilsTest.java @@ -38,7 +38,7 @@ public class TokenUtilsTest { @Test public void testIsProperUtilsClass() throws ReflectiveOperationException { - assertUtilsClassHasPrivateConstructor(TokenUtils.class); + assertUtilsClassHasPrivateConstructor(TokenUtils.class, true); } @Test