From 41edc5867ba194fdb06b2e2ffa6b6addfaa99986 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 22 May 2013 17:20:43 -0400 Subject: [PATCH] [JENKINS-16301] Verifying current load/save implementation can round-trip fingerprints. --- .../main/java/hudson/model/Fingerprint.java | 10 +++-- .../java/hudson/model/FingerprintTest.java | 45 +++++++++++++++++++ 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/hudson/model/Fingerprint.java b/core/src/main/java/hudson/model/Fingerprint.java index 075fcf9533..7dac1ed6a5 100644 --- a/core/src/main/java/hudson/model/Fingerprint.java +++ b/core/src/main/java/hudson/model/Fingerprint.java @@ -578,7 +578,7 @@ public class Fingerprint implements ModelObject, Saveable { */ private final Hashtable usages = new Hashtable(); - private PersistedList facets = new PersistedList(this); + PersistedList facets = new PersistedList(this); /** * Lazily computed immutable {@link FingerprintFacet}s created from {@link TransientFingerprintFacetFactory}. @@ -712,7 +712,12 @@ public class Fingerprint implements ModelObject, Saveable { * Records that a build of a job has used this file. */ public synchronized void add(String jobFullName, int n) throws IOException { - synchronized(usages) { + addWithoutSaving(jobFullName, n); + save(); + } + + void addWithoutSaving(String jobFullName, int n) { + synchronized(usages) { // XXX why not synchronized (this) like some, though not all, other accesses? RangeSet r = usages.get(jobFullName); if(r==null) { r = new RangeSet(); @@ -720,7 +725,6 @@ public class Fingerprint implements ModelObject, Saveable { } r.add(n); } - save(); } /** diff --git a/core/src/test/java/hudson/model/FingerprintTest.java b/core/src/test/java/hudson/model/FingerprintTest.java index eaa01473d3..1167745c73 100644 --- a/core/src/test/java/hudson/model/FingerprintTest.java +++ b/core/src/test/java/hudson/model/FingerprintTest.java @@ -23,15 +23,21 @@ */ package hudson.model; +import hudson.Util; import hudson.model.Fingerprint.RangeSet; import java.io.File; +import jenkins.model.FingerprintFacet; import static org.junit.Assert.*; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TemporaryFolder; /** * @author Kohsuke Kawaguchi */ public class FingerprintTest { + + @Rule public TemporaryFolder tmp = new TemporaryFolder(); @Test public void rangeSet() { RangeSet rs = new RangeSet(); @@ -128,4 +134,43 @@ public class FingerprintTest { Fingerprint.load(new File(FingerprintTest.class.getResource("fingerprint.xml").toURI())).toString()); } + @Test public void roundTrip() throws Exception { + Fingerprint f = new Fingerprint(new Fingerprint.BuildPtr("foo", 13), "stuff.jar", SOME_MD5); + f.addWithoutSaving("some", 1); + f.addWithoutSaving("some", 2); + f.addWithoutSaving("some", 3); + f.addWithoutSaving("some", 10); + f.addWithoutSaving("other", 6); + File xml = tmp.newFile(); + f.save(xml); + Fingerprint f2 = Fingerprint.load(xml); + assertEquals(f.toString(), f2.toString()); + f.facets.setOwner(Saveable.NOOP); + f.facets.add(new TestFacet(f, 123, "val")); + f.save(xml); + //System.out.println(FileUtils.readFileToString(xml)); + f2 = Fingerprint.load(xml); + assertEquals(f.toString(), f2.toString()); + assertEquals(1, f2.facets.size()); + TestFacet facet = (TestFacet) f2.facets.get(0); + assertEquals(f2, facet.getFingerprint()); + } + private static byte[] toByteArray(String md5sum) { + byte[] data = new byte[16]; + for( int i=0; i