From 0cdb7565c02eddb276adf3a21e6b10bf45ef5105 Mon Sep 17 00:00:00 2001 From: Roman Ivanov Date: Tue, 7 Nov 2023 05:54:47 -0800 Subject: [PATCH] Issue #13809: Kill mutation in SuppressionCommentFilter --- .../pitest-filters-suppressions.xml | 9 --- .../filters/SuppressionCommentFilterTest.java | 56 +++++++++++++++++++ ...SuppressionCommentFilterSuppressById6.java | 29 ++++++++++ 3 files changed, 85 insertions(+), 9 deletions(-) create mode 100644 src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppressioncommentfilter/InputSuppressionCommentFilterSuppressById6.java diff --git a/config/pitest-suppressions/pitest-filters-suppressions.xml b/config/pitest-suppressions/pitest-filters-suppressions.xml index 36b6dafa800..0212e58bd27 100644 --- a/config/pitest-suppressions/pitest-filters-suppressions.xml +++ b/config/pitest-suppressions/pitest-filters-suppressions.xml @@ -144,15 +144,6 @@ eventMessageRegexp = null; - - SuppressionCommentFilter.java - com.puppycrawl.tools.checkstyle.filters.SuppressionCommentFilter - accept - org.pitest.mutationtest.engine.gregor.mutators.NonVoidMethodCallMutator - removed call to com/puppycrawl/tools/checkstyle/filters/SuppressionCommentFilter::getFileContents - if (getFileContents() != currentContents) { - - SuppressionCommentFilter.java com.puppycrawl.tools.checkstyle.filters.SuppressionCommentFilter$Tag diff --git a/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressionCommentFilterTest.java b/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressionCommentFilterTest.java index 19ae666512a..04f7435d959 100644 --- a/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressionCommentFilterTest.java +++ b/src/test/java/com/puppycrawl/tools/checkstyle/filters/SuppressionCommentFilterTest.java @@ -21,24 +21,33 @@ import static com.google.common.truth.Truth.assertWithMessage; import static com.puppycrawl.tools.checkstyle.checks.naming.AbstractNameCheck.MSG_INVALID_PATTERN; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import java.io.File; import java.util.Arrays; import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; import org.junit.jupiter.api.Test; import com.puppycrawl.tools.checkstyle.AbstractModuleTestSupport; import com.puppycrawl.tools.checkstyle.DefaultConfiguration; +import com.puppycrawl.tools.checkstyle.JavaParser; import com.puppycrawl.tools.checkstyle.TreeWalker; import com.puppycrawl.tools.checkstyle.TreeWalkerAuditEvent; import com.puppycrawl.tools.checkstyle.api.CheckstyleException; +import com.puppycrawl.tools.checkstyle.api.DetailAST; import com.puppycrawl.tools.checkstyle.api.FileContents; import com.puppycrawl.tools.checkstyle.api.FileText; +import com.puppycrawl.tools.checkstyle.api.SeverityLevel; +import com.puppycrawl.tools.checkstyle.api.TextBlock; import com.puppycrawl.tools.checkstyle.api.Violation; import com.puppycrawl.tools.checkstyle.checks.coding.IllegalCatchCheck; import com.puppycrawl.tools.checkstyle.checks.naming.AbstractNameCheck; import com.puppycrawl.tools.checkstyle.checks.naming.ConstantNameCheck; +import com.puppycrawl.tools.checkstyle.checks.naming.MemberNameCheck; import com.puppycrawl.tools.checkstyle.internal.utils.TestUtil; import com.puppycrawl.tools.checkstyle.utils.CommonUtil; import nl.jqno.equalsverifier.EqualsVerifier; @@ -649,4 +658,51 @@ private static List> getTagsAfterExecution(SuppressionComment return TestUtil.getInternalState(filter, "tags"); } + @Test + public void testCachingByFileContentsInstance() throws Exception { + + File file = new File(getPath("InputSuppressionCommentFilterSuppressById6.java")); + DetailAST rootast = JavaParser.parseFile(file, JavaParser.Options.WITH_COMMENTS); + String[] lines = {"//CSOFF", "//CSON"}; + final FileContents fileContents = new FileContents( + new FileText(file, Arrays.asList(lines))); + for (int lineNo = 0; lineNo < lines.length; lineNo++) { + final int colNo = lines[lineNo].indexOf("//"); + if (colNo >= 0) { + fileContents.reportSingleLineComment(lineNo + 1, colNo);} + } + + + final FileContents mockedContents = mock(FileContents.class); + Map returnValue = fileContents.getSingleLineComments(); + when(mockedContents.getSingleLineComments()) + .thenReturn(returnValue) + .thenThrow(new IllegalStateException("Second call is not allowed")); + + + String[] args = {"line_length", "^[a-z][a-zA-Z0-9]*$"}; + Violation violation = new Violation(27, 9, 58, + "com.puppycrawl.tools.checkstyle.checks.naming.messages", + "name.invalidPattern", + args, + SeverityLevel.ERROR, + "ignore", + MemberNameCheck.class, + null); + + TreeWalkerAuditEvent event = new TreeWalkerAuditEvent( + mockedContents, file.getAbsolutePath(), violation, rootast); + + SuppressionCommentFilter filter = new SuppressionCommentFilter(); + filter.setOffCommentFormat(Pattern.compile("CSOFF")); + filter.setOnCommentFormat(Pattern.compile("CSON")); + filter.setCheckFormat("MemberNameCheck"); + filter.finishLocalSetup(); + + assertWithMessage("should accept").that(filter.accept(event)).isTrue(); + // due to caching in filter second execution should not do parsing of comments in file + // so exception is not expected + assertWithMessage("should accept").that(filter.accept(event)).isTrue(); + } + } diff --git a/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppressioncommentfilter/InputSuppressionCommentFilterSuppressById6.java b/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppressioncommentfilter/InputSuppressionCommentFilterSuppressById6.java new file mode 100644 index 00000000000..83f3effa163 --- /dev/null +++ b/src/test/resources/com/puppycrawl/tools/checkstyle/filters/suppressioncommentfilter/InputSuppressionCommentFilterSuppressById6.java @@ -0,0 +1,29 @@ +/* +SuppressionCommentFilter +offCommentFormat = CSOFF +onCommentFormat = CSON +checkFormat = MemberNameCheck +messageFormat = (default)(null) +idFormat = (default)(null) +checkCPP = (default)true +checkC = (default)true + + +com.puppycrawl.tools.checkstyle.checks.naming.MemberNameCheck +id = ignore +format = (default)^[a-z][a-zA-Z0-9]*$ +applyToPublic = (default)true +applyToProtected = (default)true +applyToPackage = (default)true +applyToPrivate = (default)true + +*/ + +package com.puppycrawl.tools.checkstyle.filters.suppressioncommentfilter; + +public class InputSuppressionCommentFilterSuppressById6 { + + // CSOFF + int line_length = 100; // filtered violation + //CSON +}