From 0ca5ff7b4044ce168c32ffe5a2b51b93c69275b4 Mon Sep 17 00:00:00 2001 From: Sumit Sarin Date: Sat, 4 Apr 2020 14:57:28 +0530 Subject: [PATCH] =?UTF-8?q?[JENKINS-61479]=20Fix=20java.lang.ClassCastExce?= =?UTF-8?q?ption=20in=20Fingerprint=E2=80=A6=20(#4577)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [JENKINS-61479] Fix a bug in FingerprintCleanupThread and add tests. * Upgraded Hamcrest to Version 2.2. Incorporated Hamcrest assertion for FingerprintCleanupThread tests. * Blank line removed * Changed timestamp_millis->Date; Removed unused imports * Added hamcrest version as a property * Changed to assert log output --- core/pom.xml | 9 +++- .../model/FingerprintCleanupThread.java | 6 +-- .../model/FingerprintCleanupThreadTest.java | 50 +++++++++++++++++++ 3 files changed, 60 insertions(+), 5 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index d9ffd0294c..f661ff6249 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -42,6 +42,7 @@ THE SOFTWARE. 1.259 2.5.6.SEC03 2.4.12 + 2.2 @@ -189,10 +190,16 @@ THE SOFTWARE. jenkins-stapler-support 1.1 + + org.hamcrest + hamcrest + ${hamcrest.version} + test + org.hamcrest hamcrest-library - 1.3 + ${hamcrest.version} test diff --git a/core/src/main/java/hudson/model/FingerprintCleanupThread.java b/core/src/main/java/hudson/model/FingerprintCleanupThread.java index f698c6a1d3..42631e8b5d 100644 --- a/core/src/main/java/hudson/model/FingerprintCleanupThread.java +++ b/core/src/main/java/hudson/model/FingerprintCleanupThread.java @@ -23,7 +23,6 @@ */ package hudson.model; -import com.thoughtworks.xstream.converters.basic.DateConverter; import hudson.Extension; import hudson.ExtensionList; import hudson.Functions; @@ -35,6 +34,7 @@ import org.kohsuke.accmod.restrictions.NoExternalUse; import java.io.File; import java.io.IOException; +import java.util.Date; import java.util.regex.Pattern; /** @@ -54,8 +54,6 @@ public class FingerprintCleanupThread extends AsyncPeriodicWork { static final String FINGERPRINTS_DIR_NAME = "fingerprints"; private static final Pattern FINGERPRINT_FILE_PATTERN = Pattern.compile("[0-9a-f]{28}\\.xml"); - private static final DateConverter DATE_CONVERTER = new DateConverter(); - public FingerprintCleanupThread() { super("Fingerprint cleanup"); } @@ -118,7 +116,7 @@ public class FingerprintCleanupThread extends AsyncPeriodicWork { } else { if (!fp.isAlive()) { FingerprintFacet deletionBlockerFacet = fp.getFacetBlockingDeletion(); - listener.getLogger().println(deletionBlockerFacet.getClass().getName() + " created on " + DATE_CONVERTER.toString(deletionBlockerFacet.getTimestamp()) + " blocked deletion of " + fingerprintFile); + listener.getLogger().println(deletionBlockerFacet.getClass().getName() + " created on " + new Date(deletionBlockerFacet.getTimestamp()) + " blocked deletion of " + fingerprintFile); } // get the fingerprint in the official map so have the changes visible to Jenkins // otherwise the mutation made in FingerprintMap can override our trimming. diff --git a/core/src/test/java/hudson/model/FingerprintCleanupThreadTest.java b/core/src/test/java/hudson/model/FingerprintCleanupThreadTest.java index 549a50df50..7cf2d780d4 100644 --- a/core/src/test/java/hudson/model/FingerprintCleanupThreadTest.java +++ b/core/src/test/java/hudson/model/FingerprintCleanupThreadTest.java @@ -34,9 +34,17 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import jenkins.model.FingerprintFacet; + +import static org.hamcrest.io.FileMatchers.aReadableFile; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsNot.not; +import static org.hamcrest.core.StringContains.containsString; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertThat; public class FingerprintCleanupThreadTest { @@ -90,6 +98,33 @@ public class FingerprintCleanupThreadTest { assertTrue("Should have logged IOException.", logOutput.contains("ERROR: Failed to process")); } + @Test + public void testBlockingFacetBlocksDeletion() throws IOException { + createFolderStructure(); + TestTaskListener testTaskListener = new TestTaskListener(); + Fingerprint fp = new TestFingerprint(false); + fp.facets.setOwner(Saveable.NOOP); + TestFingperprintFacet facet = new TestFingperprintFacet(fp, System.currentTimeMillis(), true); + fp.facets.add(facet); + FingerprintCleanupThread cleanupThread = new TestFingerprintCleanupThread(fp); + cleanupThread.execute(testTaskListener); + String logOutput = testTaskListener.outputStream.toString(); + assertThat(logOutput, containsString("blocked deletion of")); + } + + @Test + public void testUnblockedFacetsDontBlockDeletion() throws IOException { + createFolderStructure(); + TestTaskListener testTaskListener = new TestTaskListener(); + Fingerprint fp = new TestFingerprint(false); + fp.facets.setOwner(Saveable.NOOP); + TestFingperprintFacet facet = new TestFingperprintFacet(fp, System.currentTimeMillis(), false); + fp.facets.add(facet); + FingerprintCleanupThread cleanupThread = new TestFingerprintCleanupThread(fp); + cleanupThread.execute(testTaskListener); + assertThat(fpFile.toFile(), is(not(aReadableFile()))); + } + private void createFolderStructure() throws IOException { createTestDir(); Path fingerprintsPath = tempDirectory.resolve(FingerprintCleanupThread.FINGERPRINTS_DIR_NAME); @@ -145,6 +180,21 @@ public class FingerprintCleanupThreadTest { } + public static final class TestFingperprintFacet extends FingerprintFacet { + + private boolean deletionBlocked; + + public TestFingperprintFacet(Fingerprint fingerprint, long timestamp, boolean deletionBlocked) { + super(fingerprint, timestamp); + this.deletionBlocked = deletionBlocked; + } + + @Override public boolean isFingerprintDeletionBlocked() { + return deletionBlocked; + } + + } + private static class TestFingerprint extends Fingerprint { private boolean isAlive = true; -- GitLab