blob: 957cbe0518c9d067b211967c032b1bb06e787c57 [file] [log] [blame]
Jonathan Hart8f6dc092014-04-18 15:56:43 -07001package net.onrc.onos.apps.sdnip;
Jonathan Hart8f5f4682013-08-07 22:13:39 +12002
Jonathan Harta88fd242014-04-03 11:24:54 -07003import static org.junit.Assert.assertEquals;
4import static org.junit.Assert.assertFalse;
Jonathan Hartf6978ce2014-06-23 11:20:04 -07005import static org.junit.Assert.assertNotNull;
Jonathan Harta88fd242014-04-03 11:24:54 -07006import static org.junit.Assert.assertTrue;
Jonathan Hart850dddc2014-08-28 09:54:10 -07007import static org.junit.Assert.fail;
Jonathan Hart8f5f4682013-08-07 22:13:39 +12008
9import java.util.Arrays;
Jonathan Hart850dddc2014-08-28 09:54:10 -070010import java.util.HashMap;
Jonathan Hartf6978ce2014-06-23 11:20:04 -070011import java.util.LinkedList;
12import java.util.List;
Jonathan Hart850dddc2014-08-28 09:54:10 -070013import java.util.Map;
Jonathan Hart8f5f4682013-08-07 22:13:39 +120014
15import org.junit.After;
16import org.junit.Before;
17import org.junit.Test;
18
19public class PrefixTest {
20
Jonathan Hartf6978ce2014-06-23 11:20:04 -070021 private List<PrefixTestData> testPrefixes;
22
23 private class PrefixTestData {
24 public final String dotNotation;
25 public final String binaryNotation;
26 public final int prefixLength;
27
28 public PrefixTestData(String dotNotation, int prefixLength,
29 String binaryNotation) {
30 this.dotNotation = dotNotation;
31 this.prefixLength = prefixLength;
32 this.binaryNotation = binaryNotation;
33 }
34 }
35
Ray Milkey269ffb92014-04-03 14:43:30 -070036 @Before
37 public void setUp() throws Exception {
Jonathan Hartf6978ce2014-06-23 11:20:04 -070038
39 testPrefixes = new LinkedList<>();
40
41 testPrefixes.add(new PrefixTestData("0.0.0.0", 0, ""));
42
43 testPrefixes.add(new PrefixTestData("192.168.166.0", 22,
44 "1100000010101000101001"));
45
46 testPrefixes.add(new PrefixTestData("192.168.166.0", 23,
47 "11000000101010001010011"));
48
49 testPrefixes.add(new PrefixTestData("192.168.166.0", 24,
50 "110000001010100010100110"));
51
52 testPrefixes.add(new PrefixTestData("130.162.10.1", 25,
53 "1000001010100010000010100"));
54
55 testPrefixes.add(new PrefixTestData("255.255.255.255", 32,
56 "11111111111111111111111111111111"));
Ray Milkey269ffb92014-04-03 14:43:30 -070057 }
Jonathan Hart8f5f4682013-08-07 22:13:39 +120058
Ray Milkey269ffb92014-04-03 14:43:30 -070059 @After
60 public void tearDown() throws Exception {
61 }
Jonathan Hart8f5f4682013-08-07 22:13:39 +120062
Ray Milkey269ffb92014-04-03 14:43:30 -070063 @Test
Jonathan Hartf6978ce2014-06-23 11:20:04 -070064 public void testNewPrefixFromByteArray() {
Ray Milkey269ffb92014-04-03 14:43:30 -070065 byte[] b1 = new byte[]{(byte) 0x8f, (byte) 0xa0, (byte) 0x00, (byte) 0x00};
66 byte[] b2 = new byte[]{(byte) 0x8f, (byte) 0xa0, (byte) 0xff, (byte) 0xff};
67 byte[] b3 = new byte[]{(byte) 0x8f, (byte) 0xac, (byte) 0x00, (byte) 0x00};
68 byte[] b4 = new byte[]{(byte) 0x8f, (byte) 0xa0, (byte) 0x00, (byte) 0x00};
Jonathan Hart8f5f4682013-08-07 22:13:39 +120069
Ray Milkey269ffb92014-04-03 14:43:30 -070070 Prefix p1 = new Prefix(b1, 12);
71 Prefix p2 = new Prefix(b2, 12);
72 Prefix p3 = new Prefix(b3, 12);
73 Prefix p4 = new Prefix(b4, 11);
Jonathan Hart8f5f4682013-08-07 22:13:39 +120074
Jonathan Hart850dddc2014-08-28 09:54:10 -070075 // Different input byte arrays, but Prefixes should be equal after
76 // construction
Ray Milkey269ffb92014-04-03 14:43:30 -070077 assertTrue(p1.equals(p2));
78 assertTrue(p2.equals(p3));
79
Jonathan Hart850dddc2014-08-28 09:54:10 -070080 // Same input byte array, but should be false
Ray Milkey269ffb92014-04-03 14:43:30 -070081 assertFalse(p1.equals(p4));
82
83 assertTrue(Arrays.equals(p1.getAddress(), p3.getAddress()));
84 assertTrue(p1.toString().equals(p2.toString()));
85 assertTrue(Arrays.equals(p1.getAddress(), p4.getAddress()));
86 assertFalse(p1.toString().equals(p4.toString()));
87 }
88
89 @Test
90 public void testPrefixString() {
91 Prefix p1 = new Prefix("192.168.166.0", 24);
92 Prefix p2 = new Prefix("192.168.166.0", 23);
93 Prefix p3 = new Prefix("192.168.166.128", 24);
94 Prefix p4 = new Prefix("192.168.166.128", 25);
95
96 assertFalse(p1.equals(p2));
97 assertTrue(Arrays.equals(p1.getAddress(), p2.getAddress()));
98
99 assertTrue(p1.equals(p3));
100 assertTrue(Arrays.equals(p1.getAddress(), p2.getAddress()));
101
102 assertFalse(p3.equals(p4));
103 assertFalse(Arrays.equals(p3.getAddress(), p4.getAddress()));
104
105 assertTrue(p1.toString().equals(p3.toString()));
106 assertEquals(p1.hashCode(), p3.hashCode());
107 }
108
109 @Test
110 public void testPrefixReturnsSame() {
Jonathan Hart850dddc2014-08-28 09:54:10 -0700111 // Create a prefix of all ones for each prefix length.
112 // Check that Prefix doesn't mangle it
Jonathan Hartf6978ce2014-06-23 11:20:04 -0700113 for (int prefixLength = 1; prefixLength <= Prefix.MAX_PREFIX_LENGTH; prefixLength++) {
114 byte[] address = new byte[Prefix.ADDRESS_LENGTH_BYTES];
Ray Milkey269ffb92014-04-03 14:43:30 -0700115
116 int lastByte = (prefixLength - 1) / Byte.SIZE;
117 int lastBit = (prefixLength - 1) % Byte.SIZE;
118
119 for (int j = 0; j < address.length; j++) {
120 if (j < lastByte) {
121 address[j] = (byte) 0xff;
122 } else if (j == lastByte) {
123 byte b = 0;
124 byte msb = (byte) 0x80;
125 for (int k = 0; k < Byte.SIZE; k++) {
126 if (k <= lastBit) {
127 b |= (msb >> k);
128 }
129 }
130 address[j] = b;
131 } else {
132 address[j] = 0;
133 }
134 }
135
136 Prefix p = new Prefix(address, prefixLength);
Jonathan Hartf6978ce2014-06-23 11:20:04 -0700137
Ray Milkey269ffb92014-04-03 14:43:30 -0700138 assertTrue(Arrays.equals(address, p.getAddress()));
139 }
140 }
Jonathan Hartf6978ce2014-06-23 11:20:04 -0700141
142 @Test
143 public void testToBinaryString() {
144 for (PrefixTestData testPrefix : testPrefixes) {
145 Prefix p = new Prefix(testPrefix.dotNotation, testPrefix.prefixLength);
146 assertEquals(testPrefix.binaryNotation, p.toBinaryString());
147 assertEquals(p.getPrefixLength(), p.toBinaryString().length());
148 }
149 }
150
151 @Test(expected = IllegalArgumentException.class)
152 public void testStringConstructorPrefixLengthTooSmall() {
153 String s = "255.255.255.255";
154
155 // Check the first valid prefix length works
156 Prefix p = new Prefix(s, Prefix.MIN_PREFIX_LENGTH);
157 assertNotNull(p);
158
159 // Should throw IllegalArgumentException
160 new Prefix(s, Prefix.MIN_PREFIX_LENGTH - 1);
161 }
162
163 @Test(expected = IllegalArgumentException.class)
164 public void testStringConstructorPrefixLengthTooLarge() {
165 String s = "255.255.255.255";
166
167 // Check the last valid prefix length works
168 Prefix p = new Prefix(s, Prefix.MAX_PREFIX_LENGTH);
169 assertNotNull(p);
170
171 // Should throw IllegalArgumentException
172 new Prefix(s, Prefix.MAX_PREFIX_LENGTH + 1);
173 }
174
175 @Test(expected = IllegalArgumentException.class)
176 public void testByteConstructorPrefixLengthTooSmall() {
177 byte[] b = new byte[]{(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff};
178
179 // Check the first valid prefix length works
180 Prefix p = new Prefix(b, Prefix.MIN_PREFIX_LENGTH);
181 assertNotNull(p);
182
183 // Should throw IllegalArgumentException
184 new Prefix(b, Prefix.MIN_PREFIX_LENGTH - 1);
185 }
186
187 @Test(expected = IllegalArgumentException.class)
188 public void testByteConstructorPrefixLengthTooLarge() {
189 byte[] b = new byte[]{(byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xff};
190
191 // Check the last valid prefix length works
192 Prefix p = new Prefix(b, Prefix.MAX_PREFIX_LENGTH);
193 assertNotNull(p);
194
195 // Should throw IllegalArgumentException
196 new Prefix(b, Prefix.MAX_PREFIX_LENGTH + 1);
197 }
Jonathan Hart850dddc2014-08-28 09:54:10 -0700198
199 @Test
200 public void testFromBinaryString() {
201 Map<String, String> binaryToDecimalDot = new HashMap<>();
202
203 binaryToDecimalDot.put("", "0.0.0.0/0");
204 binaryToDecimalDot.put("1", "128.0.0.0/1");
205 binaryToDecimalDot.put("10000001", "129.0.0.0/8");
206 binaryToDecimalDot.put("1011011110", "183.128.0.0/10");
207 binaryToDecimalDot.put("01001101000000001010010110110101", "77.0.165.181/32");
208
209 for (Map.Entry<String, String> entry : binaryToDecimalDot.entrySet()) {
210 Prefix p = Prefix.fromBinaryString(entry.getKey());
211 assertEquals(entry.getValue(), p.toString());
212 }
213 }
214
215 @Test
216 public void testFromBinaryStringInvalidInput() {
217 try {
218 Prefix.fromBinaryString("34102");
219 fail("Non-binary input should throw an exception");
220 } catch (IllegalArgumentException e) {
221 assertTrue(true);
222 }
223
224 try {
225 Prefix.fromBinaryString("-0101");
226 fail("Non-binary input should throw an exception");
227 } catch (IllegalArgumentException e) {
228 assertTrue(true);
229 }
230
231 try {
232 Prefix.fromBinaryString("01010101010101010101010101010102");
233 fail("Non-binary input should throw an exception");
234 } catch (IllegalArgumentException e) {
235 assertTrue(true);
236 }
237
238 try {
239 Prefix.fromBinaryString("010101010101010101010101010101011");
240 fail("Input too long should throw an exception");
241 } catch (IllegalArgumentException e) {
242 assertTrue(true);
243 }
244 }
Jonathan Hart8f5f4682013-08-07 22:13:39 +1200245}