Skip to content

Commit

Permalink
Add tests to reproduce hash code collision in build memory
Browse files Browse the repository at this point in the history
  • Loading branch information
Jimilian committed May 2, 2018
1 parent a3bf98d commit 4398149
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
*/
package com.sonyericsson.hudson.plugins.gerrit.trigger.gerritnotifier.model;

import com.google.common.annotations.VisibleForTesting;
import com.infradna.tool.bridge_method_injector.WithBridgeMethods;
import com.sonyericsson.hudson.plugins.gerrit.trigger.diagnostics.BuildMemoryReport;
import com.sonyericsson.hudson.plugins.gerrit.trigger.gerritnotifier.model.BuildMemory.MemoryImprint.Entry;
Expand Down Expand Up @@ -81,7 +82,7 @@ public int compare(GerritTriggeredEvent o1, GerritTriggeredEvent o2) {
}
}

private TreeMap<GerritTriggeredEvent, MemoryImprint> memory =
private Map<GerritTriggeredEvent, MemoryImprint> memory =
new TreeMap<GerritTriggeredEvent, MemoryImprint>(
new GerritTriggeredEventComparator());
private static final Logger logger = LoggerFactory.getLogger(BuildMemory.class);
Expand All @@ -96,6 +97,15 @@ public synchronized MemoryImprint getMemoryImprint(GerritTriggeredEvent event) {
return memory.get(event);
}

/**
* Gets the entire memory representation for all events
* @return memory representation for all events.
*/
@VisibleForTesting
Map<GerritTriggeredEvent, MemoryImprint> getMemory() {
return memory;
}

/**
* Tells if all triggered builds have started for a specific memory imprint.
*
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
package com.sonyericsson.hudson.plugins.gerrit.trigger.gerritnotifier.model;

import com.sonyericsson.hudson.plugins.gerrit.trigger.mock.Setup;
import com.sonymobile.tools.gerrit.gerritevents.dto.events.ChangeMerged;
import com.sonymobile.tools.gerrit.gerritevents.dto.events.ChangeBasedEvent;
import com.sonymobile.tools.gerrit.gerritevents.dto.events.GerritTriggeredEvent;
import com.sonymobile.tools.gerrit.gerritevents.dto.events.PatchsetCreated;
import hudson.model.AbstractProject;
import hudson.model.ItemGroup;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.mockito.Mockito;

import java.util.Arrays;
import java.util.Comparator;

import static org.junit.Assert.assertEquals;

Expand All @@ -19,12 +20,30 @@
* @author Robert Sandell &lt;rsandell@cloudbees.com&gt;.
*/
@RunWith(Parameterized.class)
public class GerritTriggeredEventComparatorTest {
public class BuildMemoryReportContainterTest {

private final GerritTriggeredEvent o1;
private final GerritTriggeredEvent o2;
private final int expected;
private final Comparator<GerritTriggeredEvent> comparator;
private final BuildMemory memory;

static class PatchsetCreatedWithPrefinedHash extends PatchsetCreated {
private final int hashCode;

private PatchsetCreatedWithPrefinedHash(int hashCode) {
this.hashCode = hashCode;
}

@Override
public boolean equals(Object o) {
return false;
}

@Override
public int hashCode() {
return hashCode;
}
}

/**
* The different scenarios.
Expand All @@ -34,15 +53,16 @@ public class GerritTriggeredEventComparatorTest {
*/
@Parameterized.Parameters(name = "{index}: {0}, {1} == {2}")
public static Iterable<Object[]> permutations() {
PatchsetCreated event = Setup.createPatchsetCreated();
ChangeMerged merged = Setup.createChangeMerged();
ChangeBasedEvent event1 = new PatchsetCreatedWithPrefinedHash(777);
ChangeBasedEvent event2 = new PatchsetCreatedWithPrefinedHash(777);
return Arrays.asList(new Object[][]{
{null, null, 0},
{null, event, -1},
{event, null, 1},
{event, event, 0},
{event, merged, new Integer(event.hashCode()).compareTo(merged.hashCode())},
{merged, event, new Integer(merged.hashCode()).compareTo(event.hashCode()), },
{null, null, 1},
{null, event1, 2},
{event1, null, 2},
{event1, event1, 1},
{event2, event2, 1},
{event1, event2, 2},
{event2, event1, 2},
});
}

Expand All @@ -52,11 +72,11 @@ public static Iterable<Object[]> permutations() {
* @param o2 second argument
* @param expected the expected result
*/
public GerritTriggeredEventComparatorTest(GerritTriggeredEvent o1, GerritTriggeredEvent o2, int expected) {
public BuildMemoryReportContainterTest(GerritTriggeredEvent o1, GerritTriggeredEvent o2, int expected) {
this.o1 = o1;
this.o2 = o2;
this.expected = expected;
comparator = new BuildMemory.GerritTriggeredEventComparator();
memory = new BuildMemory();
}

/**
Expand All @@ -67,6 +87,13 @@ public GerritTriggeredEventComparatorTest(GerritTriggeredEvent o1, GerritTrigger
*/
@Test
public void testCompare() throws Exception {
assertEquals(expected, comparator.compare(o1, o2));
AbstractProject mock = Mockito.mock(AbstractProject.class);
ItemGroup itemGroup = Mockito.mock(ItemGroup.class);
Mockito.when(itemGroup.getFullName()).thenReturn("Parent");
Mockito.when(mock.getParent()).thenReturn(itemGroup);
memory.triggered(o1, mock);
memory.triggered(o2, mock);

assertEquals(expected, memory.getMemory().size());
}
}

0 comments on commit 4398149

Please sign in to comment.