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
Showing
12 changed files
with
1950 additions
and
1360 deletions
... | @@ -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 | } | 98 | } |
99 | + Ip4Address ipAddress = Ip4Address.valueOf(parts[0]); | ||
100 | + int prefixLength = Integer.parseInt(parts[1]); | ||
113 | 101 | ||
114 | - Ip4Prefix otherIp4Prefix = (Ip4Prefix) other; | 102 | + return new Ip4Prefix(ipAddress, prefixLength); |
115 | - | ||
116 | - return Objects.equals(this.address, otherIp4Prefix.address) | ||
117 | - && this.prefixLen == otherIp4Prefix.prefixLen; | ||
118 | - } | ||
119 | - | ||
120 | - @Override | ||
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 | } | 87 | } |
88 | + Ip6Address ipAddress = Ip6Address.valueOf(parts[0]); | ||
89 | + int prefixLength = Integer.parseInt(parts[1]); | ||
109 | 90 | ||
110 | - if (!(other instanceof Ip6Prefix)) { | 91 | + return new Ip6Prefix(ipAddress, prefixLength); |
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 | - } | ||
119 | - | ||
120 | - @Override | ||
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")); | 122 | + |
123 | + ipAddress = Ip4Address.valueOf(0x01020304); | ||
124 | + assertThat(ipAddress.toString(), is("1.2.3.4")); | ||
97 | 125 | ||
98 | - ip4Address = new Ip4Address(0); | 126 | + ipAddress = Ip4Address.valueOf(0); |
99 | - assertThat(ip4Address.toString(), is("0.0.0.0")); | 127 | + assertThat(ipAddress.toString(), is("0.0.0.0")); |
100 | 128 | ||
101 | - ip4Address = new Ip4Address(0xffffffff); | 129 | + ipAddress = Ip4Address.valueOf(0xffffffff); |
102 | - assertThat(ip4Address.toString(), is("255.255.255.255")); | 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. |
126 | - */ | ||
127 | - @Test | ||
128 | - public void testConstructorForArrayAndOffset() { | ||
129 | - final byte[] value1 = new byte[] {11, 22, 33, // Preamble | ||
130 | - 1, 2, 3, 4, | ||
131 | - 44, 55}; // Extra bytes | ||
132 | - Ip4Address ip4Address = new Ip4Address(value1, 3); | ||
133 | - assertThat(ip4Address.toString(), is("1.2.3.4")); | ||
134 | - | ||
135 | - final byte[] value2 = new byte[] {11, 22, // Preamble | ||
136 | - 0, 0, 0, 0, | ||
137 | - 33}; // Extra bytes | ||
138 | - ip4Address = new Ip4Address(value2, 2); | ||
139 | - assertThat(ip4Address.toString(), is("0.0.0.0")); | ||
140 | - | ||
141 | - final byte[] value3 = new byte[] {11, 22, // Preamble | ||
142 | - (byte) 0xff, (byte) 0xff, | ||
143 | - (byte) 0xff, (byte) 0xff, | ||
144 | - 33}; // Extra bytes | ||
145 | - ip4Address = new Ip4Address(value3, 2); | ||
146 | - assertThat(ip4Address.toString(), is("255.255.255.255")); | ||
147 | - } | ||
148 | - | ||
149 | - /** | ||
150 | - * Tests invalid class constructor for a null array. | ||
151 | */ | 156 | */ |
152 | @Test(expected = NullPointerException.class) | 157 | @Test(expected = NullPointerException.class) |
153 | - public void testInvalidConstructorNullArray() { | 158 | + public void testInvalidValueOfNullArrayIPv4() { |
159 | + Ip4Address ipAddress; | ||
160 | + | ||
154 | final byte[] fromArray = null; | 161 | final byte[] fromArray = null; |
155 | - Ip4Address ip4Address = new Ip4Address(fromArray); | 162 | + ipAddress = Ip4Address.valueOf(fromArray); |
156 | } | 163 | } |
157 | 164 | ||
158 | /** | 165 | /** |
159 | - * Tests invalid class constructor for an array that is too short. | 166 | + * Tests invalid valueOf() converger for an array that is too short for |
167 | + * IPv4. | ||
160 | */ | 168 | */ |
161 | @Test(expected = IllegalArgumentException.class) | 169 | @Test(expected = IllegalArgumentException.class) |
162 | - public void testInvalidConstructorShortArray() { | 170 | + public void testInvalidValueOfShortArrayIPv4() { |
171 | + Ip4Address ipAddress; | ||
172 | + | ||
163 | final byte[] fromArray = new byte[] {1, 2, 3}; | 173 | final byte[] fromArray = new byte[] {1, 2, 3}; |
164 | - Ip4Address ip4Address = new Ip4Address(fromArray); | 174 | + ipAddress = Ip4Address.valueOf(fromArray); |
175 | + } | ||
176 | + | ||
177 | + /** | ||
178 | + * Tests valueOf() converter for IPv4 byte array and an offset. | ||
179 | + */ | ||
180 | + @Test | ||
181 | + public void testValueOfByteArrayOffsetIPv4() { | ||
182 | + Ip4Address ipAddress; | ||
183 | + byte[] value; | ||
184 | + | ||
185 | + value = new byte[] {11, 22, 33, // Preamble | ||
186 | + 1, 2, 3, 4, | ||
187 | + 44, 55}; // Extra bytes | ||
188 | + ipAddress = Ip4Address.valueOf(value, 3); | ||
189 | + assertThat(ipAddress.toString(), is("1.2.3.4")); | ||
190 | + | ||
191 | + value = new byte[] {11, 22, // Preamble | ||
192 | + 0, 0, 0, 0, | ||
193 | + 33}; // Extra bytes | ||
194 | + ipAddress = Ip4Address.valueOf(value, 2); | ||
195 | + assertThat(ipAddress.toString(), is("0.0.0.0")); | ||
196 | + | ||
197 | + value = new byte[] {11, 22, // Preamble | ||
198 | + (byte) 0xff, (byte) 0xff, | ||
199 | + (byte) 0xff, (byte) 0xff, | ||
200 | + 33}; // Extra bytes | ||
201 | + ipAddress = Ip4Address.valueOf(value, 2); | ||
202 | + assertThat(ipAddress.toString(), is("255.255.255.255")); | ||
165 | } | 203 | } |
166 | 204 | ||
167 | /** | 205 | /** |
168 | - * Tests invalid class constructor for an array and an invalid offset. | 206 | + * Tests invalid valueOf() converger for an array and an invalid offset |
207 | + * for IPv4. | ||
169 | */ | 208 | */ |
170 | @Test(expected = IllegalArgumentException.class) | 209 | @Test(expected = IllegalArgumentException.class) |
171 | - public void testInvalidConstructorArrayInvalidOffset() { | 210 | + public void testInvalidValueOfArrayInvalidOffsetIPv4() { |
172 | - final byte[] value1 = new byte[] {11, 22, 33, // Preamble | 211 | + Ip4Address ipAddress; |
173 | - 1, 2, 3, 4, | 212 | + byte[] value; |
174 | - 44, 55}; // Extra bytes | 213 | + |
175 | - Ip4Address ip4Address = new Ip4Address(value1, 6); | 214 | + value = new byte[] {11, 22, 33, // Preamble |
215 | + 1, 2, 3, 4, | ||
216 | + 44, 55}; // Extra bytes | ||
217 | + ipAddress = Ip4Address.valueOf(value, 6); | ||
218 | + } | ||
219 | + | ||
220 | + /** | ||
221 | + * Tests valueOf() converter for IPv4 InetAddress. | ||
222 | + */ | ||
223 | + @Test | ||
224 | + public void testValueOfInetAddressIPv4() { | ||
225 | + Ip4Address ipAddress; | ||
226 | + InetAddress inetAddress; | ||
227 | + | ||
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")); | 247 | + |
248 | + ipAddress = Ip4Address.valueOf("1.2.3.4"); | ||
249 | + assertThat(ipAddress.toString(), is("1.2.3.4")); | ||
185 | 250 | ||
186 | - ip4Address = new Ip4Address("0.0.0.0"); | 251 | + ipAddress = Ip4Address.valueOf("0.0.0.0"); |
187 | - assertThat(ip4Address.toString(), is("0.0.0.0")); | 252 | + assertThat(ipAddress.toString(), is("0.0.0.0")); |
188 | 253 | ||
189 | - ip4Address = new Ip4Address("255.255.255.255"); | 254 | + ipAddress = Ip4Address.valueOf("255.255.255.255"); |
190 | - assertThat(ip4Address.toString(), is("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 = | ||
252 | - Ip4Address.makeMaskedAddress(ip4Address, 24); | ||
253 | - assertThat(ip4AddressMasked.toString(), is("1.2.3.0")); | ||
254 | 315 | ||
255 | - ip4AddressMasked = Ip4Address.makeMaskedAddress(ip4Address, 0); | 316 | + ipAddress = Ip4Address.makeMaskPrefix(-1); |
256 | - assertThat(ip4AddressMasked.toString(), is("0.0.0.0")); | 317 | + } |
257 | 318 | ||
258 | - ip4AddressMasked = Ip4Address.makeMaskedAddress(ip4Address, 32); | 319 | + /** |
259 | - assertThat(ip4AddressMasked.toString(), is("1.2.3.5")); | 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; | ||
326 | + | ||
327 | + ipAddress = Ip4Address.makeMaskPrefix(33); | ||
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; |
269 | 337 | ||
270 | - ip4Address = new Ip4Address("0.0.0.0"); | 338 | + ipAddressMasked = Ip4Address.makeMaskedAddress(ipAddress, 24); |
271 | - assertThat(ip4Address.getValue(), is(0)); | 339 | + assertThat(ipAddressMasked.toString(), is("1.2.3.0")); |
272 | 340 | ||
273 | - ip4Address = new Ip4Address("255.255.255.255"); | 341 | + ipAddressMasked = Ip4Address.makeMaskedAddress(ipAddress, 0); |
274 | - assertThat(ip4Address.getValue(), is(-1)); | 342 | + assertThat(ipAddressMasked.toString(), is("0.0.0.0")); |
343 | + | ||
344 | + ipAddressMasked = Ip4Address.makeMaskedAddress(ipAddress, 32); | ||
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,417 +39,459 @@ public class Ip6AddressTest { | ... | @@ -36,417 +39,459 @@ 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 | } | 75 | } |
83 | 76 | ||
84 | /** | 77 | /** |
85 | - * Tests invalid class copy constructor for a null object to copy from. | 78 | + * Tests returning an IPv6 address as a byte array. |
86 | */ | 79 | */ |
87 | - @Test(expected = NullPointerException.class) | 80 | + @Test |
88 | - public void testInvalidConstructorNullObject() { | 81 | + public void testAddressToOctetsIPv6() { |
89 | - Ip6Address fromAddr = null; | 82 | + Ip6Address ipAddress; |
90 | - Ip6Address ip6Address = new Ip6Address(fromAddr); | 83 | + byte[] value; |
84 | + | ||
85 | + value = new byte[] {0x11, 0x11, 0x22, 0x22, | ||
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)); | ||
93 | + | ||
94 | + value = new byte[] {0x00, 0x00, 0x00, 0x00, | ||
95 | + 0x00, 0x00, 0x00, 0x00, | ||
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)); | ||
91 | } | 112 | } |
92 | 113 | ||
93 | /** | 114 | /** |
94 | - * Tests valid class constructor for integer values. | 115 | + * Tests valueOf() converter for IPv6 byte array. |
95 | */ | 116 | */ |
96 | @Test | 117 | @Test |
97 | - public void testConstructorForInteger() { | 118 | + public void testValueOfByteArrayIPv6() { |
98 | - Ip6Address ip6Address = | 119 | + Ip6Address ipAddress; |
99 | - new Ip6Address(0x1111222233334444L, 0x5555666677778888L); | 120 | + byte[] value; |
100 | - assertThat(ip6Address.toString(), | 121 | + |
122 | + value = new byte[] {0x11, 0x11, 0x22, 0x22, | ||
123 | + 0x33, 0x33, 0x44, 0x44, | ||
124 | + 0x55, 0x55, 0x66, 0x66, | ||
125 | + 0x77, 0x77, | ||
126 | + (byte) 0x88, (byte) 0x88}; | ||
127 | + ipAddress = Ip6Address.valueOf(value); | ||
128 | + assertThat(ipAddress.toString(), | ||
101 | is("1111:2222:3333:4444:5555:6666:7777:8888")); | 129 | is("1111:2222:3333:4444:5555:6666:7777:8888")); |
102 | 130 | ||
103 | - ip6Address = new Ip6Address(0L, 0L); | 131 | + value = new byte[] {0x00, 0x00, 0x00, 0x00, |
104 | - assertThat(ip6Address.toString(), is("::")); | 132 | + 0x00, 0x00, 0x00, 0x00, |
105 | - | 133 | + 0x00, 0x00, 0x00, 0x00, |
106 | - ip6Address = new Ip6Address(-1L, -1L); | 134 | + 0x00, 0x00, 0x00, 0x00}; |
107 | - assertThat(ip6Address.toString(), | 135 | + ipAddress = Ip6Address.valueOf(value); |
136 | + assertThat(ipAddress.toString(), is("::")); | ||
137 | + | ||
138 | + value = new byte[] {(byte) 0xff, (byte) 0xff, | ||
139 | + (byte) 0xff, (byte) 0xff, | ||
140 | + (byte) 0xff, (byte) 0xff, | ||
141 | + (byte) 0xff, (byte) 0xff, | ||
142 | + (byte) 0xff, (byte) 0xff, | ||
143 | + (byte) 0xff, (byte) 0xff, | ||
144 | + (byte) 0xff, (byte) 0xff, | ||
145 | + (byte) 0xff, (byte) 0xff}; | ||
146 | + ipAddress = Ip6Address.valueOf(value); | ||
147 | + assertThat(ipAddress.toString(), | ||
108 | is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")); | 148 | is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")); |
109 | } | 149 | } |
110 | 150 | ||
111 | /** | 151 | /** |
112 | - * Tests valid class constructor for an array value. | 152 | + * Tests invalid valueOf() converter for a null array for IPv6. |
113 | */ | 153 | */ |
114 | - @Test | 154 | + @Test(expected = NullPointerException.class) |
115 | - public void testConstructorForArray() { | 155 | + public void testInvalidValueOfNullArrayIPv6() { |
116 | - final byte[] value1 = new byte[] {0x11, 0x11, 0x22, 0x22, | 156 | + Ip6Address ipAddress; |
117 | - 0x33, 0x33, 0x44, 0x44, | ||
118 | - 0x55, 0x55, 0x66, 0x66, | ||
119 | - 0x77, 0x77, | ||
120 | - (byte) 0x88, (byte) 0x88}; | ||
121 | - Ip6Address ip6Address = new Ip6Address(value1); | ||
122 | - assertThat(ip6Address.toString(), | ||
123 | - is("1111:2222:3333:4444:5555:6666:7777:8888")); | ||
124 | 157 | ||
125 | - final byte[] value2 = new byte[] {0x00, 0x00, 0x00, 0x00, | 158 | + final byte[] fromArray = null; |
126 | - 0x00, 0x00, 0x00, 0x00, | 159 | + ipAddress = Ip6Address.valueOf(fromArray); |
127 | - 0x00, 0x00, 0x00, 0x00, | ||
128 | - 0x00, 0x00, 0x00, 0x00}; | ||
129 | - ip6Address = new Ip6Address(value2); | ||
130 | - assertThat(ip6Address.toString(), is("::")); | ||
131 | - | ||
132 | - final byte[] value3 = new byte[] {(byte) 0xff, (byte) 0xff, | ||
133 | - (byte) 0xff, (byte) 0xff, | ||
134 | - (byte) 0xff, (byte) 0xff, | ||
135 | - (byte) 0xff, (byte) 0xff, | ||
136 | - (byte) 0xff, (byte) 0xff, | ||
137 | - (byte) 0xff, (byte) 0xff, | ||
138 | - (byte) 0xff, (byte) 0xff, | ||
139 | - (byte) 0xff, (byte) 0xff}; | ||
140 | - ip6Address = new Ip6Address(value3); | ||
141 | - assertThat(ip6Address.toString(), | ||
142 | - is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")); | ||
143 | } | 160 | } |
144 | 161 | ||
145 | /** | 162 | /** |
146 | - * Tests valid class constructor for an array value and an offset. | 163 | + * Tests invalid valueOf() converger for an array that is too short for |
164 | + * IPv6. | ||
147 | */ | 165 | */ |
148 | - @Test | 166 | + @Test(expected = IllegalArgumentException.class) |
149 | - public void testConstructorForArrayAndOffset() { | 167 | + public void testInvalidValueOfShortArrayIPv6() { |
150 | - final byte[] value1 = new byte[] {11, 22, 33, // Preamble | 168 | + Ip6Address ipAddress; |
151 | - 0x11, 0x11, 0x22, 0x22, | ||
152 | - 0x33, 0x33, 0x44, 0x44, | ||
153 | - 0x55, 0x55, 0x66, 0x66, | ||
154 | - 0x77, 0x77, | ||
155 | - (byte) 0x88, (byte) 0x88, | ||
156 | - 44, 55}; // Extra bytes | ||
157 | - Ip6Address ip6Address = new Ip6Address(value1, 3); | ||
158 | - assertThat(ip6Address.toString(), | ||
159 | - is("1111:2222:3333:4444:5555:6666:7777:8888")); | ||
160 | 169 | ||
161 | - final byte[] value2 = new byte[] {11, 22, // Preamble | 170 | + final byte[] fromArray = new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9}; |
162 | - 0x00, 0x00, 0x00, 0x00, | 171 | + ipAddress = Ip6Address.valueOf(fromArray); |
163 | - 0x00, 0x00, 0x00, 0x00, | ||
164 | - 0x00, 0x00, 0x00, 0x00, | ||
165 | - 0x00, 0x00, 0x00, 0x00, | ||
166 | - 33}; // Extra bytes | ||
167 | - ip6Address = new Ip6Address(value2, 2); | ||
168 | - assertThat(ip6Address.toString(), is("::")); | ||
169 | - | ||
170 | - final byte[] value3 = new byte[] {11, 22, // Preamble | ||
171 | - (byte) 0xff, (byte) 0xff, | ||
172 | - (byte) 0xff, (byte) 0xff, | ||
173 | - (byte) 0xff, (byte) 0xff, | ||
174 | - (byte) 0xff, (byte) 0xff, | ||
175 | - (byte) 0xff, (byte) 0xff, | ||
176 | - (byte) 0xff, (byte) 0xff, | ||
177 | - (byte) 0xff, (byte) 0xff, | ||
178 | - (byte) 0xff, (byte) 0xff, | ||
179 | - 33}; // Extra bytes | ||
180 | - ip6Address = new Ip6Address(value3, 2); | ||
181 | - assertThat(ip6Address.toString(), | ||
182 | - is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")); | ||
183 | } | 172 | } |
184 | 173 | ||
185 | /** | 174 | /** |
186 | - * Tests invalid class constructor for a null array. | 175 | + * Tests valueOf() converter for IPv6 byte array and an offset. |
187 | */ | 176 | */ |
188 | - @Test(expected = NullPointerException.class) | 177 | + @Test |
189 | - public void testInvalidConstructorNullArray() { | 178 | + public void testValueOfByteArrayOffsetIPv6() { |
190 | - final byte[] fromArray = null; | 179 | + Ip6Address ipAddress; |
191 | - Ip6Address ip6Address = new Ip6Address(fromArray); | 180 | + byte[] value; |
181 | + | ||
182 | + value = new byte[] {11, 22, 33, // Preamble | ||
183 | + 0x11, 0x11, 0x22, 0x22, | ||
184 | + 0x33, 0x33, 0x44, 0x44, | ||
185 | + 0x55, 0x55, 0x66, 0x66, | ||
186 | + 0x77, 0x77, | ||
187 | + (byte) 0x88, (byte) 0x88, | ||
188 | + 44, 55}; // Extra bytes | ||
189 | + ipAddress = Ip6Address.valueOf(value, 3); | ||
190 | + assertThat(ipAddress.toString(), | ||
191 | + is("1111:2222:3333:4444:5555:6666:7777:8888")); | ||
192 | + | ||
193 | + value = new byte[] {11, 22, // Preamble | ||
194 | + 0x00, 0x00, 0x00, 0x00, | ||
195 | + 0x00, 0x00, 0x00, 0x00, | ||
196 | + 0x00, 0x00, 0x00, 0x00, | ||
197 | + 0x00, 0x00, 0x00, 0x00, | ||
198 | + 33}; // Extra bytes | ||
199 | + ipAddress = Ip6Address.valueOf(value, 2); | ||
200 | + assertThat(ipAddress.toString(), is("::")); | ||
201 | + | ||
202 | + value = new byte[] {11, 22, // Preamble | ||
203 | + (byte) 0xff, (byte) 0xff, | ||
204 | + (byte) 0xff, (byte) 0xff, | ||
205 | + (byte) 0xff, (byte) 0xff, | ||
206 | + (byte) 0xff, (byte) 0xff, | ||
207 | + (byte) 0xff, (byte) 0xff, | ||
208 | + (byte) 0xff, (byte) 0xff, | ||
209 | + (byte) 0xff, (byte) 0xff, | ||
210 | + (byte) 0xff, (byte) 0xff, | ||
211 | + 33}; // Extra bytes | ||
212 | + ipAddress = Ip6Address.valueOf(value, 2); | ||
213 | + assertThat(ipAddress.toString(), | ||
214 | + is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")); | ||
192 | } | 215 | } |
193 | 216 | ||
194 | /** | 217 | /** |
195 | - * Tests invalid class constructor for an array that is too short. | 218 | + * Tests invalid valueOf() converger for an array and an invalid offset |
219 | + * for IPv6. | ||
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; |
225 | + | ||
226 | + value = new byte[] {11, 22, 33, // Preamble | ||
227 | + 0x11, 0x11, 0x22, 0x22, | ||
228 | + 0x33, 0x33, 0x44, 0x44, | ||
229 | + 0x55, 0x55, 0x66, 0x66, | ||
230 | + 0x77, 0x77, | ||
231 | + (byte) 0x88, (byte) 0x88, | ||
232 | + 44, 55}; // Extra bytes | ||
233 | + ipAddress = Ip6Address.valueOf(value, 6); | ||
201 | } | 234 | } |
202 | 235 | ||
203 | /** | 236 | /** |
204 | - * Tests invalid class constructor for an array and an invalid offset. | 237 | + * Tests valueOf() converter for IPv6 InetAddress. |
205 | */ | 238 | */ |
206 | - @Test(expected = IllegalArgumentException.class) | 239 | + @Test |
207 | - public void testInvalidConstructorArrayInvalidOffset() { | 240 | + public void testValueOfInetAddressIPv6() { |
208 | - final byte[] value1 = new byte[] {11, 22, 33, // Preamble | 241 | + Ip6Address ipAddress; |
209 | - 0x11, 0x11, 0x22, 0x22, | 242 | + InetAddress inetAddress; |
210 | - 0x33, 0x33, 0x44, 0x44, | 243 | + |
211 | - 0x55, 0x55, 0x66, 0x66, | 244 | + inetAddress = |
212 | - 0x77, 0x77, | 245 | + InetAddresses.forString("1111:2222:3333:4444:5555:6666:7777:8888"); |
213 | - (byte) 0x88, (byte) 0x88, | 246 | + ipAddress = Ip6Address.valueOf(inetAddress); |
214 | - 44, 55}; // Extra bytes | 247 | + assertThat(ipAddress.toString(), |
215 | - Ip6Address ip6Address = new Ip6Address(value1, 6); | 248 | + is("1111:2222:3333:4444:5555:6666:7777:8888")); |
249 | + | ||
250 | + inetAddress = InetAddresses.forString("::"); | ||
251 | + ipAddress = Ip6Address.valueOf(inetAddress); | ||
252 | + assertThat(ipAddress.toString(), is("::")); | ||
253 | + | ||
254 | + inetAddress = | ||
255 | + InetAddresses.forString("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"); | ||
256 | + ipAddress = Ip6Address.valueOf(inetAddress); | ||
257 | + assertThat(ipAddress.toString(), | ||
258 | + is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")); | ||
216 | } | 259 | } |
217 | 260 | ||
218 | /** | 261 | /** |
219 | - * Tests valid class constructor for a string. | 262 | + * Tests valueOf() converter for IPv6 string. |
220 | */ | 263 | */ |
221 | @Test | 264 | @Test |
222 | - public void testConstructorForString() { | 265 | + public void testValueOfStringIPv6() { |
223 | - Ip6Address ip6Address = | 266 | + Ip6Address ipAddress; |
224 | - new Ip6Address("1111:2222:3333:4444:5555:6666:7777:8888"); | 267 | + |
225 | - assertThat(ip6Address.toString(), | 268 | + ipAddress = |
269 | + Ip6Address.valueOf("1111:2222:3333:4444:5555:6666:7777:8888"); | ||
270 | + assertThat(ipAddress.toString(), | ||
226 | is("1111:2222:3333:4444:5555:6666:7777:8888")); | 271 | is("1111:2222:3333:4444:5555:6666:7777:8888")); |
227 | 272 | ||
228 | - ip6Address = new Ip6Address("::"); | 273 | + ipAddress = Ip6Address.valueOf("::"); |
229 | - assertThat(ip6Address.toString(), is("::")); | 274 | + assertThat(ipAddress.toString(), is("::")); |
230 | 275 | ||
231 | - ip6Address = new Ip6Address("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"); | 276 | + ipAddress = |
232 | - assertThat(ip6Address.toString(), | 277 | + Ip6Address.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"); |
278 | + assertThat(ipAddress.toString(), | ||
233 | is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")); | 279 | is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff")); |
234 | } | 280 | } |
235 | 281 | ||
236 | /** | 282 | /** |
237 | - * Tests invalid class constructor for a null string. | 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, | 310 | + |
261 | - 0x55, 0x55, 0x66, 0x66, | 311 | + String fromString = "NoSuchIpAddress"; |
262 | - 0x77, 0x77, | 312 | + ipAddress = Ip6Address.valueOf(fromString); |
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 | - | ||
275 | - final byte[] value3 = new byte[] {(byte) 0xff, (byte) 0xff, | ||
276 | - (byte) 0xff, (byte) 0xff, | ||
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,38 +104,39 @@ public class IpAddressTest { | ... | @@ -101,38 +104,39 @@ 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, |
125 | - (byte) 0xff, (byte) 0xff, | 129 | + (byte) 0xff, (byte) 0xff, |
126 | - (byte) 0xff, (byte) 0xff, | 130 | + (byte) 0xff, (byte) 0xff, |
127 | - (byte) 0xff, (byte) 0xff, | 131 | + (byte) 0xff, (byte) 0xff, |
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,32 +197,33 @@ public class IpAddressTest { | ... | @@ -192,32 +197,33 @@ public class IpAddressTest { |
192 | @Test | 197 | @Test |
193 | public void testValueOfByteArrayIPv6() { | 198 | public void testValueOfByteArrayIPv6() { |
194 | IpAddress ipAddress; | 199 | IpAddress ipAddress; |
195 | - | 200 | + byte[] value; |
196 | - final byte[] value1 = new byte[] {0x11, 0x11, 0x22, 0x22, | 201 | + |
197 | - 0x33, 0x33, 0x44, 0x44, | 202 | + value = new byte[] {0x11, 0x11, 0x22, 0x22, |
198 | - 0x55, 0x55, 0x66, 0x66, | 203 | + 0x33, 0x33, 0x44, 0x44, |
199 | - 0x77, 0x77, | 204 | + 0x55, 0x55, 0x66, 0x66, |
200 | - (byte) 0x88, (byte) 0x88}; | 205 | + 0x77, 0x77, |
201 | - ipAddress = IpAddress.valueOf(IpAddress.Version.INET6, value1); | 206 | + (byte) 0x88, (byte) 0x88}; |
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, |
216 | - (byte) 0xff, (byte) 0xff, | 222 | + (byte) 0xff, (byte) 0xff, |
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,38 +308,39 @@ public class IpAddressTest { | ... | @@ -301,38 +308,39 @@ public class IpAddressTest { |
301 | @Test | 308 | @Test |
302 | public void testValueOfByteArrayOffsetIPv6() { | 309 | public void testValueOfByteArrayOffsetIPv6() { |
303 | IpAddress ipAddress; | 310 | IpAddress ipAddress; |
304 | - | 311 | + byte[] value; |
305 | - final byte[] value1 = new byte[] {11, 22, 33, // Preamble | 312 | + |
306 | - 0x11, 0x11, 0x22, 0x22, | 313 | + value = new byte[] {11, 22, 33, // Preamble |
307 | - 0x33, 0x33, 0x44, 0x44, | 314 | + 0x11, 0x11, 0x22, 0x22, |
308 | - 0x55, 0x55, 0x66, 0x66, | 315 | + 0x33, 0x33, 0x44, 0x44, |
309 | - 0x77, 0x77, | 316 | + 0x55, 0x55, 0x66, 0x66, |
310 | - (byte) 0x88, (byte) 0x88, | 317 | + 0x77, 0x77, |
311 | - 44, 55}; // Extra bytes | 318 | + (byte) 0x88, (byte) 0x88, |
312 | - ipAddress = IpAddress.valueOf(IpAddress.Version.INET6, value1, 3); | 319 | + 44, 55}; // Extra bytes |
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, |
329 | - (byte) 0xff, (byte) 0xff, | 337 | + (byte) 0xff, (byte) 0xff, |
330 | - (byte) 0xff, (byte) 0xff, | 338 | + (byte) 0xff, (byte) 0xff, |
331 | - (byte) 0xff, (byte) 0xff, | 339 | + (byte) 0xff, (byte) 0xff, |
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; |
361 | - | 370 | + byte[] value; |
362 | - final byte[] value1 = new byte[] {11, 22, 33, // Preamble | 371 | + |
363 | - 0x11, 0x11, 0x22, 0x22, | 372 | + value = new byte[] {11, 22, 33, // Preamble |
364 | - 0x33, 0x33, 0x44, 0x44, | 373 | + 0x11, 0x11, 0x22, 0x22, |
365 | - 0x55, 0x55, 0x66, 0x66, | 374 | + 0x33, 0x33, 0x44, 0x44, |
366 | - 0x77, 0x77, | 375 | + 0x55, 0x55, 0x66, 0x66, |
367 | - (byte) 0x88, (byte) 0x88, | 376 | + 0x77, 0x77, |
368 | - 44, 55}; // Extra bytes | 377 | + (byte) 0x88, (byte) 0x88, |
369 | - ipAddress = IpAddress.valueOf(IpAddress.Version.INET6, value1, 6); | 378 | + 44, 55}; // Extra bytes |
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); | ... | ... |
-
Please register or login to post a comment