From 1db81666cc51a7f6da0a5f7b48d5320304d1296e Mon Sep 17 00:00:00 2001 From: rliesenfeld Date: Thu, 16 Jul 2015 21:46:37 -0300 Subject: [PATCH] Coverage: fixed case where classes reloaded from a third-party jar file got erroneously modified for coverage. --- .../coverage/modification/ClassSelection.java | 21 +++++++++++++------ .../test/integrationTests/CoverageTest.java | 4 ++-- .../CustomClassLoadingTest.java | 15 +++++++++++++ 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/coverage/src/mockit/coverage/modification/ClassSelection.java b/coverage/src/mockit/coverage/modification/ClassSelection.java index 640da189e..f3224453b 100644 --- a/coverage/src/mockit/coverage/modification/ClassSelection.java +++ b/coverage/src/mockit/coverage/modification/ClassSelection.java @@ -99,11 +99,14 @@ boolean isSelected(@Nonnull String className, @Nonnull ProtectionDomain protecti // It's from a custom class loader, so it may exist in the classpath. String classFileName = className.replace('.', '/') + ".class"; - URL classFile = THIS_CLASS_LOADER.getResource(classFileName); - return classFile != null; + codeSourceLocation = THIS_CLASS_LOADER.getResource(classFileName); + + if (codeSourceLocation == null) { + return false; + } } - return !isClassFromExternalLibrary(codeSourceLocation.getPath()); + return !isClassFromExternalLibrary(codeSourceLocation); } private static boolean isIneligibleForSelection(@Nonnull String className) @@ -144,10 +147,16 @@ else if (classesToInclude != null) { return true; } - private boolean isClassFromExternalLibrary(@Nonnull String location) + private boolean isClassFromExternalLibrary(@Nonnull URL location) { + if ("jar".equals(location.getProtocol())) { + return true; + } + + String path = location.getPath(); + return - location.endsWith(".jar") || location.endsWith("/.cp/") || - testCode != null && (location.endsWith("/test-classes/") || location.endsWith("/jmockit1.org/main/classes/")); + path.endsWith(".jar") || path.endsWith("/.cp/") || + testCode != null && (path.endsWith("/test-classes/") || path.endsWith("/jmockit1.org/main/classes/")); } } diff --git a/coverageTests/test/integrationTests/CoverageTest.java b/coverageTests/test/integrationTests/CoverageTest.java index b85c0c6a7..07f87717d 100644 --- a/coverageTests/test/integrationTests/CoverageTest.java +++ b/coverageTests/test/integrationTests/CoverageTest.java @@ -26,7 +26,7 @@ public class CoverageTest private int currentPathIndex = -1; @Before - public void findCoverageData() throws Exception + public final void findCoverageData() throws Exception { Field testedField = getClass().getDeclaredField("tested"); Class testedClass = testedField.getType(); @@ -252,7 +252,7 @@ protected static void assertInstanceFieldUncovered(@Nonnull String fieldName) assertFalse("Instance field " + fieldName + " should not be covered", isInstanceFieldCovered(fieldName)); } - protected void assertInstanceFieldUncovered(@Nonnull String fieldName, @Nonnull Object... uncoveredInstances) + protected static void assertInstanceFieldUncovered(@Nonnull String fieldName, @Nonnull Object... uncoveredInstances) { String msg = "Instance field " + fieldName + " should not be covered"; InstanceFieldData fieldData = getInstanceFieldData(fieldName); diff --git a/coverageTests/test/integrationTests/CustomClassLoadingTest.java b/coverageTests/test/integrationTests/CustomClassLoadingTest.java index a582f7878..0a961e29d 100644 --- a/coverageTests/test/integrationTests/CustomClassLoadingTest.java +++ b/coverageTests/test/integrationTests/CustomClassLoadingTest.java @@ -4,10 +4,16 @@ */ package integrationTests; +import java.util.*; + import org.junit.*; import org.junit.runner.*; import static org.junit.Assert.*; +import mockit.coverage.data.*; + +import org.hamcrest.*; + @RunWith(CustomRunner.class) public final class CustomClassLoadingTest extends CoverageTest { @@ -59,4 +65,13 @@ public void exerciseClassThatIsOnlyUsedHere() assertPaths(1, 1, 1); assertPath(2, 1); } + + @Test + public void exerciseClassFromNonJREJarFile() + { + CoreMatchers.anything(); + + Map fileToFileData = CoverageData.instance().getRawFileToFileData(); + assertFalse(fileToFileData.containsKey("org/hamcrest/CoreMatchers.java")); + } }