未验证 提交 0ca5ff7b 编写于 作者: S Sumit Sarin 提交者: GitHub

[JENKINS-61479] Fix java.lang.ClassCastException in Fingerprint… (#4577)

* [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
上级 99f8b3f8
......@@ -42,6 +42,7 @@ THE SOFTWARE.
<stapler.version>1.259</stapler.version>
<spring.version>2.5.6.SEC03</spring.version>
<groovy.version>2.4.12</groovy.version>
<hamcrest.version>2.2</hamcrest.version>
</properties>
<dependencyManagement>
......@@ -189,10 +190,16 @@ THE SOFTWARE.
<artifactId>jenkins-stapler-support</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest</artifactId>
<version>${hamcrest.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-library</artifactId>
<version>1.3</version>
<version>${hamcrest.version}</version>
<scope>test</scope>
</dependency>
......
......@@ -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.
......
......@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册