diff --git a/src/main/java/org/scion/internal/MultiMap.java b/src/main/java/org/scion/internal/MultiMap.java index 0019d61cd..9e2707fdb 100644 --- a/src/main/java/org/scion/internal/MultiMap.java +++ b/src/main/java/org/scion/internal/MultiMap.java @@ -20,30 +20,18 @@ public class MultiMap { private final HashMap> map = new HashMap<>(); public void put(K key, V value) { - ArrayList entry = map.get(key); - if (entry == null) { - entry = new ArrayList<>(); - map.put(key, entry); - } - entry.add(value); + map.computeIfAbsent(key, k -> new ArrayList<>()).add(value); } - public ArrayList get(K key) { - return map.get(key); + public List get(K key) { + ArrayList result = map.get(key); + return result == null ? Collections.emptyList() : result; } public boolean contains(K key) { return map.containsKey(key); } - public Set>> entrySet() { - return map.entrySet(); - } - - public Collection> values() { - return map.values(); - } - public boolean isEmpty() { return map.isEmpty(); } diff --git a/src/main/java/org/scion/internal/Segments.java b/src/main/java/org/scion/internal/Segments.java index ef2afd9b6..10864f246 100644 --- a/src/main/java/org/scion/internal/Segments.java +++ b/src/main/java/org/scion/internal/Segments.java @@ -239,11 +239,8 @@ private static List combineTwoSegments( List paths = new ArrayList<>(); for (Seg.PathSegment pathSegment0 : segments0) { long middleIsdAs = getOtherIsdAs(srcIsdAs, pathSegment0); - ArrayList segmentList1 = segmentsMap1.get(middleIsdAs); - if (segmentList1 != null) { - for (Seg.PathSegment pathSegment1 : segmentList1) { - paths.add(buildPath(brLookup, pathSegment0, pathSegment1)); - } + for (Seg.PathSegment pathSegment1 : segmentsMap1.get(middleIsdAs)) { + paths.add(buildPath(brLookup, pathSegment0, pathSegment1)); } } return paths; @@ -263,9 +260,9 @@ private static List combineThreeSegments( List paths = new ArrayList<>(); for (Seg.PathSegment pathSeg : segmentsCore) { long[] endIAs = getEndingIAs(pathSeg); - if (upSegments.get(endIAs[0]) != null && downSegments.get(endIAs[1]) != null) { + if (upSegments.contains(endIAs[0]) && downSegments.contains(endIAs[1])) { buildPath(paths, upSegments.get(endIAs[0]), pathSeg, downSegments.get(endIAs[1]), brLookup); - } else if (upSegments.get(endIAs[1]) != null && downSegments.get(endIAs[0]) != null) { + } else if (upSegments.contains(endIAs[1]) && downSegments.contains(endIAs[0])) { buildPath(paths, upSegments.get(endIAs[1]), pathSeg, downSegments.get(endIAs[0]), brLookup); } } diff --git a/src/test/java/org/scion/api/DatagramSocketApiCompletenessTest.java b/src/test/java/org/scion/api/DatagramSocketApiCompletenessTest.java index d31c44af3..7d2f7f789 100644 --- a/src/test/java/org/scion/api/DatagramSocketApiCompletenessTest.java +++ b/src/test/java/org/scion/api/DatagramSocketApiCompletenessTest.java @@ -40,7 +40,6 @@ void testApiCompleteness() { } List matches = methods.get(required.getName()); boolean foundImplementation = false; - assertNotNull(matches, "Method not found: " + required); assertFalse(matches.isEmpty(), "Method not found: " + required); for (Method implemented : matches) { if (required.getParameterCount() == implemented.getParameterCount()) { diff --git a/src/test/java/org/scion/internal/MultiMapTest.java b/src/test/java/org/scion/internal/MultiMapTest.java index 6bf7d54d1..f6a773042 100644 --- a/src/test/java/org/scion/internal/MultiMapTest.java +++ b/src/test/java/org/scion/internal/MultiMapTest.java @@ -14,7 +14,71 @@ package org.scion.internal; -import org.junit.jupiter.api.Disabled; +import static org.junit.jupiter.api.Assertions.*; -@Disabled -public class MultiMapTest {} +import java.util.ArrayList; +import java.util.List; +import org.junit.jupiter.api.Test; + +class MultiMapTest { + + private static class Pair { + int i; + String s; + + Pair(int i, String s) { + this.i = i; + this.s = s; + } + } + + @Test + void testSmoke() { + MultiMap map = new MultiMap<>(); + ArrayList list = new ArrayList<>(); + for (int i = 0; i < 1000; i++) { + // Use duplicate keys as well as duplicate values + Pair p = new Pair(i % 10, Integer.toString(i % 100)); + map.put(p.i, p.s); + list.add(p); + } + + assertFalse(map.isEmpty()); + + for (Pair p : list) { + assertTrue(map.contains(p.i)); + List entries = map.get(p.i); + assertEquals(100, entries.size()); + int matches = 0; + int identity = 0; + for (String s : entries) { + assertEquals(p.i, Integer.parseInt(s) % 10); + if (p.s.equals(s)) { + matches++; + } + if (p.s == s) { + identity++; + } + } + assertEquals(10, matches); + assertEquals(1, identity); + } + + map.clear(); + assertTrue(map.isEmpty()); + assertFalse(map.contains(0)); + assertNotNull(map.get(0)); + assertTrue(map.get(0).isEmpty()); + } + + @Test + void testEmptyMap() { + // Check that basic function donĀ“t fail on empty map + MultiMap map = new MultiMap<>(); + assertTrue(map.isEmpty()); + // assertEquals(0, map.size()); + assertFalse(map.contains(0)); + assertNotNull(map.get(0)); + assertTrue(map.get(0).isEmpty()); + } +}