Pavlin Radoslavov

Reimplementation of classes Ip4Address/Ip6Address/Ip4Prefix/Ip6Prefix

and the corresponding unit tests.

* Reimplemented classes Ip4Address and Ip6Address by inheriting from
  class IpAddress
* Reimplemented classes Ip4Prefix and Ip6Prefix by inheriting from
  class IpPrefix
* Reimplemented the unit tests Ip4AddressTest and Ip6AddressTest to
  match the corresponding IpAddressTest unit tests
* Reimplemented the unit tests Ip4PrefixTest and Ip6PrefixTest to
  match the corresponding IpPrefixTest unit tests
* Minor refactoring/cleanup of classes IpAddress and IpPrefix
...@@ -15,203 +15,160 @@ ...@@ -15,203 +15,160 @@
15 */ 15 */
16 package org.onlab.packet; 16 package org.onlab.packet;
17 17
18 +import java.net.InetAddress;
19 +import java.net.Inet4Address;
20 +import java.net.Inet6Address;
18 import java.nio.ByteBuffer; 21 import java.nio.ByteBuffer;
19 -import static com.google.common.base.Preconditions.checkNotNull; 22 +import java.util.Arrays;
23 +
24 +import com.google.common.net.InetAddresses;
20 25
21 /** 26 /**
22 - * The class representing an IPv4 address. 27 + * A class representing an IPv4 address.
23 * This class is immutable. 28 * This class is immutable.
24 */ 29 */
25 -public final class Ip4Address implements Comparable<Ip4Address> { 30 +public final class Ip4Address extends IpAddress {
26 - private final int value; 31 + public static final IpAddress.Version VERSION = IpAddress.Version.INET;
27 - 32 + public static final int BYTE_LENGTH = IpAddress.INET_BYTE_LENGTH;
28 - /** The length of the address in bytes (octets). */ 33 + public static final int BIT_LENGTH = IpAddress.INET_BIT_LENGTH;
29 - public static final int BYTE_LENGTH = 4;
30 -
31 - /** The length of the address in bits. */
32 - public static final int BIT_LENGTH = BYTE_LENGTH * Byte.SIZE;
33 34
34 /** 35 /**
35 - * Default constructor. 36 + * Constructor for given IP address version and address octets.
37 + *
38 + * @param value the IP address value stored in network byte order
39 + * (i.e., the most significant byte first)
40 + * @throws IllegalArgumentException if the arguments are invalid
36 */ 41 */
37 - public Ip4Address() { 42 + private Ip4Address(byte[] value) {
38 - this.value = 0; 43 + super(VERSION, value);
39 } 44 }
40 45
41 /** 46 /**
42 - * Copy constructor. 47 + * Returns the integer value of this IPv4 address.
43 * 48 *
44 - * @param other the object to copy from 49 + * @return the IPv4 address's value as an integer
45 */ 50 */
46 - public Ip4Address(Ip4Address other) { 51 + public int toInt() {
47 - this.value = other.value; 52 + ByteBuffer bb = ByteBuffer.wrap(super.toOctets());
53 + return bb.getInt();
48 } 54 }
49 55
50 /** 56 /**
51 - * Constructor from an integer value. 57 + * Converts an integer into an IPv4 address.
52 * 58 *
53 - * @param value the value to use 59 + * @param value an integer representing an IPv4 address value
60 + * @return an IPv4 address
54 */ 61 */
55 - public Ip4Address(int value) { 62 + public static Ip4Address valueOf(int value) {
56 - this.value = value; 63 + byte[] bytes =
64 + ByteBuffer.allocate(INET_BYTE_LENGTH).putInt(value).array();
65 + return new Ip4Address(bytes);
57 } 66 }
58 67
59 /** 68 /**
60 - * Constructor from a byte array with the IPv4 address stored in network 69 + * Converts a byte array into an IPv4 address.
61 - * byte order (i.e., the most significant byte first).
62 * 70 *
63 - * @param value the value to use 71 + * @param value the IPv4 address value stored in network byte order
72 + * (i.e., the most significant byte first)
73 + * @return an IPv4 address
74 + * @throws IllegalArgumentException if the argument is invalid
64 */ 75 */
65 - public Ip4Address(byte[] value) { 76 + public static Ip4Address valueOf(byte[] value) {
66 - this(value, 0); 77 + return new Ip4Address(value);
67 } 78 }
68 79
69 /** 80 /**
70 - * Constructor from a byte array with the IPv4 address stored in network 81 + * Converts a byte array and a given offset from the beginning of the
71 - * byte order (i.e., the most significant byte first), and a given offset 82 + * array into an IPv4 address.
72 - * from the beginning of the byte array. 83 + * <p>
73 - * 84 + * The IP address is stored in network byte order (i.e., the most
85 + * significant byte first).
86 + * </p>
74 * @param value the value to use 87 * @param value the value to use
75 * @param offset the offset in bytes from the beginning of the byte array 88 * @param offset the offset in bytes from the beginning of the byte array
89 + * @return an IPv4 address
90 + * @throws IllegalArgumentException if the arguments are invalid
76 */ 91 */
77 - public Ip4Address(byte[] value, int offset) { 92 + public static Ip4Address valueOf(byte[] value, int offset) {
78 - checkNotNull(value); 93 + IpAddress.checkArguments(VERSION, value, offset);
79 - 94 + byte[] bc = Arrays.copyOfRange(value, offset, value.length);
80 - // Verify the arguments 95 + return Ip4Address.valueOf(bc);
81 - if ((offset < 0) || (offset + BYTE_LENGTH > value.length)) {
82 - String msg;
83 - if (value.length < BYTE_LENGTH) {
84 - msg = "Invalid IPv4 address array: array length: " +
85 - value.length + ". Must be at least " + BYTE_LENGTH;
86 - } else {
87 - msg = "Invalid IPv4 address array: array offset: " +
88 - offset + ". Must be in the interval [0, " +
89 - (value.length - BYTE_LENGTH) + "]";
90 - }
91 - throw new IllegalArgumentException(msg);
92 - }
93 -
94 - // Read the address
95 - ByteBuffer bb = ByteBuffer.wrap(value);
96 - this.value = bb.getInt(offset);
97 } 96 }
98 97
99 /** 98 /**
100 - * Constructs an IPv4 address from a string representation of the address. 99 + * Converts an InetAddress into an IPv4 address.
101 - *<p>
102 - * Example: "1.2.3.4"
103 * 100 *
104 - * @param value the value to use 101 + * @param inetAddress the InetAddress value to use. It must contain an IPv4
102 + * address
103 + * @return an IPv4 address
104 + * @throws IllegalArgumentException if the argument is invalid
105 */ 105 */
106 - public Ip4Address(String value) { 106 + public static Ip4Address valueOf(InetAddress inetAddress) {
107 - checkNotNull(value); 107 + byte[] bytes = inetAddress.getAddress();
108 - 108 + if (inetAddress instanceof Inet4Address) {
109 - String[] splits = value.split("\\."); 109 + return new Ip4Address(bytes);
110 - if (splits.length != 4) { 110 + }
111 - final String msg = "Invalid IPv4 address string: " + value; 111 + if ((inetAddress instanceof Inet6Address) ||
112 + (bytes.length == INET6_BYTE_LENGTH)) {
113 + final String msg = "Invalid IPv4 version address string: " +
114 + inetAddress.toString();
112 throw new IllegalArgumentException(msg); 115 throw new IllegalArgumentException(msg);
113 } 116 }
114 - 117 + // Use the number of bytes as a hint
115 - int result = 0; 118 + if (bytes.length == INET_BYTE_LENGTH) {
116 - for (int i = 0; i < BYTE_LENGTH; i++) { 119 + return new Ip4Address(bytes);
117 - result |= Integer.parseInt(splits[i]) <<
118 - ((BYTE_LENGTH - (i + 1)) * Byte.SIZE);
119 } 120 }
120 - this.value = result; 121 + final String msg = "Unrecognized IP version address string: " +
122 + inetAddress.toString();
123 + throw new IllegalArgumentException(msg);
121 } 124 }
122 125
123 /** 126 /**
124 - * Gets the IPv4 address as a byte array. 127 + * Converts an IPv4 string literal (e.g., "10.2.3.4") into an IP address.
125 * 128 *
126 - * @return a byte array with the IPv4 address stored in network byte order 129 + * @param value an IPv4 address value in string form
127 - * (i.e., the most significant byte first). 130 + * @return an IPv4 address
131 + * @throws IllegalArgumentException if the argument is invalid
128 */ 132 */
129 - public byte[] toOctets() { 133 + public static Ip4Address valueOf(String value) {
130 - return ByteBuffer.allocate(BYTE_LENGTH).putInt(value).array(); 134 + InetAddress inetAddress = null;
135 + try {
136 + inetAddress = InetAddresses.forString(value);
137 + } catch (IllegalArgumentException e) {
138 + final String msg = "Invalid IP address string: " + value;
139 + throw new IllegalArgumentException(msg);
140 + }
141 + return valueOf(inetAddress);
131 } 142 }
132 143
133 /** 144 /**
134 * Creates an IPv4 network mask prefix. 145 * Creates an IPv4 network mask prefix.
135 * 146 *
136 - * @param prefixLen the length of the mask prefix. Must be in the interval 147 + * @param prefixLength the length of the mask prefix. Must be in the
137 - * [0, 32]. 148 + * interval [0, 32]
138 * @return a new IPv4 address that contains a mask prefix of the 149 * @return a new IPv4 address that contains a mask prefix of the
139 * specified length 150 * specified length
151 + * @throws IllegalArgumentException if the argument is invalid
140 */ 152 */
141 - public static Ip4Address makeMaskPrefix(int prefixLen) { 153 + public static Ip4Address makeMaskPrefix(int prefixLength) {
142 - // Verify the prefix length 154 + byte[] mask = IpAddress.makeMaskPrefixArray(VERSION, prefixLength);
143 - if ((prefixLen < 0) || (prefixLen > Ip4Address.BIT_LENGTH)) { 155 + return new Ip4Address(mask);
144 - final String msg = "Invalid IPv4 prefix length: " + prefixLen +
145 - ". Must be in the interval [0, 32].";
146 - throw new IllegalArgumentException(msg);
147 - }
148 -
149 - long v =
150 - (0xffffffffL << (Ip4Address.BIT_LENGTH - prefixLen)) & 0xffffffffL;
151 - return new Ip4Address((int) v);
152 } 156 }
153 157
154 /** 158 /**
155 * Creates an IPv4 address by masking it with a network mask of given 159 * Creates an IPv4 address by masking it with a network mask of given
156 * mask length. 160 * mask length.
157 * 161 *
158 - * @param addr the address to mask 162 + * @param address the address to mask
159 - * @param prefixLen the length of the mask prefix. Must be in the interval 163 + * @param prefixLength the length of the mask prefix. Must be in the
160 - * [0, 32]. 164 + * interval [0, 32]
161 * @return a new IPv4 address that is masked with a mask prefix of the 165 * @return a new IPv4 address that is masked with a mask prefix of the
162 * specified length 166 * specified length
167 + * @throws IllegalArgumentException if the prefix length is invalid
163 */ 168 */
164 - public static Ip4Address makeMaskedAddress(final Ip4Address addr, 169 + public static Ip4Address makeMaskedAddress(final Ip4Address address,
165 - int prefixLen) { 170 + int prefixLength) {
166 - Ip4Address mask = Ip4Address.makeMaskPrefix(prefixLen); 171 + byte[] net = makeMaskedAddressArray(address, prefixLength);
167 - long v = addr.value & mask.value; 172 + return Ip4Address.valueOf(net);
168 -
169 - return new Ip4Address((int) v);
170 - }
171 -
172 - /**
173 - * Gets the value of the IPv4 address.
174 - *
175 - * @return the value of the IPv4 address
176 - */
177 - public int getValue() {
178 - return value;
179 - }
180 -
181 - /**
182 - * Converts the IPv4 value to a '.' separated string.
183 - *
184 - * @return the IPv4 value as a '.' separated string
185 - */
186 - @Override
187 - public String toString() {
188 - return ((this.value >> 24) & 0xff) + "." +
189 - ((this.value >> 16) & 0xff) + "." +
190 - ((this.value >> 8) & 0xff) + "." +
191 - (this.value & 0xff);
192 - }
193 -
194 - @Override
195 - public boolean equals(Object o) {
196 - if (!(o instanceof Ip4Address)) {
197 - return false;
198 - }
199 - Ip4Address other = (Ip4Address) o;
200 - if (this.value != other.value) {
201 - return false;
202 - }
203 - return true;
204 - }
205 -
206 - @Override
207 - public int hashCode() {
208 - return this.value;
209 - }
210 -
211 - @Override
212 - public int compareTo(Ip4Address o) {
213 - Long lv = ((long) this.value) & 0xffffffffL;
214 - Long rv = ((long) o.value) & 0xffffffffL;
215 - return lv.compareTo(rv);
216 } 173 }
217 } 174 }
......
...@@ -15,110 +15,90 @@ ...@@ -15,110 +15,90 @@
15 */ 15 */
16 package org.onlab.packet; 16 package org.onlab.packet;
17 17
18 -import java.util.Objects;
19 -
20 /** 18 /**
21 * The class representing an IPv4 network address. 19 * The class representing an IPv4 network address.
22 * This class is immutable. 20 * This class is immutable.
23 */ 21 */
24 -public final class Ip4Prefix { 22 +public final class Ip4Prefix extends IpPrefix {
25 - private final Ip4Address address; // The IPv4 address 23 + public static final IpAddress.Version VERSION = IpAddress.Version.INET;
26 - private final short prefixLen; // The prefix length 24 + // Maximum network mask length
25 + public static final int MAX_MASK_LENGTH = IpPrefix.MAX_INET_MASK_LENGTH;
27 26
28 /** 27 /**
29 - * Default constructor. 28 + * Constructor for given IPv4 address, and a prefix length.
30 - */
31 - public Ip4Prefix() {
32 - this.address = new Ip4Address();
33 - this.prefixLen = 0;
34 - }
35 -
36 - /**
37 - * Copy constructor.
38 * 29 *
39 - * @param other the object to copy from 30 + * @param address the IPv4 address
31 + * @param prefixLength the prefix length
32 + * @throws IllegalArgumentException if the prefix length value is invalid
40 */ 33 */
41 - public Ip4Prefix(Ip4Prefix other) { 34 + private Ip4Prefix(Ip4Address address, int prefixLength) {
42 - this.address = new Ip4Address(other.address); 35 + super(address, prefixLength);
43 - this.prefixLen = other.prefixLen;
44 } 36 }
45 37
46 /** 38 /**
47 - * Constructor for a given address and prefix length. 39 + * Returns the IPv4 address value of the prefix.
48 * 40 *
49 - * @param address the address to use 41 + * @return the IPv4 address value of the prefix
50 - * @param prefixLen the prefix length to use
51 */ 42 */
52 - public Ip4Prefix(Ip4Address address, short prefixLen) { 43 + public Ip4Address address() {
53 - this.address = Ip4Address.makeMaskedAddress(address, prefixLen); 44 + IpAddress a = super.address();
54 - this.prefixLen = prefixLen; 45 + return (Ip4Address) a;
55 } 46 }
56 47
57 /** 48 /**
58 - * Constructs an IPv4 prefix from a string representation of the 49 + * Converts an integer and a prefix length into an IPv4 prefix.
59 - * prefix.
60 - *<p>
61 - * Example: "1.2.0.0/16"
62 * 50 *
63 - * @param value the value to use 51 + * @param address an integer representing the IPv4 address
52 + * @param prefixLength the prefix length
53 + * @return an IPv4 prefix
54 + * @throws IllegalArgumentException if the prefix length value is invalid
64 */ 55 */
65 - public Ip4Prefix(String value) { 56 + public static Ip4Prefix valueOf(int address, int prefixLength) {
66 - String[] splits = value.split("/"); 57 + return new Ip4Prefix(Ip4Address.valueOf(address), prefixLength);
67 - if (splits.length != 2) {
68 - throw new IllegalArgumentException("Specified IPv4 prefix must contain an IPv4 " +
69 - "address and a prefix length separated by '/'");
70 - }
71 - this.prefixLen = Short.decode(splits[1]);
72 - this.address = Ip4Address.makeMaskedAddress(new Ip4Address(splits[0]),
73 - this.prefixLen);
74 } 58 }
75 59
76 /** 60 /**
77 - * Gets the address value of the IPv4 prefix. 61 + * Converts a byte array and a prefix length into an IPv4 prefix.
78 * 62 *
79 - * @return the address value of the IPv4 prefix 63 + * @param address the IPv4 address value stored in network byte order
64 + * @param prefixLength the prefix length
65 + * @return an IPv4 prefix
66 + * @throws IllegalArgumentException if the prefix length value is invalid
80 */ 67 */
81 - public Ip4Address getAddress() { 68 + public static Ip4Prefix valueOf(byte[] address, int prefixLength) {
82 - return address; 69 + return new Ip4Prefix(Ip4Address.valueOf(address), prefixLength);
83 } 70 }
84 71
85 /** 72 /**
86 - * Gets the prefix length value of the IPv4 prefix. 73 + * Converts an IPv4 address and a prefix length into an IPv4 prefix.
87 * 74 *
88 - * @return the prefix length value of the IPv4 prefix 75 + * @param address the IPv4 address
76 + * @param prefixLength the prefix length
77 + * @return an IPv4 prefix
78 + * @throws IllegalArgumentException if the prefix length value is invalid
89 */ 79 */
90 - public short getPrefixLen() { 80 + public static Ip4Prefix valueOf(Ip4Address address, int prefixLength) {
91 - return prefixLen; 81 + return new Ip4Prefix(address, prefixLength);
92 } 82 }
93 83
94 /** 84 /**
95 - * Converts the IPv4 prefix value to an "address/prefixLen" string. 85 + * Converts a CIDR (slash) notation string (e.g., "10.1.0.0/16")
86 + * into an IPv4 prefix.
96 * 87 *
97 - * @return the IPv4 prefix value as an "address/prefixLen" string 88 + * @param address an IP prefix in string form (e.g., "10.1.0.0/16")
89 + * @return an IPv4 prefix
90 + * @throws IllegalArgumentException if the arguments are invalid
98 */ 91 */
99 - @Override 92 + public static Ip4Prefix valueOf(String address) {
100 - public String toString() { 93 + final String[] parts = address.split("/");
101 - return this.address.toString() + "/" + this.prefixLen; 94 + if (parts.length != 2) {
102 - } 95 + String msg = "Malformed IPv4 prefix string: " + address + "." +
103 - 96 + "Address must take form \"x.x.x.x/y\"";
104 - @Override 97 + throw new IllegalArgumentException(msg);
105 - public boolean equals(Object other) {
106 - if (other == this) {
107 - return true;
108 - }
109 -
110 - if (!(other instanceof Ip4Prefix)) {
111 - return false;
112 - }
113 -
114 - Ip4Prefix otherIp4Prefix = (Ip4Prefix) other;
115 -
116 - return Objects.equals(this.address, otherIp4Prefix.address)
117 - && this.prefixLen == otherIp4Prefix.prefixLen;
118 } 98 }
99 + Ip4Address ipAddress = Ip4Address.valueOf(parts[0]);
100 + int prefixLength = Integer.parseInt(parts[1]);
119 101
120 - @Override 102 + return new Ip4Prefix(ipAddress, prefixLength);
121 - public int hashCode() {
122 - return Objects.hash(address, prefixLen);
123 } 103 }
124 } 104 }
......
...@@ -16,260 +16,137 @@ ...@@ -16,260 +16,137 @@
16 package org.onlab.packet; 16 package org.onlab.packet;
17 17
18 import java.net.InetAddress; 18 import java.net.InetAddress;
19 -import java.net.UnknownHostException; 19 +import java.net.Inet4Address;
20 -import java.nio.ByteBuffer; 20 +import java.net.Inet6Address;
21 -import java.util.Objects; 21 +import java.util.Arrays;
22 22
23 import com.google.common.net.InetAddresses; 23 import com.google.common.net.InetAddresses;
24 -import com.google.common.primitives.UnsignedLongs;
25 -
26 -import static com.google.common.base.Preconditions.checkNotNull;
27 -import static com.google.common.base.Preconditions.checkState;
28 24
29 /** 25 /**
30 - * The class representing an IPv6 address. 26 + * A class representing an IPv6 address.
31 * This class is immutable. 27 * This class is immutable.
32 */ 28 */
33 -public final class Ip6Address implements Comparable<Ip6Address> { 29 +public final class Ip6Address extends IpAddress {
34 - private final long valueHigh; // The higher (more significant) 64 bits 30 + public static final IpAddress.Version VERSION = IpAddress.Version.INET6;
35 - private final long valueLow; // The lower (less significant) 64 bits 31 + public static final int BYTE_LENGTH = IpAddress.INET6_BYTE_LENGTH;
36 - 32 + public static final int BIT_LENGTH = IpAddress.INET6_BIT_LENGTH;
37 - /** The length of the address in bytes (octets). */
38 - public static final int BYTE_LENGTH = 16;
39 -
40 - /** The length of the address in bits. */
41 - public static final int BIT_LENGTH = BYTE_LENGTH * Byte.SIZE;
42 -
43 - /**
44 - * Default constructor.
45 - */
46 - public Ip6Address() {
47 - this.valueHigh = 0;
48 - this.valueLow = 0;
49 - }
50 33
51 /** 34 /**
52 - * Copy constructor. 35 + * Constructor for given IP address version and address octets.
53 * 36 *
54 - * @param other the object to copy from 37 + * @param value the IP address value stored in network byte order
38 + * (i.e., the most significant byte first)
39 + * @throws IllegalArgumentException if the arguments are invalid
55 */ 40 */
56 - public Ip6Address(Ip6Address other) { 41 + private Ip6Address(byte[] value) {
57 - this.valueHigh = other.valueHigh; 42 + super(VERSION, value);
58 - this.valueLow = other.valueLow;
59 } 43 }
60 44
61 /** 45 /**
62 - * Constructor from integer values. 46 + * Converts a byte array into an IPv6 address.
63 * 47 *
64 - * @param valueHigh the higher (more significant) 64 bits of the address 48 + * @param value the IPv6 address value stored in network byte order
65 - * @param valueLow the lower (less significant) 64 bits of the address 49 + * (i.e., the most significant byte first)
50 + * @return an IPv6 address
51 + * @throws IllegalArgumentException if the argument is invalid
66 */ 52 */
67 - public Ip6Address(long valueHigh, long valueLow) { 53 + public static Ip6Address valueOf(byte[] value) {
68 - this.valueHigh = valueHigh; 54 + return new Ip6Address(value);
69 - this.valueLow = valueLow;
70 } 55 }
71 56
72 /** 57 /**
73 - * Constructor from a byte array with the IPv6 address stored in network 58 + * Converts a byte array and a given offset from the beginning of the
74 - * byte order (i.e., the most significant byte first). 59 + * array into an IPv6 address.
75 - * 60 + * <p>
61 + * The IP address is stored in network byte order (i.e., the most
62 + * significant byte first).
63 + * </p>
76 * @param value the value to use 64 * @param value the value to use
65 + * @param offset the offset in bytes from the beginning of the byte array
66 + * @return an IPv6 address
67 + * @throws IllegalArgumentException if the arguments are invalid
77 */ 68 */
78 - public Ip6Address(byte[] value) { 69 + public static Ip6Address valueOf(byte[] value, int offset) {
79 - this(value, 0); 70 + IpAddress.checkArguments(VERSION, value, offset);
71 + byte[] bc = Arrays.copyOfRange(value, offset, value.length);
72 + return Ip6Address.valueOf(bc);
80 } 73 }
81 74
82 /** 75 /**
83 - * Constructor from a byte array with the IPv6 address stored in network 76 + * Converts an InetAddress into an IPv6 address.
84 - * byte order (i.e., the most significant byte first), and a given offset
85 - * from the beginning of the byte array.
86 * 77 *
87 - * @param value the value to use 78 + * @param inetAddress the InetAddress value to use. It must contain an IPv6
88 - * @param offset the offset in bytes from the beginning of the byte array 79 + * address
80 + * @return an IPv6 address
81 + * @throws IllegalArgumentException if the argument is invalid
89 */ 82 */
90 - public Ip6Address(byte[] value, int offset) { 83 + public static Ip6Address valueOf(InetAddress inetAddress) {
91 - checkNotNull(value); 84 + byte[] bytes = inetAddress.getAddress();
92 - 85 + if (inetAddress instanceof Inet6Address) {
93 - // Verify the arguments 86 + return new Ip6Address(bytes);
94 - if ((offset < 0) || (offset + BYTE_LENGTH > value.length)) { 87 + }
95 - String msg; 88 + if ((inetAddress instanceof Inet4Address) ||
96 - if (value.length < BYTE_LENGTH) { 89 + (bytes.length == INET_BYTE_LENGTH)) {
97 - msg = "Invalid IPv6 address array: array length: " + 90 + final String msg = "Invalid IPv6 version address string: " +
98 - value.length + ". Must be at least " + BYTE_LENGTH; 91 + inetAddress.toString();
99 - } else {
100 - msg = "Invalid IPv6 address array: array offset: " +
101 - offset + ". Must be in the interval [0, " +
102 - (value.length - BYTE_LENGTH) + "]";
103 - }
104 throw new IllegalArgumentException(msg); 92 throw new IllegalArgumentException(msg);
105 } 93 }
106 - 94 + // Use the number of bytes as a hint
107 - // Read the address 95 + if (bytes.length == INET6_BYTE_LENGTH) {
108 - ByteBuffer bb = ByteBuffer.wrap(value); 96 + return new Ip6Address(bytes);
109 - bb.position(offset); 97 + }
110 - this.valueHigh = bb.getLong(); 98 + final String msg = "Unrecognized IP version address string: " +
111 - this.valueLow = bb.getLong(); 99 + inetAddress.toString();
100 + throw new IllegalArgumentException(msg);
112 } 101 }
113 102
114 /** 103 /**
115 - * Constructs an IPv6 address from a string representation of the address. 104 + * Converts an IPv6 string literal (e.g., "1111:2222::8888") into an IP
116 - *<p> 105 + * address.
117 - * Example: "1111:2222::8888"
118 * 106 *
119 - * @param value the value to use 107 + * @param value an IPv6 address value in string form
108 + * @return an IPv6 address
109 + * @throws IllegalArgumentException if the argument is invalid
120 */ 110 */
121 - public Ip6Address(String value) { 111 + public static Ip6Address valueOf(String value) {
122 - checkNotNull(value); 112 + InetAddress inetAddress = null;
123 -
124 - if (value.isEmpty()) {
125 - final String msg = "Specified IPv6 cannot be an empty string";
126 - throw new IllegalArgumentException(msg);
127 - }
128 - InetAddress addr = null;
129 try { 113 try {
130 - addr = InetAddresses.forString(value); 114 + inetAddress = InetAddresses.forString(value);
131 } catch (IllegalArgumentException e) { 115 } catch (IllegalArgumentException e) {
132 - final String msg = "Invalid IPv6 address string: " + value; 116 + final String msg = "Invalid IP address string: " + value;
133 throw new IllegalArgumentException(msg); 117 throw new IllegalArgumentException(msg);
134 } 118 }
135 - byte[] bytes = addr.getAddress(); 119 + return valueOf(inetAddress);
136 - ByteBuffer bb = ByteBuffer.wrap(bytes);
137 - this.valueHigh = bb.getLong();
138 - this.valueLow = bb.getLong();
139 - }
140 -
141 - /**
142 - * Gets the IPv6 address as a byte array.
143 - *
144 - * @return a byte array with the IPv6 address stored in network byte order
145 - * (i.e., the most significant byte first).
146 - */
147 - public byte[] toOctets() {
148 - return ByteBuffer.allocate(BYTE_LENGTH)
149 - .putLong(valueHigh).putLong(valueLow).array();
150 } 120 }
151 121
152 /** 122 /**
153 * Creates an IPv6 network mask prefix. 123 * Creates an IPv6 network mask prefix.
154 * 124 *
155 - * @param prefixLen the length of the mask prefix. Must be in the interval 125 + * @param prefixLength the length of the mask prefix. Must be in the
156 - * [0, 128]. 126 + * interval [0, 128]
157 * @return a new IPv6 address that contains a mask prefix of the 127 * @return a new IPv6 address that contains a mask prefix of the
158 * specified length 128 * specified length
129 + * @throws IllegalArgumentException if the arguments are invalid
159 */ 130 */
160 - public static Ip6Address makeMaskPrefix(int prefixLen) { 131 + public static Ip6Address makeMaskPrefix(int prefixLength) {
161 - long vh, vl; 132 + byte[] mask = IpAddress.makeMaskPrefixArray(VERSION, prefixLength);
162 - 133 + return new Ip6Address(mask);
163 - // Verify the prefix length
164 - if ((prefixLen < 0) || (prefixLen > Ip6Address.BIT_LENGTH)) {
165 - final String msg = "Invalid IPv6 prefix length: " + prefixLen +
166 - ". Must be in the interval [0, 128].";
167 - throw new IllegalArgumentException(msg);
168 - }
169 -
170 - if (prefixLen == 0) {
171 - //
172 - // NOTE: Apparently, the result of "<< 64" shifting to the left
173 - // results in all 1s instead of all 0s, hence we handle it as
174 - // a special case.
175 - //
176 - vh = 0;
177 - vl = 0;
178 - } else if (prefixLen <= 64) {
179 - vh = (0xffffffffffffffffL << (64 - prefixLen)) & 0xffffffffffffffffL;
180 - vl = 0;
181 - } else {
182 - vh = -1L; // All 1s
183 - vl = (0xffffffffffffffffL << (128 - prefixLen)) & 0xffffffffffffffffL;
184 - }
185 - return new Ip6Address(vh, vl);
186 } 134 }
187 135
188 /** 136 /**
189 * Creates an IPv6 address by masking it with a network mask of given 137 * Creates an IPv6 address by masking it with a network mask of given
190 * mask length. 138 * mask length.
191 * 139 *
192 - * @param addr the address to mask 140 + * @param address the address to mask
193 - * @param prefixLen the length of the mask prefix. Must be in the interval 141 + * @param prefixLength the length of the mask prefix. Must be in the
194 - * [0, 128]. 142 + * interval [0, 128]
195 * @return a new IPv6 address that is masked with a mask prefix of the 143 * @return a new IPv6 address that is masked with a mask prefix of the
196 * specified length 144 * specified length
145 + * @throws IllegalArgumentException if the prefix length is invalid
197 */ 146 */
198 - public static Ip6Address makeMaskedAddress(final Ip6Address addr, 147 + public static Ip6Address makeMaskedAddress(final Ip6Address address,
199 - int prefixLen) { 148 + int prefixLength) {
200 - Ip6Address mask = Ip6Address.makeMaskPrefix(prefixLen); 149 + byte[] net = makeMaskedAddressArray(address, prefixLength);
201 - long vh = addr.valueHigh & mask.valueHigh; 150 + return Ip6Address.valueOf(net);
202 - long vl = addr.valueLow & mask.valueLow;
203 -
204 - return new Ip6Address(vh, vl);
205 - }
206 -
207 - /**
208 - * Gets the value of the higher (more significant) 64 bits of the address.
209 - *
210 - * @return the value of the higher (more significant) 64 bits of the
211 - * address
212 - */
213 - public long getValueHigh() {
214 - return valueHigh;
215 - }
216 -
217 - /**
218 - * Gets the value of the lower (less significant) 64 bits of the address.
219 - *
220 - * @return the value of the lower (less significant) 64 bits of the
221 - * address
222 - */
223 - public long getValueLow() {
224 - return valueLow;
225 - }
226 -
227 - /**
228 - * Converts the IPv6 value to a ':' separated string.
229 - *
230 - * @return the IPv6 value as a ':' separated string
231 - */
232 - @Override
233 - public String toString() {
234 - ByteBuffer bb = ByteBuffer.allocate(Ip6Address.BYTE_LENGTH);
235 - bb.putLong(valueHigh);
236 - bb.putLong(valueLow);
237 - InetAddress inetAddr = null;
238 - try {
239 - inetAddr = InetAddress.getByAddress(bb.array());
240 - } catch (UnknownHostException e) {
241 - // Should never happen
242 - checkState(false, "Internal error: Ip6Address.toString()");
243 - return "::";
244 - }
245 - return InetAddresses.toAddrString(inetAddr);
246 - }
247 -
248 - @Override
249 - public boolean equals(Object o) {
250 - if (!(o instanceof Ip6Address)) {
251 - return false;
252 - }
253 - Ip6Address other = (Ip6Address) o;
254 - return this.valueHigh == other.valueHigh
255 - && this.valueLow == other.valueLow;
256 - }
257 -
258 - @Override
259 - public int hashCode() {
260 - return Objects.hash(valueHigh, valueLow);
261 - }
262 -
263 - @Override
264 - public int compareTo(Ip6Address o) {
265 - // Compare the high-order 64-bit value
266 - if (this.valueHigh != o.valueHigh) {
267 - return UnsignedLongs.compare(this.valueHigh, o.valueHigh);
268 - }
269 - // Compare the low-order 64-bit value
270 - if (this.valueLow != o.valueLow) {
271 - return UnsignedLongs.compare(this.valueLow, o.valueLow);
272 - }
273 - return 0;
274 } 151 }
275 } 152 }
......
...@@ -15,110 +15,79 @@ ...@@ -15,110 +15,79 @@
15 */ 15 */
16 package org.onlab.packet; 16 package org.onlab.packet;
17 17
18 -import java.util.Objects;
19 -
20 /** 18 /**
21 * The class representing an IPv6 network address. 19 * The class representing an IPv6 network address.
22 * This class is immutable. 20 * This class is immutable.
23 */ 21 */
24 -public final class Ip6Prefix { 22 +public final class Ip6Prefix extends IpPrefix {
25 - private final Ip6Address address; // The IPv6 address 23 + public static final IpAddress.Version VERSION = IpAddress.Version.INET6;
26 - private final short prefixLen; // The prefix length 24 + // Maximum network mask length
27 - 25 + public static final int MAX_MASK_LENGTH = IpPrefix.MAX_INET6_MASK_LENGTH;
28 - /**
29 - * Default constructor.
30 - */
31 - public Ip6Prefix() {
32 - this.address = new Ip6Address();
33 - this.prefixLen = 0;
34 - }
35 -
36 - /**
37 - * Copy constructor.
38 - *
39 - * @param other the object to copy from
40 - */
41 - public Ip6Prefix(Ip6Prefix other) {
42 - this.address = new Ip6Address(other.address);
43 - this.prefixLen = other.prefixLen;
44 - }
45 26
46 /** 27 /**
47 - * Constructor for a given address and prefix length. 28 + * Constructor for given IPv6 address, and a prefix length.
48 * 29 *
49 - * @param address the address to use 30 + * @param address the IPv6 address
50 - * @param prefixLen the prefix length to use 31 + * @param prefixLength the prefix length
32 + * @throws IllegalArgumentException if the prefix length value is invalid
51 */ 33 */
52 - public Ip6Prefix(Ip6Address address, short prefixLen) { 34 + private Ip6Prefix(Ip6Address address, int prefixLength) {
53 - this.address = Ip6Address.makeMaskedAddress(address, prefixLen); 35 + super(address, prefixLength);
54 - this.prefixLen = prefixLen;
55 } 36 }
56 37
57 /** 38 /**
58 - * Constructs an IPv6 prefix from a string representation of the 39 + * Returns the IPv6 address value of the prefix.
59 - * prefix.
60 - *<p>
61 - * Example: "1111:2222::/32"
62 * 40 *
63 - * @param value the value to use 41 + * @return the IPv6 address value of the prefix
64 */ 42 */
65 - public Ip6Prefix(String value) { 43 + public Ip6Address address() {
66 - String[] splits = value.split("/"); 44 + IpAddress a = super.address();
67 - if (splits.length != 2) { 45 + return (Ip6Address) a;
68 - throw new IllegalArgumentException("Specified IPv6 prefix must contain an IPv6 " +
69 - "address and a prefix length separated by '/'");
70 - }
71 - this.prefixLen = Short.decode(splits[1]);
72 - this.address = Ip6Address.makeMaskedAddress(new Ip6Address(splits[0]),
73 - this.prefixLen);
74 } 46 }
75 47
76 /** 48 /**
77 - * Gets the address value of the IPv6 prefix. 49 + * Converts a byte array and a prefix length into an IPv6 prefix.
78 * 50 *
79 - * @return the address value of the IPv6 prefix 51 + * @param address the IPv6 address value stored in network byte order
52 + * @param prefixLength the prefix length
53 + * @return an IPv6 prefix
54 + * @throws IllegalArgumentException if the prefix length value is invalid
80 */ 55 */
81 - public Ip6Address getAddress() { 56 + public static Ip6Prefix valueOf(byte[] address, int prefixLength) {
82 - return address; 57 + return new Ip6Prefix(Ip6Address.valueOf(address), prefixLength);
83 } 58 }
84 59
85 /** 60 /**
86 - * Gets the prefix length value of the IPv6 prefix. 61 + * Converts an IPv6 address and a prefix length into an IPv6 prefix.
87 * 62 *
88 - * @return the prefix length value of the IPv6 prefix 63 + * @param address the IPv6 address
64 + * @param prefixLength the prefix length
65 + * @return an IPv6 prefix
66 + * @throws IllegalArgumentException if the prefix length value is invalid
89 */ 67 */
90 - public short getPrefixLen() { 68 + public static Ip6Prefix valueOf(Ip6Address address, int prefixLength) {
91 - return prefixLen; 69 + return new Ip6Prefix(address, prefixLength);
92 } 70 }
93 71
94 /** 72 /**
95 - * Converts the IPv6 prefix value to an "address/prefixLen" string. 73 + * Converts a CIDR (slash) notation string (e.g., "1111:2222::/64")
74 + * into an IPv6 prefix.
96 * 75 *
97 - * @return the IPv6 prefix value as an "address/prefixLen" string 76 + * @param address an IP prefix in string form (e.g.,"1111:2222::/64")
77 + * @return an IPv6 prefix
78 + * @throws IllegalArgumentException if the arguments are invalid
98 */ 79 */
99 - @Override 80 + public static Ip6Prefix valueOf(String address) {
100 - public String toString() { 81 + final String[] parts = address.split("/");
101 - return this.address.toString() + "/" + this.prefixLen; 82 + if (parts.length != 2) {
102 - } 83 + String msg = "Malformed IPv6 prefix string: " + address + "." +
103 - 84 + "Address must take form " +
104 - @Override 85 + "\"xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/y\"";
105 - public boolean equals(Object other) { 86 + throw new IllegalArgumentException(msg);
106 - if (other == this) {
107 - return true;
108 - }
109 -
110 - if (!(other instanceof Ip6Prefix)) {
111 - return false;
112 - }
113 -
114 - Ip6Prefix otherIp6Prefix = (Ip6Prefix) other;
115 -
116 - return Objects.equals(this.address, otherIp6Prefix.address)
117 - && this.prefixLen == otherIp6Prefix.prefixLen;
118 } 87 }
88 + Ip6Address ipAddress = Ip6Address.valueOf(parts[0]);
89 + int prefixLength = Integer.parseInt(parts[1]);
119 90
120 - @Override 91 + return new Ip6Prefix(ipAddress, prefixLength);
121 - public int hashCode() {
122 - return Objects.hash(address, prefixLen);
123 } 92 }
124 } 93 }
......
...@@ -30,8 +30,9 @@ import static com.google.common.base.Preconditions.checkState; ...@@ -30,8 +30,9 @@ import static com.google.common.base.Preconditions.checkState;
30 30
31 /** 31 /**
32 * A class representing an IP address. 32 * A class representing an IP address.
33 + * This class is immutable.
33 */ 34 */
34 -public final class IpAddress implements Comparable<IpAddress> { 35 +public class IpAddress implements Comparable<IpAddress> {
35 // IP Versions 36 // IP Versions
36 public enum Version { INET, INET6 }; 37 public enum Version { INET, INET6 };
37 38
...@@ -52,7 +53,7 @@ public final class IpAddress implements Comparable<IpAddress> { ...@@ -52,7 +53,7 @@ public final class IpAddress implements Comparable<IpAddress> {
52 * (i.e., the most significant byte first) 53 * (i.e., the most significant byte first)
53 * @throws IllegalArgumentException if the arguments are invalid 54 * @throws IllegalArgumentException if the arguments are invalid
54 */ 55 */
55 - private IpAddress(Version version, byte[] value) { 56 + protected IpAddress(Version version, byte[] value) {
56 checkArguments(version, value, 0); 57 checkArguments(version, value, 0);
57 this.version = version; 58 this.version = version;
58 switch (version) { 59 switch (version) {
...@@ -88,7 +89,7 @@ public final class IpAddress implements Comparable<IpAddress> { ...@@ -88,7 +89,7 @@ public final class IpAddress implements Comparable<IpAddress> {
88 } 89 }
89 90
90 /** 91 /**
91 - * Returns the integral value of this IP address. 92 + * Returns the integer value of this IP address.
92 * TODO: This method should be moved to Ip4Address. 93 * TODO: This method should be moved to Ip4Address.
93 * 94 *
94 * @return the IP address's value as an integer 95 * @return the IP address's value as an integer
...@@ -219,31 +220,7 @@ public final class IpAddress implements Comparable<IpAddress> { ...@@ -219,31 +220,7 @@ public final class IpAddress implements Comparable<IpAddress> {
219 * @throws IllegalArgumentException if the arguments are invalid 220 * @throws IllegalArgumentException if the arguments are invalid
220 */ 221 */
221 public static IpAddress makeMaskPrefix(Version version, int prefixLength) { 222 public static IpAddress makeMaskPrefix(Version version, int prefixLength) {
222 - int addrByteLength = byteLength(version); 223 + byte[] mask = makeMaskPrefixArray(version, prefixLength);
223 - int addrBitLength = addrByteLength * Byte.SIZE;
224 -
225 - // Verify the prefix length
226 - if ((prefixLength < 0) || (prefixLength > addrBitLength)) {
227 - final String msg = "Invalid IP prefix length: " + prefixLength +
228 - ". Must be in the interval [0, " + addrBitLength + "].";
229 - throw new IllegalArgumentException(msg);
230 - }
231 -
232 - // Number of bytes and extra bits that should be all 1s
233 - int maskBytes = prefixLength / Byte.SIZE;
234 - int maskBits = prefixLength % Byte.SIZE;
235 - byte[] mask = new byte[addrByteLength];
236 -
237 - // Set the bytes and extra bits to 1s
238 - for (int i = 0; i < maskBytes; i++) {
239 - mask[i] = (byte) 0xff; // Set mask bytes to 1s
240 - }
241 - for (int i = maskBytes; i < addrByteLength; i++) {
242 - mask[i] = 0; // Set remaining bytes to 0s
243 - }
244 - if (maskBits > 0) {
245 - mask[maskBytes] = (byte) (0xff << (Byte.SIZE - maskBits));
246 - }
247 return new IpAddress(version, mask); 224 return new IpAddress(version, mask);
248 } 225 }
249 226
...@@ -251,24 +228,26 @@ public final class IpAddress implements Comparable<IpAddress> { ...@@ -251,24 +228,26 @@ public final class IpAddress implements Comparable<IpAddress> {
251 * Creates an IP address by masking it with a network mask of given 228 * Creates an IP address by masking it with a network mask of given
252 * mask length. 229 * mask length.
253 * 230 *
254 - * @param addr the address to mask 231 + * @param address the address to mask
255 * @param prefixLength the length of the mask prefix. Must be in the 232 * @param prefixLength the length of the mask prefix. Must be in the
256 * interval [0, 32] for IPv4, or [0, 128] for IPv6 233 * interval [0, 32] for IPv4, or [0, 128] for IPv6
257 * @return a new IP address that is masked with a mask prefix of the 234 * @return a new IP address that is masked with a mask prefix of the
258 * specified length 235 * specified length
259 * @throws IllegalArgumentException if the prefix length is invalid 236 * @throws IllegalArgumentException if the prefix length is invalid
260 */ 237 */
261 - public static IpAddress makeMaskedAddress(final IpAddress addr, 238 + public static IpAddress makeMaskedAddress(final IpAddress address,
262 int prefixLength) { 239 int prefixLength) {
263 - IpAddress mask = IpAddress.makeMaskPrefix(addr.version(), 240 + // TODO: The code below should go away and replaced with generics
264 - prefixLength); 241 + if (address instanceof Ip4Address) {
265 - byte[] net = new byte[mask.octets.length]; 242 + Ip4Address ip4a = (Ip4Address) address;
266 - 243 + return Ip4Address.makeMaskedAddress(ip4a, prefixLength);
267 - // Mask each byte 244 + } else if (address instanceof Ip6Address) {
268 - for (int i = 0; i < net.length; i++) { 245 + Ip6Address ip6a = (Ip6Address) address;
269 - net[i] = (byte) (addr.octets[i] & mask.octets[i]); 246 + return Ip6Address.makeMaskedAddress(ip6a, prefixLength);
247 + } else {
248 + byte[] net = makeMaskedAddressArray(address, prefixLength);
249 + return IpAddress.valueOf(address.version(), net);
270 } 250 }
271 - return IpAddress.valueOf(addr.version(), net);
272 } 251 }
273 252
274 @Override 253 @Override
...@@ -352,8 +331,7 @@ public final class IpAddress implements Comparable<IpAddress> { ...@@ -352,8 +331,7 @@ public final class IpAddress implements Comparable<IpAddress> {
352 * array with the address 331 * array with the address
353 * @throws IllegalArgumentException if any of the arguments is invalid 332 * @throws IllegalArgumentException if any of the arguments is invalid
354 */ 333 */
355 - private static void checkArguments(Version version, byte[] value, 334 + static void checkArguments(Version version, byte[] value, int offset) {
356 - int offset) {
357 // Check the offset and byte array length 335 // Check the offset and byte array length
358 int addrByteLength = byteLength(version); 336 int addrByteLength = byteLength(version);
359 if ((offset < 0) || (offset + addrByteLength > value.length)) { 337 if ((offset < 0) || (offset + addrByteLength > value.length)) {
...@@ -371,4 +349,67 @@ public final class IpAddress implements Comparable<IpAddress> { ...@@ -371,4 +349,67 @@ public final class IpAddress implements Comparable<IpAddress> {
371 throw new IllegalArgumentException(msg); 349 throw new IllegalArgumentException(msg);
372 } 350 }
373 } 351 }
352 +
353 + /**
354 + * Creates a byte array for IP network mask prefix.
355 + *
356 + * @param version the IP address version
357 + * @param prefixLength the length of the mask prefix. Must be in the
358 + * interval [0, 32] for IPv4, or [0, 128] for IPv6
359 + * @return a byte array that contains a mask prefix of the
360 + * specified length
361 + * @throws IllegalArgumentException if the arguments are invalid
362 + */
363 + static byte[] makeMaskPrefixArray(Version version, int prefixLength) {
364 + int addrByteLength = byteLength(version);
365 + int addrBitLength = addrByteLength * Byte.SIZE;
366 +
367 + // Verify the prefix length
368 + if ((prefixLength < 0) || (prefixLength > addrBitLength)) {
369 + final String msg = "Invalid IP prefix length: " + prefixLength +
370 + ". Must be in the interval [0, " + addrBitLength + "].";
371 + throw new IllegalArgumentException(msg);
372 + }
373 +
374 + // Number of bytes and extra bits that should be all 1s
375 + int maskBytes = prefixLength / Byte.SIZE;
376 + int maskBits = prefixLength % Byte.SIZE;
377 + byte[] mask = new byte[addrByteLength];
378 +
379 + // Set the bytes and extra bits to 1s
380 + for (int i = 0; i < maskBytes; i++) {
381 + mask[i] = (byte) 0xff; // Set mask bytes to 1s
382 + }
383 + for (int i = maskBytes; i < addrByteLength; i++) {
384 + mask[i] = 0; // Set remaining bytes to 0s
385 + }
386 + if (maskBits > 0) {
387 + mask[maskBytes] = (byte) (0xff << (Byte.SIZE - maskBits));
388 + }
389 + return mask;
390 + }
391 +
392 + /**
393 + * Creates a byte array that represents an IP address masked with
394 + * a network mask of given mask length.
395 + *
396 + * @param addr the address to mask
397 + * @param prefixLength the length of the mask prefix. Must be in the
398 + * interval [0, 32] for IPv4, or [0, 128] for IPv6
399 + * @return a byte array that represents the IP address masked with
400 + * a mask prefix of the specified length
401 + * @throws IllegalArgumentException if the prefix length is invalid
402 + */
403 + static byte[] makeMaskedAddressArray(final IpAddress addr,
404 + int prefixLength) {
405 + byte[] mask = IpAddress.makeMaskPrefixArray(addr.version(),
406 + prefixLength);
407 + byte[] net = new byte[mask.length];
408 +
409 + // Mask each byte
410 + for (int i = 0; i < net.length; i++) {
411 + net[i] = (byte) (addr.octets[i] & mask[i]);
412 + }
413 + return net;
414 + }
374 } 415 }
......
...@@ -20,12 +20,13 @@ import java.util.Objects; ...@@ -20,12 +20,13 @@ import java.util.Objects;
20 /** 20 /**
21 * A class representing an IP prefix. A prefix consists of an IP address and 21 * A class representing an IP prefix. A prefix consists of an IP address and
22 * a subnet mask. 22 * a subnet mask.
23 + * This class is immutable.
23 * <p> 24 * <p>
24 * NOTE: The stored IP address in the result IP prefix is masked to 25 * NOTE: The stored IP address in the result IP prefix is masked to
25 * contain zeroes in all bits after the prefix length. 26 * contain zeroes in all bits after the prefix length.
26 * </p> 27 * </p>
27 */ 28 */
28 -public final class IpPrefix { 29 +public class IpPrefix {
29 // Maximum network mask length 30 // Maximum network mask length
30 public static final int MAX_INET_MASK_LENGTH = IpAddress.INET_BIT_LENGTH; 31 public static final int MAX_INET_MASK_LENGTH = IpAddress.INET_BIT_LENGTH;
31 public static final int MAX_INET6_MASK_LENGTH = IpAddress.INET6_BIT_LENGTH; 32 public static final int MAX_INET6_MASK_LENGTH = IpAddress.INET6_BIT_LENGTH;
...@@ -40,7 +41,7 @@ public final class IpPrefix { ...@@ -40,7 +41,7 @@ public final class IpPrefix {
40 * @param prefixLength the prefix length 41 * @param prefixLength the prefix length
41 * @throws IllegalArgumentException if the prefix length value is invalid 42 * @throws IllegalArgumentException if the prefix length value is invalid
42 */ 43 */
43 - private IpPrefix(IpAddress address, int prefixLength) { 44 + protected IpPrefix(IpAddress address, int prefixLength) {
44 checkPrefixLength(address.version(), prefixLength); 45 checkPrefixLength(address.version(), prefixLength);
45 this.address = IpAddress.makeMaskedAddress(address, prefixLength); 46 this.address = IpAddress.makeMaskedAddress(address, prefixLength);
46 this.prefixLength = (short) prefixLength; 47 this.prefixLength = (short) prefixLength;
...@@ -100,7 +101,7 @@ public final class IpPrefix { ...@@ -100,7 +101,7 @@ public final class IpPrefix {
100 } 101 }
101 102
102 /** 103 /**
103 - * Converts an IP address and a prefix length into IP prefix. 104 + * Converts an IP address and a prefix length into an IP prefix.
104 * 105 *
105 * @param address the IP address 106 * @param address the IP address
106 * @param prefixLength the prefix length 107 * @param prefixLength the prefix length
...@@ -112,10 +113,11 @@ public final class IpPrefix { ...@@ -112,10 +113,11 @@ public final class IpPrefix {
112 } 113 }
113 114
114 /** 115 /**
115 - * Converts a CIDR (slash) notation string (e.g., "10.1.0.0/16") into an 116 + * Converts a CIDR (slash) notation string (e.g., "10.1.0.0/16" or
116 - * IP prefix. 117 + * "1111:2222::/64") into an IP prefix.
117 * 118 *
118 - * @param address an IP prefix in string form, e.g. "10.1.0.0/16" 119 + * @param address an IP prefix in string form (e.g. "10.1.0.0/16" or
120 + * "1111:2222::/64")
119 * @return an IP prefix 121 * @return an IP prefix
120 * @throws IllegalArgumentException if the arguments are invalid 122 * @throws IllegalArgumentException if the arguments are invalid
121 */ 123 */
...@@ -123,7 +125,8 @@ public final class IpPrefix { ...@@ -123,7 +125,8 @@ public final class IpPrefix {
123 final String[] parts = address.split("/"); 125 final String[] parts = address.split("/");
124 if (parts.length != 2) { 126 if (parts.length != 2) {
125 String msg = "Malformed IP prefix string: " + address + "." + 127 String msg = "Malformed IP prefix string: " + address + "." +
126 - "Address must take form \"x.x.x.x/y\""; 128 + "Address must take form \"x.x.x.x/y\" or " +
129 + "\"xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/y\"";
127 throw new IllegalArgumentException(msg); 130 throw new IllegalArgumentException(msg);
128 } 131 }
129 IpAddress ipAddress = IpAddress.valueOf(parts[0]); 132 IpAddress ipAddress = IpAddress.valueOf(parts[0]);
......
...@@ -15,10 +15,13 @@ ...@@ -15,10 +15,13 @@
15 */ 15 */
16 package org.onlab.packet; 16 package org.onlab.packet;
17 17
18 +import com.google.common.net.InetAddresses;
19 +import com.google.common.testing.EqualsTester;
18 import org.junit.Test; 20 import org.junit.Test;
19 21
22 +import java.net.InetAddress;
23 +
20 import static org.hamcrest.Matchers.is; 24 import static org.hamcrest.Matchers.is;
21 -import static org.hamcrest.Matchers.not;
22 import static org.junit.Assert.assertThat; 25 import static org.junit.Assert.assertThat;
23 import static org.junit.Assert.assertTrue; 26 import static org.junit.Assert.assertTrue;
24 import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable; 27 import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
...@@ -36,10 +39,18 @@ public class Ip4AddressTest { ...@@ -36,10 +39,18 @@ public class Ip4AddressTest {
36 } 39 }
37 40
38 /** 41 /**
42 + * Tests the IPv4 address version constant.
43 + */
44 + @Test
45 + public void testAddressVersion() {
46 + assertThat(Ip4Address.VERSION, is(IpAddress.Version.INET));
47 + }
48 +
49 + /**
39 * Tests the length of the address in bytes (octets). 50 * Tests the length of the address in bytes (octets).
40 */ 51 */
41 @Test 52 @Test
42 - public void testAddrBytelen() { 53 + public void testAddrByteLength() {
43 assertThat(Ip4Address.BYTE_LENGTH, is(4)); 54 assertThat(Ip4Address.BYTE_LENGTH, is(4));
44 } 55 }
45 56
...@@ -47,299 +58,372 @@ public class Ip4AddressTest { ...@@ -47,299 +58,372 @@ public class Ip4AddressTest {
47 * Tests the length of the address in bits. 58 * Tests the length of the address in bits.
48 */ 59 */
49 @Test 60 @Test
50 - public void testAddrBitlen() { 61 + public void testAddrBitLength() {
51 assertThat(Ip4Address.BIT_LENGTH, is(32)); 62 assertThat(Ip4Address.BIT_LENGTH, is(32));
52 } 63 }
53 64
54 /** 65 /**
55 - * Tests default class constructor. 66 + * Tests returning the IP address version.
56 */ 67 */
57 @Test 68 @Test
58 - public void testDefaultConstructor() { 69 + public void testVersion() {
59 - Ip4Address ip4Address = new Ip4Address(); 70 + Ip4Address ipAddress;
60 - assertThat(ip4Address.toString(), is("0.0.0.0")); 71 +
72 + // IPv4
73 + ipAddress = Ip4Address.valueOf("0.0.0.0");
74 + assertThat(ipAddress.version(), is(IpAddress.Version.INET));
61 } 75 }
62 76
63 /** 77 /**
64 - * Tests valid class copy constructor. 78 + * Tests returning an IPv4 address as a byte array.
65 */ 79 */
66 @Test 80 @Test
67 - public void testCopyConstructor() { 81 + public void testAddressToOctetsIPv4() {
68 - Ip4Address fromAddr = new Ip4Address("1.2.3.4"); 82 + Ip4Address ipAddress;
69 - Ip4Address ip4Address = new Ip4Address(fromAddr); 83 + byte[] value;
70 - assertThat(ip4Address.toString(), is("1.2.3.4")); 84 +
71 - 85 + value = new byte[] {1, 2, 3, 4};
72 - fromAddr = new Ip4Address("0.0.0.0"); 86 + ipAddress = Ip4Address.valueOf("1.2.3.4");
73 - ip4Address = new Ip4Address(fromAddr); 87 + assertThat(ipAddress.toOctets(), is(value));
74 - assertThat(ip4Address.toString(), is("0.0.0.0")); 88 +
75 - 89 + value = new byte[] {0, 0, 0, 0};
76 - fromAddr = new Ip4Address("255.255.255.255"); 90 + ipAddress = Ip4Address.valueOf("0.0.0.0");
77 - ip4Address = new Ip4Address(fromAddr); 91 + assertThat(ipAddress.toOctets(), is(value));
78 - assertThat(ip4Address.toString(), is("255.255.255.255")); 92 +
93 + value = new byte[] {(byte) 0xff, (byte) 0xff,
94 + (byte) 0xff, (byte) 0xff};
95 + ipAddress = Ip4Address.valueOf("255.255.255.255");
96 + assertThat(ipAddress.toOctets(), is(value));
79 } 97 }
80 98
81 /** 99 /**
82 - * Tests invalid class copy constructor for a null object to copy from. 100 + * Tests returning an IPv4 address as an integer.
83 */ 101 */
84 - @Test(expected = NullPointerException.class) 102 + @Test
85 - public void testInvalidConstructorNullObject() { 103 + public void testToInt() {
86 - Ip4Address fromAddr = null; 104 + Ip4Address ipAddress;
87 - Ip4Address ip4Address = new Ip4Address(fromAddr); 105 +
106 + ipAddress = Ip4Address.valueOf("1.2.3.4");
107 + assertThat(ipAddress.toInt(), is(0x01020304));
108 +
109 + ipAddress = Ip4Address.valueOf("0.0.0.0");
110 + assertThat(ipAddress.toInt(), is(0));
111 +
112 + ipAddress = Ip4Address.valueOf("255.255.255.255");
113 + assertThat(ipAddress.toInt(), is(-1));
88 } 114 }
89 115
90 /** 116 /**
91 - * Tests valid class constructor for an integer value. 117 + * Tests valueOf() converter for IPv4 integer value.
92 */ 118 */
93 @Test 119 @Test
94 - public void testConstructorForInteger() { 120 + public void testValueOfForIntegerIPv4() {
95 - Ip4Address ip4Address = new Ip4Address(0x01020304); 121 + Ip4Address ipAddress;
96 - assertThat(ip4Address.toString(), is("1.2.3.4"));
97 122
98 - ip4Address = new Ip4Address(0); 123 + ipAddress = Ip4Address.valueOf(0x01020304);
99 - assertThat(ip4Address.toString(), is("0.0.0.0")); 124 + assertThat(ipAddress.toString(), is("1.2.3.4"));
100 125
101 - ip4Address = new Ip4Address(0xffffffff); 126 + ipAddress = Ip4Address.valueOf(0);
102 - assertThat(ip4Address.toString(), is("255.255.255.255")); 127 + assertThat(ipAddress.toString(), is("0.0.0.0"));
128 +
129 + ipAddress = Ip4Address.valueOf(0xffffffff);
130 + assertThat(ipAddress.toString(), is("255.255.255.255"));
103 } 131 }
104 132
105 /** 133 /**
106 - * Tests valid class constructor for an array value. 134 + * Tests valueOf() converter for IPv4 byte array.
107 */ 135 */
108 @Test 136 @Test
109 - public void testConstructorForArray() { 137 + public void testValueOfByteArrayIPv4() {
138 + Ip4Address ipAddress;
139 +
110 final byte[] value1 = new byte[] {1, 2, 3, 4}; 140 final byte[] value1 = new byte[] {1, 2, 3, 4};
111 - Ip4Address ip4Address = new Ip4Address(value1); 141 + ipAddress = Ip4Address.valueOf(value1);
112 - assertThat(ip4Address.toString(), is("1.2.3.4")); 142 + assertThat(ipAddress.toString(), is("1.2.3.4"));
113 143
114 final byte[] value2 = new byte[] {0, 0, 0, 0}; 144 final byte[] value2 = new byte[] {0, 0, 0, 0};
115 - ip4Address = new Ip4Address(value2); 145 + ipAddress = Ip4Address.valueOf(value2);
116 - assertThat(ip4Address.toString(), is("0.0.0.0")); 146 + assertThat(ipAddress.toString(), is("0.0.0.0"));
117 147
118 final byte[] value3 = new byte[] {(byte) 0xff, (byte) 0xff, 148 final byte[] value3 = new byte[] {(byte) 0xff, (byte) 0xff,
119 (byte) 0xff, (byte) 0xff}; 149 (byte) 0xff, (byte) 0xff};
120 - ip4Address = new Ip4Address(value3); 150 + ipAddress = Ip4Address.valueOf(value3);
121 - assertThat(ip4Address.toString(), is("255.255.255.255")); 151 + assertThat(ipAddress.toString(), is("255.255.255.255"));
122 } 152 }
123 153
124 /** 154 /**
125 - * Tests valid class constructor for an array value and an offset. 155 + * Tests invalid valueOf() converter for a null array for IPv4.
156 + */
157 + @Test(expected = NullPointerException.class)
158 + public void testInvalidValueOfNullArrayIPv4() {
159 + Ip4Address ipAddress;
160 +
161 + final byte[] fromArray = null;
162 + ipAddress = Ip4Address.valueOf(fromArray);
163 + }
164 +
165 + /**
166 + * Tests invalid valueOf() converger for an array that is too short for
167 + * IPv4.
168 + */
169 + @Test(expected = IllegalArgumentException.class)
170 + public void testInvalidValueOfShortArrayIPv4() {
171 + Ip4Address ipAddress;
172 +
173 + final byte[] fromArray = new byte[] {1, 2, 3};
174 + ipAddress = Ip4Address.valueOf(fromArray);
175 + }
176 +
177 + /**
178 + * Tests valueOf() converter for IPv4 byte array and an offset.
126 */ 179 */
127 @Test 180 @Test
128 - public void testConstructorForArrayAndOffset() { 181 + public void testValueOfByteArrayOffsetIPv4() {
129 - final byte[] value1 = new byte[] {11, 22, 33, // Preamble 182 + Ip4Address ipAddress;
183 + byte[] value;
184 +
185 + value = new byte[] {11, 22, 33, // Preamble
130 1, 2, 3, 4, 186 1, 2, 3, 4,
131 44, 55}; // Extra bytes 187 44, 55}; // Extra bytes
132 - Ip4Address ip4Address = new Ip4Address(value1, 3); 188 + ipAddress = Ip4Address.valueOf(value, 3);
133 - assertThat(ip4Address.toString(), is("1.2.3.4")); 189 + assertThat(ipAddress.toString(), is("1.2.3.4"));
134 190
135 - final byte[] value2 = new byte[] {11, 22, // Preamble 191 + value = new byte[] {11, 22, // Preamble
136 0, 0, 0, 0, 192 0, 0, 0, 0,
137 33}; // Extra bytes 193 33}; // Extra bytes
138 - ip4Address = new Ip4Address(value2, 2); 194 + ipAddress = Ip4Address.valueOf(value, 2);
139 - assertThat(ip4Address.toString(), is("0.0.0.0")); 195 + assertThat(ipAddress.toString(), is("0.0.0.0"));
140 196
141 - final byte[] value3 = new byte[] {11, 22, // Preamble 197 + value = new byte[] {11, 22, // Preamble
142 (byte) 0xff, (byte) 0xff, 198 (byte) 0xff, (byte) 0xff,
143 (byte) 0xff, (byte) 0xff, 199 (byte) 0xff, (byte) 0xff,
144 33}; // Extra bytes 200 33}; // Extra bytes
145 - ip4Address = new Ip4Address(value3, 2); 201 + ipAddress = Ip4Address.valueOf(value, 2);
146 - assertThat(ip4Address.toString(), is("255.255.255.255")); 202 + assertThat(ipAddress.toString(), is("255.255.255.255"));
147 - }
148 -
149 - /**
150 - * Tests invalid class constructor for a null array.
151 - */
152 - @Test(expected = NullPointerException.class)
153 - public void testInvalidConstructorNullArray() {
154 - final byte[] fromArray = null;
155 - Ip4Address ip4Address = new Ip4Address(fromArray);
156 } 203 }
157 204
158 /** 205 /**
159 - * Tests invalid class constructor for an array that is too short. 206 + * Tests invalid valueOf() converger for an array and an invalid offset
207 + * for IPv4.
160 */ 208 */
161 @Test(expected = IllegalArgumentException.class) 209 @Test(expected = IllegalArgumentException.class)
162 - public void testInvalidConstructorShortArray() { 210 + public void testInvalidValueOfArrayInvalidOffsetIPv4() {
163 - final byte[] fromArray = new byte[] {1, 2, 3}; 211 + Ip4Address ipAddress;
164 - Ip4Address ip4Address = new Ip4Address(fromArray); 212 + byte[] value;
213 +
214 + value = new byte[] {11, 22, 33, // Preamble
215 + 1, 2, 3, 4,
216 + 44, 55}; // Extra bytes
217 + ipAddress = Ip4Address.valueOf(value, 6);
165 } 218 }
166 219
167 /** 220 /**
168 - * Tests invalid class constructor for an array and an invalid offset. 221 + * Tests valueOf() converter for IPv4 InetAddress.
169 */ 222 */
170 - @Test(expected = IllegalArgumentException.class) 223 + @Test
171 - public void testInvalidConstructorArrayInvalidOffset() { 224 + public void testValueOfInetAddressIPv4() {
172 - final byte[] value1 = new byte[] {11, 22, 33, // Preamble 225 + Ip4Address ipAddress;
173 - 1, 2, 3, 4, 226 + InetAddress inetAddress;
174 - 44, 55}; // Extra bytes 227 +
175 - Ip4Address ip4Address = new Ip4Address(value1, 6); 228 + inetAddress = InetAddresses.forString("1.2.3.4");
229 + ipAddress = Ip4Address.valueOf(inetAddress);
230 + assertThat(ipAddress.toString(), is("1.2.3.4"));
231 +
232 + inetAddress = InetAddresses.forString("0.0.0.0");
233 + ipAddress = Ip4Address.valueOf(inetAddress);
234 + assertThat(ipAddress.toString(), is("0.0.0.0"));
235 +
236 + inetAddress = InetAddresses.forString("255.255.255.255");
237 + ipAddress = Ip4Address.valueOf(inetAddress);
238 + assertThat(ipAddress.toString(), is("255.255.255.255"));
176 } 239 }
177 240
178 /** 241 /**
179 - * Tests valid class constructor for a string. 242 + * Tests valueOf() converter for IPv4 string.
180 */ 243 */
181 @Test 244 @Test
182 - public void testConstructorForString() { 245 + public void testValueOfStringIPv4() {
183 - Ip4Address ip4Address = new Ip4Address("1.2.3.4"); 246 + Ip4Address ipAddress;
184 - assertThat(ip4Address.toString(), is("1.2.3.4"));
185 247
186 - ip4Address = new Ip4Address("0.0.0.0"); 248 + ipAddress = Ip4Address.valueOf("1.2.3.4");
187 - assertThat(ip4Address.toString(), is("0.0.0.0")); 249 + assertThat(ipAddress.toString(), is("1.2.3.4"));
188 250
189 - ip4Address = new Ip4Address("255.255.255.255"); 251 + ipAddress = Ip4Address.valueOf("0.0.0.0");
190 - assertThat(ip4Address.toString(), is("255.255.255.255")); 252 + assertThat(ipAddress.toString(), is("0.0.0.0"));
253 +
254 + ipAddress = Ip4Address.valueOf("255.255.255.255");
255 + assertThat(ipAddress.toString(), is("255.255.255.255"));
191 } 256 }
192 257
193 /** 258 /**
194 - * Tests invalid class constructor for a null string. 259 + * Tests invalid valueOf() converter for a null string.
195 */ 260 */
196 @Test(expected = NullPointerException.class) 261 @Test(expected = NullPointerException.class)
197 - public void testInvalidConstructorNullString() { 262 + public void testInvalidValueOfNullString() {
263 + Ip4Address ipAddress;
264 +
198 String fromString = null; 265 String fromString = null;
199 - Ip4Address ip4Address = new Ip4Address(fromString); 266 + ipAddress = Ip4Address.valueOf(fromString);
200 } 267 }
201 268
202 /** 269 /**
203 - * Tests invalid class constructor for an empty string. 270 + * Tests invalid valueOf() converter for an empty string.
204 */ 271 */
205 @Test(expected = IllegalArgumentException.class) 272 @Test(expected = IllegalArgumentException.class)
206 - public void testInvalidConstructors() { 273 + public void testInvalidValueOfEmptyString() {
207 - // Check constructor for invalid ID: empty string 274 + Ip4Address ipAddress;
208 - Ip4Address ip4Address = new Ip4Address(""); 275 +
276 + String fromString = "";
277 + ipAddress = Ip4Address.valueOf(fromString);
209 } 278 }
210 279
211 /** 280 /**
212 - * Tests returning the address as a byte array. 281 + * Tests invalid valueOf() converter for an incorrect string.
213 */ 282 */
214 - @Test 283 + @Test(expected = IllegalArgumentException.class)
215 - public void testAddressToOctets() { 284 + public void testInvalidValueOfIncorrectString() {
216 - final byte[] value1 = new byte[] {1, 2, 3, 4}; 285 + Ip4Address ipAddress;
217 - Ip4Address ip4Address = new Ip4Address("1.2.3.4");
218 - assertThat(ip4Address.toOctets(), is(value1));
219 -
220 - final byte[] value2 = new byte[] {0, 0, 0, 0};
221 - ip4Address = new Ip4Address("0.0.0.0");
222 - assertThat(ip4Address.toOctets(), is(value2));
223 286
224 - final byte[] value3 = new byte[] {(byte) 0xff, (byte) 0xff, 287 + String fromString = "NoSuchIpAddress";
225 - (byte) 0xff, (byte) 0xff}; 288 + ipAddress = Ip4Address.valueOf(fromString);
226 - ip4Address = new Ip4Address("255.255.255.255");
227 - assertThat(ip4Address.toOctets(), is(value3));
228 } 289 }
229 290
230 /** 291 /**
231 - * Tests making a mask prefix for a given prefix length. 292 + * Tests making a mask prefix for a given prefix length for IPv4.
232 */ 293 */
233 @Test 294 @Test
234 - public void testMakeMaskPrefix() { 295 + public void testMakeMaskPrefixIPv4() {
235 - Ip4Address ip4Address = Ip4Address.makeMaskPrefix(25); 296 + Ip4Address ipAddress;
236 - assertThat(ip4Address.toString(), is("255.255.255.128"));
237 297
238 - ip4Address = Ip4Address.makeMaskPrefix(0); 298 + ipAddress = Ip4Address.makeMaskPrefix(25);
239 - assertThat(ip4Address.toString(), is("0.0.0.0")); 299 + assertThat(ipAddress.toString(), is("255.255.255.128"));
240 300
241 - ip4Address = Ip4Address.makeMaskPrefix(32); 301 + ipAddress = Ip4Address.makeMaskPrefix(0);
242 - assertThat(ip4Address.toString(), is("255.255.255.255")); 302 + assertThat(ipAddress.toString(), is("0.0.0.0"));
303 +
304 + ipAddress = Ip4Address.makeMaskPrefix(32);
305 + assertThat(ipAddress.toString(), is("255.255.255.255"));
243 } 306 }
244 307
245 /** 308 /**
246 - * Tests making of a masked address. 309 + * Tests making a mask prefix for an invalid prefix length for IPv4:
310 + * negative prefix length.
247 */ 311 */
248 - @Test 312 + @Test(expected = IllegalArgumentException.class)
249 - public void testMakeMaskedAddress() { 313 + public void testInvalidMakeNegativeMaskPrefixIPv4() {
250 - Ip4Address ip4Address = new Ip4Address("1.2.3.5"); 314 + Ip4Address ipAddress;
251 - Ip4Address ip4AddressMasked = 315 +
252 - Ip4Address.makeMaskedAddress(ip4Address, 24); 316 + ipAddress = Ip4Address.makeMaskPrefix(-1);
253 - assertThat(ip4AddressMasked.toString(), is("1.2.3.0")); 317 + }
254 318
255 - ip4AddressMasked = Ip4Address.makeMaskedAddress(ip4Address, 0); 319 + /**
256 - assertThat(ip4AddressMasked.toString(), is("0.0.0.0")); 320 + * Tests making a mask prefix for an invalid prefix length for IPv4:
321 + * too long prefix length.
322 + */
323 + @Test(expected = IllegalArgumentException.class)
324 + public void testInvalidMakeTooLongMaskPrefixIPv4() {
325 + Ip4Address ipAddress;
257 326
258 - ip4AddressMasked = Ip4Address.makeMaskedAddress(ip4Address, 32); 327 + ipAddress = Ip4Address.makeMaskPrefix(33);
259 - assertThat(ip4AddressMasked.toString(), is("1.2.3.5"));
260 } 328 }
261 329
262 /** 330 /**
263 - * Tests getting the value of an address. 331 + * Tests making of a masked address for IPv4.
264 */ 332 */
265 @Test 333 @Test
266 - public void testGetValue() { 334 + public void testMakeMaskedAddressIPv4() {
267 - Ip4Address ip4Address = new Ip4Address("1.2.3.4"); 335 + Ip4Address ipAddress = Ip4Address.valueOf("1.2.3.5");
268 - assertThat(ip4Address.getValue(), is(0x01020304)); 336 + Ip4Address ipAddressMasked;
337 +
338 + ipAddressMasked = Ip4Address.makeMaskedAddress(ipAddress, 24);
339 + assertThat(ipAddressMasked.toString(), is("1.2.3.0"));
269 340
270 - ip4Address = new Ip4Address("0.0.0.0"); 341 + ipAddressMasked = Ip4Address.makeMaskedAddress(ipAddress, 0);
271 - assertThat(ip4Address.getValue(), is(0)); 342 + assertThat(ipAddressMasked.toString(), is("0.0.0.0"));
272 343
273 - ip4Address = new Ip4Address("255.255.255.255"); 344 + ipAddressMasked = Ip4Address.makeMaskedAddress(ipAddress, 32);
274 - assertThat(ip4Address.getValue(), is(-1)); 345 + assertThat(ipAddressMasked.toString(), is("1.2.3.5"));
275 } 346 }
276 347
277 /** 348 /**
278 - * Tests equality of {@link Ip4Address}. 349 + * Tests making of a masked address for invalid prefix length for IPv4:
350 + * negative prefix length.
279 */ 351 */
280 - @Test 352 + @Test(expected = IllegalArgumentException.class)
281 - public void testEquality() { 353 + public void testInvalidMakeNegativeMaskedAddressIPv4() {
282 - Ip4Address addr1 = new Ip4Address("1.2.3.4"); 354 + Ip4Address ipAddress = Ip4Address.valueOf("1.2.3.5");
283 - Ip4Address addr2 = new Ip4Address("1.2.3.4"); 355 + Ip4Address ipAddressMasked;
284 - assertThat(addr1, is(addr2)); 356 +
285 - 357 + ipAddressMasked = Ip4Address.makeMaskedAddress(ipAddress, -1);
286 - addr1 = new Ip4Address("0.0.0.0");
287 - addr2 = new Ip4Address("0.0.0.0");
288 - assertThat(addr1, is(addr2));
289 -
290 - addr1 = new Ip4Address("255.255.255.255");
291 - addr2 = new Ip4Address("255.255.255.255");
292 - assertThat(addr1, is(addr2));
293 } 358 }
294 359
295 /** 360 /**
296 - * Tests non-equality of {@link Ip4Address}. 361 + * Tests making of a masked address for an invalid prefix length for IPv4:
362 + * too long prefix length.
297 */ 363 */
298 - @Test 364 + @Test(expected = IllegalArgumentException.class)
299 - public void testNonEquality() { 365 + public void testInvalidMakeTooLongMaskedAddressIPv4() {
300 - Ip4Address addr1 = new Ip4Address("1.2.3.4"); 366 + Ip4Address ipAddress = Ip4Address.valueOf("1.2.3.5");
301 - Ip4Address addr2 = new Ip4Address("1.2.3.5"); 367 + Ip4Address ipAddressMasked;
302 - Ip4Address addr3 = new Ip4Address("0.0.0.0"); 368 +
303 - Ip4Address addr4 = new Ip4Address("255.255.255.255"); 369 + ipAddressMasked = Ip4Address.makeMaskedAddress(ipAddress, 33);
304 - assertThat(addr1, is(not(addr2)));
305 - assertThat(addr3, is(not(addr2)));
306 - assertThat(addr4, is(not(addr2)));
307 } 370 }
308 371
309 /** 372 /**
310 - * Tests comparison of {@link Ip4Address}. 373 + * Tests comparison of {@link Ip4Address} for IPv4.
311 */ 374 */
312 @Test 375 @Test
313 - public void testComparison() { 376 + public void testComparisonIPv4() {
314 - Ip4Address addr1 = new Ip4Address("1.2.3.4"); 377 + Ip4Address addr1, addr2, addr3, addr4;
315 - Ip4Address addr2 = new Ip4Address("1.2.3.4"); 378 +
316 - Ip4Address addr3 = new Ip4Address("1.2.3.3"); 379 + addr1 = Ip4Address.valueOf("1.2.3.4");
317 - Ip4Address addr4 = new Ip4Address("1.2.3.5"); 380 + addr2 = Ip4Address.valueOf("1.2.3.4");
381 + addr3 = Ip4Address.valueOf("1.2.3.3");
382 + addr4 = Ip4Address.valueOf("1.2.3.5");
318 assertTrue(addr1.compareTo(addr2) == 0); 383 assertTrue(addr1.compareTo(addr2) == 0);
319 assertTrue(addr1.compareTo(addr3) > 0); 384 assertTrue(addr1.compareTo(addr3) > 0);
320 assertTrue(addr1.compareTo(addr4) < 0); 385 assertTrue(addr1.compareTo(addr4) < 0);
321 386
322 - addr1 = new Ip4Address("255.2.3.4"); 387 + addr1 = Ip4Address.valueOf("255.2.3.4");
323 - addr2 = new Ip4Address("255.2.3.4"); 388 + addr2 = Ip4Address.valueOf("255.2.3.4");
324 - addr3 = new Ip4Address("255.2.3.3"); 389 + addr3 = Ip4Address.valueOf("255.2.3.3");
325 - addr4 = new Ip4Address("255.2.3.5"); 390 + addr4 = Ip4Address.valueOf("255.2.3.5");
326 assertTrue(addr1.compareTo(addr2) == 0); 391 assertTrue(addr1.compareTo(addr2) == 0);
327 assertTrue(addr1.compareTo(addr3) > 0); 392 assertTrue(addr1.compareTo(addr3) > 0);
328 assertTrue(addr1.compareTo(addr4) < 0); 393 assertTrue(addr1.compareTo(addr4) < 0);
329 } 394 }
330 395
331 /** 396 /**
332 - * Tests object string representation. 397 + * Tests equality of {@link Ip4Address} for IPv4.
398 + */
399 + @Test
400 + public void testEqualityIPv4() {
401 + new EqualsTester()
402 + .addEqualityGroup(Ip4Address.valueOf("1.2.3.4"),
403 + Ip4Address.valueOf("1.2.3.4"))
404 + .addEqualityGroup(Ip4Address.valueOf("1.2.3.5"),
405 + Ip4Address.valueOf("1.2.3.5"))
406 + .addEqualityGroup(Ip4Address.valueOf("0.0.0.0"),
407 + Ip4Address.valueOf("0.0.0.0"))
408 + .addEqualityGroup(Ip4Address.valueOf("255.255.255.255"),
409 + Ip4Address.valueOf("255.255.255.255"))
410 + .testEquals();
411 + }
412 +
413 + /**
414 + * Tests object string representation for IPv4.
333 */ 415 */
334 @Test 416 @Test
335 - public void testToString() { 417 + public void testToStringIPv4() {
336 - Ip4Address ip4Address = new Ip4Address("1.2.3.4"); 418 + Ip4Address ipAddress;
337 - assertThat(ip4Address.toString(), is("1.2.3.4")); 419 +
420 + ipAddress = Ip4Address.valueOf("1.2.3.4");
421 + assertThat(ipAddress.toString(), is("1.2.3.4"));
338 422
339 - ip4Address = new Ip4Address("0.0.0.0"); 423 + ipAddress = Ip4Address.valueOf("0.0.0.0");
340 - assertThat(ip4Address.toString(), is("0.0.0.0")); 424 + assertThat(ipAddress.toString(), is("0.0.0.0"));
341 425
342 - ip4Address = new Ip4Address("255.255.255.255"); 426 + ipAddress = Ip4Address.valueOf("255.255.255.255");
343 - assertThat(ip4Address.toString(), is("255.255.255.255")); 427 + assertThat(ipAddress.toString(), is("255.255.255.255"));
344 } 428 }
345 } 429 }
......
...@@ -15,12 +15,14 @@ ...@@ -15,12 +15,14 @@
15 */ 15 */
16 package org.onlab.packet; 16 package org.onlab.packet;
17 17
18 +import com.google.common.testing.EqualsTester;
18 import org.junit.Test; 19 import org.junit.Test;
19 20
20 import static org.hamcrest.Matchers.equalTo; 21 import static org.hamcrest.Matchers.equalTo;
21 import static org.hamcrest.Matchers.is; 22 import static org.hamcrest.Matchers.is;
22 -import static org.hamcrest.Matchers.not;
23 import static org.junit.Assert.assertThat; 23 import static org.junit.Assert.assertThat;
24 +import static org.junit.Assert.assertFalse;
25 +import static org.junit.Assert.assertTrue;
24 import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable; 26 import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
25 27
26 /** 28 /**
...@@ -36,175 +38,497 @@ public class Ip4PrefixTest { ...@@ -36,175 +38,497 @@ public class Ip4PrefixTest {
36 } 38 }
37 39
38 /** 40 /**
39 - * Tests default class constructor. 41 + * Tests the IPv4 prefix address version constant.
40 */ 42 */
41 @Test 43 @Test
42 - public void testDefaultConstructor() { 44 + public void testAddressVersion() {
43 - Ip4Prefix ip4prefix = new Ip4Prefix(); 45 + assertThat(Ip4Prefix.VERSION, is(IpAddress.Version.INET));
44 - assertThat(ip4prefix.toString(), is("0.0.0.0/0"));
45 } 46 }
46 47
47 /** 48 /**
48 - * Tests valid class copy constructor. 49 + * Tests the maximum mask length.
49 */ 50 */
50 @Test 51 @Test
51 - public void testCopyConstructor() { 52 + public void testMaxMaskLength() {
52 - Ip4Prefix fromAddr = new Ip4Prefix("1.2.3.0/24"); 53 + assertThat(Ip4Prefix.MAX_MASK_LENGTH, is(32));
53 - Ip4Prefix ip4prefix = new Ip4Prefix(fromAddr); 54 + }
54 - assertThat(ip4prefix.toString(), is("1.2.3.0/24"));
55 55
56 - fromAddr = new Ip4Prefix("0.0.0.0/0"); 56 + /**
57 - ip4prefix = new Ip4Prefix(fromAddr); 57 + * Tests returning the IP version of the prefix.
58 - assertThat(ip4prefix.toString(), is("0.0.0.0/0")); 58 + */
59 + @Test
60 + public void testVersion() {
61 + Ip4Prefix ipPrefix;
59 62
60 - fromAddr = new Ip4Prefix("255.255.255.255/32"); 63 + // IPv4
61 - ip4prefix = new Ip4Prefix(fromAddr); 64 + ipPrefix = Ip4Prefix.valueOf("0.0.0.0/0");
62 - assertThat(ip4prefix.toString(), is("255.255.255.255/32")); 65 + assertThat(ipPrefix.version(), is(IpAddress.Version.INET));
63 } 66 }
64 67
65 /** 68 /**
66 - * Tests invalid class copy constructor for a null object to copy from. 69 + * Tests returning the IP address value and IP address prefix length of
70 + * an IPv4 prefix.
67 */ 71 */
68 - @Test(expected = NullPointerException.class) 72 + @Test
69 - public void testInvalidConstructorNullObject() { 73 + public void testAddressAndPrefixLengthIPv4() {
70 - Ip4Prefix fromAddr = null; 74 + Ip4Prefix ipPrefix;
71 - Ip4Prefix ip4prefix = new Ip4Prefix(fromAddr); 75 +
76 + ipPrefix = Ip4Prefix.valueOf("1.2.3.0/24");
77 + assertThat(ipPrefix.address(), equalTo(Ip4Address.valueOf("1.2.3.0")));
78 + assertThat(ipPrefix.prefixLength(), is(24));
79 +
80 + ipPrefix = Ip4Prefix.valueOf("1.2.3.4/24");
81 + assertThat(ipPrefix.address(), equalTo(Ip4Address.valueOf("1.2.3.0")));
82 + assertThat(ipPrefix.prefixLength(), is(24));
83 +
84 + ipPrefix = Ip4Prefix.valueOf("1.2.3.4/32");
85 + assertThat(ipPrefix.address(), equalTo(Ip4Address.valueOf("1.2.3.4")));
86 + assertThat(ipPrefix.prefixLength(), is(32));
87 +
88 + ipPrefix = Ip4Prefix.valueOf("1.2.3.5/32");
89 + assertThat(ipPrefix.address(), equalTo(Ip4Address.valueOf("1.2.3.5")));
90 + assertThat(ipPrefix.prefixLength(), is(32));
91 +
92 + ipPrefix = Ip4Prefix.valueOf("0.0.0.0/0");
93 + assertThat(ipPrefix.address(), equalTo(Ip4Address.valueOf("0.0.0.0")));
94 + assertThat(ipPrefix.prefixLength(), is(0));
95 +
96 + ipPrefix = Ip4Prefix.valueOf("255.255.255.255/32");
97 + assertThat(ipPrefix.address(),
98 + equalTo(Ip4Address.valueOf("255.255.255.255")));
99 + assertThat(ipPrefix.prefixLength(), is(32));
72 } 100 }
73 101
74 /** 102 /**
75 - * Tests valid class constructor for an address and prefix length. 103 + * Tests valueOf() converter for IPv4 integer value.
76 */ 104 */
77 @Test 105 @Test
78 - public void testConstructorForAddressAndPrefixLength() { 106 + public void testValueOfForIntegerIPv4() {
79 - Ip4Prefix ip4prefix = 107 + Ip4Prefix ipPrefix;
80 - new Ip4Prefix(new Ip4Address("1.2.3.0"), (short) 24); 108 +
81 - assertThat(ip4prefix.toString(), is("1.2.3.0/24")); 109 + ipPrefix = Ip4Prefix.valueOf(0x01020304, 24);
110 + assertThat(ipPrefix.toString(), is("1.2.3.0/24"));
111 +
112 + ipPrefix = Ip4Prefix.valueOf(0x01020304, 32);
113 + assertThat(ipPrefix.toString(), is("1.2.3.4/32"));
114 +
115 + ipPrefix = Ip4Prefix.valueOf(0x01020305, 32);
116 + assertThat(ipPrefix.toString(), is("1.2.3.5/32"));
82 117
83 - ip4prefix = new Ip4Prefix(new Ip4Address("1.2.3.4"), (short) 24); 118 + ipPrefix = Ip4Prefix.valueOf(0, 0);
84 - assertThat(ip4prefix.toString(), is("1.2.3.0/24")); 119 + assertThat(ipPrefix.toString(), is("0.0.0.0/0"));
85 120
86 - ip4prefix = new Ip4Prefix(new Ip4Address("1.2.3.5"), (short) 32); 121 + ipPrefix = Ip4Prefix.valueOf(0, 32);
87 - assertThat(ip4prefix.toString(), is("1.2.3.5/32")); 122 + assertThat(ipPrefix.toString(), is("0.0.0.0/32"));
88 123
89 - ip4prefix = new Ip4Prefix(new Ip4Address("0.0.0.0"), (short) 0); 124 + ipPrefix = Ip4Prefix.valueOf(0xffffffff, 0);
90 - assertThat(ip4prefix.toString(), is("0.0.0.0/0")); 125 + assertThat(ipPrefix.toString(), is("0.0.0.0/0"));
91 126
92 - ip4prefix = 127 + ipPrefix = Ip4Prefix.valueOf(0xffffffff, 16);
93 - new Ip4Prefix(new Ip4Address("255.255.255.255"), (short) 32); 128 + assertThat(ipPrefix.toString(), is("255.255.0.0/16"));
94 - assertThat(ip4prefix.toString(), is("255.255.255.255/32")); 129 +
130 + ipPrefix = Ip4Prefix.valueOf(0xffffffff, 32);
131 + assertThat(ipPrefix.toString(), is("255.255.255.255/32"));
132 + }
133 +
134 + /**
135 + * Tests invalid valueOf() converter for IPv4 integer value and
136 + * negative prefix length.
137 + */
138 + @Test(expected = IllegalArgumentException.class)
139 + public void testInvalidValueOfIntegerNegativePrefixLengthIPv4() {
140 + Ip4Prefix ipPrefix;
141 +
142 + ipPrefix = Ip4Prefix.valueOf(0x01020304, -1);
95 } 143 }
96 144
97 /** 145 /**
98 - * Tests valid class constructor for a string. 146 + * Tests invalid valueOf() converter for IPv4 integer value and
147 + * too long prefix length.
148 + */
149 + @Test(expected = IllegalArgumentException.class)
150 + public void testInvalidValueOfIntegerTooLongPrefixLengthIPv4() {
151 + Ip4Prefix ipPrefix;
152 +
153 + ipPrefix = Ip4Prefix.valueOf(0x01020304, 33);
154 + }
155 +
156 + /**
157 + * Tests valueOf() converter for IPv4 byte array.
99 */ 158 */
100 @Test 159 @Test
101 - public void testConstructorForString() { 160 + public void testValueOfByteArrayIPv4() {
102 - Ip4Prefix ip4prefix = new Ip4Prefix("1.2.3.0/24"); 161 + Ip4Prefix ipPrefix;
103 - assertThat(ip4prefix.toString(), is("1.2.3.0/24")); 162 + byte[] value;
163 +
164 + value = new byte[] {1, 2, 3, 4};
165 + ipPrefix = Ip4Prefix.valueOf(value, 24);
166 + assertThat(ipPrefix.toString(), is("1.2.3.0/24"));
104 167
105 - ip4prefix = new Ip4Prefix("1.2.3.4/24"); 168 + ipPrefix = Ip4Prefix.valueOf(value, 32);
106 - assertThat(ip4prefix.toString(), is("1.2.3.0/24")); 169 + assertThat(ipPrefix.toString(), is("1.2.3.4/32"));
107 170
108 - ip4prefix = new Ip4Prefix("1.2.3.5/32"); 171 + value = new byte[] {1, 2, 3, 5};
109 - assertThat(ip4prefix.toString(), is("1.2.3.5/32")); 172 + ipPrefix = Ip4Prefix.valueOf(value, 32);
173 + assertThat(ipPrefix.toString(), is("1.2.3.5/32"));
110 174
111 - ip4prefix = new Ip4Prefix("0.0.0.0/0"); 175 + value = new byte[] {0, 0, 0, 0};
112 - assertThat(ip4prefix.toString(), is("0.0.0.0/0")); 176 + ipPrefix = Ip4Prefix.valueOf(value, 0);
177 + assertThat(ipPrefix.toString(), is("0.0.0.0/0"));
113 178
114 - ip4prefix = new Ip4Prefix("255.255.255.255/32"); 179 + ipPrefix = Ip4Prefix.valueOf(value, 32);
115 - assertThat(ip4prefix.toString(), is("255.255.255.255/32")); 180 + assertThat(ipPrefix.toString(), is("0.0.0.0/32"));
181 +
182 + value = new byte[] {(byte) 0xff, (byte) 0xff,
183 + (byte) 0xff, (byte) 0xff};
184 + ipPrefix = Ip4Prefix.valueOf(value, 0);
185 + assertThat(ipPrefix.toString(), is("0.0.0.0/0"));
186 +
187 + ipPrefix = Ip4Prefix.valueOf(value, 16);
188 + assertThat(ipPrefix.toString(), is("255.255.0.0/16"));
189 +
190 + ipPrefix = Ip4Prefix.valueOf(value, 32);
191 + assertThat(ipPrefix.toString(), is("255.255.255.255/32"));
116 } 192 }
117 193
118 /** 194 /**
119 - * Tests invalid class constructor for a null string. 195 + * Tests invalid valueOf() converter for a null array for IPv4.
120 */ 196 */
121 @Test(expected = NullPointerException.class) 197 @Test(expected = NullPointerException.class)
122 - public void testInvalidConstructorNullString() { 198 + public void testInvalidValueOfNullArrayIPv4() {
123 - String fromString = null; 199 + Ip4Prefix ipPrefix;
124 - Ip4Prefix ip4prefix = new Ip4Prefix(fromString); 200 + byte[] value;
201 +
202 + value = null;
203 + ipPrefix = Ip4Prefix.valueOf(value, 24);
125 } 204 }
126 205
127 /** 206 /**
128 - * Tests invalid class constructor for an empty string. 207 + * Tests invalid valueOf() converter for a short array for IPv4.
129 */ 208 */
130 @Test(expected = IllegalArgumentException.class) 209 @Test(expected = IllegalArgumentException.class)
131 - public void testInvalidConstructors() { 210 + public void testInvalidValueOfShortArrayIPv4() {
132 - // Check constructor for invalid ID: empty string 211 + Ip4Prefix ipPrefix;
133 - Ip4Prefix ip4prefix = new Ip4Prefix(""); 212 + byte[] value;
213 +
214 + value = new byte[] {1, 2, 3};
215 + ipPrefix = Ip4Prefix.valueOf(value, 24);
134 } 216 }
135 217
136 /** 218 /**
137 - * Tests getting the value of an address. 219 + * Tests invalid valueOf() converter for IPv4 byte array and
220 + * negative prefix length.
221 + */
222 + @Test(expected = IllegalArgumentException.class)
223 + public void testInvalidValueOfByteArrayNegativePrefixLengthIPv4() {
224 + Ip4Prefix ipPrefix;
225 + byte[] value;
226 +
227 + value = new byte[] {1, 2, 3, 4};
228 + ipPrefix = Ip4Prefix.valueOf(value, -1);
229 + }
230 +
231 + /**
232 + * Tests invalid valueOf() converter for IPv4 byte array and
233 + * too long prefix length.
234 + */
235 + @Test(expected = IllegalArgumentException.class)
236 + public void testInvalidValueOfByteArrayTooLongPrefixLengthIPv4() {
237 + Ip4Prefix ipPrefix;
238 + byte[] value;
239 +
240 + value = new byte[] {1, 2, 3, 4};
241 + ipPrefix = Ip4Prefix.valueOf(value, 33);
242 + }
243 +
244 + /**
245 + * Tests valueOf() converter for IPv4 address.
138 */ 246 */
139 @Test 247 @Test
140 - public void testGetValue() { 248 + public void testValueOfAddressIPv4() {
141 - Ip4Prefix ip4prefix = new Ip4Prefix("1.2.3.0/24"); 249 + Ip4Address ipAddress;
142 - assertThat(ip4prefix.getAddress(), equalTo(new Ip4Address("1.2.3.0"))); 250 + Ip4Prefix ipPrefix;
143 - assertThat(ip4prefix.getPrefixLen(), is((short) 24)); 251 +
252 + ipAddress = Ip4Address.valueOf("1.2.3.4");
253 + ipPrefix = Ip4Prefix.valueOf(ipAddress, 24);
254 + assertThat(ipPrefix.toString(), is("1.2.3.0/24"));
255 +
256 + ipPrefix = Ip4Prefix.valueOf(ipAddress, 32);
257 + assertThat(ipPrefix.toString(), is("1.2.3.4/32"));
258 +
259 + ipAddress = Ip4Address.valueOf("1.2.3.5");
260 + ipPrefix = Ip4Prefix.valueOf(ipAddress, 32);
261 + assertThat(ipPrefix.toString(), is("1.2.3.5/32"));
262 +
263 + ipAddress = Ip4Address.valueOf("0.0.0.0");
264 + ipPrefix = Ip4Prefix.valueOf(ipAddress, 0);
265 + assertThat(ipPrefix.toString(), is("0.0.0.0/0"));
266 +
267 + ipPrefix = Ip4Prefix.valueOf(ipAddress, 32);
268 + assertThat(ipPrefix.toString(), is("0.0.0.0/32"));
269 +
270 + ipAddress = Ip4Address.valueOf("255.255.255.255");
271 + ipPrefix = Ip4Prefix.valueOf(ipAddress, 0);
272 + assertThat(ipPrefix.toString(), is("0.0.0.0/0"));
273 +
274 + ipPrefix = Ip4Prefix.valueOf(ipAddress, 16);
275 + assertThat(ipPrefix.toString(), is("255.255.0.0/16"));
276 +
277 + ipPrefix = Ip4Prefix.valueOf(ipAddress, 32);
278 + assertThat(ipPrefix.toString(), is("255.255.255.255/32"));
279 + }
280 +
281 + /**
282 + * Tests invalid valueOf() converter for a null IP address.
283 + */
284 + @Test(expected = NullPointerException.class)
285 + public void testInvalidValueOfNullAddress() {
286 + Ip4Address ipAddress;
287 + Ip4Prefix ipPrefix;
288 +
289 + ipAddress = null;
290 + ipPrefix = Ip4Prefix.valueOf(ipAddress, 24);
291 + }
144 292
145 - ip4prefix = new Ip4Prefix("0.0.0.0/0"); 293 + /**
146 - assertThat(ip4prefix.getAddress(), equalTo(new Ip4Address("0.0.0.0"))); 294 + * Tests invalid valueOf() converter for IPv4 address and
147 - assertThat(ip4prefix.getPrefixLen(), is((short) 0)); 295 + * negative prefix length.
296 + */
297 + @Test(expected = IllegalArgumentException.class)
298 + public void testInvalidValueOfAddressNegativePrefixLengthIPv4() {
299 + Ip4Address ipAddress;
300 + Ip4Prefix ipPrefix;
148 301
149 - ip4prefix = new Ip4Prefix("255.255.255.255/32"); 302 + ipAddress = Ip4Address.valueOf("1.2.3.4");
150 - assertThat(ip4prefix.getAddress(), 303 + ipPrefix = Ip4Prefix.valueOf(ipAddress, -1);
151 - equalTo(new Ip4Address("255.255.255.255")));
152 - assertThat(ip4prefix.getPrefixLen(), is((short) 32));
153 } 304 }
154 305
155 /** 306 /**
156 - * Tests equality of {@link Ip4Address}. 307 + * Tests invalid valueOf() converter for IPv4 address and
308 + * too long prefix length.
309 + */
310 + @Test(expected = IllegalArgumentException.class)
311 + public void testInvalidValueOfAddressTooLongPrefixLengthIPv4() {
312 + Ip4Address ipAddress;
313 + Ip4Prefix ipPrefix;
314 +
315 + ipAddress = Ip4Address.valueOf("1.2.3.4");
316 + ipPrefix = Ip4Prefix.valueOf(ipAddress, 33);
317 + }
318 +
319 + /**
320 + * Tests valueOf() converter for IPv4 string.
157 */ 321 */
158 @Test 322 @Test
159 - public void testEquality() { 323 + public void testValueOfStringIPv4() {
160 - Ip4Prefix addr1net = new Ip4Prefix("1.2.3.0/24"); 324 + Ip4Prefix ipPrefix;
161 - Ip4Prefix addr2net = new Ip4Prefix("1.2.3.0/24"); 325 +
162 - assertThat(addr1net, is(addr2net)); 326 + ipPrefix = Ip4Prefix.valueOf("1.2.3.4/24");
327 + assertThat(ipPrefix.toString(), is("1.2.3.0/24"));
328 +
329 + ipPrefix = Ip4Prefix.valueOf("1.2.3.4/32");
330 + assertThat(ipPrefix.toString(), is("1.2.3.4/32"));
331 +
332 + ipPrefix = Ip4Prefix.valueOf("1.2.3.5/32");
333 + assertThat(ipPrefix.toString(), is("1.2.3.5/32"));
334 +
335 + ipPrefix = Ip4Prefix.valueOf("0.0.0.0/0");
336 + assertThat(ipPrefix.toString(), is("0.0.0.0/0"));
337 +
338 + ipPrefix = Ip4Prefix.valueOf("0.0.0.0/32");
339 + assertThat(ipPrefix.toString(), is("0.0.0.0/32"));
340 +
341 + ipPrefix = Ip4Prefix.valueOf("255.255.255.255/0");
342 + assertThat(ipPrefix.toString(), is("0.0.0.0/0"));
343 +
344 + ipPrefix = Ip4Prefix.valueOf("255.255.255.255/16");
345 + assertThat(ipPrefix.toString(), is("255.255.0.0/16"));
346 +
347 + ipPrefix = Ip4Prefix.valueOf("255.255.255.255/32");
348 + assertThat(ipPrefix.toString(), is("255.255.255.255/32"));
349 + }
350 +
351 + /**
352 + * Tests invalid valueOf() converter for a null string.
353 + */
354 + @Test(expected = NullPointerException.class)
355 + public void testInvalidValueOfNullString() {
356 + Ip4Prefix ipPrefix;
357 + String fromString;
358 +
359 + fromString = null;
360 + ipPrefix = Ip4Prefix.valueOf(fromString);
361 + }
362 +
363 + /**
364 + * Tests invalid valueOf() converter for an empty string.
365 + */
366 + @Test(expected = IllegalArgumentException.class)
367 + public void testInvalidValueOfEmptyString() {
368 + Ip4Prefix ipPrefix;
369 + String fromString;
163 370
164 - addr1net = new Ip4Prefix("1.2.3.0/24"); 371 + fromString = "";
165 - addr2net = new Ip4Prefix("1.2.3.4/24"); 372 + ipPrefix = Ip4Prefix.valueOf(fromString);
166 - assertThat(addr1net, is(addr2net)); 373 + }
167 374
168 - addr1net = new Ip4Prefix("0.0.0.0/0"); 375 + /**
169 - addr2net = new Ip4Prefix("0.0.0.0/0"); 376 + * Tests invalid valueOf() converter for an incorrect string.
170 - assertThat(addr1net, is(addr2net)); 377 + */
378 + @Test(expected = IllegalArgumentException.class)
379 + public void testInvalidValueOfIncorrectString() {
380 + Ip4Prefix ipPrefix;
381 + String fromString;
171 382
172 - addr1net = new Ip4Prefix("255.255.255.255/32"); 383 + fromString = "NoSuchIpPrefix";
173 - addr2net = new Ip4Prefix("255.255.255.255/32"); 384 + ipPrefix = Ip4Prefix.valueOf(fromString);
174 - assertThat(addr1net, is(addr2net));
175 } 385 }
176 386
177 /** 387 /**
178 - * Tests non-equality of {@link Ip4Address}. 388 + * Tests invalid valueOf() converter for IPv4 string and
389 + * negative prefix length.
390 + */
391 + @Test(expected = IllegalArgumentException.class)
392 + public void testInvalidValueOfStringNegativePrefixLengthIPv4() {
393 + Ip4Prefix ipPrefix;
394 +
395 + ipPrefix = Ip4Prefix.valueOf("1.2.3.4/-1");
396 + }
397 +
398 + /**
399 + * Tests invalid valueOf() converter for IPv4 string and
400 + * too long prefix length.
401 + */
402 + @Test(expected = IllegalArgumentException.class)
403 + public void testInvalidValueOfStringTooLongPrefixLengthIPv4() {
404 + Ip4Prefix ipPrefix;
405 +
406 + ipPrefix = Ip4Prefix.valueOf("1.2.3.4/33");
407 + }
408 +
409 + /**
410 + * Tests IP prefix contains another IP prefix for IPv4.
411 + */
412 + @Test
413 + public void testContainsIpPrefixIPv4() {
414 + Ip4Prefix ipPrefix;
415 +
416 + ipPrefix = Ip4Prefix.valueOf("1.2.0.0/24");
417 + assertTrue(ipPrefix.contains(Ip4Prefix.valueOf("1.2.0.0/24")));
418 + assertTrue(ipPrefix.contains(Ip4Prefix.valueOf("1.2.0.0/32")));
419 + assertTrue(ipPrefix.contains(Ip4Prefix.valueOf("1.2.0.4/32")));
420 + assertFalse(ipPrefix.contains(Ip4Prefix.valueOf("1.2.0.0/16")));
421 + assertFalse(ipPrefix.contains(Ip4Prefix.valueOf("1.3.0.0/24")));
422 + assertFalse(ipPrefix.contains(Ip4Prefix.valueOf("0.0.0.0/16")));
423 + assertFalse(ipPrefix.contains(Ip4Prefix.valueOf("0.0.0.0/0")));
424 + assertFalse(ipPrefix.contains(Ip4Prefix.valueOf("255.255.255.255/32")));
425 +
426 + ipPrefix = Ip4Prefix.valueOf("1.2.0.0/32");
427 + assertFalse(ipPrefix.contains(Ip4Prefix.valueOf("1.2.0.0/24")));
428 + assertTrue(ipPrefix.contains(Ip4Prefix.valueOf("1.2.0.0/32")));
429 + assertFalse(ipPrefix.contains(Ip4Prefix.valueOf("1.2.0.4/32")));
430 + assertFalse(ipPrefix.contains(Ip4Prefix.valueOf("1.2.0.0/16")));
431 + assertFalse(ipPrefix.contains(Ip4Prefix.valueOf("1.3.0.0/24")));
432 + assertFalse(ipPrefix.contains(Ip4Prefix.valueOf("0.0.0.0/16")));
433 + assertFalse(ipPrefix.contains(Ip4Prefix.valueOf("0.0.0.0/0")));
434 + assertFalse(ipPrefix.contains(Ip4Prefix.valueOf("255.255.255.255/32")));
435 +
436 + ipPrefix = Ip4Prefix.valueOf("0.0.0.0/0");
437 + assertTrue(ipPrefix.contains(Ip4Prefix.valueOf("1.2.0.0/24")));
438 + assertTrue(ipPrefix.contains(Ip4Prefix.valueOf("1.2.0.0/32")));
439 + assertTrue(ipPrefix.contains(Ip4Prefix.valueOf("1.2.0.4/32")));
440 + assertTrue(ipPrefix.contains(Ip4Prefix.valueOf("1.2.0.0/16")));
441 + assertTrue(ipPrefix.contains(Ip4Prefix.valueOf("1.3.0.0/24")));
442 + assertTrue(ipPrefix.contains(Ip4Prefix.valueOf("0.0.0.0/16")));
443 + assertTrue(ipPrefix.contains(Ip4Prefix.valueOf("0.0.0.0/0")));
444 + assertTrue(ipPrefix.contains(Ip4Prefix.valueOf("255.255.255.255/32")));
445 +
446 + ipPrefix = Ip4Prefix.valueOf("255.255.255.255/32");
447 + assertFalse(ipPrefix.contains(Ip4Prefix.valueOf("1.2.0.0/24")));
448 + assertFalse(ipPrefix.contains(Ip4Prefix.valueOf("1.2.0.0/32")));
449 + assertFalse(ipPrefix.contains(Ip4Prefix.valueOf("1.2.0.4/32")));
450 + assertFalse(ipPrefix.contains(Ip4Prefix.valueOf("1.2.0.0/16")));
451 + assertFalse(ipPrefix.contains(Ip4Prefix.valueOf("1.3.0.0/24")));
452 + assertFalse(ipPrefix.contains(Ip4Prefix.valueOf("0.0.0.0/16")));
453 + assertFalse(ipPrefix.contains(Ip4Prefix.valueOf("0.0.0.0/0")));
454 + assertTrue(ipPrefix.contains(Ip4Prefix.valueOf("255.255.255.255/32")));
455 + }
456 +
457 + /**
458 + * Tests IP prefix contains IP address for IPv4.
179 */ 459 */
180 @Test 460 @Test
181 - public void testNonEquality() { 461 + public void testContainsIpAddressIPv4() {
182 - Ip4Prefix addr1net = new Ip4Prefix("1.2.0.0/16"); 462 + Ip4Prefix ipPrefix;
183 - Ip4Prefix addr2net = new Ip4Prefix("1.3.0.0/16"); 463 +
184 - Ip4Prefix addr3net = new Ip4Prefix("1.3.0.0/24"); 464 + ipPrefix = Ip4Prefix.valueOf("1.2.0.0/24");
185 - Ip4Prefix addr4net = new Ip4Prefix("0.0.0.0/0"); 465 + assertTrue(ipPrefix.contains(Ip4Address.valueOf("1.2.0.0")));
186 - Ip4Prefix addr5net = new Ip4Prefix("255.255.255.255/32"); 466 + assertTrue(ipPrefix.contains(Ip4Address.valueOf("1.2.0.4")));
187 - assertThat(addr1net, is(not(addr2net))); 467 + assertFalse(ipPrefix.contains(Ip4Address.valueOf("1.3.0.0")));
188 - assertThat(addr3net, is(not(addr2net))); 468 + assertFalse(ipPrefix.contains(Ip4Address.valueOf("0.0.0.0")));
189 - assertThat(addr4net, is(not(addr2net))); 469 + assertFalse(ipPrefix.contains(Ip4Address.valueOf("255.255.255.255")));
190 - assertThat(addr5net, is(not(addr2net))); 470 +
471 + ipPrefix = Ip4Prefix.valueOf("1.2.0.0/32");
472 + assertTrue(ipPrefix.contains(Ip4Address.valueOf("1.2.0.0")));
473 + assertFalse(ipPrefix.contains(Ip4Address.valueOf("1.2.0.4")));
474 + assertFalse(ipPrefix.contains(Ip4Address.valueOf("1.3.0.0")));
475 + assertFalse(ipPrefix.contains(Ip4Address.valueOf("0.0.0.0")));
476 + assertFalse(ipPrefix.contains(Ip4Address.valueOf("255.255.255.255")));
477 +
478 + ipPrefix = Ip4Prefix.valueOf("0.0.0.0/0");
479 + assertTrue(ipPrefix.contains(Ip4Address.valueOf("1.2.0.0")));
480 + assertTrue(ipPrefix.contains(Ip4Address.valueOf("1.2.0.4")));
481 + assertTrue(ipPrefix.contains(Ip4Address.valueOf("1.3.0.0")));
482 + assertTrue(ipPrefix.contains(Ip4Address.valueOf("0.0.0.0")));
483 + assertTrue(ipPrefix.contains(Ip4Address.valueOf("255.255.255.255")));
484 +
485 + ipPrefix = Ip4Prefix.valueOf("255.255.255.255/32");
486 + assertFalse(ipPrefix.contains(Ip4Address.valueOf("1.2.0.0")));
487 + assertFalse(ipPrefix.contains(Ip4Address.valueOf("1.2.0.4")));
488 + assertFalse(ipPrefix.contains(Ip4Address.valueOf("1.3.0.0")));
489 + assertFalse(ipPrefix.contains(Ip4Address.valueOf("0.0.0.0")));
490 + assertTrue(ipPrefix.contains(Ip4Address.valueOf("255.255.255.255")));
191 } 491 }
192 492
193 /** 493 /**
194 - * Tests object string representation. 494 + * Tests equality of {@link Ip4Prefix} for IPv4.
195 */ 495 */
196 @Test 496 @Test
197 - public void testToString() { 497 + public void testEqualityIPv4() {
198 - Ip4Prefix ip4prefix = new Ip4Prefix("1.2.3.0/24"); 498 + new EqualsTester()
199 - assertThat(ip4prefix.toString(), is("1.2.3.0/24")); 499 + .addEqualityGroup(Ip4Prefix.valueOf("1.2.0.0/24"),
500 + Ip4Prefix.valueOf("1.2.0.0/24"),
501 + Ip4Prefix.valueOf("1.2.0.4/24"))
502 + .addEqualityGroup(Ip4Prefix.valueOf("1.2.0.0/16"),
503 + Ip4Prefix.valueOf("1.2.0.0/16"))
504 + .addEqualityGroup(Ip4Prefix.valueOf("1.2.0.0/32"),
505 + Ip4Prefix.valueOf("1.2.0.0/32"))
506 + .addEqualityGroup(Ip4Prefix.valueOf("1.3.0.0/24"),
507 + Ip4Prefix.valueOf("1.3.0.0/24"))
508 + .addEqualityGroup(Ip4Prefix.valueOf("0.0.0.0/0"),
509 + Ip4Prefix.valueOf("0.0.0.0/0"))
510 + .addEqualityGroup(Ip4Prefix.valueOf("255.255.255.255/32"),
511 + Ip4Prefix.valueOf("255.255.255.255/32"))
512 + .testEquals();
513 + }
514 +
515 + /**
516 + * Tests object string representation for IPv4.
517 + */
518 + @Test
519 + public void testToStringIPv4() {
520 + Ip4Prefix ipPrefix;
521 +
522 + ipPrefix = Ip4Prefix.valueOf("1.2.3.0/24");
523 + assertThat(ipPrefix.toString(), is("1.2.3.0/24"));
200 524
201 - ip4prefix = new Ip4Prefix("1.2.3.4/24"); 525 + ipPrefix = Ip4Prefix.valueOf("1.2.3.4/24");
202 - assertThat(ip4prefix.toString(), is("1.2.3.0/24")); 526 + assertThat(ipPrefix.toString(), is("1.2.3.0/24"));
203 527
204 - ip4prefix = new Ip4Prefix("0.0.0.0/0"); 528 + ipPrefix = Ip4Prefix.valueOf("0.0.0.0/0");
205 - assertThat(ip4prefix.toString(), is("0.0.0.0/0")); 529 + assertThat(ipPrefix.toString(), is("0.0.0.0/0"));
206 530
207 - ip4prefix = new Ip4Prefix("255.255.255.255/32"); 531 + ipPrefix = Ip4Prefix.valueOf("255.255.255.255/32");
208 - assertThat(ip4prefix.toString(), is("255.255.255.255/32")); 532 + assertThat(ipPrefix.toString(), is("255.255.255.255/32"));
209 } 533 }
210 } 534 }
......
...@@ -15,10 +15,13 @@ ...@@ -15,10 +15,13 @@
15 */ 15 */
16 package org.onlab.packet; 16 package org.onlab.packet;
17 17
18 +import com.google.common.net.InetAddresses;
19 +import com.google.common.testing.EqualsTester;
18 import org.junit.Test; 20 import org.junit.Test;
19 21
22 +import java.net.InetAddress;
23 +
20 import static org.hamcrest.Matchers.is; 24 import static org.hamcrest.Matchers.is;
21 -import static org.hamcrest.Matchers.not;
22 import static org.junit.Assert.assertThat; 25 import static org.junit.Assert.assertThat;
23 import static org.junit.Assert.assertTrue; 26 import static org.junit.Assert.assertTrue;
24 import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable; 27 import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
...@@ -36,100 +39,103 @@ public class Ip6AddressTest { ...@@ -36,100 +39,103 @@ public class Ip6AddressTest {
36 } 39 }
37 40
38 /** 41 /**
39 - * Tests the length of the address in bytes (octets). 42 + * Tests the IPv4 address version constant.
40 */ 43 */
41 @Test 44 @Test
42 - public void testAddrBytelen() { 45 + public void testAddressVersion() {
43 - assertThat(Ip6Address.BYTE_LENGTH, is(16)); 46 + assertThat(Ip6Address.VERSION, is(IpAddress.Version.INET6));
44 } 47 }
45 48
46 /** 49 /**
47 - * Tests the length of the address in bits. 50 + * Tests the length of the address in bytes (octets).
48 */ 51 */
49 @Test 52 @Test
50 - public void testAddrBitlen() { 53 + public void testAddrByteLength() {
51 - assertThat(Ip6Address.BIT_LENGTH, is(128)); 54 + assertThat(Ip6Address.BYTE_LENGTH, is(16));
52 } 55 }
53 56
54 /** 57 /**
55 - * Tests default class constructor. 58 + * Tests the length of the address in bits.
56 */ 59 */
57 @Test 60 @Test
58 - public void testDefaultConstructor() { 61 + public void testAddrBitLength() {
59 - Ip6Address ip6Address = new Ip6Address(); 62 + assertThat(Ip6Address.BIT_LENGTH, is(128));
60 - assertThat(ip6Address.toString(), is("::"));
61 } 63 }
62 64
63 /** 65 /**
64 - * Tests valid class copy constructor. 66 + * Tests returning the IP address version.
65 */ 67 */
66 @Test 68 @Test
67 - public void testCopyConstructor() { 69 + public void testVersion() {
68 - Ip6Address fromAddr = 70 + IpAddress ipAddress;
69 - new Ip6Address("1111:2222:3333:4444:5555:6666:7777:8888");
70 - Ip6Address ip6Address = new Ip6Address(fromAddr);
71 - assertThat(ip6Address.toString(),
72 - is("1111:2222:3333:4444:5555:6666:7777:8888"));
73 71
74 - fromAddr = new Ip6Address("::"); 72 + // IPv6
75 - ip6Address = new Ip6Address(fromAddr); 73 + ipAddress = IpAddress.valueOf("::");
76 - assertThat(ip6Address.toString(), is("::")); 74 + assertThat(ipAddress.version(), is(IpAddress.Version.INET6));
77 -
78 - fromAddr = new Ip6Address("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
79 - ip6Address = new Ip6Address(fromAddr);
80 - assertThat(ip6Address.toString(),
81 - is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"));
82 - }
83 -
84 - /**
85 - * Tests invalid class copy constructor for a null object to copy from.
86 - */
87 - @Test(expected = NullPointerException.class)
88 - public void testInvalidConstructorNullObject() {
89 - Ip6Address fromAddr = null;
90 - Ip6Address ip6Address = new Ip6Address(fromAddr);
91 } 75 }
92 76
93 /** 77 /**
94 - * Tests valid class constructor for integer values. 78 + * Tests returning an IPv6 address as a byte array.
95 */ 79 */
96 @Test 80 @Test
97 - public void testConstructorForInteger() { 81 + public void testAddressToOctetsIPv6() {
98 - Ip6Address ip6Address = 82 + Ip6Address ipAddress;
99 - new Ip6Address(0x1111222233334444L, 0x5555666677778888L); 83 + byte[] value;
100 - assertThat(ip6Address.toString(),
101 - is("1111:2222:3333:4444:5555:6666:7777:8888"));
102 84
103 - ip6Address = new Ip6Address(0L, 0L); 85 + value = new byte[] {0x11, 0x11, 0x22, 0x22,
104 - assertThat(ip6Address.toString(), is("::")); 86 + 0x33, 0x33, 0x44, 0x44,
87 + 0x55, 0x55, 0x66, 0x66,
88 + 0x77, 0x77,
89 + (byte) 0x88, (byte) 0x88};
90 + ipAddress =
91 + Ip6Address.valueOf("1111:2222:3333:4444:5555:6666:7777:8888");
92 + assertThat(ipAddress.toOctets(), is(value));
105 93
106 - ip6Address = new Ip6Address(-1L, -1L); 94 + value = new byte[] {0x00, 0x00, 0x00, 0x00,
107 - assertThat(ip6Address.toString(), 95 + 0x00, 0x00, 0x00, 0x00,
108 - is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")); 96 + 0x00, 0x00, 0x00, 0x00,
97 + 0x00, 0x00, 0x00, 0x00};
98 + ipAddress = Ip6Address.valueOf("::");
99 + assertThat(ipAddress.toOctets(), is(value));
100 +
101 + value = new byte[] {(byte) 0xff, (byte) 0xff,
102 + (byte) 0xff, (byte) 0xff,
103 + (byte) 0xff, (byte) 0xff,
104 + (byte) 0xff, (byte) 0xff,
105 + (byte) 0xff, (byte) 0xff,
106 + (byte) 0xff, (byte) 0xff,
107 + (byte) 0xff, (byte) 0xff,
108 + (byte) 0xff, (byte) 0xff};
109 + ipAddress =
110 + Ip6Address.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
111 + assertThat(ipAddress.toOctets(), is(value));
109 } 112 }
110 113
111 /** 114 /**
112 - * Tests valid class constructor for an array value. 115 + * Tests valueOf() converter for IPv6 byte array.
113 */ 116 */
114 @Test 117 @Test
115 - public void testConstructorForArray() { 118 + public void testValueOfByteArrayIPv6() {
116 - final byte[] value1 = new byte[] {0x11, 0x11, 0x22, 0x22, 119 + Ip6Address ipAddress;
120 + byte[] value;
121 +
122 + value = new byte[] {0x11, 0x11, 0x22, 0x22,
117 0x33, 0x33, 0x44, 0x44, 123 0x33, 0x33, 0x44, 0x44,
118 0x55, 0x55, 0x66, 0x66, 124 0x55, 0x55, 0x66, 0x66,
119 0x77, 0x77, 125 0x77, 0x77,
120 (byte) 0x88, (byte) 0x88}; 126 (byte) 0x88, (byte) 0x88};
121 - Ip6Address ip6Address = new Ip6Address(value1); 127 + ipAddress = Ip6Address.valueOf(value);
122 - assertThat(ip6Address.toString(), 128 + assertThat(ipAddress.toString(),
123 is("1111:2222:3333:4444:5555:6666:7777:8888")); 129 is("1111:2222:3333:4444:5555:6666:7777:8888"));
124 130
125 - final byte[] value2 = new byte[] {0x00, 0x00, 0x00, 0x00, 131 + value = new byte[] {0x00, 0x00, 0x00, 0x00,
126 0x00, 0x00, 0x00, 0x00, 132 0x00, 0x00, 0x00, 0x00,
127 0x00, 0x00, 0x00, 0x00, 133 0x00, 0x00, 0x00, 0x00,
128 0x00, 0x00, 0x00, 0x00}; 134 0x00, 0x00, 0x00, 0x00};
129 - ip6Address = new Ip6Address(value2); 135 + ipAddress = Ip6Address.valueOf(value);
130 - assertThat(ip6Address.toString(), is("::")); 136 + assertThat(ipAddress.toString(), is("::"));
131 137
132 - final byte[] value3 = new byte[] {(byte) 0xff, (byte) 0xff, 138 + value = new byte[] {(byte) 0xff, (byte) 0xff,
133 (byte) 0xff, (byte) 0xff, 139 (byte) 0xff, (byte) 0xff,
134 (byte) 0xff, (byte) 0xff, 140 (byte) 0xff, (byte) 0xff,
135 (byte) 0xff, (byte) 0xff, 141 (byte) 0xff, (byte) 0xff,
...@@ -137,37 +143,63 @@ public class Ip6AddressTest { ...@@ -137,37 +143,63 @@ public class Ip6AddressTest {
137 (byte) 0xff, (byte) 0xff, 143 (byte) 0xff, (byte) 0xff,
138 (byte) 0xff, (byte) 0xff, 144 (byte) 0xff, (byte) 0xff,
139 (byte) 0xff, (byte) 0xff}; 145 (byte) 0xff, (byte) 0xff};
140 - ip6Address = new Ip6Address(value3); 146 + ipAddress = Ip6Address.valueOf(value);
141 - assertThat(ip6Address.toString(), 147 + assertThat(ipAddress.toString(),
142 is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")); 148 is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"));
143 } 149 }
144 150
145 /** 151 /**
146 - * Tests valid class constructor for an array value and an offset. 152 + * Tests invalid valueOf() converter for a null array for IPv6.
153 + */
154 + @Test(expected = NullPointerException.class)
155 + public void testInvalidValueOfNullArrayIPv6() {
156 + Ip6Address ipAddress;
157 +
158 + final byte[] fromArray = null;
159 + ipAddress = Ip6Address.valueOf(fromArray);
160 + }
161 +
162 + /**
163 + * Tests invalid valueOf() converger for an array that is too short for
164 + * IPv6.
165 + */
166 + @Test(expected = IllegalArgumentException.class)
167 + public void testInvalidValueOfShortArrayIPv6() {
168 + Ip6Address ipAddress;
169 +
170 + final byte[] fromArray = new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9};
171 + ipAddress = Ip6Address.valueOf(fromArray);
172 + }
173 +
174 + /**
175 + * Tests valueOf() converter for IPv6 byte array and an offset.
147 */ 176 */
148 @Test 177 @Test
149 - public void testConstructorForArrayAndOffset() { 178 + public void testValueOfByteArrayOffsetIPv6() {
150 - final byte[] value1 = new byte[] {11, 22, 33, // Preamble 179 + Ip6Address ipAddress;
180 + byte[] value;
181 +
182 + value = new byte[] {11, 22, 33, // Preamble
151 0x11, 0x11, 0x22, 0x22, 183 0x11, 0x11, 0x22, 0x22,
152 0x33, 0x33, 0x44, 0x44, 184 0x33, 0x33, 0x44, 0x44,
153 0x55, 0x55, 0x66, 0x66, 185 0x55, 0x55, 0x66, 0x66,
154 0x77, 0x77, 186 0x77, 0x77,
155 (byte) 0x88, (byte) 0x88, 187 (byte) 0x88, (byte) 0x88,
156 44, 55}; // Extra bytes 188 44, 55}; // Extra bytes
157 - Ip6Address ip6Address = new Ip6Address(value1, 3); 189 + ipAddress = Ip6Address.valueOf(value, 3);
158 - assertThat(ip6Address.toString(), 190 + assertThat(ipAddress.toString(),
159 is("1111:2222:3333:4444:5555:6666:7777:8888")); 191 is("1111:2222:3333:4444:5555:6666:7777:8888"));
160 192
161 - final byte[] value2 = new byte[] {11, 22, // Preamble 193 + value = new byte[] {11, 22, // Preamble
162 0x00, 0x00, 0x00, 0x00, 194 0x00, 0x00, 0x00, 0x00,
163 0x00, 0x00, 0x00, 0x00, 195 0x00, 0x00, 0x00, 0x00,
164 0x00, 0x00, 0x00, 0x00, 196 0x00, 0x00, 0x00, 0x00,
165 0x00, 0x00, 0x00, 0x00, 197 0x00, 0x00, 0x00, 0x00,
166 33}; // Extra bytes 198 33}; // Extra bytes
167 - ip6Address = new Ip6Address(value2, 2); 199 + ipAddress = Ip6Address.valueOf(value, 2);
168 - assertThat(ip6Address.toString(), is("::")); 200 + assertThat(ipAddress.toString(), is("::"));
169 201
170 - final byte[] value3 = new byte[] {11, 22, // Preamble 202 + value = new byte[] {11, 22, // Preamble
171 (byte) 0xff, (byte) 0xff, 203 (byte) 0xff, (byte) 0xff,
172 (byte) 0xff, (byte) 0xff, 204 (byte) 0xff, (byte) 0xff,
173 (byte) 0xff, (byte) 0xff, 205 (byte) 0xff, (byte) 0xff,
...@@ -177,276 +209,289 @@ public class Ip6AddressTest { ...@@ -177,276 +209,289 @@ public class Ip6AddressTest {
177 (byte) 0xff, (byte) 0xff, 209 (byte) 0xff, (byte) 0xff,
178 (byte) 0xff, (byte) 0xff, 210 (byte) 0xff, (byte) 0xff,
179 33}; // Extra bytes 211 33}; // Extra bytes
180 - ip6Address = new Ip6Address(value3, 2); 212 + ipAddress = Ip6Address.valueOf(value, 2);
181 - assertThat(ip6Address.toString(), 213 + assertThat(ipAddress.toString(),
182 is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")); 214 is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"));
183 } 215 }
184 216
185 /** 217 /**
186 - * Tests invalid class constructor for a null array. 218 + * Tests invalid valueOf() converger for an array and an invalid offset
187 - */ 219 + * for IPv6.
188 - @Test(expected = NullPointerException.class)
189 - public void testInvalidConstructorNullArray() {
190 - final byte[] fromArray = null;
191 - Ip6Address ip6Address = new Ip6Address(fromArray);
192 - }
193 -
194 - /**
195 - * Tests invalid class constructor for an array that is too short.
196 */ 220 */
197 @Test(expected = IllegalArgumentException.class) 221 @Test(expected = IllegalArgumentException.class)
198 - public void testInvalidConstructorShortArray() { 222 + public void testInvalidValueOfArrayInvalidOffsetIPv6() {
199 - final byte[] fromArray = new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9}; 223 + Ip6Address ipAddress;
200 - Ip6Address ip6Address = new Ip6Address(fromArray); 224 + byte[] value;
201 - }
202 225
203 - /** 226 + value = new byte[] {11, 22, 33, // Preamble
204 - * Tests invalid class constructor for an array and an invalid offset.
205 - */
206 - @Test(expected = IllegalArgumentException.class)
207 - public void testInvalidConstructorArrayInvalidOffset() {
208 - final byte[] value1 = new byte[] {11, 22, 33, // Preamble
209 0x11, 0x11, 0x22, 0x22, 227 0x11, 0x11, 0x22, 0x22,
210 0x33, 0x33, 0x44, 0x44, 228 0x33, 0x33, 0x44, 0x44,
211 0x55, 0x55, 0x66, 0x66, 229 0x55, 0x55, 0x66, 0x66,
212 0x77, 0x77, 230 0x77, 0x77,
213 (byte) 0x88, (byte) 0x88, 231 (byte) 0x88, (byte) 0x88,
214 44, 55}; // Extra bytes 232 44, 55}; // Extra bytes
215 - Ip6Address ip6Address = new Ip6Address(value1, 6); 233 + ipAddress = Ip6Address.valueOf(value, 6);
216 } 234 }
217 235
218 /** 236 /**
219 - * Tests valid class constructor for a string. 237 + * Tests valueOf() converter for IPv6 InetAddress.
220 */ 238 */
221 @Test 239 @Test
222 - public void testConstructorForString() { 240 + public void testValueOfInetAddressIPv6() {
223 - Ip6Address ip6Address = 241 + Ip6Address ipAddress;
224 - new Ip6Address("1111:2222:3333:4444:5555:6666:7777:8888"); 242 + InetAddress inetAddress;
225 - assertThat(ip6Address.toString(), 243 +
244 + inetAddress =
245 + InetAddresses.forString("1111:2222:3333:4444:5555:6666:7777:8888");
246 + ipAddress = Ip6Address.valueOf(inetAddress);
247 + assertThat(ipAddress.toString(),
226 is("1111:2222:3333:4444:5555:6666:7777:8888")); 248 is("1111:2222:3333:4444:5555:6666:7777:8888"));
227 249
228 - ip6Address = new Ip6Address("::"); 250 + inetAddress = InetAddresses.forString("::");
229 - assertThat(ip6Address.toString(), is("::")); 251 + ipAddress = Ip6Address.valueOf(inetAddress);
252 + assertThat(ipAddress.toString(), is("::"));
230 253
231 - ip6Address = new Ip6Address("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"); 254 + inetAddress =
232 - assertThat(ip6Address.toString(), 255 + InetAddresses.forString("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
256 + ipAddress = Ip6Address.valueOf(inetAddress);
257 + assertThat(ipAddress.toString(),
233 is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")); 258 is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"));
234 } 259 }
235 260
236 /** 261 /**
237 - * Tests invalid class constructor for a null string. 262 + * Tests valueOf() converter for IPv6 string.
263 + */
264 + @Test
265 + public void testValueOfStringIPv6() {
266 + Ip6Address ipAddress;
267 +
268 + ipAddress =
269 + Ip6Address.valueOf("1111:2222:3333:4444:5555:6666:7777:8888");
270 + assertThat(ipAddress.toString(),
271 + is("1111:2222:3333:4444:5555:6666:7777:8888"));
272 +
273 + ipAddress = Ip6Address.valueOf("::");
274 + assertThat(ipAddress.toString(), is("::"));
275 +
276 + ipAddress =
277 + Ip6Address.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
278 + assertThat(ipAddress.toString(),
279 + is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"));
280 + }
281 +
282 + /**
283 + * Tests invalid valueOf() converter for a null string.
238 */ 284 */
239 @Test(expected = NullPointerException.class) 285 @Test(expected = NullPointerException.class)
240 - public void testInvalidConstructorNullString() { 286 + public void testInvalidValueOfNullString() {
287 + Ip6Address ipAddress;
288 +
241 String fromString = null; 289 String fromString = null;
242 - Ip6Address ip6Address = new Ip6Address(fromString); 290 + ipAddress = Ip6Address.valueOf(fromString);
243 } 291 }
244 292
245 /** 293 /**
246 - * Tests invalid class constructor for an empty string. 294 + * Tests invalid valueOf() converter for an empty string.
247 */ 295 */
248 @Test(expected = IllegalArgumentException.class) 296 @Test(expected = IllegalArgumentException.class)
249 - public void testInvalidConstructors() { 297 + public void testInvalidValueOfEmptyString() {
250 - // Check constructor for invalid ID: empty string 298 + Ip6Address ipAddress;
251 - Ip6Address ip6Address = new Ip6Address(""); 299 +
300 + String fromString = "";
301 + ipAddress = Ip6Address.valueOf(fromString);
252 } 302 }
253 303
254 /** 304 /**
255 - * Tests returning the address as a byte array. 305 + * Tests invalid valueOf() converter for an incorrect string.
256 */ 306 */
257 - @Test 307 + @Test(expected = IllegalArgumentException.class)
258 - public void testAddressToOctets() { 308 + public void testInvalidValueOfIncorrectString() {
259 - final byte[] value1 = new byte[] {0x11, 0x11, 0x22, 0x22, 309 + Ip6Address ipAddress;
260 - 0x33, 0x33, 0x44, 0x44,
261 - 0x55, 0x55, 0x66, 0x66,
262 - 0x77, 0x77,
263 - (byte) 0x88, (byte) 0x88};
264 - Ip6Address ip6Address =
265 - new Ip6Address("1111:2222:3333:4444:5555:6666:7777:8888");
266 - assertThat(ip6Address.toOctets(), is(value1));
267 -
268 - final byte[] value2 = new byte[] {0x00, 0x00, 0x00, 0x00,
269 - 0x00, 0x00, 0x00, 0x00,
270 - 0x00, 0x00, 0x00, 0x00,
271 - 0x00, 0x00, 0x00, 0x00};
272 - ip6Address = new Ip6Address("::");
273 - assertThat(ip6Address.toOctets(), is(value2));
274 310
275 - final byte[] value3 = new byte[] {(byte) 0xff, (byte) 0xff, 311 + String fromString = "NoSuchIpAddress";
276 - (byte) 0xff, (byte) 0xff, 312 + ipAddress = Ip6Address.valueOf(fromString);
277 - (byte) 0xff, (byte) 0xff,
278 - (byte) 0xff, (byte) 0xff,
279 - (byte) 0xff, (byte) 0xff,
280 - (byte) 0xff, (byte) 0xff,
281 - (byte) 0xff, (byte) 0xff,
282 - (byte) 0xff, (byte) 0xff};
283 - ip6Address = new Ip6Address("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
284 - assertThat(ip6Address.toOctets(), is(value3));
285 } 313 }
286 314
287 /** 315 /**
288 - * Tests making a mask prefix for a given prefix length. 316 + * Tests making a mask prefix for a given prefix length for IPv6.
289 */ 317 */
290 @Test 318 @Test
291 - public void testMakeMaskPrefix() { 319 + public void testMakeMaskPrefixIPv6() {
292 - Ip6Address ip6Address = Ip6Address.makeMaskPrefix(8); 320 + Ip6Address ipAddress;
293 - assertThat(ip6Address.toString(), is("ff00::"));
294 321
295 - ip6Address = Ip6Address.makeMaskPrefix(120); 322 + ipAddress = Ip6Address.makeMaskPrefix(8);
296 - assertThat(ip6Address.toString(), 323 + assertThat(ipAddress.toString(), is("ff00::"));
324 +
325 + ipAddress = Ip6Address.makeMaskPrefix(120);
326 + assertThat(ipAddress.toString(),
297 is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00")); 327 is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00"));
298 328
299 - ip6Address = Ip6Address.makeMaskPrefix(0); 329 + ipAddress = Ip6Address.makeMaskPrefix(0);
300 - assertThat(ip6Address.toString(), is("::")); 330 + assertThat(ipAddress.toString(), is("::"));
301 331
302 - ip6Address = Ip6Address.makeMaskPrefix(128); 332 + ipAddress = Ip6Address.makeMaskPrefix(128);
303 - assertThat(ip6Address.toString(), 333 + assertThat(ipAddress.toString(),
304 is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")); 334 is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"));
305 335
306 - ip6Address = Ip6Address.makeMaskPrefix(64); 336 + ipAddress = Ip6Address.makeMaskPrefix(64);
307 - assertThat(ip6Address.toString(), is("ffff:ffff:ffff:ffff::")); 337 + assertThat(ipAddress.toString(), is("ffff:ffff:ffff:ffff::"));
308 } 338 }
309 339
310 /** 340 /**
311 - * Tests making of a masked address. 341 + * Tests making a mask prefix for an invalid prefix length for IPv6:
342 + * negative prefix length.
312 */ 343 */
313 - @Test 344 + @Test(expected = IllegalArgumentException.class)
314 - public void testMakeMaskedAddress() { 345 + public void testInvalidMakeNegativeMaskPrefixIPv6() {
315 - Ip6Address ip6Address = 346 + Ip6Address ipAddress;
316 - new Ip6Address("1111:2222:3333:4444:5555:6666:7777:8885");
317 - Ip6Address ip6AddressMasked =
318 - Ip6Address.makeMaskedAddress(ip6Address, 8);
319 - assertThat(ip6AddressMasked.toString(), is("1100::"));
320 -
321 - ip6AddressMasked = Ip6Address.makeMaskedAddress(ip6Address, 120);
322 - assertThat(ip6AddressMasked.toString(),
323 - is("1111:2222:3333:4444:5555:6666:7777:8800"));
324 347
325 - ip6AddressMasked = Ip6Address.makeMaskedAddress(ip6Address, 0); 348 + ipAddress = Ip6Address.makeMaskPrefix(-1);
326 - assertThat(ip6AddressMasked.toString(), is("::")); 349 + }
327 350
328 - ip6AddressMasked = Ip6Address.makeMaskedAddress(ip6Address, 128); 351 + /**
329 - assertThat(ip6AddressMasked.toString(), 352 + * Tests making a mask prefix for an invalid prefix length for IPv6:
330 - is("1111:2222:3333:4444:5555:6666:7777:8885")); 353 + * too long prefix length.
354 + */
355 + @Test(expected = IllegalArgumentException.class)
356 + public void testInvalidMakeTooLongMaskPrefixIPv6() {
357 + Ip6Address ipAddress;
331 358
332 - ip6AddressMasked = Ip6Address.makeMaskedAddress(ip6Address, 64); 359 + ipAddress = Ip6Address.makeMaskPrefix(129);
333 - assertThat(ip6AddressMasked.toString(), is("1111:2222:3333:4444::"));
334 } 360 }
335 361
336 /** 362 /**
337 - * Tests getting the value of an address. 363 + * Tests making of a masked address for IPv6.
338 */ 364 */
339 @Test 365 @Test
340 - public void testGetValue() { 366 + public void testMakeMaskedAddressIPv6() {
341 - Ip6Address ip6Address = 367 + Ip6Address ipAddress =
342 - new Ip6Address("1111:2222:3333:4444:5555:6666:7777:8888"); 368 + Ip6Address.valueOf("1111:2222:3333:4444:5555:6666:7777:8885");
343 - assertThat(ip6Address.getValueHigh(), is(0x1111222233334444L)); 369 + Ip6Address ipAddressMasked;
344 - assertThat(ip6Address.getValueLow(), is(0x5555666677778888L)); 370 +
345 - 371 + ipAddressMasked = Ip6Address.makeMaskedAddress(ipAddress, 8);
346 - ip6Address = new Ip6Address(0, 0); 372 + assertThat(ipAddressMasked.toString(), is("1100::"));
347 - assertThat(ip6Address.getValueHigh(), is(0L)); 373 +
348 - assertThat(ip6Address.getValueLow(), is(0L)); 374 + ipAddressMasked = Ip6Address.makeMaskedAddress(ipAddress, 120);
349 - 375 + assertThat(ipAddressMasked.toString(),
350 - ip6Address = new Ip6Address(-1L, -1L); 376 + is("1111:2222:3333:4444:5555:6666:7777:8800"));
351 - assertThat(ip6Address.getValueHigh(), is(-1L)); 377 +
352 - assertThat(ip6Address.getValueLow(), is(-1L)); 378 + ipAddressMasked = Ip6Address.makeMaskedAddress(ipAddress, 0);
379 + assertThat(ipAddressMasked.toString(), is("::"));
380 +
381 + ipAddressMasked = Ip6Address.makeMaskedAddress(ipAddress, 128);
382 + assertThat(ipAddressMasked.toString(),
383 + is("1111:2222:3333:4444:5555:6666:7777:8885"));
384 +
385 + ipAddressMasked = Ip6Address.makeMaskedAddress(ipAddress, 64);
386 + assertThat(ipAddressMasked.toString(), is("1111:2222:3333:4444::"));
353 } 387 }
354 388
355 /** 389 /**
356 - * Tests equality of {@link Ip6Address}. 390 + * Tests making of a masked address for invalid prefix length for IPv6:
391 + * negative prefix length.
357 */ 392 */
358 - @Test 393 + @Test(expected = IllegalArgumentException.class)
359 - public void testEquality() { 394 + public void testInvalidMakeNegativeMaskedAddressIPv6() {
360 - Ip6Address addr1 = 395 + Ip6Address ipAddress =
361 - new Ip6Address("1111:2222:3333:4444:5555:6666:7777:8888"); 396 + Ip6Address.valueOf("1111:2222:3333:4444:5555:6666:7777:8885");
362 - Ip6Address addr2 = 397 + Ip6Address ipAddressMasked;
363 - new Ip6Address("1111:2222:3333:4444:5555:6666:7777:8888"); 398 +
364 - assertThat(addr1, is(addr2)); 399 + ipAddressMasked = Ip6Address.makeMaskedAddress(ipAddress, -1);
365 -
366 - addr1 = new Ip6Address("::");
367 - addr2 = new Ip6Address("::");
368 - assertThat(addr1, is(addr2));
369 -
370 - addr1 = new Ip6Address("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
371 - addr2 = new Ip6Address("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
372 - assertThat(addr1, is(addr2));
373 } 400 }
374 401
375 /** 402 /**
376 - * Tests non-equality of {@link Ip6Address}. 403 + * Tests making of a masked address for an invalid prefix length for IPv6:
404 + * too long prefix length.
377 */ 405 */
378 - @Test 406 + @Test(expected = IllegalArgumentException.class)
379 - public void testNonEquality() { 407 + public void testInvalidMakeTooLongMaskedAddressIPv6() {
380 - Ip6Address addr1 = 408 + Ip6Address ipAddress =
381 - new Ip6Address("1111:2222:3333:4444:5555:6666:7777:8888"); 409 + Ip6Address.valueOf("1111:2222:3333:4444:5555:6666:7777:8885");
382 - Ip6Address addr2 = 410 + Ip6Address ipAddressMasked;
383 - new Ip6Address("1111:2222:3333:4444:5555:6666:7777:888A"); 411 +
384 - Ip6Address addr3 = new Ip6Address("::"); 412 + ipAddressMasked = Ip6Address.makeMaskedAddress(ipAddress, 129);
385 - Ip6Address addr4 =
386 - new Ip6Address("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
387 - assertThat(addr1, is(not(addr2)));
388 - assertThat(addr3, is(not(addr2)));
389 - assertThat(addr4, is(not(addr2)));
390 } 413 }
391 414
392 /** 415 /**
393 - * Tests comparison of {@link Ip6Address}. 416 + * Tests comparison of {@link Ip6Address} for IPv6.
394 */ 417 */
395 @Test 418 @Test
396 - public void testComparison() { 419 + public void testComparisonIPv6() {
397 - Ip6Address addr1 = 420 + Ip6Address addr1, addr2, addr3, addr4;
398 - new Ip6Address("1111:2222:3333:4444:5555:6666:7777:8888"); 421 +
399 - Ip6Address addr2 = 422 + addr1 = Ip6Address.valueOf("1111:2222:3333:4444:5555:6666:7777:8888");
400 - new Ip6Address("1111:2222:3333:4444:5555:6666:7777:8888"); 423 + addr2 = Ip6Address.valueOf("1111:2222:3333:4444:5555:6666:7777:8888");
401 - Ip6Address addr3 = 424 + addr3 = Ip6Address.valueOf("1111:2222:3333:4444:5555:6666:7777:8887");
402 - new Ip6Address("1111:2222:3333:4444:5555:6666:7777:8887"); 425 + addr4 = Ip6Address.valueOf("1111:2222:3333:4444:5555:6666:7777:8889");
403 - Ip6Address addr4 =
404 - new Ip6Address("1111:2222:3333:4444:5555:6666:7777:8889");
405 assertTrue(addr1.compareTo(addr2) == 0); 426 assertTrue(addr1.compareTo(addr2) == 0);
406 assertTrue(addr1.compareTo(addr3) > 0); 427 assertTrue(addr1.compareTo(addr3) > 0);
407 assertTrue(addr1.compareTo(addr4) < 0); 428 assertTrue(addr1.compareTo(addr4) < 0);
408 429
409 - addr1 = new Ip6Address("ffff:2222:3333:4444:5555:6666:7777:8888"); 430 + addr1 = Ip6Address.valueOf("ffff:2222:3333:4444:5555:6666:7777:8888");
410 - addr2 = new Ip6Address("ffff:2222:3333:4444:5555:6666:7777:8888"); 431 + addr2 = Ip6Address.valueOf("ffff:2222:3333:4444:5555:6666:7777:8888");
411 - addr3 = new Ip6Address("ffff:2222:3333:4444:5555:6666:7777:8887"); 432 + addr3 = Ip6Address.valueOf("ffff:2222:3333:4444:5555:6666:7777:8887");
412 - addr4 = new Ip6Address("ffff:2222:3333:4444:5555:6666:7777:8889"); 433 + addr4 = Ip6Address.valueOf("ffff:2222:3333:4444:5555:6666:7777:8889");
413 assertTrue(addr1.compareTo(addr2) == 0); 434 assertTrue(addr1.compareTo(addr2) == 0);
414 assertTrue(addr1.compareTo(addr3) > 0); 435 assertTrue(addr1.compareTo(addr3) > 0);
415 assertTrue(addr1.compareTo(addr4) < 0); 436 assertTrue(addr1.compareTo(addr4) < 0);
416 437
417 - addr1 = new Ip6Address("ffff:2222:3333:4444:5555:6666:7777:8888"); 438 + addr1 = Ip6Address.valueOf("ffff:2222:3333:4444:5555:6666:7777:8888");
418 - addr2 = new Ip6Address("ffff:2222:3333:4444:5555:6666:7777:8888"); 439 + addr2 = Ip6Address.valueOf("ffff:2222:3333:4444:5555:6666:7777:8888");
419 - addr3 = new Ip6Address("ffff:2222:3333:4443:5555:6666:7777:8888"); 440 + addr3 = Ip6Address.valueOf("ffff:2222:3333:4443:5555:6666:7777:8888");
420 - addr4 = new Ip6Address("ffff:2222:3333:4445:5555:6666:7777:8888"); 441 + addr4 = Ip6Address.valueOf("ffff:2222:3333:4445:5555:6666:7777:8888");
421 assertTrue(addr1.compareTo(addr2) == 0); 442 assertTrue(addr1.compareTo(addr2) == 0);
422 assertTrue(addr1.compareTo(addr3) > 0); 443 assertTrue(addr1.compareTo(addr3) > 0);
423 assertTrue(addr1.compareTo(addr4) < 0); 444 assertTrue(addr1.compareTo(addr4) < 0);
424 } 445 }
425 446
426 /** 447 /**
427 - * Tests object string representation. 448 + * Tests equality of {@link Ip6Address} for IPv6.
428 */ 449 */
429 @Test 450 @Test
430 - public void testToString() { 451 + public void testEqualityIPv6() {
431 - Ip6Address ip6Address = 452 + new EqualsTester()
432 - new Ip6Address("1111:2222:3333:4444:5555:6666:7777:8888"); 453 + .addEqualityGroup(
433 - assertThat(ip6Address.toString(), 454 + Ip6Address.valueOf("1111:2222:3333:4444:5555:6666:7777:8888"),
455 + Ip6Address.valueOf("1111:2222:3333:4444:5555:6666:7777:8888"))
456 + .addEqualityGroup(
457 + Ip6Address.valueOf("1111:2222:3333:4444:5555:6666:7777:888a"),
458 + Ip6Address.valueOf("1111:2222:3333:4444:5555:6666:7777:888a"))
459 + .addEqualityGroup(
460 + Ip6Address.valueOf("::"),
461 + Ip6Address.valueOf("::"))
462 + .addEqualityGroup(
463 + Ip6Address.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"),
464 + Ip6Address.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"))
465 + .testEquals();
466 + }
467 +
468 + /**
469 + * Tests object string representation for IPv6.
470 + */
471 + @Test
472 + public void testToStringIPv6() {
473 + Ip6Address ipAddress;
474 +
475 + ipAddress =
476 + Ip6Address.valueOf("1111:2222:3333:4444:5555:6666:7777:8888");
477 + assertThat(ipAddress.toString(),
434 is("1111:2222:3333:4444:5555:6666:7777:8888")); 478 is("1111:2222:3333:4444:5555:6666:7777:8888"));
435 479
436 - ip6Address = new Ip6Address("1111::8888"); 480 + ipAddress = Ip6Address.valueOf("1111::8888");
437 - assertThat(ip6Address.toString(), is("1111::8888")); 481 + assertThat(ipAddress.toString(), is("1111::8888"));
438 482
439 - ip6Address = new Ip6Address("1111::"); 483 + ipAddress = Ip6Address.valueOf("1111::");
440 - assertThat(ip6Address.toString(), is("1111::")); 484 + assertThat(ipAddress.toString(), is("1111::"));
441 485
442 - ip6Address = new Ip6Address("::8888"); 486 + ipAddress = Ip6Address.valueOf("::8888");
443 - assertThat(ip6Address.toString(), is("::8888")); 487 + assertThat(ipAddress.toString(), is("::8888"));
444 488
445 - ip6Address = new Ip6Address("::"); 489 + ipAddress = Ip6Address.valueOf("::");
446 - assertThat(ip6Address.toString(), is("::")); 490 + assertThat(ipAddress.toString(), is("::"));
447 491
448 - ip6Address = new Ip6Address("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"); 492 + ipAddress =
449 - assertThat(ip6Address.toString(), 493 + Ip6Address.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
494 + assertThat(ipAddress.toString(),
450 is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")); 495 is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"));
451 } 496 }
452 } 497 }
......
...@@ -15,12 +15,14 @@ ...@@ -15,12 +15,14 @@
15 */ 15 */
16 package org.onlab.packet; 16 package org.onlab.packet;
17 17
18 +import com.google.common.testing.EqualsTester;
18 import org.junit.Test; 19 import org.junit.Test;
19 20
20 import static org.hamcrest.Matchers.equalTo; 21 import static org.hamcrest.Matchers.equalTo;
21 import static org.hamcrest.Matchers.is; 22 import static org.hamcrest.Matchers.is;
22 -import static org.hamcrest.Matchers.not;
23 import static org.junit.Assert.assertThat; 23 import static org.junit.Assert.assertThat;
24 +import static org.junit.Assert.assertFalse;
25 +import static org.junit.Assert.assertTrue;
24 import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable; 26 import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable;
25 27
26 /** 28 /**
...@@ -36,235 +38,531 @@ public class Ip6PrefixTest { ...@@ -36,235 +38,531 @@ public class Ip6PrefixTest {
36 } 38 }
37 39
38 /** 40 /**
39 - * Tests default class constructor. 41 + * Tests the IPv4 prefix address version constant.
40 */ 42 */
41 @Test 43 @Test
42 - public void testDefaultConstructor() { 44 + public void testAddressVersion() {
43 - Ip6Prefix ip6prefix = new Ip6Prefix(); 45 + assertThat(Ip6Prefix.VERSION, is(IpAddress.Version.INET6));
44 - assertThat(ip6prefix.toString(), is("::/0"));
45 } 46 }
46 47
47 /** 48 /**
48 - * Tests valid class copy constructor. 49 + * Tests the maximum mask length.
49 */ 50 */
50 @Test 51 @Test
51 - public void testCopyConstructor() { 52 + public void testMaxMaskLength() {
52 - Ip6Prefix fromAddr = new Ip6Prefix("1100::/8"); 53 + assertThat(Ip6Prefix.MAX_MASK_LENGTH, is(128));
53 - Ip6Prefix ip6prefix = new Ip6Prefix(fromAddr); 54 + }
54 - assertThat(ip6prefix.toString(), is("1100::/8")); 55 +
55 - 56 + /**
56 - fromAddr = new Ip6Prefix("::/0"); 57 + * Tests returning the IP version of the prefix.
57 - ip6prefix = new Ip6Prefix(fromAddr); 58 + */
58 - assertThat(ip6prefix.toString(), is("::/0")); 59 + @Test
59 - 60 + public void testVersion() {
60 - fromAddr = 61 + Ip6Prefix ipPrefix;
61 - new Ip6Prefix("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"); 62 +
62 - ip6prefix = new Ip6Prefix(fromAddr); 63 + // IPv6
63 - assertThat(ip6prefix.toString(), 64 + ipPrefix = Ip6Prefix.valueOf("::/0");
65 + assertThat(ipPrefix.version(), is(IpAddress.Version.INET6));
66 + }
67 +
68 + /**
69 + * Tests returning the IP address value and IP address prefix length of
70 + * an IPv6 prefix.
71 + */
72 + @Test
73 + public void testAddressAndPrefixLengthIPv6() {
74 + Ip6Prefix ipPrefix;
75 +
76 + ipPrefix = Ip6Prefix.valueOf("1100::/8");
77 + assertThat(ipPrefix.address(), equalTo(Ip6Address.valueOf("1100::")));
78 + assertThat(ipPrefix.prefixLength(), is(8));
79 +
80 + ipPrefix =
81 + Ip6Prefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8885/8");
82 + assertThat(ipPrefix.address(), equalTo(Ip6Address.valueOf("1100::")));
83 + assertThat(ipPrefix.prefixLength(), is(8));
84 +
85 + ipPrefix =
86 + Ip6Prefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8800/120");
87 + assertThat(ipPrefix.address(),
88 + equalTo(Ip6Address.valueOf("1111:2222:3333:4444:5555:6666:7777:8800")));
89 + assertThat(ipPrefix.prefixLength(), is(120));
90 +
91 + ipPrefix =
92 + Ip6Prefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8885/128");
93 + assertThat(ipPrefix.address(),
94 + equalTo(Ip6Address.valueOf("1111:2222:3333:4444:5555:6666:7777:8885")));
95 + assertThat(ipPrefix.prefixLength(), is(128));
96 +
97 + ipPrefix = Ip6Prefix.valueOf("::/0");
98 + assertThat(ipPrefix.address(), equalTo(Ip6Address.valueOf("::")));
99 + assertThat(ipPrefix.prefixLength(), is(0));
100 +
101 + ipPrefix =
102 + Ip6Prefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128");
103 + assertThat(ipPrefix.address(),
104 + equalTo(Ip6Address.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")));
105 + assertThat(ipPrefix.prefixLength(), is(128));
106 +
107 + ipPrefix =
108 + Ip6Prefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8885/64");
109 + assertThat(ipPrefix.address(),
110 + equalTo(Ip6Address.valueOf("1111:2222:3333:4444::")));
111 + assertThat(ipPrefix.prefixLength(), is(64));
112 + }
113 +
114 + /**
115 + * Tests valueOf() converter for IPv6 byte array.
116 + */
117 + @Test
118 + public void testValueOfByteArrayIPv6() {
119 + Ip6Prefix ipPrefix;
120 + byte[] value;
121 +
122 + value = new byte[] {0x11, 0x11, 0x22, 0x22,
123 + 0x33, 0x33, 0x44, 0x44,
124 + 0x55, 0x55, 0x66, 0x66,
125 + 0x77, 0x77, (byte) 0x88, (byte) 0x88};
126 + ipPrefix = Ip6Prefix.valueOf(value, 120);
127 + assertThat(ipPrefix.toString(),
128 + is("1111:2222:3333:4444:5555:6666:7777:8800/120"));
129 +
130 + ipPrefix = Ip6Prefix.valueOf(value, 128);
131 + assertThat(ipPrefix.toString(),
132 + is("1111:2222:3333:4444:5555:6666:7777:8888/128"));
133 +
134 + value = new byte[] {0x00, 0x00, 0x00, 0x00,
135 + 0x00, 0x00, 0x00, 0x00,
136 + 0x00, 0x00, 0x00, 0x00,
137 + 0x00, 0x00, 0x00, 0x00};
138 + ipPrefix = Ip6Prefix.valueOf(value, 0);
139 + assertThat(ipPrefix.toString(), is("::/0"));
140 +
141 + ipPrefix = Ip6Prefix.valueOf(value, 128);
142 + assertThat(ipPrefix.toString(), is("::/128"));
143 +
144 + value = new byte[] {(byte) 0xff, (byte) 0xff,
145 + (byte) 0xff, (byte) 0xff,
146 + (byte) 0xff, (byte) 0xff,
147 + (byte) 0xff, (byte) 0xff,
148 + (byte) 0xff, (byte) 0xff,
149 + (byte) 0xff, (byte) 0xff,
150 + (byte) 0xff, (byte) 0xff,
151 + (byte) 0xff, (byte) 0xff};
152 + ipPrefix = Ip6Prefix.valueOf(value, 0);
153 + assertThat(ipPrefix.toString(), is("::/0"));
154 +
155 + ipPrefix = Ip6Prefix.valueOf(value, 64);
156 + assertThat(ipPrefix.toString(), is("ffff:ffff:ffff:ffff::/64"));
157 +
158 + ipPrefix = Ip6Prefix.valueOf(value, 128);
159 + assertThat(ipPrefix.toString(),
64 is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128")); 160 is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"));
65 } 161 }
66 162
67 /** 163 /**
68 - * Tests invalid class copy constructor for a null object to copy from. 164 + * Tests invalid valueOf() converter for a null array for IPv6.
69 */ 165 */
70 @Test(expected = NullPointerException.class) 166 @Test(expected = NullPointerException.class)
71 - public void testInvalidConstructorNullObject() { 167 + public void testInvalidValueOfNullArrayIPv6() {
72 - Ip6Prefix fromAddr = null; 168 + Ip6Prefix ipPrefix;
73 - Ip6Prefix ip6prefix = new Ip6Prefix(fromAddr); 169 + byte[] value;
170 +
171 + value = null;
172 + ipPrefix = Ip6Prefix.valueOf(value, 120);
74 } 173 }
75 174
76 /** 175 /**
77 - * Tests valid class constructor for an address and prefix length. 176 + * Tests invalid valueOf() converter for a short array for IPv6.
177 + */
178 + @Test(expected = IllegalArgumentException.class)
179 + public void testInvalidValueOfShortArrayIPv6() {
180 + Ip6Prefix ipPrefix;
181 + byte[] value;
182 +
183 + value = new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9};
184 + ipPrefix = Ip6Prefix.valueOf(value, 120);
185 + }
186 +
187 + /**
188 + * Tests invalid valueOf() converter for IPv6 byte array and
189 + * negative prefix length.
190 + */
191 + @Test(expected = IllegalArgumentException.class)
192 + public void testInvalidValueOfByteArrayNegativePrefixLengthIPv6() {
193 + Ip6Prefix ipPrefix;
194 + byte[] value;
195 +
196 + value = new byte[] {0x11, 0x11, 0x22, 0x22,
197 + 0x33, 0x33, 0x44, 0x44,
198 + 0x55, 0x55, 0x66, 0x66,
199 + 0x77, 0x77, (byte) 0x88, (byte) 0x88};
200 + ipPrefix = Ip6Prefix.valueOf(value, -1);
201 + }
202 +
203 + /**
204 + * Tests invalid valueOf() converter for IPv6 byte array and
205 + * too long prefix length.
206 + */
207 + @Test(expected = IllegalArgumentException.class)
208 + public void testInvalidValueOfByteArrayTooLongPrefixLengthIPv6() {
209 + Ip6Prefix ipPrefix;
210 + byte[] value;
211 +
212 + value = new byte[] {0x11, 0x11, 0x22, 0x22,
213 + 0x33, 0x33, 0x44, 0x44,
214 + 0x55, 0x55, 0x66, 0x66,
215 + 0x77, 0x77, (byte) 0x88, (byte) 0x88};
216 + ipPrefix = Ip6Prefix.valueOf(value, 129);
217 + }
218 +
219 + /**
220 + * Tests valueOf() converter for IPv6 address.
78 */ 221 */
79 @Test 222 @Test
80 - public void testConstructorForAddressAndPrefixLength() { 223 + public void testValueOfAddressIPv6() {
81 - Ip6Prefix ip6prefix = 224 + Ip6Address ipAddress;
82 - new Ip6Prefix(new Ip6Address("1100::"), (short) 8); 225 + Ip6Prefix ipPrefix;
83 - assertThat(ip6prefix.toString(), is("1100::/8")); 226 +
84 - 227 + ipAddress =
85 - ip6prefix = 228 + Ip6Address.valueOf("1111:2222:3333:4444:5555:6666:7777:8888");
86 - new Ip6Prefix(new Ip6Address("1111:2222:3333:4444:5555:6666:7777:8885"), 229 + ipPrefix = Ip6Prefix.valueOf(ipAddress, 120);
87 - (short) 8); 230 + assertThat(ipPrefix.toString(),
88 - assertThat(ip6prefix.toString(), is("1100::/8"));
89 -
90 - ip6prefix =
91 - new Ip6Prefix(new Ip6Address("1111:2222:3333:4444:5555:6666:7777:8800"),
92 - (short) 120);
93 - assertThat(ip6prefix.toString(),
94 is("1111:2222:3333:4444:5555:6666:7777:8800/120")); 231 is("1111:2222:3333:4444:5555:6666:7777:8800/120"));
95 232
96 - ip6prefix = new Ip6Prefix(new Ip6Address("::"), (short) 0); 233 + ipPrefix = Ip6Prefix.valueOf(ipAddress, 128);
97 - assertThat(ip6prefix.toString(), is("::/0")); 234 + assertThat(ipPrefix.toString(),
235 + is("1111:2222:3333:4444:5555:6666:7777:8888/128"));
236 +
237 + ipAddress = Ip6Address.valueOf("::");
238 + ipPrefix = Ip6Prefix.valueOf(ipAddress, 0);
239 + assertThat(ipPrefix.toString(), is("::/0"));
98 240
99 - ip6prefix = 241 + ipPrefix = Ip6Prefix.valueOf(ipAddress, 128);
100 - new Ip6Prefix(new Ip6Address("1111:2222:3333:4444:5555:6666:7777:8885"), 242 + assertThat(ipPrefix.toString(), is("::/128"));
101 - (short) 128);
102 - assertThat(ip6prefix.toString(),
103 - is("1111:2222:3333:4444:5555:6666:7777:8885/128"));
104 243
105 - ip6prefix = 244 + ipAddress =
106 - new Ip6Prefix(new Ip6Address("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"), 245 + Ip6Address.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
107 - (short) 128); 246 + ipPrefix = Ip6Prefix.valueOf(ipAddress, 0);
108 - assertThat(ip6prefix.toString(), 247 + assertThat(ipPrefix.toString(), is("::/0"));
248 +
249 + ipPrefix = Ip6Prefix.valueOf(ipAddress, 64);
250 + assertThat(ipPrefix.toString(), is("ffff:ffff:ffff:ffff::/64"));
251 +
252 + ipPrefix = Ip6Prefix.valueOf(ipAddress, 128);
253 + assertThat(ipPrefix.toString(),
109 is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128")); 254 is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"));
255 + }
110 256
111 - ip6prefix = 257 + /**
112 - new Ip6Prefix(new Ip6Address("1111:2222:3333:4444:5555:6666:7777:8885"), 258 + * Tests invalid valueOf() converter for a null IP address.
113 - (short) 64); 259 + */
114 - assertThat(ip6prefix.toString(), is("1111:2222:3333:4444::/64")); 260 + @Test(expected = NullPointerException.class)
261 + public void testInvalidValueOfNullAddress() {
262 + Ip6Address ipAddress;
263 + Ip6Prefix ipPrefix;
264 +
265 + ipAddress = null;
266 + ipPrefix = Ip6Prefix.valueOf(ipAddress, 24);
115 } 267 }
116 268
117 /** 269 /**
118 - * Tests valid class constructor for a string. 270 + * Tests invalid valueOf() converter for IPv6 address and
271 + * negative prefix length.
119 */ 272 */
120 - @Test 273 + @Test(expected = IllegalArgumentException.class)
121 - public void testConstructorForString() { 274 + public void testInvalidValueOfAddressNegativePrefixLengthIPv6() {
122 - Ip6Prefix ip6prefix = new Ip6Prefix("1100::/8"); 275 + Ip6Address ipAddress;
123 - assertThat(ip6prefix.toString(), is("1100::/8")); 276 + Ip6Prefix ipPrefix;
277 +
278 + ipAddress =
279 + Ip6Address.valueOf("1111:2222:3333:4444:5555:6666:7777:8888");
280 + ipPrefix = Ip6Prefix.valueOf(ipAddress, -1);
281 + }
282 +
283 + /**
284 + * Tests invalid valueOf() converter for IPv6 address and
285 + * too long prefix length.
286 + */
287 + @Test(expected = IllegalArgumentException.class)
288 + public void testInvalidValueOfAddressTooLongPrefixLengthIPv6() {
289 + Ip6Address ipAddress;
290 + Ip6Prefix ipPrefix;
124 291
125 - ip6prefix = new Ip6Prefix("1111:2222:3333:4444:5555:6666:7777:8885/8"); 292 + ipAddress =
126 - assertThat(ip6prefix.toString(), is("1100::/8")); 293 + Ip6Address.valueOf("1111:2222:3333:4444:5555:6666:7777:8888");
294 + ipPrefix = Ip6Prefix.valueOf(ipAddress, 129);
295 + }
296 +
297 + /**
298 + * Tests valueOf() converter for IPv6 string.
299 + */
300 + @Test
301 + public void testValueOfStringIPv6() {
302 + Ip6Prefix ipPrefix;
127 303
128 - ip6prefix = 304 + ipPrefix =
129 - new Ip6Prefix("1111:2222:3333:4444:5555:6666:7777:8800/120"); 305 + Ip6Prefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8888/120");
130 - assertThat(ip6prefix.toString(), 306 + assertThat(ipPrefix.toString(),
131 is("1111:2222:3333:4444:5555:6666:7777:8800/120")); 307 is("1111:2222:3333:4444:5555:6666:7777:8800/120"));
132 308
133 - ip6prefix = new Ip6Prefix("::/0"); 309 + ipPrefix =
134 - assertThat(ip6prefix.toString(), is("::/0")); 310 + Ip6Prefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8888/128");
311 + assertThat(ipPrefix.toString(),
312 + is("1111:2222:3333:4444:5555:6666:7777:8888/128"));
135 313
136 - ip6prefix = 314 + ipPrefix = Ip6Prefix.valueOf("::/0");
137 - new Ip6Prefix("1111:2222:3333:4444:5555:6666:7777:8885/128"); 315 + assertThat(ipPrefix.toString(), is("::/0"));
138 - assertThat(ip6prefix.toString(),
139 - is("1111:2222:3333:4444:5555:6666:7777:8885/128"));
140 316
141 - ip6prefix = new Ip6Prefix("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"); 317 + ipPrefix = Ip6Prefix.valueOf("::/128");
142 - assertThat(ip6prefix.toString(), 318 + assertThat(ipPrefix.toString(), is("::/128"));
143 - is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128")); 319 +
320 + ipPrefix =
321 + Ip6Prefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/0");
322 + assertThat(ipPrefix.toString(), is("::/0"));
323 +
324 + ipPrefix =
325 + Ip6Prefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/64");
326 + assertThat(ipPrefix.toString(), is("ffff:ffff:ffff:ffff::/64"));
144 327
145 - ip6prefix = 328 + ipPrefix =
146 - new Ip6Prefix("1111:2222:3333:4444:5555:6666:7777:8885/64"); 329 + Ip6Prefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128");
147 - assertThat(ip6prefix.toString(), is("1111:2222:3333:4444::/64")); 330 + assertThat(ipPrefix.toString(),
331 + is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"));
148 } 332 }
149 333
150 /** 334 /**
151 - * Tests invalid class constructor for a null string. 335 + * Tests invalid valueOf() converter for a null string.
152 */ 336 */
153 @Test(expected = NullPointerException.class) 337 @Test(expected = NullPointerException.class)
154 - public void testInvalidConstructorNullString() { 338 + public void testInvalidValueOfNullString() {
155 - String fromString = null; 339 + Ip6Prefix ipPrefix;
156 - Ip6Prefix ip6prefix = new Ip6Prefix(fromString); 340 + String fromString;
341 +
342 + fromString = null;
343 + ipPrefix = Ip6Prefix.valueOf(fromString);
157 } 344 }
158 345
159 /** 346 /**
160 - * Tests invalid class constructor for an empty string. 347 + * Tests invalid valueOf() converter for an empty string.
161 */ 348 */
162 @Test(expected = IllegalArgumentException.class) 349 @Test(expected = IllegalArgumentException.class)
163 - public void testInvalidConstructors() { 350 + public void testInvalidValueOfEmptyString() {
164 - // Check constructor for invalid ID: empty string 351 + Ip6Prefix ipPrefix;
165 - Ip6Prefix ip6prefix = new Ip6Prefix(""); 352 + String fromString;
353 +
354 + fromString = "";
355 + ipPrefix = Ip6Prefix.valueOf(fromString);
356 + }
357 +
358 + /**
359 + * Tests invalid valueOf() converter for an incorrect string.
360 + */
361 + @Test(expected = IllegalArgumentException.class)
362 + public void testInvalidValueOfIncorrectString() {
363 + Ip6Prefix ipPrefix;
364 + String fromString;
365 +
366 + fromString = "NoSuchIpPrefix";
367 + ipPrefix = Ip6Prefix.valueOf(fromString);
368 + }
369 +
370 + /**
371 + * Tests invalid valueOf() converter for IPv6 string and
372 + * negative prefix length.
373 + */
374 + @Test(expected = IllegalArgumentException.class)
375 + public void testInvalidValueOfStringNegativePrefixLengthIPv6() {
376 + Ip6Prefix ipPrefix;
377 +
378 + ipPrefix =
379 + Ip6Prefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8888/-1");
380 + }
381 +
382 + /**
383 + * Tests invalid valueOf() converter for IPv6 string and
384 + * too long prefix length.
385 + */
386 + @Test(expected = IllegalArgumentException.class)
387 + public void testInvalidValueOfStringTooLongPrefixLengthIPv6() {
388 + Ip6Prefix ipPrefix;
389 +
390 + ipPrefix =
391 + Ip6Prefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8888/129");
166 } 392 }
167 393
168 /** 394 /**
169 - * Tests getting the value of an address. 395 + * Tests IP prefix contains another IP prefix for IPv6.
170 */ 396 */
171 @Test 397 @Test
172 - public void testGetValue() { 398 + public void testContainsIpPrefixIPv6() {
173 - Ip6Prefix ip6prefix = new Ip6Prefix("1100::/8"); 399 + Ip6Prefix ipPrefix;
174 - assertThat(ip6prefix.getAddress(), equalTo(new Ip6Address("1100::"))); 400 +
175 - assertThat(ip6prefix.getPrefixLen(), is((short) 8)); 401 + ipPrefix = Ip6Prefix.valueOf("1111:2222:3333:4444::/120");
176 - 402 + assertTrue(ipPrefix.contains(
177 - ip6prefix = new Ip6Prefix("1111:2222:3333:4444:5555:6666:7777:8885/8"); 403 + Ip6Prefix.valueOf("1111:2222:3333:4444::/120")));
178 - assertThat(ip6prefix.getAddress(), equalTo(new Ip6Address("1100::"))); 404 + assertTrue(ipPrefix.contains(
179 - assertThat(ip6prefix.getPrefixLen(), is((short) 8)); 405 + Ip6Prefix.valueOf("1111:2222:3333:4444::/128")));
180 - 406 + assertTrue(ipPrefix.contains(
181 - ip6prefix = 407 + Ip6Prefix.valueOf("1111:2222:3333:4444::1/128")));
182 - new Ip6Prefix("1111:2222:3333:4444:5555:6666:7777:8800/120"); 408 + assertFalse(ipPrefix.contains(
183 - assertThat(ip6prefix.getAddress(), 409 + Ip6Prefix.valueOf("1111:2222:3333:4444::/64")));
184 - equalTo(new Ip6Address("1111:2222:3333:4444:5555:6666:7777:8800"))); 410 + assertFalse(ipPrefix.contains(
185 - assertThat(ip6prefix.getPrefixLen(), is((short) 120)); 411 + Ip6Prefix.valueOf("1111:2222:3333:4445::/120")));
186 - 412 + assertFalse(ipPrefix.contains(Ip6Prefix.valueOf("::/64")));
187 - ip6prefix = new Ip6Prefix("::/0"); 413 + assertFalse(ipPrefix.contains(Ip6Prefix.valueOf("::/0")));
188 - assertThat(ip6prefix.getAddress(), equalTo(new Ip6Address("::"))); 414 + assertFalse(ipPrefix.contains(
189 - assertThat(ip6prefix.getPrefixLen(), is((short) 0)); 415 + Ip6Prefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128")));
190 - 416 +
191 - ip6prefix = 417 + ipPrefix = Ip6Prefix.valueOf("1111:2222:3333:4444::/128");
192 - new Ip6Prefix("1111:2222:3333:4444:5555:6666:7777:8885/128"); 418 + assertFalse(ipPrefix.contains(
193 - assertThat(ip6prefix.getAddress(), 419 + Ip6Prefix.valueOf("1111:2222:3333:4444::/120")));
194 - equalTo(new Ip6Address("1111:2222:3333:4444:5555:6666:7777:8885"))); 420 + assertTrue(ipPrefix.contains(
195 - assertThat(ip6prefix.getPrefixLen(), is((short) 128)); 421 + Ip6Prefix.valueOf("1111:2222:3333:4444::/128")));
196 - 422 + assertFalse(ipPrefix.contains(
197 - ip6prefix = 423 + Ip6Prefix.valueOf("1111:2222:3333:4444::1/128")));
198 - new Ip6Prefix("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"); 424 + assertFalse(ipPrefix.contains(
199 - assertThat(ip6prefix.getAddress(), 425 + Ip6Prefix.valueOf("1111:2222:3333:4444::/64")));
200 - equalTo(new Ip6Address("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"))); 426 + assertFalse(ipPrefix.contains(
201 - assertThat(ip6prefix.getPrefixLen(), is((short) 128)); 427 + Ip6Prefix.valueOf("1111:2222:3333:4445::/120")));
202 - 428 + assertFalse(ipPrefix.contains(Ip6Prefix.valueOf("::/64")));
203 - ip6prefix = 429 + assertFalse(ipPrefix.contains(Ip6Prefix.valueOf("::/0")));
204 - new Ip6Prefix("1111:2222:3333:4444:5555:6666:7777:8885/64"); 430 + assertFalse(ipPrefix.contains(
205 - assertThat(ip6prefix.getAddress(), 431 + Ip6Prefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128")));
206 - equalTo(new Ip6Address("1111:2222:3333:4444::"))); 432 +
207 - assertThat(ip6prefix.getPrefixLen(), is((short) 64)); 433 + ipPrefix = Ip6Prefix.valueOf("::/0");
434 + assertTrue(ipPrefix.contains(
435 + Ip6Prefix.valueOf("1111:2222:3333:4444::/120")));
436 + assertTrue(ipPrefix.contains(
437 + Ip6Prefix.valueOf("1111:2222:3333:4444::/128")));
438 + assertTrue(ipPrefix.contains(
439 + Ip6Prefix.valueOf("1111:2222:3333:4444::1/128")));
440 + assertTrue(ipPrefix.contains(
441 + Ip6Prefix.valueOf("1111:2222:3333:4444::/64")));
442 + assertTrue(ipPrefix.contains(
443 + Ip6Prefix.valueOf("1111:2222:3333:4445::/120")));
444 + assertTrue(ipPrefix.contains(Ip6Prefix.valueOf("::/64")));
445 + assertTrue(ipPrefix.contains(Ip6Prefix.valueOf("::/0")));
446 + assertTrue(ipPrefix.contains(
447 + Ip6Prefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128")));
448 +
449 + ipPrefix =
450 + Ip6Prefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128");
451 + assertFalse(ipPrefix.contains(
452 + Ip6Prefix.valueOf("1111:2222:3333:4444::/120")));
453 + assertFalse(ipPrefix.contains(
454 + Ip6Prefix.valueOf("1111:2222:3333:4444::/128")));
455 + assertFalse(ipPrefix.contains(
456 + Ip6Prefix.valueOf("1111:2222:3333:4444::1/128")));
457 + assertFalse(ipPrefix.contains(
458 + Ip6Prefix.valueOf("1111:2222:3333:4444::/64")));
459 + assertFalse(ipPrefix.contains(
460 + Ip6Prefix.valueOf("1111:2222:3333:4445::/120")));
461 + assertFalse(ipPrefix.contains(Ip6Prefix.valueOf("::/64")));
462 + assertFalse(ipPrefix.contains(Ip6Prefix.valueOf("::/0")));
463 + assertTrue(ipPrefix.contains(
464 + Ip6Prefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128")));
208 } 465 }
209 466
210 /** 467 /**
211 - * Tests equality of {@link Ip6Address}. 468 + * Tests IP prefix contains IP address for IPv6.
212 */ 469 */
213 @Test 470 @Test
214 - public void testEquality() { 471 + public void testContainsIpAddressIPv6() {
215 - Ip6Prefix addr1net = new Ip6Prefix("1100::/8"); 472 + Ip6Prefix ipPrefix;
216 - Ip6Prefix addr2net = new Ip6Prefix("1100::/8"); 473 +
217 - assertThat(addr1net, is(addr2net)); 474 + ipPrefix = Ip6Prefix.valueOf("1111:2222:3333:4444::/120");
218 - 475 + assertTrue(ipPrefix.contains(
219 - addr1net = new Ip6Prefix("1111:2222:3333:4444:5555:6666:7777:8885/8"); 476 + Ip6Address.valueOf("1111:2222:3333:4444::")));
220 - addr2net = new Ip6Prefix("1100::/8"); 477 + assertTrue(ipPrefix.contains(
221 - assertThat(addr1net, is(addr2net)); 478 + Ip6Address.valueOf("1111:2222:3333:4444::1")));
222 - 479 + assertFalse(ipPrefix.contains(
223 - addr1net = new Ip6Prefix("::/0"); 480 + Ip6Address.valueOf("1111:2222:3333:4445::")));
224 - addr2net = new Ip6Prefix("::/0"); 481 + assertFalse(ipPrefix.contains(Ip6Address.valueOf("::")));
225 - assertThat(addr1net, is(addr2net)); 482 + assertFalse(ipPrefix.contains(
226 - 483 + Ip6Address.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")));
227 - addr1net = 484 +
228 - new Ip6Prefix("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"); 485 + ipPrefix = Ip6Prefix.valueOf("1111:2222:3333:4444::/128");
229 - addr2net = 486 + assertTrue(ipPrefix.contains(
230 - new Ip6Prefix("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"); 487 + Ip6Address.valueOf("1111:2222:3333:4444::")));
231 - assertThat(addr1net, is(addr2net)); 488 + assertFalse(ipPrefix.contains(
489 + Ip6Address.valueOf("1111:2222:3333:4444::1")));
490 + assertFalse(ipPrefix.contains(
491 + Ip6Address.valueOf("1111:2222:3333:4445::")));
492 + assertFalse(ipPrefix.contains(Ip6Address.valueOf("::")));
493 + assertFalse(ipPrefix.contains(
494 + Ip6Address.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")));
495 +
496 + ipPrefix = Ip6Prefix.valueOf("::/0");
497 + assertTrue(ipPrefix.contains(
498 + Ip6Address.valueOf("1111:2222:3333:4444::")));
499 + assertTrue(ipPrefix.contains(
500 + Ip6Address.valueOf("1111:2222:3333:4444::1")));
501 + assertTrue(ipPrefix.contains(
502 + Ip6Address.valueOf("1111:2222:3333:4445::")));
503 + assertTrue(ipPrefix.contains(Ip6Address.valueOf("::")));
504 + assertTrue(ipPrefix.contains(
505 + Ip6Address.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")));
506 +
507 + ipPrefix =
508 + Ip6Prefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128");
509 + assertFalse(ipPrefix.contains(
510 + Ip6Address.valueOf("1111:2222:3333:4444::")));
511 + assertFalse(ipPrefix.contains(
512 + Ip6Address.valueOf("1111:2222:3333:4444::1")));
513 + assertFalse(ipPrefix.contains(
514 + Ip6Address.valueOf("1111:2222:3333:4445::")));
515 + assertFalse(ipPrefix.contains(Ip6Address.valueOf("::")));
516 + assertTrue(ipPrefix.contains(
517 + Ip6Address.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")));
232 } 518 }
233 519
234 /** 520 /**
235 - * Tests non-equality of {@link Ip6Address}. 521 + * Tests equality of {@link Ip6Prefix} for IPv6.
236 */ 522 */
237 @Test 523 @Test
238 - public void testNonEquality() { 524 + public void testEqualityIPv6() {
239 - Ip6Prefix addr1net = new Ip6Prefix("1100::/8"); 525 + new EqualsTester()
240 - Ip6Prefix addr2net = new Ip6Prefix("1200::/8"); 526 + .addEqualityGroup(
241 - Ip6Prefix addr3net = new Ip6Prefix("1200::/12"); 527 + Ip6Prefix.valueOf("1111:2222:3333:4444::/120"),
242 - Ip6Prefix addr4net = new Ip6Prefix("::/0"); 528 + Ip6Prefix.valueOf("1111:2222:3333:4444::1/120"),
243 - Ip6Prefix addr5net = 529 + Ip6Prefix.valueOf("1111:2222:3333:4444::/120"))
244 - new Ip6Prefix("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"); 530 + .addEqualityGroup(
245 - assertThat(addr1net, is(not(addr2net))); 531 + Ip6Prefix.valueOf("1111:2222:3333:4444::/64"),
246 - assertThat(addr3net, is(not(addr2net))); 532 + Ip6Prefix.valueOf("1111:2222:3333:4444::/64"))
247 - assertThat(addr4net, is(not(addr2net))); 533 + .addEqualityGroup(
248 - assertThat(addr5net, is(not(addr2net))); 534 + Ip6Prefix.valueOf("1111:2222:3333:4444::/128"),
535 + Ip6Prefix.valueOf("1111:2222:3333:4444::/128"))
536 + .addEqualityGroup(
537 + Ip6Prefix.valueOf("1111:2222:3333:4445::/64"),
538 + Ip6Prefix.valueOf("1111:2222:3333:4445::/64"))
539 + .addEqualityGroup(
540 + Ip6Prefix.valueOf("::/0"),
541 + Ip6Prefix.valueOf("::/0"))
542 + .addEqualityGroup(
543 + Ip6Prefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"),
544 + Ip6Prefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"))
545 + .testEquals();
249 } 546 }
250 547
251 /** 548 /**
252 - * Tests object string representation. 549 + * Tests object string representation for IPv6.
253 */ 550 */
254 @Test 551 @Test
255 - public void testToString() { 552 + public void testToStringIPv6() {
256 - Ip6Prefix ip6prefix = new Ip6Prefix("1100::/8"); 553 + Ip6Prefix ipPrefix;
257 - assertThat(ip6prefix.toString(), is("1100::/8")); 554 +
555 + ipPrefix = Ip6Prefix.valueOf("1100::/8");
556 + assertThat(ipPrefix.toString(), is("1100::/8"));
258 557
259 - ip6prefix = new Ip6Prefix("1111:2222:3333:4444:5555:6666:7777:8885/8"); 558 + ipPrefix = Ip6Prefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8885/8");
260 - assertThat(ip6prefix.toString(), is("1100::/8")); 559 + assertThat(ipPrefix.toString(), is("1100::/8"));
261 560
262 - ip6prefix = new Ip6Prefix("::/0"); 561 + ipPrefix = Ip6Prefix.valueOf("::/0");
263 - assertThat(ip6prefix.toString(), is("::/0")); 562 + assertThat(ipPrefix.toString(), is("::/0"));
264 563
265 - ip6prefix = 564 + ipPrefix = Ip6Prefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128");
266 - new Ip6Prefix("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"); 565 + assertThat(ipPrefix.toString(),
267 - assertThat(ip6prefix.toString(),
268 is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128")); 566 is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"));
269 } 567 }
270 } 568 }
......
...@@ -17,6 +17,7 @@ package org.onlab.packet; ...@@ -17,6 +17,7 @@ package org.onlab.packet;
17 17
18 import com.google.common.net.InetAddresses; 18 import com.google.common.net.InetAddresses;
19 import com.google.common.testing.EqualsTester; 19 import com.google.common.testing.EqualsTester;
20 +import org.junit.Ignore;
20 import org.junit.Test; 21 import org.junit.Test;
21 22
22 import java.net.InetAddress; 23 import java.net.InetAddress;
...@@ -33,6 +34,7 @@ public class IpAddressTest { ...@@ -33,6 +34,7 @@ public class IpAddressTest {
33 /** 34 /**
34 * Tests the immutability of {@link IpAddress}. 35 * Tests the immutability of {@link IpAddress}.
35 */ 36 */
37 + @Ignore("The class is not pure immutable, because it is not 'final'")
36 @Test 38 @Test
37 public void testImmutable() { 39 public void testImmutable() {
38 assertThatClassIsImmutable(IpAddress.class); 40 assertThatClassIsImmutable(IpAddress.class);
...@@ -80,19 +82,20 @@ public class IpAddressTest { ...@@ -80,19 +82,20 @@ public class IpAddressTest {
80 @Test 82 @Test
81 public void testAddressToOctetsIPv4() { 83 public void testAddressToOctetsIPv4() {
82 IpAddress ipAddress; 84 IpAddress ipAddress;
85 + byte[] value;
83 86
84 - final byte[] value1 = new byte[] {1, 2, 3, 4}; 87 + value = new byte[] {1, 2, 3, 4};
85 ipAddress = IpAddress.valueOf("1.2.3.4"); 88 ipAddress = IpAddress.valueOf("1.2.3.4");
86 - assertThat(ipAddress.toOctets(), is(value1)); 89 + assertThat(ipAddress.toOctets(), is(value));
87 90
88 - final byte[] value2 = new byte[] {0, 0, 0, 0}; 91 + value = new byte[] {0, 0, 0, 0};
89 ipAddress = IpAddress.valueOf("0.0.0.0"); 92 ipAddress = IpAddress.valueOf("0.0.0.0");
90 - assertThat(ipAddress.toOctets(), is(value2)); 93 + assertThat(ipAddress.toOctets(), is(value));
91 94
92 - final byte[] value3 = new byte[] {(byte) 0xff, (byte) 0xff, 95 + value = new byte[] {(byte) 0xff, (byte) 0xff,
93 (byte) 0xff, (byte) 0xff}; 96 (byte) 0xff, (byte) 0xff};
94 ipAddress = IpAddress.valueOf("255.255.255.255"); 97 ipAddress = IpAddress.valueOf("255.255.255.255");
95 - assertThat(ipAddress.toOctets(), is(value3)); 98 + assertThat(ipAddress.toOctets(), is(value));
96 } 99 }
97 100
98 /** 101 /**
...@@ -101,24 +104,25 @@ public class IpAddressTest { ...@@ -101,24 +104,25 @@ public class IpAddressTest {
101 @Test 104 @Test
102 public void testAddressToOctetsIPv6() { 105 public void testAddressToOctetsIPv6() {
103 IpAddress ipAddress; 106 IpAddress ipAddress;
107 + byte[] value;
104 108
105 - final byte[] value1 = new byte[] {0x11, 0x11, 0x22, 0x22, 109 + value = new byte[] {0x11, 0x11, 0x22, 0x22,
106 0x33, 0x33, 0x44, 0x44, 110 0x33, 0x33, 0x44, 0x44,
107 0x55, 0x55, 0x66, 0x66, 111 0x55, 0x55, 0x66, 0x66,
108 0x77, 0x77, 112 0x77, 0x77,
109 (byte) 0x88, (byte) 0x88}; 113 (byte) 0x88, (byte) 0x88};
110 ipAddress = 114 ipAddress =
111 IpAddress.valueOf("1111:2222:3333:4444:5555:6666:7777:8888"); 115 IpAddress.valueOf("1111:2222:3333:4444:5555:6666:7777:8888");
112 - assertThat(ipAddress.toOctets(), is(value1)); 116 + assertThat(ipAddress.toOctets(), is(value));
113 117
114 - final byte[] value2 = new byte[] {0x00, 0x00, 0x00, 0x00, 118 + value = new byte[] {0x00, 0x00, 0x00, 0x00,
115 0x00, 0x00, 0x00, 0x00, 119 0x00, 0x00, 0x00, 0x00,
116 0x00, 0x00, 0x00, 0x00, 120 0x00, 0x00, 0x00, 0x00,
117 0x00, 0x00, 0x00, 0x00}; 121 0x00, 0x00, 0x00, 0x00};
118 ipAddress = IpAddress.valueOf("::"); 122 ipAddress = IpAddress.valueOf("::");
119 - assertThat(ipAddress.toOctets(), is(value2)); 123 + assertThat(ipAddress.toOctets(), is(value));
120 124
121 - final byte[] value3 = new byte[] {(byte) 0xff, (byte) 0xff, 125 + value = new byte[] {(byte) 0xff, (byte) 0xff,
122 (byte) 0xff, (byte) 0xff, 126 (byte) 0xff, (byte) 0xff,
123 (byte) 0xff, (byte) 0xff, 127 (byte) 0xff, (byte) 0xff,
124 (byte) 0xff, (byte) 0xff, 128 (byte) 0xff, (byte) 0xff,
...@@ -128,11 +132,11 @@ public class IpAddressTest { ...@@ -128,11 +132,11 @@ public class IpAddressTest {
128 (byte) 0xff, (byte) 0xff}; 132 (byte) 0xff, (byte) 0xff};
129 ipAddress = 133 ipAddress =
130 IpAddress.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"); 134 IpAddress.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
131 - assertThat(ipAddress.toOctets(), is(value3)); 135 + assertThat(ipAddress.toOctets(), is(value));
132 } 136 }
133 137
134 /** 138 /**
135 - * Tests returning an IPv4 address asn an integer. 139 + * Tests returning an IPv4 address as an integer.
136 */ 140 */
137 @Test 141 @Test
138 public void testToInt() { 142 public void testToInt() {
...@@ -171,18 +175,19 @@ public class IpAddressTest { ...@@ -171,18 +175,19 @@ public class IpAddressTest {
171 @Test 175 @Test
172 public void testValueOfByteArrayIPv4() { 176 public void testValueOfByteArrayIPv4() {
173 IpAddress ipAddress; 177 IpAddress ipAddress;
178 + byte[] value;
174 179
175 - final byte[] value1 = new byte[] {1, 2, 3, 4}; 180 + value = new byte[] {1, 2, 3, 4};
176 - ipAddress = IpAddress.valueOf(IpAddress.Version.INET, value1); 181 + ipAddress = IpAddress.valueOf(IpAddress.Version.INET, value);
177 assertThat(ipAddress.toString(), is("1.2.3.4")); 182 assertThat(ipAddress.toString(), is("1.2.3.4"));
178 183
179 - final byte[] value2 = new byte[] {0, 0, 0, 0}; 184 + value = new byte[] {0, 0, 0, 0};
180 - ipAddress = IpAddress.valueOf(IpAddress.Version.INET, value2); 185 + ipAddress = IpAddress.valueOf(IpAddress.Version.INET, value);
181 assertThat(ipAddress.toString(), is("0.0.0.0")); 186 assertThat(ipAddress.toString(), is("0.0.0.0"));
182 187
183 - final byte[] value3 = new byte[] {(byte) 0xff, (byte) 0xff, 188 + value = new byte[] {(byte) 0xff, (byte) 0xff,
184 (byte) 0xff, (byte) 0xff}; 189 (byte) 0xff, (byte) 0xff};
185 - ipAddress = IpAddress.valueOf(IpAddress.Version.INET, value3); 190 + ipAddress = IpAddress.valueOf(IpAddress.Version.INET, value);
186 assertThat(ipAddress.toString(), is("255.255.255.255")); 191 assertThat(ipAddress.toString(), is("255.255.255.255"));
187 } 192 }
188 193
...@@ -192,24 +197,25 @@ public class IpAddressTest { ...@@ -192,24 +197,25 @@ public class IpAddressTest {
192 @Test 197 @Test
193 public void testValueOfByteArrayIPv6() { 198 public void testValueOfByteArrayIPv6() {
194 IpAddress ipAddress; 199 IpAddress ipAddress;
200 + byte[] value;
195 201
196 - final byte[] value1 = new byte[] {0x11, 0x11, 0x22, 0x22, 202 + value = new byte[] {0x11, 0x11, 0x22, 0x22,
197 0x33, 0x33, 0x44, 0x44, 203 0x33, 0x33, 0x44, 0x44,
198 0x55, 0x55, 0x66, 0x66, 204 0x55, 0x55, 0x66, 0x66,
199 0x77, 0x77, 205 0x77, 0x77,
200 (byte) 0x88, (byte) 0x88}; 206 (byte) 0x88, (byte) 0x88};
201 - ipAddress = IpAddress.valueOf(IpAddress.Version.INET6, value1); 207 + ipAddress = IpAddress.valueOf(IpAddress.Version.INET6, value);
202 assertThat(ipAddress.toString(), 208 assertThat(ipAddress.toString(),
203 is("1111:2222:3333:4444:5555:6666:7777:8888")); 209 is("1111:2222:3333:4444:5555:6666:7777:8888"));
204 210
205 - final byte[] value2 = new byte[] {0x00, 0x00, 0x00, 0x00, 211 + value = new byte[] {0x00, 0x00, 0x00, 0x00,
206 0x00, 0x00, 0x00, 0x00, 212 0x00, 0x00, 0x00, 0x00,
207 0x00, 0x00, 0x00, 0x00, 213 0x00, 0x00, 0x00, 0x00,
208 0x00, 0x00, 0x00, 0x00}; 214 0x00, 0x00, 0x00, 0x00};
209 - ipAddress = IpAddress.valueOf(IpAddress.Version.INET6, value2); 215 + ipAddress = IpAddress.valueOf(IpAddress.Version.INET6, value);
210 assertThat(ipAddress.toString(), is("::")); 216 assertThat(ipAddress.toString(), is("::"));
211 217
212 - final byte[] value3 = new byte[] {(byte) 0xff, (byte) 0xff, 218 + value = new byte[] {(byte) 0xff, (byte) 0xff,
213 (byte) 0xff, (byte) 0xff, 219 (byte) 0xff, (byte) 0xff,
214 (byte) 0xff, (byte) 0xff, 220 (byte) 0xff, (byte) 0xff,
215 (byte) 0xff, (byte) 0xff, 221 (byte) 0xff, (byte) 0xff,
...@@ -217,7 +223,7 @@ public class IpAddressTest { ...@@ -217,7 +223,7 @@ public class IpAddressTest {
217 (byte) 0xff, (byte) 0xff, 223 (byte) 0xff, (byte) 0xff,
218 (byte) 0xff, (byte) 0xff, 224 (byte) 0xff, (byte) 0xff,
219 (byte) 0xff, (byte) 0xff}; 225 (byte) 0xff, (byte) 0xff};
220 - ipAddress = IpAddress.valueOf(IpAddress.Version.INET6, value3); 226 + ipAddress = IpAddress.valueOf(IpAddress.Version.INET6, value);
221 assertThat(ipAddress.toString(), 227 assertThat(ipAddress.toString(),
222 is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")); 228 is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"));
223 } 229 }
...@@ -274,24 +280,25 @@ public class IpAddressTest { ...@@ -274,24 +280,25 @@ public class IpAddressTest {
274 @Test 280 @Test
275 public void testValueOfByteArrayOffsetIPv4() { 281 public void testValueOfByteArrayOffsetIPv4() {
276 IpAddress ipAddress; 282 IpAddress ipAddress;
283 + byte[] value;
277 284
278 - final byte[] value1 = new byte[] {11, 22, 33, // Preamble 285 + value = new byte[] {11, 22, 33, // Preamble
279 1, 2, 3, 4, 286 1, 2, 3, 4,
280 44, 55}; // Extra bytes 287 44, 55}; // Extra bytes
281 - ipAddress = IpAddress.valueOf(IpAddress.Version.INET, value1, 3); 288 + ipAddress = IpAddress.valueOf(IpAddress.Version.INET, value, 3);
282 assertThat(ipAddress.toString(), is("1.2.3.4")); 289 assertThat(ipAddress.toString(), is("1.2.3.4"));
283 290
284 - final byte[] value2 = new byte[] {11, 22, // Preamble 291 + value = new byte[] {11, 22, // Preamble
285 0, 0, 0, 0, 292 0, 0, 0, 0,
286 33}; // Extra bytes 293 33}; // Extra bytes
287 - ipAddress = IpAddress.valueOf(IpAddress.Version.INET, value2, 2); 294 + ipAddress = IpAddress.valueOf(IpAddress.Version.INET, value, 2);
288 assertThat(ipAddress.toString(), is("0.0.0.0")); 295 assertThat(ipAddress.toString(), is("0.0.0.0"));
289 296
290 - final byte[] value3 = new byte[] {11, 22, // Preamble 297 + value = new byte[] {11, 22, // Preamble
291 (byte) 0xff, (byte) 0xff, 298 (byte) 0xff, (byte) 0xff,
292 (byte) 0xff, (byte) 0xff, 299 (byte) 0xff, (byte) 0xff,
293 33}; // Extra bytes 300 33}; // Extra bytes
294 - ipAddress = IpAddress.valueOf(IpAddress.Version.INET, value3, 2); 301 + ipAddress = IpAddress.valueOf(IpAddress.Version.INET, value, 2);
295 assertThat(ipAddress.toString(), is("255.255.255.255")); 302 assertThat(ipAddress.toString(), is("255.255.255.255"));
296 } 303 }
297 304
...@@ -301,28 +308,29 @@ public class IpAddressTest { ...@@ -301,28 +308,29 @@ public class IpAddressTest {
301 @Test 308 @Test
302 public void testValueOfByteArrayOffsetIPv6() { 309 public void testValueOfByteArrayOffsetIPv6() {
303 IpAddress ipAddress; 310 IpAddress ipAddress;
311 + byte[] value;
304 312
305 - final byte[] value1 = new byte[] {11, 22, 33, // Preamble 313 + value = new byte[] {11, 22, 33, // Preamble
306 0x11, 0x11, 0x22, 0x22, 314 0x11, 0x11, 0x22, 0x22,
307 0x33, 0x33, 0x44, 0x44, 315 0x33, 0x33, 0x44, 0x44,
308 0x55, 0x55, 0x66, 0x66, 316 0x55, 0x55, 0x66, 0x66,
309 0x77, 0x77, 317 0x77, 0x77,
310 (byte) 0x88, (byte) 0x88, 318 (byte) 0x88, (byte) 0x88,
311 44, 55}; // Extra bytes 319 44, 55}; // Extra bytes
312 - ipAddress = IpAddress.valueOf(IpAddress.Version.INET6, value1, 3); 320 + ipAddress = IpAddress.valueOf(IpAddress.Version.INET6, value, 3);
313 assertThat(ipAddress.toString(), 321 assertThat(ipAddress.toString(),
314 is("1111:2222:3333:4444:5555:6666:7777:8888")); 322 is("1111:2222:3333:4444:5555:6666:7777:8888"));
315 323
316 - final byte[] value2 = new byte[] {11, 22, // Preamble 324 + value = new byte[] {11, 22, // Preamble
317 0x00, 0x00, 0x00, 0x00, 325 0x00, 0x00, 0x00, 0x00,
318 0x00, 0x00, 0x00, 0x00, 326 0x00, 0x00, 0x00, 0x00,
319 0x00, 0x00, 0x00, 0x00, 327 0x00, 0x00, 0x00, 0x00,
320 0x00, 0x00, 0x00, 0x00, 328 0x00, 0x00, 0x00, 0x00,
321 33}; // Extra bytes 329 33}; // Extra bytes
322 - ipAddress = IpAddress.valueOf(IpAddress.Version.INET6, value2, 2); 330 + ipAddress = IpAddress.valueOf(IpAddress.Version.INET6, value, 2);
323 assertThat(ipAddress.toString(), is("::")); 331 assertThat(ipAddress.toString(), is("::"));
324 332
325 - final byte[] value3 = new byte[] {11, 22, // Preamble 333 + value = new byte[] {11, 22, // Preamble
326 (byte) 0xff, (byte) 0xff, 334 (byte) 0xff, (byte) 0xff,
327 (byte) 0xff, (byte) 0xff, 335 (byte) 0xff, (byte) 0xff,
328 (byte) 0xff, (byte) 0xff, 336 (byte) 0xff, (byte) 0xff,
...@@ -332,7 +340,7 @@ public class IpAddressTest { ...@@ -332,7 +340,7 @@ public class IpAddressTest {
332 (byte) 0xff, (byte) 0xff, 340 (byte) 0xff, (byte) 0xff,
333 (byte) 0xff, (byte) 0xff, 341 (byte) 0xff, (byte) 0xff,
334 33}; // Extra bytes 342 33}; // Extra bytes
335 - ipAddress = IpAddress.valueOf(IpAddress.Version.INET6, value3, 2); 343 + ipAddress = IpAddress.valueOf(IpAddress.Version.INET6, value, 2);
336 assertThat(ipAddress.toString(), 344 assertThat(ipAddress.toString(),
337 is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")); 345 is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"));
338 } 346 }
...@@ -344,11 +352,12 @@ public class IpAddressTest { ...@@ -344,11 +352,12 @@ public class IpAddressTest {
344 @Test(expected = IllegalArgumentException.class) 352 @Test(expected = IllegalArgumentException.class)
345 public void testInvalidValueOfArrayInvalidOffsetIPv4() { 353 public void testInvalidValueOfArrayInvalidOffsetIPv4() {
346 IpAddress ipAddress; 354 IpAddress ipAddress;
355 + byte[] value;
347 356
348 - final byte[] value1 = new byte[] {11, 22, 33, // Preamble 357 + value = new byte[] {11, 22, 33, // Preamble
349 1, 2, 3, 4, 358 1, 2, 3, 4,
350 44, 55}; // Extra bytes 359 44, 55}; // Extra bytes
351 - ipAddress = IpAddress.valueOf(IpAddress.Version.INET, value1, 6); 360 + ipAddress = IpAddress.valueOf(IpAddress.Version.INET, value, 6);
352 } 361 }
353 362
354 /** 363 /**
...@@ -358,15 +367,16 @@ public class IpAddressTest { ...@@ -358,15 +367,16 @@ public class IpAddressTest {
358 @Test(expected = IllegalArgumentException.class) 367 @Test(expected = IllegalArgumentException.class)
359 public void testInvalidValueOfArrayInvalidOffsetIPv6() { 368 public void testInvalidValueOfArrayInvalidOffsetIPv6() {
360 IpAddress ipAddress; 369 IpAddress ipAddress;
370 + byte[] value;
361 371
362 - final byte[] value1 = new byte[] {11, 22, 33, // Preamble 372 + value = new byte[] {11, 22, 33, // Preamble
363 0x11, 0x11, 0x22, 0x22, 373 0x11, 0x11, 0x22, 0x22,
364 0x33, 0x33, 0x44, 0x44, 374 0x33, 0x33, 0x44, 0x44,
365 0x55, 0x55, 0x66, 0x66, 375 0x55, 0x55, 0x66, 0x66,
366 0x77, 0x77, 376 0x77, 0x77,
367 (byte) 0x88, (byte) 0x88, 377 (byte) 0x88, (byte) 0x88,
368 44, 55}; // Extra bytes 378 44, 55}; // Extra bytes
369 - ipAddress = IpAddress.valueOf(IpAddress.Version.INET6, value1, 6); 379 + ipAddress = IpAddress.valueOf(IpAddress.Version.INET6, value, 6);
370 } 380 }
371 381
372 /** 382 /**
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
16 package org.onlab.packet; 16 package org.onlab.packet;
17 17
18 import com.google.common.testing.EqualsTester; 18 import com.google.common.testing.EqualsTester;
19 +import org.junit.Ignore;
19 import org.junit.Test; 20 import org.junit.Test;
20 21
21 import static org.hamcrest.Matchers.equalTo; 22 import static org.hamcrest.Matchers.equalTo;
...@@ -32,6 +33,7 @@ public class IpPrefixTest { ...@@ -32,6 +33,7 @@ public class IpPrefixTest {
32 /** 33 /**
33 * Tests the immutability of {@link IpPrefix}. 34 * Tests the immutability of {@link IpPrefix}.
34 */ 35 */
36 + @Ignore("The class is not pure immutable, because it is not 'final'")
35 @Test 37 @Test
36 public void testImmutable() { 38 public void testImmutable() {
37 assertThatClassIsImmutable(IpPrefix.class); 39 assertThatClassIsImmutable(IpPrefix.class);
......