blob: 871c8282775e15b77d154033aee838d56da532a8 [file] [log] [blame]
Jonathan Hart382623d2014-04-03 09:48:11 -07001package net.onrc.onos.apps.bgproute;
Jonathan Hart8f5f4682013-08-07 22:13:39 +12002
3import static org.junit.Assert.assertFalse;
4import static org.junit.Assert.assertNotNull;
5import static org.junit.Assert.assertNull;
6import static org.junit.Assert.assertTrue;
Jonathan Hart8f5f4682013-08-07 22:13:39 +12007
8import java.util.HashMap;
9import java.util.Iterator;
10import java.util.Map;
11
12import org.junit.After;
13import org.junit.Before;
Jonathan Hart8f5f4682013-08-07 22:13:39 +120014import org.junit.Test;
15
16public class PatriciaTrieTest {
17
Jonathan Hart29b972d2013-08-12 23:43:51 +120018 IPatriciaTrie<RibEntry> ptrie;
Jonathan Hart8f5f4682013-08-07 22:13:39 +120019 Prefix[] prefixes;
Jonathan Hartb39a67d2013-08-10 23:59:50 +120020 Map<Prefix, RibEntry> mappings;
Jonathan Hart8f5f4682013-08-07 22:13:39 +120021
22 @Before
23 public void setUp() throws Exception {
Jonathan Hart29b972d2013-08-12 23:43:51 +120024 ptrie = new PatriciaTrie<RibEntry>(32);
Jonathan Hartb39a67d2013-08-10 23:59:50 +120025 mappings = new HashMap<Prefix, RibEntry>();
Jonathan Hart8f5f4682013-08-07 22:13:39 +120026
27 prefixes = new Prefix[] {
28 new Prefix("192.168.10.0", 24),
29 new Prefix("192.168.8.0", 23),
30 new Prefix("192.168.8.0", 22),
31 new Prefix("192.0.0.0", 7),
32 new Prefix("192.168.11.0", 24),
33 new Prefix("10.0.23.128", 25),
34 new Prefix("206.17.144.0", 20),
35 new Prefix("9.17.0.0", 12),
36 new Prefix("192.168.0.0", 16)
37 };
38
39 for (int i = 0; i < prefixes.length; i++) {
Jonathan Hartb39a67d2013-08-10 23:59:50 +120040 mappings.put(prefixes[i], new RibEntry("192.168.10.101", "192.168.20." + i));
41 ptrie.put(prefixes[i], new RibEntry("192.168.10.101", "192.168.20." + i));
Jonathan Hart8f5f4682013-08-07 22:13:39 +120042 }
43 }
44
45 @After
46 public void tearDown() throws Exception {
47 }
48
49 @Test
50 public void testPut() {
Jonathan Hart29b972d2013-08-12 23:43:51 +120051 IPatriciaTrie<RibEntry> ptrie = new PatriciaTrie<RibEntry>(32);
Jonathan Hart8f5f4682013-08-07 22:13:39 +120052
53 Prefix p1 = new Prefix("192.168.240.0", 20);
Jonathan Hartb39a67d2013-08-10 23:59:50 +120054 RibEntry r1 = new RibEntry("192.168.10.101", "192.168.60.2");
55 RibEntry retval = ptrie.put(p1, r1);
Jonathan Hart8f5f4682013-08-07 22:13:39 +120056 assertNull(retval);
57 retval = ptrie.lookup(p1);
58 assertTrue(r1 == retval); //should be the same object
59
60 Prefix p2 = new Prefix("192.160.0.0", 12);
Jonathan Hartb39a67d2013-08-10 23:59:50 +120061 RibEntry r2 = new RibEntry("192.168.10.101", "192.168.20.1");
Jonathan Hart8f5f4682013-08-07 22:13:39 +120062 retval = ptrie.put(p2, r2);
63 assertNull(retval);
64
65 Prefix p3 = new Prefix("192.168.208.0", 20);
Jonathan Hartb39a67d2013-08-10 23:59:50 +120066 RibEntry r3 = new RibEntry("192.168.10.101", "192.168.30.1");
Jonathan Hart8f5f4682013-08-07 22:13:39 +120067 retval = ptrie.put(p3, r3);
68 assertNull(retval);
69
Jonathan Hartb39a67d2013-08-10 23:59:50 +120070 //Insert a new RibEntry entry over a previous one
71 RibEntry r3new = new RibEntry("192.168.10.101", "192.168.60.2");
Jonathan Hart8f5f4682013-08-07 22:13:39 +120072 retval = ptrie.put(p3, r3new);
73 assertNotNull(retval);
74 assertTrue(retval.equals(r3));
75 assertTrue(retval == r3); //should be the same object
76
77 //Now we have an aggregate node with prefix 192.168.192.0/18.
Jonathan Hartb39a67d2013-08-10 23:59:50 +120078 //We will insert a RibEntry at this prefix
Jonathan Hart8f5f4682013-08-07 22:13:39 +120079 Prefix p4 = new Prefix("192.168.192.0", 18);
Jonathan Hartb39a67d2013-08-10 23:59:50 +120080 RibEntry r4 = new RibEntry("192.168.10.101", "192.168.40.1");
Jonathan Hart8f5f4682013-08-07 22:13:39 +120081 retval = ptrie.put(p4, r4);
82 assertNull(retval);
83 retval = ptrie.lookup(p4);
84 assertTrue(retval == r4); //should be the same object
85 }
86
87 @Test
88 public void testLookup() {
Jonathan Hartb39a67d2013-08-10 23:59:50 +120089 for (Map.Entry<Prefix, RibEntry> entry : mappings.entrySet()) {
90 RibEntry r = ptrie.lookup(entry.getKey());
Jonathan Hart8f5f4682013-08-07 22:13:39 +120091 assertTrue(entry.getValue().equals(r));
92 }
93
94 //These are aggregate nodes in the tree. Shouldn't be returned by lookup
95 Prefix p1 = new Prefix("0.0.0.0", 0);
Jonathan Hartb39a67d2013-08-10 23:59:50 +120096 RibEntry retval = ptrie.lookup(p1);
Jonathan Hart8f5f4682013-08-07 22:13:39 +120097 assertNull(retval);
98
Jonathan Hartb39a67d2013-08-10 23:59:50 +120099 //We'll put a RibEntry at an aggregate node and check if lookup returns correctly
Jonathan Hart8f5f4682013-08-07 22:13:39 +1200100 Prefix p2 = new Prefix("192.0.0.0", 4);
Jonathan Hartb39a67d2013-08-10 23:59:50 +1200101 RibEntry r2 = new RibEntry("192.168.10.101", "192.168.60.1");
Jonathan Hart8f5f4682013-08-07 22:13:39 +1200102 retval = ptrie.put(p2, r2);
103 assertNull(retval);
104 retval = ptrie.lookup(p2);
105 assertTrue(retval.equals(r2));
106 }
107
Jonathan Hartabf10222013-08-13 10:19:34 +1200108 //@Ignore
Jonathan Hart8f5f4682013-08-07 22:13:39 +1200109 @Test
110 public void testMatch() {
Jonathan Hartabf10222013-08-13 10:19:34 +1200111 Prefix p1 = new Prefix("192.168.10.30", 32);
112 Prefix p2 = new Prefix("192.168.10.30", 31);
113 Prefix p3 = new Prefix("192.168.8.241", 32);
114 Prefix p4 = new Prefix("1.0.0.0", 32);
115 Prefix p5 = new Prefix("192.168.8.0", 22);
116 Prefix p6 = new Prefix("192.168.8.0", 21);
117
118 assertTrue(ptrie.match(p1).equals(mappings.get(prefixes[0])));
119 assertTrue(ptrie.match(p2).equals(mappings.get(prefixes[0])));
120 assertTrue(ptrie.match(p3).equals(mappings.get(prefixes[1])));
121 assertNull(ptrie.match(p4));
122 assertTrue(ptrie.match(p5).equals(mappings.get(prefixes[2])));
123 //System.out.println(ptrie.match(p6).getNextHop().getHostAddress());
124 assertTrue(ptrie.match(p6).equals(mappings.get(prefixes[8])));
125
126
127 //TODO more extensive tests
128 //fail("Not yet implemented");
Jonathan Hart8f5f4682013-08-07 22:13:39 +1200129 }
130
131 @Test
132 public void testRemove() {
133 Prefix p1 = new Prefix("192.168.8.0", 23);
Jonathan Hartb39a67d2013-08-10 23:59:50 +1200134 RibEntry retval = ptrie.lookup(p1);
Jonathan Hart8f5f4682013-08-07 22:13:39 +1200135 assertNotNull(retval);
136 boolean success = ptrie.remove(p1, retval);
137 assertTrue(success);
138
139 Prefix p2 = new Prefix("192.168.8.0", 22);
140 Prefix p3 = new Prefix("192.168.10.0", 24);
141
142 //Test it does the right thing with null arguments
143 success = ptrie.remove(null, null);
144 assertFalse(success);
145 success = ptrie.remove(p2, null);
146 assertFalse(success);
147
148 //Check other prefixes are still there
149 retval = ptrie.lookup(p2);
150 assertNotNull(retval);
151 retval = ptrie.lookup(p3);
152 assertNotNull(retval);
153
154 Prefix p4 = new Prefix("9.17.0.0", 12);
155 retval = ptrie.lookup(p4);
156 assertNotNull(retval);
157 success = ptrie.remove(p4, retval);
158 assertTrue(success);
159 success = ptrie.remove(p4, retval);
160 assertFalse(success);
161
162 //Check other prefixes are still there
163 retval = ptrie.lookup(p2);
164 assertNotNull(retval);
165 retval = ptrie.lookup(p3);
166 assertNotNull(retval);
167
168 Prefix p5 = new Prefix("192.0.0.0", 7);
169 retval = ptrie.lookup(p5);
170 assertNotNull(retval);
171 success = ptrie.remove(p5, retval);
172 assertTrue(success);
173
174 //Check other prefixes are still there
175 retval = ptrie.lookup(p2);
176 assertNotNull(retval);
177 retval = ptrie.lookup(p3);
178 assertNotNull(retval);
179
180
181 }
182
183 @Test(expected=java.util.NoSuchElementException.class)
184 public void testIterator() {
185 int[] order = new int[] {7, 5, 3, 8, 2, 1, 0, 4, 6};
186
Jonathan Hart29b972d2013-08-12 23:43:51 +1200187 Iterator<IPatriciaTrie.Entry<RibEntry>> it = ptrie.iterator();
Jonathan Hart8f5f4682013-08-07 22:13:39 +1200188 int i = 0;
189 assertTrue(it.hasNext());
190 while (it.hasNext()) {
Jonathan Hart29b972d2013-08-12 23:43:51 +1200191 IPatriciaTrie.Entry<RibEntry> entry = it.next();
Jonathan Hart8f5f4682013-08-07 22:13:39 +1200192 assertTrue(entry.getPrefix().equals(prefixes[order[i]]));
193 i++;
194 }
195 assertFalse(it.hasNext());
196 assertTrue(i == order.length);
197
Jonathan Hart29b972d2013-08-12 23:43:51 +1200198 IPatriciaTrie<RibEntry> pt = new PatriciaTrie<RibEntry>(32);
199 Iterator<IPatriciaTrie.Entry<RibEntry>> it2 = pt.iterator();
Jonathan Hart8f5f4682013-08-07 22:13:39 +1200200 assertFalse(it2.hasNext());
201 it.next(); //throws NoSuchElementException
202 }
203
204}