blob: c5138c13692eff6ba3e1064eba0208fb12a7b9e5 [file] [log] [blame]
Jonathan Hart8f6dc092014-04-18 15:56:43 -07001package net.onrc.onos.apps.sdnip;
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
Jonathan Hart5e54f2e2014-04-17 13:43:40 -070016public class PatriciaTreeTest {
Jonathan Hart8f5f4682013-08-07 22:13:39 +120017
Jonathan Hart5e54f2e2014-04-17 13:43:40 -070018 IPatriciaTree<RibEntry> ptree;
Ray Milkey269ffb92014-04-03 14:43:30 -070019 Prefix[] prefixes;
20 Map<Prefix, RibEntry> mappings;
Jonathan Hart8f5f4682013-08-07 22:13:39 +120021
Ray Milkey269ffb92014-04-03 14:43:30 -070022 @Before
23 public void setUp() throws Exception {
Jonathan Hart5e54f2e2014-04-17 13:43:40 -070024 ptree = new PatriciaTree<RibEntry>(32);
Ray Milkey269ffb92014-04-03 14:43:30 -070025 mappings = new HashMap<Prefix, RibEntry>();
Jonathan Hart8f5f4682013-08-07 22:13:39 +120026
Ray Milkey269ffb92014-04-03 14:43:30 -070027 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 };
Jonathan Hart8f5f4682013-08-07 22:13:39 +120038
Ray Milkey269ffb92014-04-03 14:43:30 -070039 for (int i = 0; i < prefixes.length; i++) {
40 mappings.put(prefixes[i], new RibEntry("192.168.10.101", "192.168.20." + i));
Jonathan Hart5e54f2e2014-04-17 13:43:40 -070041 ptree.put(prefixes[i], new RibEntry("192.168.10.101", "192.168.20." + i));
Ray Milkey269ffb92014-04-03 14:43:30 -070042 }
43 }
Jonathan Hart8f5f4682013-08-07 22:13:39 +120044
Ray Milkey269ffb92014-04-03 14:43:30 -070045 @After
46 public void tearDown() throws Exception {
47 }
Jonathan Hart8f5f4682013-08-07 22:13:39 +120048
Ray Milkey269ffb92014-04-03 14:43:30 -070049 @Test
50 public void testPut() {
Yuta HIGUCHI44a0b352014-05-14 21:32:48 -070051 ptree = new PatriciaTree<RibEntry>(32);
Jonathan Hart8f5f4682013-08-07 22:13:39 +120052
Ray Milkey269ffb92014-04-03 14:43:30 -070053 Prefix p1 = new Prefix("192.168.240.0", 20);
54 RibEntry r1 = new RibEntry("192.168.10.101", "192.168.60.2");
Jonathan Hart5e54f2e2014-04-17 13:43:40 -070055 RibEntry retval = ptree.put(p1, r1);
Ray Milkey269ffb92014-04-03 14:43:30 -070056 assertNull(retval);
Jonathan Hart5e54f2e2014-04-17 13:43:40 -070057 retval = ptree.lookup(p1);
Ray Milkey269ffb92014-04-03 14:43:30 -070058 assertTrue(r1 == retval); //should be the same object
59
60 Prefix p2 = new Prefix("192.160.0.0", 12);
61 RibEntry r2 = new RibEntry("192.168.10.101", "192.168.20.1");
Jonathan Hart5e54f2e2014-04-17 13:43:40 -070062 retval = ptree.put(p2, r2);
Ray Milkey269ffb92014-04-03 14:43:30 -070063 assertNull(retval);
64
65 Prefix p3 = new Prefix("192.168.208.0", 20);
66 RibEntry r3 = new RibEntry("192.168.10.101", "192.168.30.1");
Jonathan Hart5e54f2e2014-04-17 13:43:40 -070067 retval = ptree.put(p3, r3);
Ray Milkey269ffb92014-04-03 14:43:30 -070068 assertNull(retval);
69
70 //Insert a new RibEntry entry over a previous one
71 RibEntry r3new = new RibEntry("192.168.10.101", "192.168.60.2");
Jonathan Hart5e54f2e2014-04-17 13:43:40 -070072 retval = ptree.put(p3, r3new);
Ray Milkey269ffb92014-04-03 14:43:30 -070073 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.
78 //We will insert a RibEntry at this prefix
79 Prefix p4 = new Prefix("192.168.192.0", 18);
80 RibEntry r4 = new RibEntry("192.168.10.101", "192.168.40.1");
Jonathan Hart5e54f2e2014-04-17 13:43:40 -070081 retval = ptree.put(p4, r4);
Ray Milkey269ffb92014-04-03 14:43:30 -070082 assertNull(retval);
Jonathan Hart5e54f2e2014-04-17 13:43:40 -070083 retval = ptree.lookup(p4);
Ray Milkey269ffb92014-04-03 14:43:30 -070084 assertTrue(retval == r4); //should be the same object
85 }
86
87 @Test
88 public void testLookup() {
89 for (Map.Entry<Prefix, RibEntry> entry : mappings.entrySet()) {
Jonathan Hart5e54f2e2014-04-17 13:43:40 -070090 RibEntry r = ptree.lookup(entry.getKey());
Ray Milkey269ffb92014-04-03 14:43:30 -070091 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 Hart5e54f2e2014-04-17 13:43:40 -070096 RibEntry retval = ptree.lookup(p1);
Ray Milkey269ffb92014-04-03 14:43:30 -070097 assertNull(retval);
98
99 //We'll put a RibEntry at an aggregate node and check if lookup returns correctly
100 Prefix p2 = new Prefix("192.0.0.0", 4);
101 RibEntry r2 = new RibEntry("192.168.10.101", "192.168.60.1");
Jonathan Hart5e54f2e2014-04-17 13:43:40 -0700102 retval = ptree.put(p2, r2);
Ray Milkey269ffb92014-04-03 14:43:30 -0700103 assertNull(retval);
Jonathan Hart5e54f2e2014-04-17 13:43:40 -0700104 retval = ptree.lookup(p2);
Ray Milkey269ffb92014-04-03 14:43:30 -0700105 assertTrue(retval.equals(r2));
106 }
107
108 //@Ignore
109 @Test
110 public void testMatch() {
111 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
Jonathan Hart5e54f2e2014-04-17 13:43:40 -0700118 assertTrue(ptree.match(p1).equals(mappings.get(prefixes[0])));
119 assertTrue(ptree.match(p2).equals(mappings.get(prefixes[0])));
120 assertTrue(ptree.match(p3).equals(mappings.get(prefixes[1])));
121 assertNull(ptree.match(p4));
122 assertTrue(ptree.match(p5).equals(mappings.get(prefixes[2])));
123 //System.out.println(ptree.match(p6).getNextHop().getHostAddress());
124 assertTrue(ptree.match(p6).equals(mappings.get(prefixes[8])));
Ray Milkey269ffb92014-04-03 14:43:30 -0700125
126
127 //TODO more extensive tests
128 //fail("Not yet implemented");
129 }
130
131 @Test
132 public void testRemove() {
133 Prefix p1 = new Prefix("192.168.8.0", 23);
Jonathan Hart5e54f2e2014-04-17 13:43:40 -0700134 RibEntry retval = ptree.lookup(p1);
Ray Milkey269ffb92014-04-03 14:43:30 -0700135 assertNotNull(retval);
Jonathan Hart5e54f2e2014-04-17 13:43:40 -0700136 boolean success = ptree.remove(p1, retval);
Ray Milkey269ffb92014-04-03 14:43:30 -0700137 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
Jonathan Hart5e54f2e2014-04-17 13:43:40 -0700143 success = ptree.remove(null, null);
Ray Milkey269ffb92014-04-03 14:43:30 -0700144 assertFalse(success);
Jonathan Hart5e54f2e2014-04-17 13:43:40 -0700145 success = ptree.remove(p2, null);
Ray Milkey269ffb92014-04-03 14:43:30 -0700146 assertFalse(success);
147
148 //Check other prefixes are still there
Jonathan Hart5e54f2e2014-04-17 13:43:40 -0700149 retval = ptree.lookup(p2);
Ray Milkey269ffb92014-04-03 14:43:30 -0700150 assertNotNull(retval);
Jonathan Hart5e54f2e2014-04-17 13:43:40 -0700151 retval = ptree.lookup(p3);
Ray Milkey269ffb92014-04-03 14:43:30 -0700152 assertNotNull(retval);
153
154 Prefix p4 = new Prefix("9.17.0.0", 12);
Jonathan Hart5e54f2e2014-04-17 13:43:40 -0700155 retval = ptree.lookup(p4);
Ray Milkey269ffb92014-04-03 14:43:30 -0700156 assertNotNull(retval);
Jonathan Hart5e54f2e2014-04-17 13:43:40 -0700157 success = ptree.remove(p4, retval);
Ray Milkey269ffb92014-04-03 14:43:30 -0700158 assertTrue(success);
Jonathan Hart5e54f2e2014-04-17 13:43:40 -0700159 success = ptree.remove(p4, retval);
Ray Milkey269ffb92014-04-03 14:43:30 -0700160 assertFalse(success);
161
162 //Check other prefixes are still there
Jonathan Hart5e54f2e2014-04-17 13:43:40 -0700163 retval = ptree.lookup(p2);
Ray Milkey269ffb92014-04-03 14:43:30 -0700164 assertNotNull(retval);
Jonathan Hart5e54f2e2014-04-17 13:43:40 -0700165 retval = ptree.lookup(p3);
Ray Milkey269ffb92014-04-03 14:43:30 -0700166 assertNotNull(retval);
167
168 Prefix p5 = new Prefix("192.0.0.0", 7);
Jonathan Hart5e54f2e2014-04-17 13:43:40 -0700169 retval = ptree.lookup(p5);
Ray Milkey269ffb92014-04-03 14:43:30 -0700170 assertNotNull(retval);
Jonathan Hart5e54f2e2014-04-17 13:43:40 -0700171 success = ptree.remove(p5, retval);
Ray Milkey269ffb92014-04-03 14:43:30 -0700172 assertTrue(success);
173
174 //Check other prefixes are still there
Jonathan Hart5e54f2e2014-04-17 13:43:40 -0700175 retval = ptree.lookup(p2);
Ray Milkey269ffb92014-04-03 14:43:30 -0700176 assertNotNull(retval);
Jonathan Hart5e54f2e2014-04-17 13:43:40 -0700177 retval = ptree.lookup(p3);
Ray Milkey269ffb92014-04-03 14:43:30 -0700178 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 Hart5e54f2e2014-04-17 13:43:40 -0700187 Iterator<IPatriciaTree.Entry<RibEntry>> it = ptree.iterator();
Ray Milkey269ffb92014-04-03 14:43:30 -0700188 int i = 0;
189 assertTrue(it.hasNext());
190 while (it.hasNext()) {
Jonathan Hart5e54f2e2014-04-17 13:43:40 -0700191 IPatriciaTree.Entry<RibEntry> entry = it.next();
Ray Milkey269ffb92014-04-03 14:43:30 -0700192 assertTrue(entry.getPrefix().equals(prefixes[order[i]]));
193 i++;
194 }
195 assertFalse(it.hasNext());
196 assertTrue(i == order.length);
197
Jonathan Hart5e54f2e2014-04-17 13:43:40 -0700198 IPatriciaTree<RibEntry> pt = new PatriciaTree<RibEntry>(32);
199 Iterator<IPatriciaTree.Entry<RibEntry>> it2 = pt.iterator();
Ray Milkey269ffb92014-04-03 14:43:30 -0700200 assertFalse(it2.hasNext());
201 it.next(); //throws NoSuchElementException
202 }
Jonathan Hart8f5f4682013-08-07 22:13:39 +1200203
204}