From 347dde1462cda52d2358130794007cb7057d2954 Mon Sep 17 00:00:00 2001 From: Henry Coles Date: Fri, 11 Nov 2022 12:39:35 +0000 Subject: [PATCH] Relax source file attribute check The purpose of the check is to alert users that they must configure the compiler to include source file debug info. Previously all classes were checked to ensure the source file was present, however it appears there may be some scenarios in which the source file is omitted when compiling kotlin. To allow analysis of the remaining classes, the check has been relaxed so that the info must be present in at least one file, rather than all files. --- .../verify/DefaultBuildVerifier.java | 22 +++++++++---------- .../verify/DefaultBuildVerifierTest.java | 7 ++++++ 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/pitest-entry/src/main/java/org/pitest/mutationtest/verify/DefaultBuildVerifier.java b/pitest-entry/src/main/java/org/pitest/mutationtest/verify/DefaultBuildVerifier.java index cc40b6be1..4264e004c 100644 --- a/pitest-entry/src/main/java/org/pitest/mutationtest/verify/DefaultBuildVerifier.java +++ b/pitest-entry/src/main/java/org/pitest/mutationtest/verify/DefaultBuildVerifier.java @@ -16,7 +16,7 @@ */ import java.util.Collection; -import java.util.function.Consumer; +import java.util.List; import java.util.function.Predicate; import org.pitest.classinfo.ClassInfo; @@ -29,11 +29,11 @@ public class DefaultBuildVerifier implements BuildVerifier { @Override public void verify(final CodeSource code) { - final Collection codeClasses = FCollection.filter(code.getCode(), isNotSynthetic()); + final List codeClasses = FCollection.filter(code.getCode(), isNotSynthetic()); if (hasMutableCode(codeClasses)) { checkAtLeastOneClassHasLineNumbers(codeClasses); - codeClasses.forEach(throwErrorIfHasNoSourceFile()); + checkAtLeastOneClassHasSourceFile(codeClasses); } } @@ -54,6 +54,14 @@ private void checkAtLeastOneClassHasLineNumbers( } } + private void checkAtLeastOneClassHasSourceFile(List codeClasses) { + // perform only a weak check for line numbers as + // some jvm languages are not guaranteed to include a source file for all classes + if (!FCollection.contains(codeClasses, a -> a.getSourceFileName() != null)) { + throw new PitHelpError(Help.NO_SOURCE_FILE, codeClasses.get(0).getName().asJavaName()); + } + } + private static Predicate aConcreteClass() { return a -> !a.isInterface(); } @@ -62,14 +70,6 @@ private static Predicate aClassWithLineNumbers() { return a -> a.getNumberOfCodeLines() != 0; } - private Consumer throwErrorIfHasNoSourceFile() { - return a -> { - if (a.getSourceFileName() == null) { - throw new PitHelpError(Help.NO_SOURCE_FILE, a.getName().asJavaName()); - } - }; - } - private static Predicate isNotSynthetic() { return a -> !a.isSynthetic(); } diff --git a/pitest-entry/src/test/java/org/pitest/mutationtest/verify/DefaultBuildVerifierTest.java b/pitest-entry/src/test/java/org/pitest/mutationtest/verify/DefaultBuildVerifierTest.java index cdfa123a9..85f22c704 100644 --- a/pitest-entry/src/test/java/org/pitest/mutationtest/verify/DefaultBuildVerifierTest.java +++ b/pitest-entry/src/test/java/org/pitest/mutationtest/verify/DefaultBuildVerifierTest.java @@ -15,6 +15,7 @@ package org.pitest.mutationtest.verify; +import static org.assertj.core.api.Assertions.assertThatCode; import static org.junit.Assert.fail; import static org.mockito.Mockito.when; @@ -105,6 +106,12 @@ public void shouldNotThrowAnErrorWhenOnlyInterfacesPresent() { } } + @Test + public void doesNotErrorWhenNoClassesProvided() { + when(this.code.getCode()).thenReturn(Collections.emptyList()); + assertThatCode(() -> this.testee.verify(this.code)).doesNotThrowAnyException(); + } + private void setupClassPath(final Class clazz) { this.setupClassPath( new ClassloaderByteArraySource(IsolationUtils.getContextClassLoader()),