blob: f5ad88b9871383ae50d229415d2af352996e717d [file] [log] [blame]
Thomas Vachuska24c849c2014-10-27 09:53:05 -07001/*
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07002 * Copyright 2014 Open Networking Laboratory
Thomas Vachuska24c849c2014-10-27 09:53:05 -07003 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07004 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
Thomas Vachuska24c849c2014-10-27 09:53:05 -07007 *
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07008 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
Thomas Vachuska24c849c2014-10-27 09:53:05 -070015 */
Ayaka Koshibe16698a32014-09-13 22:19:02 -070016package org.onlab.packet;
17
18import static org.junit.Assert.assertEquals;
Jonathan Hartb7a2ac32014-09-19 10:42:27 -070019import static org.junit.Assert.assertFalse;
Ayaka Koshibe40e7fec2014-09-16 22:32:19 -070020import static org.junit.Assert.assertTrue;
Ayaka Koshibe16698a32014-09-13 22:19:02 -070021
22import java.util.Arrays;
23
24import org.junit.Test;
Pavlin Radoslavov855ea2d2014-10-30 15:32:39 -070025import org.onlab.packet.IpAddress.Version;
Ayaka Koshibe16698a32014-09-13 22:19:02 -070026
27import com.google.common.testing.EqualsTester;
28
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -070029public class IpPrefixTest {
Ayaka Koshibe16698a32014-09-13 22:19:02 -070030
Ayaka Koshibe40e7fec2014-09-16 22:32:19 -070031 private static final byte [] BYTES1 = new byte [] {0xa, 0x0, 0x0, 0xa};
32 private static final byte [] BYTES2 = new byte [] {0xa, 0x0, 0x0, 0xb};
Pavlin Radoslavov855ea2d2014-10-30 15:32:39 -070033 private static final int INTVAL0 = 0x0a000000;
34 private static final int INTVAL1 = 0x0a00000a;
35 private static final int INTVAL2 = 0x0a00000b;
Pavlin Radoslavov52307e62014-10-29 15:07:37 -070036 private static final String STRVAL = "10.0.0.12/16";
37 private static final int MASK_LENGTH = 16;
Ayaka Koshibe16698a32014-09-13 22:19:02 -070038
39 @Test
40 public void testEquality() {
Pavlin Radoslavovd0e32d72014-10-31 18:11:43 -070041 IpPrefix ip1 = IpPrefix.valueOf(IpAddress.Version.INET,
42 BYTES1, IpPrefix.MAX_INET_MASK_LENGTH);
Pavlin Radoslavov52307e62014-10-29 15:07:37 -070043 IpPrefix ip2 = IpPrefix.valueOf(INTVAL1, IpPrefix.MAX_INET_MASK_LENGTH);
Pavlin Radoslavovd0e32d72014-10-31 18:11:43 -070044 IpPrefix ip3 = IpPrefix.valueOf(IpAddress.Version.INET,
45 BYTES2, IpPrefix.MAX_INET_MASK_LENGTH);
Pavlin Radoslavov52307e62014-10-29 15:07:37 -070046 IpPrefix ip4 = IpPrefix.valueOf(INTVAL2, IpPrefix.MAX_INET_MASK_LENGTH);
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -070047 IpPrefix ip5 = IpPrefix.valueOf(STRVAL);
Ayaka Koshibe16698a32014-09-13 22:19:02 -070048
Ayaka Koshibe40e7fec2014-09-16 22:32:19 -070049 new EqualsTester().addEqualityGroup(ip1, ip2)
50 .addEqualityGroup(ip3, ip4)
51 .addEqualityGroup(ip5)
Ayaka Koshibe16698a32014-09-13 22:19:02 -070052 .testEquals();
Ayaka Koshibe40e7fec2014-09-16 22:32:19 -070053
54 // string conversions
Pavlin Radoslavovd0e32d72014-10-31 18:11:43 -070055 IpPrefix ip6 = IpPrefix.valueOf(IpAddress.Version.INET,
56 BYTES1, MASK_LENGTH);
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -070057 IpPrefix ip7 = IpPrefix.valueOf("10.0.0.10/16");
Pavlin Radoslavovd0e32d72014-10-31 18:11:43 -070058 IpPrefix ip8 = IpPrefix.valueOf(IpAddress.Version.INET,
59 new byte [] {0xa, 0x0, 0x0, 0xc}, 16);
Ayaka Koshibe40e7fec2014-09-16 22:32:19 -070060 assertEquals("incorrect address conversion", ip6, ip7);
61 assertEquals("incorrect address conversion", ip5, ip8);
Ayaka Koshibe16698a32014-09-13 22:19:02 -070062 }
63
64 @Test
65 public void basics() {
Pavlin Radoslavovd0e32d72014-10-31 18:11:43 -070066 IpPrefix ip1 = IpPrefix.valueOf(IpAddress.Version.INET,
67 BYTES1, MASK_LENGTH);
Pavlin Radoslavov855ea2d2014-10-30 15:32:39 -070068 final byte [] bytes = new byte [] {0xa, 0x0, 0x0, 0x0};
Ayaka Koshibe40e7fec2014-09-16 22:32:19 -070069
Pavlin Radoslavov855ea2d2014-10-30 15:32:39 -070070 // check fields
Ayaka Koshibe40e7fec2014-09-16 22:32:19 -070071 assertEquals("incorrect IP Version", Version.INET, ip1.version());
Pavlin Radoslavov52307e62014-10-29 15:07:37 -070072 assertEquals("incorrect netmask", 16, ip1.prefixLength());
Pavlin Radoslavov855ea2d2014-10-30 15:32:39 -070073 assertTrue("faulty toOctets()",
74 Arrays.equals(bytes, ip1.address().toOctets()));
75 assertEquals("faulty toInt()", INTVAL0, ip1.address().toInt());
76 assertEquals("faulty toString()", "10.0.0.0/16", ip1.toString());
Ayaka Koshibe40e7fec2014-09-16 22:32:19 -070077 }
78
79 @Test
80 public void netmasks() {
81 // masked
Pavlin Radoslavovd0e32d72014-10-31 18:11:43 -070082 IpPrefix ip1 = IpPrefix.valueOf(IpAddress.Version.INET,
83 BYTES1, MASK_LENGTH);
Pavlin Radoslavov855ea2d2014-10-30 15:32:39 -070084 IpPrefix ip2 = IpPrefix.valueOf("10.0.0.10/16");
85 IpPrefix ip3 = IpPrefix.valueOf("10.0.0.0/16");
86 assertEquals("incorrect binary masked address",
87 ip1.toString(), "10.0.0.0/16");
88 assertEquals("incorrect string masked address",
89 ip2.toString(), "10.0.0.0/16");
90 assertEquals("incorrect network address",
91 ip2.toString(), "10.0.0.0/16");
Ayaka Koshibe16698a32014-09-13 22:19:02 -070092 }
Jonathan Hartb7a2ac32014-09-19 10:42:27 -070093
94 @Test
Jonathan Hart70da5122014-10-01 16:37:42 -070095 public void testContainsIpPrefix() {
Pavlin Radoslavovd0e32d72014-10-31 18:11:43 -070096 IpPrefix slash31 = IpPrefix.valueOf(IpAddress.Version.INET,
97 BYTES1, 31);
98 IpPrefix slash32 = IpPrefix.valueOf(IpAddress.Version.INET,
99 BYTES1, 32);
100 IpPrefix differentSlash32 = IpPrefix.valueOf(IpAddress.Version.INET,
101 BYTES2, 32);
Jonathan Hartb7a2ac32014-09-19 10:42:27 -0700102
103 assertTrue(slash31.contains(differentSlash32));
104 assertFalse(differentSlash32.contains(slash31));
105
106 assertTrue(slash31.contains(slash32));
107 assertFalse(slash32.contains(differentSlash32));
108 assertFalse(differentSlash32.contains(slash32));
109
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -0700110 IpPrefix zero = IpPrefix.valueOf("0.0.0.0/0");
Jonathan Hartb7a2ac32014-09-19 10:42:27 -0700111 assertTrue(zero.contains(differentSlash32));
112 assertFalse(differentSlash32.contains(zero));
113
Ayaka Koshibe1d56fe42014-09-19 16:51:58 -0700114 IpPrefix slash8 = IpPrefix.valueOf("10.0.0.0/8");
Jonathan Hartb7a2ac32014-09-19 10:42:27 -0700115 assertTrue(slash8.contains(slash31));
116 assertFalse(slash31.contains(slash8));
117 }
Jonathan Hart70da5122014-10-01 16:37:42 -0700118
119 @Test
120 public void testContainsIpAddress() {
Pavlin Radoslavovd0e32d72014-10-31 18:11:43 -0700121 IpPrefix slash31 = IpPrefix.valueOf(IpAddress.Version.INET,
122 BYTES1, 31);
123 IpAddress addr32 = IpAddress.valueOf(IpAddress.Version.INET, BYTES1);
Jonathan Hart70da5122014-10-01 16:37:42 -0700124
Pavlin Radoslavove7b5bd72014-10-27 20:17:24 -0700125 assertTrue(slash31.contains(addr32));
Jonathan Hart70da5122014-10-01 16:37:42 -0700126
127 IpPrefix intf = IpPrefix.valueOf("192.168.10.101/24");
128 IpAddress addr = IpAddress.valueOf("192.168.10.1");
129
130 assertTrue(intf.contains(addr));
Jonathan Hartdbdbdbb2014-10-06 18:35:30 -0700131
132 IpPrefix intf1 = IpPrefix.valueOf("10.0.0.101/24");
133 IpAddress addr1 = IpAddress.valueOf("10.0.0.4");
134
135 assertTrue(intf1.contains(addr1));
Jonathan Hart70da5122014-10-01 16:37:42 -0700136 }
Ayaka Koshibe16698a32014-09-13 22:19:02 -0700137}