Merge branch 'master' of ssh://gerrit.onlab.us:29418/onos-next
Showing
20 changed files
with
1187 additions
and
216 deletions
... | @@ -62,6 +62,32 @@ | ... | @@ -62,6 +62,32 @@ |
62 | <groupId>org.osgi</groupId> | 62 | <groupId>org.osgi</groupId> |
63 | <artifactId>org.osgi.core</artifactId> | 63 | <artifactId>org.osgi.core</artifactId> |
64 | </dependency> | 64 | </dependency> |
65 | + | ||
66 | + <dependency> | ||
67 | + <groupId>org.onlab.onos</groupId> | ||
68 | + <artifactId>onlab-thirdparty</artifactId> | ||
69 | + </dependency> | ||
70 | + | ||
71 | + <dependency> | ||
72 | + <groupId>org.onlab.onos</groupId> | ||
73 | + <artifactId>onlab-misc</artifactId> | ||
74 | + </dependency> | ||
75 | + | ||
76 | + <dependency> | ||
77 | + <groupId>org.onlab.onos</groupId> | ||
78 | + <artifactId>onlab-junit</artifactId> | ||
79 | + <scope>test</scope> | ||
80 | + </dependency> | ||
81 | + | ||
82 | + <dependency> | ||
83 | + <groupId>org.onlab.onos</groupId> | ||
84 | + <artifactId>onos-cli</artifactId> | ||
85 | + <version>${project.version}</version> | ||
86 | + </dependency> | ||
87 | + <dependency> | ||
88 | + <groupId>org.apache.karaf.shell</groupId> | ||
89 | + <artifactId>org.apache.karaf.shell.console</artifactId> | ||
90 | + </dependency> | ||
65 | </dependencies> | 91 | </dependencies> |
66 | 92 | ||
67 | <build> | 93 | <build> |
... | @@ -77,6 +103,7 @@ | ... | @@ -77,6 +103,7 @@ |
77 | ${project.groupId}.${project.artifactId} | 103 | ${project.groupId}.${project.artifactId} |
78 | </Bundle-SymbolicName> | 104 | </Bundle-SymbolicName> |
79 | <Import-Package> | 105 | <Import-Package> |
106 | + org.slf4j, | ||
80 | org.osgi.framework, | 107 | org.osgi.framework, |
81 | javax.ws.rs,javax.ws.rs.core, | 108 | javax.ws.rs,javax.ws.rs.core, |
82 | com.sun.jersey.api.core, | 109 | com.sun.jersey.api.core, | ... | ... |
... | @@ -16,43 +16,47 @@ | ... | @@ -16,43 +16,47 @@ |
16 | package org.onlab.onos.calendar; | 16 | package org.onlab.onos.calendar; |
17 | 17 | ||
18 | import java.net.URI; | 18 | import java.net.URI; |
19 | - | 19 | +import org.onlab.onos.net.ConnectPoint; |
20 | +import org.onlab.onos.net.DeviceId; | ||
21 | +import org.onlab.onos.net.intent.IntentService; | ||
22 | +import org.onlab.rest.BaseResource; | ||
20 | import javax.ws.rs.POST; | 23 | import javax.ws.rs.POST; |
21 | -import javax.ws.rs.Path; | 24 | +import javax.ws.rs.DELETE; |
22 | import javax.ws.rs.PathParam; | 25 | import javax.ws.rs.PathParam; |
23 | import javax.ws.rs.core.Response; | 26 | import javax.ws.rs.core.Response; |
24 | - | ||
25 | import org.onlab.onos.core.ApplicationId; | 27 | import org.onlab.onos.core.ApplicationId; |
26 | import org.onlab.onos.core.CoreService; | 28 | import org.onlab.onos.core.CoreService; |
27 | -import org.onlab.onos.net.ConnectPoint; | ||
28 | -import org.onlab.onos.net.DeviceId; | ||
29 | import org.onlab.onos.net.flow.DefaultTrafficSelector; | 29 | import org.onlab.onos.net.flow.DefaultTrafficSelector; |
30 | import org.onlab.onos.net.flow.TrafficSelector; | 30 | import org.onlab.onos.net.flow.TrafficSelector; |
31 | import org.onlab.onos.net.flow.TrafficTreatment; | 31 | import org.onlab.onos.net.flow.TrafficTreatment; |
32 | -import org.onlab.onos.net.intent.Intent; | 32 | +import org.onlab.onos.net.intent.PointToPointIntent; |
33 | -import org.onlab.onos.net.intent.IntentService; | ||
34 | -import org.onlab.onos.net.intent.PointToPointIntentWithBandwidthConstraint; | ||
35 | -import org.onlab.onos.net.resource.BandwidthResourceRequest; | ||
36 | import org.onlab.packet.Ethernet; | 33 | import org.onlab.packet.Ethernet; |
37 | -import org.onlab.rest.BaseResource; | ||
38 | - | ||
39 | import static org.onlab.onos.net.PortNumber.portNumber; | 34 | import static org.onlab.onos.net.PortNumber.portNumber; |
40 | import static org.onlab.onos.net.flow.DefaultTrafficTreatment.builder; | 35 | import static org.onlab.onos.net.flow.DefaultTrafficTreatment.builder; |
41 | 36 | ||
37 | +import static org.slf4j.LoggerFactory.getLogger; | ||
38 | +import org.slf4j.Logger; | ||
39 | + | ||
42 | /** | 40 | /** |
43 | * Web resource for triggering calendared intents. | 41 | * Web resource for triggering calendared intents. |
44 | */ | 42 | */ |
45 | -@Path("intent") | 43 | +@javax.ws.rs.Path("intent") |
46 | public class BandwidthCalendarResource extends BaseResource { | 44 | public class BandwidthCalendarResource extends BaseResource { |
47 | 45 | ||
46 | + private static final Logger log = getLogger(BandwidthCalendarResource.class); | ||
47 | + | ||
48 | + @javax.ws.rs.Path("/{src}/{dst}/{srcPort}/{dstPort}/{bandwidth}") | ||
48 | @POST | 49 | @POST |
49 | - @Path("{src}/{dst}/{srcPort}/{dstPort}/{bandwidth}") | ||
50 | public Response createIntent(@PathParam("src") String src, | 50 | public Response createIntent(@PathParam("src") String src, |
51 | @PathParam("dst") String dst, | 51 | @PathParam("dst") String dst, |
52 | @PathParam("srcPort") String srcPort, | 52 | @PathParam("srcPort") String srcPort, |
53 | @PathParam("dstPort") String dstPort, | 53 | @PathParam("dstPort") String dstPort, |
54 | @PathParam("bandwidth") String bandwidth) { | 54 | @PathParam("bandwidth") String bandwidth) { |
55 | - // TODO: implement calls to intent framework | 55 | + |
56 | + log.info("Receiving Create Intent request..."); | ||
57 | + log.info("Path Constraints: Src = {} SrcPort = {} Dest = {} DestPort = {} BW = {}", | ||
58 | + src, srcPort, dst, dstPort, bandwidth); | ||
59 | + | ||
56 | IntentService service = get(IntentService.class); | 60 | IntentService service = get(IntentService.class); |
57 | 61 | ||
58 | ConnectPoint srcPoint = new ConnectPoint(deviceId(src), portNumber(srcPort)); | 62 | ConnectPoint srcPoint = new ConnectPoint(deviceId(src), portNumber(srcPort)); |
... | @@ -61,13 +65,38 @@ public class BandwidthCalendarResource extends BaseResource { | ... | @@ -61,13 +65,38 @@ public class BandwidthCalendarResource extends BaseResource { |
61 | TrafficSelector selector = buildTrafficSelector(); | 65 | TrafficSelector selector = buildTrafficSelector(); |
62 | TrafficTreatment treatment = builder().build(); | 66 | TrafficTreatment treatment = builder().build(); |
63 | 67 | ||
64 | - Intent intent = new PointToPointIntentWithBandwidthConstraint( | 68 | + PointToPointIntent intentP2P = |
65 | - appId(), selector, treatment, | 69 | + new PointToPointIntent(appId(), selector, treatment, |
66 | - srcPoint, dstPoint, new BandwidthResourceRequest(Double.parseDouble(bandwidth))); | 70 | + srcPoint, dstPoint); |
67 | - service.submit(intent); | 71 | + service.submit(intentP2P); |
72 | + log.info("Submitted Calendar App intent: src = " + src + "dest = " + dst | ||
73 | + + "srcPort = " + srcPort + "destPort" + dstPort + "intentID = " + intentP2P.id().toString()); | ||
74 | + String reply = intentP2P.id().toString() + "\n"; | ||
68 | 75 | ||
69 | - return Response.ok("Yo! We got src=" + srcPoint + "; dst=" + dstPoint + | 76 | + return Response.ok(reply).build(); |
70 | - "; bw=" + bandwidth + "; intent service " + service).build(); | 77 | + } |
78 | + | ||
79 | + @javax.ws.rs.Path("/cancellation/{intentId}") | ||
80 | + @DELETE | ||
81 | + public Response withdrawIntent(@PathParam("intentId") String intentId) { | ||
82 | + | ||
83 | + log.info("Receiving Teardown request..."); | ||
84 | + log.info("Withdraw intentId = {} ", intentId); | ||
85 | + | ||
86 | + String reply = "ok\n"; | ||
87 | + return Response.ok(reply).build(); | ||
88 | + } | ||
89 | + | ||
90 | + @javax.ws.rs.Path("/modification/{intentId}/{bandwidth}") | ||
91 | + @POST | ||
92 | + public Response modifyBandwidth(@PathParam("intentId") String intentId, | ||
93 | + @PathParam("bandwidth") String bandwidth) { | ||
94 | + | ||
95 | + log.info("Receiving Modify request..."); | ||
96 | + log.info("Modify bw for intentId = {} with new bandwidth = {}", intentId, bandwidth); | ||
97 | + | ||
98 | + String reply = "ok\n"; | ||
99 | + return Response.ok(reply).build(); | ||
71 | } | 100 | } |
72 | 101 | ||
73 | private TrafficSelector buildTrafficSelector() { | 102 | private TrafficSelector buildTrafficSelector() { |
... | @@ -86,5 +115,4 @@ public class BandwidthCalendarResource extends BaseResource { | ... | @@ -86,5 +115,4 @@ public class BandwidthCalendarResource extends BaseResource { |
86 | protected ApplicationId appId() { | 115 | protected ApplicationId appId() { |
87 | return get(CoreService.class).registerApplication("org.onlab.onos.calendar"); | 116 | return get(CoreService.class).registerApplication("org.onlab.onos.calendar"); |
88 | } | 117 | } |
89 | - | ||
90 | } | 118 | } | ... | ... |
... | @@ -188,7 +188,7 @@ public final class DefaultTrafficSelector implements TrafficSelector { | ... | @@ -188,7 +188,7 @@ public final class DefaultTrafficSelector implements TrafficSelector { |
188 | } | 188 | } |
189 | 189 | ||
190 | @Override | 190 | @Override |
191 | - public Builder matchOpticalSignalType(Byte signalType) { | 191 | + public Builder matchOpticalSignalType(Short signalType) { |
192 | return add(Criteria.matchOpticalSignalType(signalType)); | 192 | return add(Criteria.matchOpticalSignalType(signalType)); |
193 | 193 | ||
194 | } | 194 | } | ... | ... |
... | @@ -27,11 +27,14 @@ public final class FlowRuleBatchEvent extends AbstractEvent<FlowRuleBatchEvent.T | ... | @@ -27,11 +27,14 @@ public final class FlowRuleBatchEvent extends AbstractEvent<FlowRuleBatchEvent.T |
27 | */ | 27 | */ |
28 | public enum Type { | 28 | public enum Type { |
29 | 29 | ||
30 | + // Request has been forwarded to MASTER Node | ||
30 | /** | 31 | /** |
31 | * Signifies that a batch operation has been initiated. | 32 | * Signifies that a batch operation has been initiated. |
32 | */ | 33 | */ |
33 | BATCH_OPERATION_REQUESTED, | 34 | BATCH_OPERATION_REQUESTED, |
34 | 35 | ||
36 | + // MASTER Node has pushed the batch down to the Device | ||
37 | + // (e.g., Received barrier reply) | ||
35 | /** | 38 | /** |
36 | * Signifies that a batch operation has completed. | 39 | * Signifies that a batch operation has completed. |
37 | */ | 40 | */ | ... | ... |
... | @@ -25,29 +25,29 @@ import com.google.common.collect.Lists; | ... | @@ -25,29 +25,29 @@ import com.google.common.collect.Lists; |
25 | public class FlowRuleBatchRequest { | 25 | public class FlowRuleBatchRequest { |
26 | 26 | ||
27 | private final int batchId; | 27 | private final int batchId; |
28 | - private final List<FlowEntry> toAdd; | 28 | + private final List<FlowRule> toAdd; |
29 | - private final List<FlowEntry> toRemove; | 29 | + private final List<FlowRule> toRemove; |
30 | 30 | ||
31 | - public FlowRuleBatchRequest(int batchId, List<? extends FlowEntry> toAdd, List<? extends FlowEntry> toRemove) { | 31 | + public FlowRuleBatchRequest(int batchId, List<? extends FlowRule> toAdd, List<? extends FlowRule> toRemove) { |
32 | this.batchId = batchId; | 32 | this.batchId = batchId; |
33 | this.toAdd = Collections.unmodifiableList(toAdd); | 33 | this.toAdd = Collections.unmodifiableList(toAdd); |
34 | this.toRemove = Collections.unmodifiableList(toRemove); | 34 | this.toRemove = Collections.unmodifiableList(toRemove); |
35 | } | 35 | } |
36 | 36 | ||
37 | - public List<FlowEntry> toAdd() { | 37 | + public List<FlowRule> toAdd() { |
38 | return toAdd; | 38 | return toAdd; |
39 | } | 39 | } |
40 | 40 | ||
41 | - public List<FlowEntry> toRemove() { | 41 | + public List<FlowRule> toRemove() { |
42 | return toRemove; | 42 | return toRemove; |
43 | } | 43 | } |
44 | 44 | ||
45 | public FlowRuleBatchOperation asBatchOperation() { | 45 | public FlowRuleBatchOperation asBatchOperation() { |
46 | List<FlowRuleBatchEntry> entries = Lists.newArrayList(); | 46 | List<FlowRuleBatchEntry> entries = Lists.newArrayList(); |
47 | - for (FlowEntry e : toAdd) { | 47 | + for (FlowRule e : toAdd) { |
48 | entries.add(new FlowRuleBatchEntry(FlowRuleOperation.ADD, e)); | 48 | entries.add(new FlowRuleBatchEntry(FlowRuleOperation.ADD, e)); |
49 | } | 49 | } |
50 | - for (FlowEntry e : toRemove) { | 50 | + for (FlowRule e : toRemove) { |
51 | entries.add(new FlowRuleBatchEntry(FlowRuleOperation.REMOVE, e)); | 51 | entries.add(new FlowRuleBatchEntry(FlowRuleOperation.REMOVE, e)); |
52 | } | 52 | } |
53 | return new FlowRuleBatchOperation(entries); | 53 | return new FlowRuleBatchOperation(entries); | ... | ... |
... | @@ -147,7 +147,7 @@ public interface TrafficSelector { | ... | @@ -147,7 +147,7 @@ public interface TrafficSelector { |
147 | * @param signalType | 147 | * @param signalType |
148 | * @return a selection builder | 148 | * @return a selection builder |
149 | */ | 149 | */ |
150 | - public Builder matchOpticalSignalType(Byte signalType); | 150 | + public Builder matchOpticalSignalType(Short signalType); |
151 | 151 | ||
152 | /** | 152 | /** |
153 | * Builds an immutable traffic selector. | 153 | * Builds an immutable traffic selector. | ... | ... |
... | @@ -161,11 +161,11 @@ public final class Criteria { | ... | @@ -161,11 +161,11 @@ public final class Criteria { |
161 | /** | 161 | /** |
162 | * Creates a match on lambda field using the specified value. | 162 | * Creates a match on lambda field using the specified value. |
163 | * | 163 | * |
164 | - * @param lambda | 164 | + * @param sigType |
165 | * @return match criterion | 165 | * @return match criterion |
166 | */ | 166 | */ |
167 | - public static Criterion matchOpticalSignalType(Byte lambda) { | 167 | + public static Criterion matchOpticalSignalType(Short sigType) { |
168 | - return new OpticalSignalTypeCriterion(lambda, Type.OCH_SIGTYPE); | 168 | + return new OpticalSignalTypeCriterion(sigType, Type.OCH_SIGTYPE); |
169 | } | 169 | } |
170 | 170 | ||
171 | 171 | ||
... | @@ -587,10 +587,10 @@ public final class Criteria { | ... | @@ -587,10 +587,10 @@ public final class Criteria { |
587 | 587 | ||
588 | public static final class OpticalSignalTypeCriterion implements Criterion { | 588 | public static final class OpticalSignalTypeCriterion implements Criterion { |
589 | 589 | ||
590 | - private final byte signalType; | 590 | + private final Short signalType; |
591 | private final Type type; | 591 | private final Type type; |
592 | 592 | ||
593 | - public OpticalSignalTypeCriterion(byte signalType, Type type) { | 593 | + public OpticalSignalTypeCriterion(Short signalType, Type type) { |
594 | this.signalType = signalType; | 594 | this.signalType = signalType; |
595 | this.type = type; | 595 | this.type = type; |
596 | } | 596 | } |
... | @@ -600,7 +600,7 @@ public final class Criteria { | ... | @@ -600,7 +600,7 @@ public final class Criteria { |
600 | return this.type; | 600 | return this.type; |
601 | } | 601 | } |
602 | 602 | ||
603 | - public Byte signalType() { | 603 | + public Short signalType() { |
604 | return this.signalType; | 604 | return this.signalType; |
605 | } | 605 | } |
606 | 606 | ... | ... |
... | @@ -15,7 +15,11 @@ | ... | @@ -15,7 +15,11 @@ |
15 | */ | 15 | */ |
16 | package org.onlab.onos.net.intent; | 16 | package org.onlab.onos.net.intent; |
17 | 17 | ||
18 | +import java.util.List; | ||
19 | + | ||
18 | import com.google.common.base.MoreObjects; | 20 | import com.google.common.base.MoreObjects; |
21 | +import com.google.common.collect.ImmutableList; | ||
22 | + | ||
19 | import org.onlab.onos.core.ApplicationId; | 23 | import org.onlab.onos.core.ApplicationId; |
20 | import org.onlab.onos.net.Path; | 24 | import org.onlab.onos.net.Path; |
21 | import org.onlab.onos.net.flow.TrafficSelector; | 25 | import org.onlab.onos.net.flow.TrafficSelector; |
... | @@ -28,7 +32,7 @@ import org.onlab.onos.net.resource.LinkResourceRequest; | ... | @@ -28,7 +32,7 @@ import org.onlab.onos.net.resource.LinkResourceRequest; |
28 | public class PathIntent extends ConnectivityIntent { | 32 | public class PathIntent extends ConnectivityIntent { |
29 | 33 | ||
30 | private final Path path; | 34 | private final Path path; |
31 | - private final LinkResourceRequest[] resourceRequests; | 35 | + private final List<LinkResourceRequest> resourceRequests; |
32 | 36 | ||
33 | /** | 37 | /** |
34 | * Creates a new point-to-point intent with the supplied ingress/egress | 38 | * Creates a new point-to-point intent with the supplied ingress/egress |
... | @@ -45,7 +49,7 @@ public class PathIntent extends ConnectivityIntent { | ... | @@ -45,7 +49,7 @@ public class PathIntent extends ConnectivityIntent { |
45 | super(id(PathIntent.class, selector, treatment, path), appId, | 49 | super(id(PathIntent.class, selector, treatment, path), appId, |
46 | resources(path.links()), selector, treatment); | 50 | resources(path.links()), selector, treatment); |
47 | this.path = path; | 51 | this.path = path; |
48 | - this.resourceRequests = resourceRequests; | 52 | + this.resourceRequests = ImmutableList.copyOf(resourceRequests); |
49 | } | 53 | } |
50 | 54 | ||
51 | /** | 55 | /** |
... | @@ -54,7 +58,7 @@ public class PathIntent extends ConnectivityIntent { | ... | @@ -54,7 +58,7 @@ public class PathIntent extends ConnectivityIntent { |
54 | protected PathIntent() { | 58 | protected PathIntent() { |
55 | super(); | 59 | super(); |
56 | this.path = null; | 60 | this.path = null; |
57 | - this.resourceRequests = new LinkResourceRequest[0]; | 61 | + this.resourceRequests = ImmutableList.of(); |
58 | } | 62 | } |
59 | 63 | ||
60 | /** | 64 | /** |
... | @@ -71,8 +75,9 @@ public class PathIntent extends ConnectivityIntent { | ... | @@ -71,8 +75,9 @@ public class PathIntent extends ConnectivityIntent { |
71 | return true; | 75 | return true; |
72 | } | 76 | } |
73 | 77 | ||
78 | + // TODO: consider changing return type | ||
74 | public LinkResourceRequest[] resourceRequests() { | 79 | public LinkResourceRequest[] resourceRequests() { |
75 | - return resourceRequests; | 80 | + return resourceRequests.toArray(new LinkResourceRequest[resourceRequests.size()]); |
76 | } | 81 | } |
77 | 82 | ||
78 | @Override | 83 | @Override | ... | ... |
... | @@ -371,10 +371,11 @@ public class FlowRuleManager | ... | @@ -371,10 +371,11 @@ public class FlowRuleManager |
371 | final FlowRuleBatchRequest request = event.subject(); | 371 | final FlowRuleBatchRequest request = event.subject(); |
372 | switch (event.type()) { | 372 | switch (event.type()) { |
373 | case BATCH_OPERATION_REQUESTED: | 373 | case BATCH_OPERATION_REQUESTED: |
374 | - for (FlowEntry entry : request.toAdd()) { | 374 | + // Request has been forwarded to MASTER Node, and was |
375 | + for (FlowRule entry : request.toAdd()) { | ||
375 | eventDispatcher.post(new FlowRuleEvent(FlowRuleEvent.Type.RULE_ADD_REQUESTED, entry)); | 376 | eventDispatcher.post(new FlowRuleEvent(FlowRuleEvent.Type.RULE_ADD_REQUESTED, entry)); |
376 | } | 377 | } |
377 | - for (FlowEntry entry : request.toRemove()) { | 378 | + for (FlowRule entry : request.toRemove()) { |
378 | eventDispatcher.post(new FlowRuleEvent(FlowRuleEvent.Type.RULE_REMOVE_REQUESTED, entry)); | 379 | eventDispatcher.post(new FlowRuleEvent(FlowRuleEvent.Type.RULE_REMOVE_REQUESTED, entry)); |
379 | } | 380 | } |
380 | // FIXME: what about op.equals(FlowRuleOperation.MODIFY) ? | 381 | // FIXME: what about op.equals(FlowRuleOperation.MODIFY) ? |
... | @@ -392,21 +393,15 @@ public class FlowRuleManager | ... | @@ -392,21 +393,15 @@ public class FlowRuleManager |
392 | Futures.getUnchecked(result))); | 393 | Futures.getUnchecked(result))); |
393 | } | 394 | } |
394 | }, futureListeners); | 395 | }, futureListeners); |
395 | - | ||
396 | break; | 396 | break; |
397 | + | ||
397 | case BATCH_OPERATION_COMPLETED: | 398 | case BATCH_OPERATION_COMPLETED: |
398 | - Set<FlowRule> failedItems = event.result().failedItems(); | 399 | + // MASTER Node has pushed the batch down to the Device |
399 | - for (FlowEntry entry : request.toAdd()) { | 400 | + |
400 | - if (!failedItems.contains(entry)) { | 401 | + // Note: RULE_ADDED will be posted |
401 | - eventDispatcher.post(new FlowRuleEvent(FlowRuleEvent.Type.RULE_ADDED, entry)); | 402 | + // when Flow was actually confirmed by stats reply. |
402 | - } | ||
403 | - } | ||
404 | - for (FlowEntry entry : request.toRemove()) { | ||
405 | - if (!failedItems.contains(entry)) { | ||
406 | - eventDispatcher.post(new FlowRuleEvent(FlowRuleEvent.Type.RULE_REMOVED, entry)); | ||
407 | - } | ||
408 | - } | ||
409 | break; | 403 | break; |
404 | + | ||
410 | default: | 405 | default: |
411 | break; | 406 | break; |
412 | } | 407 | } | ... | ... |
... | @@ -79,6 +79,7 @@ public class OpticalPathIntentInstaller implements IntentInstaller<OpticalPathIn | ... | @@ -79,6 +79,7 @@ public class OpticalPathIntentInstaller implements IntentInstaller<OpticalPathIn |
79 | private ApplicationId appId; | 79 | private ApplicationId appId; |
80 | 80 | ||
81 | //final short WAVELENGTH = 80; | 81 | //final short WAVELENGTH = 80; |
82 | + static final short SIGNAL_TYPE = (short) 1; | ||
82 | 83 | ||
83 | @Activate | 84 | @Activate |
84 | public void activate() { | 85 | public void activate() { |
... | @@ -151,7 +152,9 @@ public class OpticalPathIntentInstaller implements IntentInstaller<OpticalPathIn | ... | @@ -151,7 +152,9 @@ public class OpticalPathIntentInstaller implements IntentInstaller<OpticalPathIn |
151 | 152 | ||
152 | prev = link.dst(); | 153 | prev = link.dst(); |
153 | selectorBuilder.matchInport(link.dst().port()); | 154 | selectorBuilder.matchInport(link.dst().port()); |
155 | + selectorBuilder.matchOpticalSignalType(SIGNAL_TYPE); //todo | ||
154 | selectorBuilder.matchLambda((short) la.toInt()); | 156 | selectorBuilder.matchLambda((short) la.toInt()); |
157 | + | ||
155 | } | 158 | } |
156 | 159 | ||
157 | // build the last T port rule | 160 | // build the last T port rule | ... | ... |
... | @@ -148,7 +148,7 @@ public class FlowRuleManagerTest { | ... | @@ -148,7 +148,7 @@ public class FlowRuleManagerTest { |
148 | int i = 0; | 148 | int i = 0; |
149 | System.err.println("events :" + listener.events); | 149 | System.err.println("events :" + listener.events); |
150 | for (FlowRuleEvent e : listener.events) { | 150 | for (FlowRuleEvent e : listener.events) { |
151 | - assertTrue("unexpected event", e.type().equals(events[i])); | 151 | + assertEquals("unexpected event", events[i], e.type()); |
152 | i++; | 152 | i++; |
153 | } | 153 | } |
154 | 154 | ||
... | @@ -178,15 +178,13 @@ public class FlowRuleManagerTest { | ... | @@ -178,15 +178,13 @@ public class FlowRuleManagerTest { |
178 | RULE_ADDED, RULE_ADDED); | 178 | RULE_ADDED, RULE_ADDED); |
179 | 179 | ||
180 | addFlowRule(1); | 180 | addFlowRule(1); |
181 | + System.err.println("events :" + listener.events); | ||
181 | assertEquals("should still be 2 rules", 2, flowCount()); | 182 | assertEquals("should still be 2 rules", 2, flowCount()); |
182 | 183 | ||
183 | providerService.pushFlowMetrics(DID, ImmutableList.of(fe1)); | 184 | providerService.pushFlowMetrics(DID, ImmutableList.of(fe1)); |
184 | validateEvents(RULE_UPDATED); | 185 | validateEvents(RULE_UPDATED); |
185 | } | 186 | } |
186 | 187 | ||
187 | - | ||
188 | - // TODO: If preserving iteration order is a requirement, redo FlowRuleStore. | ||
189 | - //backing store is sensitive to the order of additions/removals | ||
190 | private boolean validateState(Map<FlowRule, FlowEntryState> expected) { | 188 | private boolean validateState(Map<FlowRule, FlowEntryState> expected) { |
191 | Map<FlowRule, FlowEntryState> expectedToCheck = new HashMap<>(expected); | 189 | Map<FlowRule, FlowEntryState> expectedToCheck = new HashMap<>(expected); |
192 | Iterable<FlowEntry> rules = service.getFlowEntries(DID); | 190 | Iterable<FlowEntry> rules = service.getFlowEntries(DID); |
... | @@ -539,17 +537,17 @@ public class FlowRuleManagerTest { | ... | @@ -539,17 +537,17 @@ public class FlowRuleManagerTest { |
539 | 537 | ||
540 | @Override | 538 | @Override |
541 | public boolean cancel(boolean mayInterruptIfRunning) { | 539 | public boolean cancel(boolean mayInterruptIfRunning) { |
542 | - return true; | 540 | + return false; |
543 | } | 541 | } |
544 | 542 | ||
545 | @Override | 543 | @Override |
546 | public boolean isCancelled() { | 544 | public boolean isCancelled() { |
547 | - return true; | 545 | + return false; |
548 | } | 546 | } |
549 | 547 | ||
550 | @Override | 548 | @Override |
551 | public boolean isDone() { | 549 | public boolean isDone() { |
552 | - return false; | 550 | + return true; |
553 | } | 551 | } |
554 | 552 | ||
555 | @Override | 553 | @Override |
... | @@ -562,12 +560,14 @@ public class FlowRuleManagerTest { | ... | @@ -562,12 +560,14 @@ public class FlowRuleManagerTest { |
562 | public CompletedBatchOperation get(long timeout, TimeUnit unit) | 560 | public CompletedBatchOperation get(long timeout, TimeUnit unit) |
563 | throws InterruptedException, | 561 | throws InterruptedException, |
564 | ExecutionException, TimeoutException { | 562 | ExecutionException, TimeoutException { |
565 | - return null; | 563 | + return new CompletedBatchOperation(true, Collections.<FlowRule>emptySet()); |
566 | } | 564 | } |
567 | 565 | ||
568 | @Override | 566 | @Override |
569 | public void addListener(Runnable task, Executor executor) { | 567 | public void addListener(Runnable task, Executor executor) { |
570 | - // TODO: add stuff. | 568 | + if (isDone()) { |
569 | + executor.execute(task); | ||
570 | + } | ||
571 | } | 571 | } |
572 | } | 572 | } |
573 | 573 | ... | ... |
... | @@ -447,7 +447,13 @@ implements MastershipStore { | ... | @@ -447,7 +447,13 @@ implements MastershipStore { |
447 | RoleValue oldValue = event.getOldValue(); | 447 | RoleValue oldValue = event.getOldValue(); |
448 | RoleValue newValue = event.getValue(); | 448 | RoleValue newValue = event.getValue(); |
449 | 449 | ||
450 | - if (Objects.equal(oldValue.get(MASTER), newValue.get(MASTER))) { | 450 | + NodeId oldMaster = null; |
451 | + if (oldValue != null) { | ||
452 | + oldMaster = oldValue.get(MASTER); | ||
453 | + } | ||
454 | + NodeId newMaster = newValue.get(MASTER); | ||
455 | + | ||
456 | + if (Objects.equal(oldMaster, newMaster)) { | ||
451 | notifyDelegate(new MastershipEvent( | 457 | notifyDelegate(new MastershipEvent( |
452 | MASTER_CHANGED, event.getKey(), event.getValue().roleInfo())); | 458 | MASTER_CHANGED, event.getKey(), event.getValue().roleInfo())); |
453 | } else { | 459 | } else { | ... | ... |
... | @@ -16,8 +16,12 @@ | ... | @@ -16,8 +16,12 @@ |
16 | package org.onlab.onos.store.trivial.impl; | 16 | package org.onlab.onos.store.trivial.impl; |
17 | 17 | ||
18 | import com.google.common.base.Function; | 18 | import com.google.common.base.Function; |
19 | +import com.google.common.cache.Cache; | ||
20 | +import com.google.common.cache.CacheBuilder; | ||
19 | import com.google.common.collect.FluentIterable; | 21 | import com.google.common.collect.FluentIterable; |
20 | import com.google.common.util.concurrent.Futures; | 22 | import com.google.common.util.concurrent.Futures; |
23 | +import com.google.common.util.concurrent.SettableFuture; | ||
24 | + | ||
21 | import org.apache.felix.scr.annotations.Activate; | 25 | import org.apache.felix.scr.annotations.Activate; |
22 | import org.apache.felix.scr.annotations.Component; | 26 | import org.apache.felix.scr.annotations.Component; |
23 | import org.apache.felix.scr.annotations.Deactivate; | 27 | import org.apache.felix.scr.annotations.Deactivate; |
... | @@ -43,13 +47,15 @@ import org.onlab.onos.store.AbstractStore; | ... | @@ -43,13 +47,15 @@ import org.onlab.onos.store.AbstractStore; |
43 | import org.onlab.util.NewConcurrentHashMap; | 47 | import org.onlab.util.NewConcurrentHashMap; |
44 | import org.slf4j.Logger; | 48 | import org.slf4j.Logger; |
45 | 49 | ||
46 | -import java.util.Arrays; | 50 | +import java.util.ArrayList; |
47 | import java.util.Collections; | 51 | import java.util.Collections; |
48 | import java.util.List; | 52 | import java.util.List; |
49 | import java.util.concurrent.ConcurrentHashMap; | 53 | import java.util.concurrent.ConcurrentHashMap; |
50 | import java.util.concurrent.ConcurrentMap; | 54 | import java.util.concurrent.ConcurrentMap; |
51 | import java.util.concurrent.CopyOnWriteArrayList; | 55 | import java.util.concurrent.CopyOnWriteArrayList; |
52 | import java.util.concurrent.Future; | 56 | import java.util.concurrent.Future; |
57 | +import java.util.concurrent.TimeUnit; | ||
58 | +import java.util.concurrent.atomic.AtomicInteger; | ||
53 | 59 | ||
54 | import static org.apache.commons.lang3.concurrent.ConcurrentUtils.createIfAbsentUnchecked; | 60 | import static org.apache.commons.lang3.concurrent.ConcurrentUtils.createIfAbsentUnchecked; |
55 | import static org.onlab.onos.net.flow.FlowRuleEvent.Type.RULE_REMOVED; | 61 | import static org.onlab.onos.net.flow.FlowRuleEvent.Type.RULE_REMOVED; |
... | @@ -72,6 +78,18 @@ public class SimpleFlowRuleStore | ... | @@ -72,6 +78,18 @@ public class SimpleFlowRuleStore |
72 | private final ConcurrentMap<DeviceId, ConcurrentMap<FlowId, List<StoredFlowEntry>>> | 78 | private final ConcurrentMap<DeviceId, ConcurrentMap<FlowId, List<StoredFlowEntry>>> |
73 | flowEntries = new ConcurrentHashMap<>(); | 79 | flowEntries = new ConcurrentHashMap<>(); |
74 | 80 | ||
81 | + private final AtomicInteger localBatchIdGen = new AtomicInteger(); | ||
82 | + | ||
83 | + // TODO: make this configurable | ||
84 | + private int pendingFutureTimeoutMinutes = 5; | ||
85 | + | ||
86 | + private Cache<Integer, SettableFuture<CompletedBatchOperation>> pendingFutures = | ||
87 | + CacheBuilder.newBuilder() | ||
88 | + .expireAfterWrite(pendingFutureTimeoutMinutes, TimeUnit.MINUTES) | ||
89 | + // TODO Explicitly fail the future if expired? | ||
90 | + //.removalListener(listener) | ||
91 | + .build(); | ||
92 | + | ||
75 | @Activate | 93 | @Activate |
76 | public void activate() { | 94 | public void activate() { |
77 | log.info("Started"); | 95 | log.info("Started"); |
... | @@ -173,10 +191,6 @@ public class SimpleFlowRuleStore | ... | @@ -173,10 +191,6 @@ public class SimpleFlowRuleStore |
173 | } | 191 | } |
174 | // new flow rule added | 192 | // new flow rule added |
175 | existing.add(f); | 193 | existing.add(f); |
176 | - notifyDelegate(FlowRuleBatchEvent.requested( | ||
177 | - new FlowRuleBatchRequest(1, /* FIXME generate something */ | ||
178 | - Arrays.<FlowEntry>asList(f), | ||
179 | - Collections.<FlowEntry>emptyList()))); | ||
180 | } | 194 | } |
181 | } | 195 | } |
182 | 196 | ||
... | @@ -190,11 +204,6 @@ public class SimpleFlowRuleStore | ... | @@ -190,11 +204,6 @@ public class SimpleFlowRuleStore |
190 | if (entry.equals(rule)) { | 204 | if (entry.equals(rule)) { |
191 | synchronized (entry) { | 205 | synchronized (entry) { |
192 | entry.setState(FlowEntryState.PENDING_REMOVE); | 206 | entry.setState(FlowEntryState.PENDING_REMOVE); |
193 | - // TODO: Should we notify only if it's "remote" event? | ||
194 | - notifyDelegate(FlowRuleBatchEvent.requested( | ||
195 | - new FlowRuleBatchRequest(1, /* FIXME generate something */ | ||
196 | - Collections.<FlowEntry>emptyList(), | ||
197 | - Arrays.<FlowEntry>asList(entry)))); | ||
198 | } | 207 | } |
199 | } | 208 | } |
200 | } | 209 | } |
... | @@ -251,20 +260,47 @@ public class SimpleFlowRuleStore | ... | @@ -251,20 +260,47 @@ public class SimpleFlowRuleStore |
251 | @Override | 260 | @Override |
252 | public Future<CompletedBatchOperation> storeBatch( | 261 | public Future<CompletedBatchOperation> storeBatch( |
253 | FlowRuleBatchOperation batchOperation) { | 262 | FlowRuleBatchOperation batchOperation) { |
263 | + List<FlowRule> toAdd = new ArrayList<>(); | ||
264 | + List<FlowRule> toRemove = new ArrayList<>(); | ||
254 | for (FlowRuleBatchEntry entry : batchOperation.getOperations()) { | 265 | for (FlowRuleBatchEntry entry : batchOperation.getOperations()) { |
266 | + final FlowRule flowRule = entry.getTarget(); | ||
255 | if (entry.getOperator().equals(FlowRuleOperation.ADD)) { | 267 | if (entry.getOperator().equals(FlowRuleOperation.ADD)) { |
256 | - storeFlowRule(entry.getTarget()); | 268 | + if (!getFlowEntries(flowRule.deviceId(), flowRule.id()).contains(flowRule)) { |
269 | + storeFlowRule(flowRule); | ||
270 | + toAdd.add(flowRule); | ||
271 | + } | ||
257 | } else if (entry.getOperator().equals(FlowRuleOperation.REMOVE)) { | 272 | } else if (entry.getOperator().equals(FlowRuleOperation.REMOVE)) { |
258 | - deleteFlowRule(entry.getTarget()); | 273 | + if (getFlowEntries(flowRule.deviceId(), flowRule.id()).contains(flowRule)) { |
274 | + deleteFlowRule(flowRule); | ||
275 | + toRemove.add(flowRule); | ||
276 | + } | ||
259 | } else { | 277 | } else { |
260 | throw new UnsupportedOperationException("Unsupported operation type"); | 278 | throw new UnsupportedOperationException("Unsupported operation type"); |
261 | } | 279 | } |
262 | } | 280 | } |
263 | - return Futures.immediateFuture(new CompletedBatchOperation(true, Collections.<FlowEntry>emptySet())); | 281 | + |
282 | + if (toAdd.isEmpty() && toRemove.isEmpty()) { | ||
283 | + return Futures.immediateFuture(new CompletedBatchOperation(true, Collections.<FlowRule>emptySet())); | ||
284 | + } | ||
285 | + | ||
286 | + SettableFuture<CompletedBatchOperation> r = SettableFuture.create(); | ||
287 | + final int batchId = localBatchIdGen.incrementAndGet(); | ||
288 | + | ||
289 | + pendingFutures.put(batchId, r); | ||
290 | + notifyDelegate(FlowRuleBatchEvent.requested(new FlowRuleBatchRequest(batchId, toAdd, toRemove))); | ||
291 | + | ||
292 | + return r; | ||
264 | } | 293 | } |
265 | 294 | ||
266 | @Override | 295 | @Override |
267 | public void batchOperationComplete(FlowRuleBatchEvent event) { | 296 | public void batchOperationComplete(FlowRuleBatchEvent event) { |
297 | + final Integer batchId = event.subject().batchId(); | ||
298 | + SettableFuture<CompletedBatchOperation> future | ||
299 | + = pendingFutures.getIfPresent(batchId); | ||
300 | + if (future != null) { | ||
301 | + future.set(event.result()); | ||
302 | + pendingFutures.invalidate(batchId); | ||
303 | + } | ||
268 | notifyDelegate(event); | 304 | notifyDelegate(event); |
269 | } | 305 | } |
270 | } | 306 | } | ... | ... |
... | @@ -352,13 +352,6 @@ | ... | @@ -352,13 +352,6 @@ |
352 | </dependencies> | 352 | </dependencies> |
353 | 353 | ||
354 | <build> | 354 | <build> |
355 | - <extensions> | ||
356 | - <extension> | ||
357 | - <groupId>kr.motd.maven</groupId> | ||
358 | - <artifactId>os-maven-plugin</artifactId> | ||
359 | - <version>1.2.3.Final</version> | ||
360 | - </extension> | ||
361 | - </extensions> | ||
362 | <pluginManagement> | 355 | <pluginManagement> |
363 | <plugins> | 356 | <plugins> |
364 | <plugin> | 357 | <plugin> | ... | ... |
... | @@ -289,7 +289,10 @@ public class FlowEntryBuilder { | ... | @@ -289,7 +289,10 @@ public class FlowEntryBuilder { |
289 | case OCH_SIGID: | 289 | case OCH_SIGID: |
290 | builder.matchLambda(match.get(MatchField.OCH_SIGID).getChannelNumber()); | 290 | builder.matchLambda(match.get(MatchField.OCH_SIGID).getChannelNumber()); |
291 | break; | 291 | break; |
292 | - case OCH_SIGTYPE_BASIC: | 292 | + case OCH_SIGTYPE: |
293 | + builder.matchOpticalSignalType(match.get(MatchField | ||
294 | + .OCH_SIGTYPE).getValue()); | ||
295 | + break; | ||
293 | case ARP_OP: | 296 | case ARP_OP: |
294 | case ARP_SHA: | 297 | case ARP_SHA: |
295 | case ARP_SPA: | 298 | case ARP_SPA: | ... | ... |
... | @@ -19,6 +19,7 @@ import static org.slf4j.LoggerFactory.getLogger; | ... | @@ -19,6 +19,7 @@ import static org.slf4j.LoggerFactory.getLogger; |
19 | 19 | ||
20 | import org.onlab.onos.net.flow.FlowRule; | 20 | import org.onlab.onos.net.flow.FlowRule; |
21 | import org.onlab.onos.net.flow.TrafficSelector; | 21 | import org.onlab.onos.net.flow.TrafficSelector; |
22 | +import org.onlab.onos.net.flow.criteria.Criteria; | ||
22 | import org.onlab.onos.net.flow.criteria.Criteria.EthCriterion; | 23 | import org.onlab.onos.net.flow.criteria.Criteria.EthCriterion; |
23 | import org.onlab.onos.net.flow.criteria.Criteria.EthTypeCriterion; | 24 | import org.onlab.onos.net.flow.criteria.Criteria.EthTypeCriterion; |
24 | import org.onlab.onos.net.flow.criteria.Criteria.IPCriterion; | 25 | import org.onlab.onos.net.flow.criteria.Criteria.IPCriterion; |
... | @@ -46,6 +47,7 @@ import org.projectfloodlight.openflow.types.Masked; | ... | @@ -46,6 +47,7 @@ import org.projectfloodlight.openflow.types.Masked; |
46 | import org.projectfloodlight.openflow.types.OFPort; | 47 | import org.projectfloodlight.openflow.types.OFPort; |
47 | import org.projectfloodlight.openflow.types.OFVlanVidMatch; | 48 | import org.projectfloodlight.openflow.types.OFVlanVidMatch; |
48 | import org.projectfloodlight.openflow.types.TransportPort; | 49 | import org.projectfloodlight.openflow.types.TransportPort; |
50 | +import org.projectfloodlight.openflow.types.U8; | ||
49 | import org.projectfloodlight.openflow.types.VlanPcp; | 51 | import org.projectfloodlight.openflow.types.VlanPcp; |
50 | import org.projectfloodlight.openflow.types.VlanVid; | 52 | import org.projectfloodlight.openflow.types.VlanVid; |
51 | import org.slf4j.Logger; | 53 | import org.slf4j.Logger; |
... | @@ -197,6 +199,12 @@ public abstract class FlowModBuilder { | ... | @@ -197,6 +199,12 @@ public abstract class FlowModBuilder { |
197 | mBuilder.setExact(MatchField.OCH_SIGID, | 199 | mBuilder.setExact(MatchField.OCH_SIGID, |
198 | new CircuitSignalID((byte) 1, (byte) 2, lc.lambda(), (short) 1)); | 200 | new CircuitSignalID((byte) 1, (byte) 2, lc.lambda(), (short) 1)); |
199 | break; | 201 | break; |
202 | + case OCH_SIGTYPE: | ||
203 | + Criteria.OpticalSignalTypeCriterion sc = | ||
204 | + (Criteria.OpticalSignalTypeCriterion) c; | ||
205 | + mBuilder.setExact(MatchField.OCH_SIGTYPE, | ||
206 | + U8.of(sc.signalType())); | ||
207 | + break; | ||
200 | case ARP_OP: | 208 | case ARP_OP: |
201 | case ARP_SHA: | 209 | case ARP_SHA: |
202 | case ARP_SPA: | 210 | case ARP_SPA: | ... | ... |
... | @@ -30,7 +30,6 @@ import static com.google.common.base.Preconditions.checkState; | ... | @@ -30,7 +30,6 @@ 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 | - * TODO: Add support for IPv6 as well. | ||
34 | */ | 33 | */ |
35 | public final class IpAddress implements Comparable<IpAddress> { | 34 | public final class IpAddress implements Comparable<IpAddress> { |
36 | // IP Versions | 35 | // IP Versions | ... | ... |
... | @@ -17,8 +17,6 @@ package org.onlab.packet; | ... | @@ -17,8 +17,6 @@ package org.onlab.packet; |
17 | 17 | ||
18 | import java.util.Objects; | 18 | import java.util.Objects; |
19 | 19 | ||
20 | -// TODO: Add support for IPv6 as well. | ||
21 | - | ||
22 | /** | 20 | /** |
23 | * 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 |
24 | * a subnet mask. | 22 | * a subnet mask. |
... | @@ -40,26 +38,39 @@ public final class IpPrefix { | ... | @@ -40,26 +38,39 @@ public final class IpPrefix { |
40 | * | 38 | * |
41 | * @param address the IP address | 39 | * @param address the IP address |
42 | * @param prefixLength the prefix length | 40 | * @param prefixLength the prefix length |
41 | + * @throws IllegalArgumentException if the prefix length value is invalid | ||
43 | */ | 42 | */ |
44 | private IpPrefix(IpAddress address, int prefixLength) { | 43 | private IpPrefix(IpAddress address, int prefixLength) { |
45 | - checkPrefixLength(prefixLength); | 44 | + checkPrefixLength(address.version(), prefixLength); |
46 | this.address = IpAddress.makeMaskedAddress(address, prefixLength); | 45 | this.address = IpAddress.makeMaskedAddress(address, prefixLength); |
47 | this.prefixLength = (short) prefixLength; | 46 | this.prefixLength = (short) prefixLength; |
48 | } | 47 | } |
49 | 48 | ||
50 | /** | 49 | /** |
51 | - * Checks whether the prefix length is valid. | 50 | + * Returns the IP version of the prefix. |
52 | * | 51 | * |
53 | - * @param prefixLength the prefix length value to check | 52 | + * @return the IP version of the prefix |
54 | - * @throws IllegalArgumentException if the prefix length value is invalid | ||
55 | */ | 53 | */ |
56 | - private static void checkPrefixLength(int prefixLength) { | 54 | + public IpAddress.Version version() { |
57 | - if ((prefixLength < 0) || (prefixLength > MAX_INET_MASK_LENGTH)) { | 55 | + return address.version(); |
58 | - String msg = "Invalid prefix length " + prefixLength + ". " + | 56 | + } |
59 | - "The value must be in the interval [0, " + | 57 | + |
60 | - MAX_INET_MASK_LENGTH + "]"; | 58 | + /** |
61 | - throw new IllegalArgumentException(msg); | 59 | + * Returns the IP address value of the prefix. |
62 | - } | 60 | + * |
61 | + * @return the IP address value of the prefix | ||
62 | + */ | ||
63 | + public IpAddress address() { | ||
64 | + return address; | ||
65 | + } | ||
66 | + | ||
67 | + /** | ||
68 | + * Returns the IP address prefix length. | ||
69 | + * | ||
70 | + * @return the IP address prefix length | ||
71 | + */ | ||
72 | + public int prefixLength() { | ||
73 | + return prefixLength; | ||
63 | } | 74 | } |
64 | 75 | ||
65 | /** | 76 | /** |
... | @@ -68,6 +79,7 @@ public final class IpPrefix { | ... | @@ -68,6 +79,7 @@ public final class IpPrefix { |
68 | * @param address an integer representing the IPv4 address | 79 | * @param address an integer representing the IPv4 address |
69 | * @param prefixLength the prefix length | 80 | * @param prefixLength the prefix length |
70 | * @return an IP prefix | 81 | * @return an IP prefix |
82 | + * @throws IllegalArgumentException if the prefix length value is invalid | ||
71 | */ | 83 | */ |
72 | public static IpPrefix valueOf(int address, int prefixLength) { | 84 | public static IpPrefix valueOf(int address, int prefixLength) { |
73 | return new IpPrefix(IpAddress.valueOf(address), prefixLength); | 85 | return new IpPrefix(IpAddress.valueOf(address), prefixLength); |
... | @@ -80,11 +92,11 @@ public final class IpPrefix { | ... | @@ -80,11 +92,11 @@ public final class IpPrefix { |
80 | * @param address the IP address value stored in network byte order | 92 | * @param address the IP address value stored in network byte order |
81 | * @param prefixLength the prefix length | 93 | * @param prefixLength the prefix length |
82 | * @return an IP prefix | 94 | * @return an IP prefix |
95 | + * @throws IllegalArgumentException if the prefix length value is invalid | ||
83 | */ | 96 | */ |
84 | public static IpPrefix valueOf(IpAddress.Version version, byte[] address, | 97 | public static IpPrefix valueOf(IpAddress.Version version, byte[] address, |
85 | int prefixLength) { | 98 | int prefixLength) { |
86 | - return new IpPrefix(IpAddress.valueOf(version, address), | 99 | + return new IpPrefix(IpAddress.valueOf(version, address), prefixLength); |
87 | - prefixLength); | ||
88 | } | 100 | } |
89 | 101 | ||
90 | /** | 102 | /** |
... | @@ -93,6 +105,7 @@ public final class IpPrefix { | ... | @@ -93,6 +105,7 @@ public final class IpPrefix { |
93 | * @param address the IP address | 105 | * @param address the IP address |
94 | * @param prefixLength the prefix length | 106 | * @param prefixLength the prefix length |
95 | * @return an IP prefix | 107 | * @return an IP prefix |
108 | + * @throws IllegalArgumentException if the prefix length value is invalid | ||
96 | */ | 109 | */ |
97 | public static IpPrefix valueOf(IpAddress address, int prefixLength) { | 110 | public static IpPrefix valueOf(IpAddress address, int prefixLength) { |
98 | return new IpPrefix(address, prefixLength); | 111 | return new IpPrefix(address, prefixLength); |
... | @@ -104,6 +117,7 @@ public final class IpPrefix { | ... | @@ -104,6 +117,7 @@ public final class IpPrefix { |
104 | * | 117 | * |
105 | * @param address an IP prefix in string form, e.g. "10.1.0.0/16" | 118 | * @param address an IP prefix in string form, e.g. "10.1.0.0/16" |
106 | * @return an IP prefix | 119 | * @return an IP prefix |
120 | + * @throws IllegalArgumentException if the arguments are invalid | ||
107 | */ | 121 | */ |
108 | public static IpPrefix valueOf(String address) { | 122 | public static IpPrefix valueOf(String address) { |
109 | final String[] parts = address.split("/"); | 123 | final String[] parts = address.split("/"); |
... | @@ -119,33 +133,6 @@ public final class IpPrefix { | ... | @@ -119,33 +133,6 @@ public final class IpPrefix { |
119 | } | 133 | } |
120 | 134 | ||
121 | /** | 135 | /** |
122 | - * Returns the IP version of the prefix. | ||
123 | - * | ||
124 | - * @return the IP version of the prefix | ||
125 | - */ | ||
126 | - public IpAddress.Version version() { | ||
127 | - return address.version(); | ||
128 | - } | ||
129 | - | ||
130 | - /** | ||
131 | - * Returns the IP address value of the prefix. | ||
132 | - * | ||
133 | - * @return the IP address value of the prefix | ||
134 | - */ | ||
135 | - public IpAddress address() { | ||
136 | - return address; | ||
137 | - } | ||
138 | - | ||
139 | - /** | ||
140 | - * Returns the IP address prefix length. | ||
141 | - * | ||
142 | - * @return the IP address prefix length | ||
143 | - */ | ||
144 | - public int prefixLength() { | ||
145 | - return prefixLength; | ||
146 | - } | ||
147 | - | ||
148 | - /** | ||
149 | * Determines whether a given IP prefix is contained within this prefix. | 136 | * Determines whether a given IP prefix is contained within this prefix. |
150 | * | 137 | * |
151 | * @param other the IP prefix to test | 138 | * @param other the IP prefix to test |
... | @@ -217,4 +204,35 @@ public final class IpPrefix { | ... | @@ -217,4 +204,35 @@ public final class IpPrefix { |
217 | builder.append(String.format("%d", prefixLength)); | 204 | builder.append(String.format("%d", prefixLength)); |
218 | return builder.toString(); | 205 | return builder.toString(); |
219 | } | 206 | } |
207 | + | ||
208 | + /** | ||
209 | + * Checks whether the prefix length is valid. | ||
210 | + * | ||
211 | + * @param version the IP address version | ||
212 | + * @param prefixLength the prefix length value to check | ||
213 | + * @throws IllegalArgumentException if the prefix length value is invalid | ||
214 | + */ | ||
215 | + private static void checkPrefixLength(IpAddress.Version version, | ||
216 | + int prefixLength) { | ||
217 | + int maxPrefixLen = 0; | ||
218 | + | ||
219 | + switch (version) { | ||
220 | + case INET: | ||
221 | + maxPrefixLen = MAX_INET_MASK_LENGTH; | ||
222 | + break; | ||
223 | + case INET6: | ||
224 | + maxPrefixLen = MAX_INET6_MASK_LENGTH; | ||
225 | + break; | ||
226 | + default: | ||
227 | + String msg = "Invalid IP version " + version; | ||
228 | + throw new IllegalArgumentException(msg); | ||
229 | + } | ||
230 | + | ||
231 | + if ((prefixLength < 0) || (prefixLength > maxPrefixLen)) { | ||
232 | + String msg = "Invalid prefix length " + prefixLength + ". " + | ||
233 | + "The value must be in the interval [0, " + | ||
234 | + maxPrefixLen + "]"; | ||
235 | + throw new IllegalArgumentException(msg); | ||
236 | + } | ||
237 | + } | ||
220 | } | 238 | } | ... | ... |
... | @@ -135,7 +135,7 @@ public class IpAddressTest { | ... | @@ -135,7 +135,7 @@ public class IpAddressTest { |
135 | * Tests returning an IPv4 address asn an integer. | 135 | * Tests returning an IPv4 address asn an integer. |
136 | */ | 136 | */ |
137 | @Test | 137 | @Test |
138 | - public void testToint() { | 138 | + public void testToInt() { |
139 | IpAddress ipAddress; | 139 | IpAddress ipAddress; |
140 | 140 | ||
141 | ipAddress = IpAddress.valueOf("1.2.3.4"); | 141 | ipAddress = IpAddress.valueOf("1.2.3.4"); |
... | @@ -149,10 +149,10 @@ public class IpAddressTest { | ... | @@ -149,10 +149,10 @@ public class IpAddressTest { |
149 | } | 149 | } |
150 | 150 | ||
151 | /** | 151 | /** |
152 | - * Tests valueOf() converter for an integer value. | 152 | + * Tests valueOf() converter for IPv4 integer value. |
153 | */ | 153 | */ |
154 | @Test | 154 | @Test |
155 | - public void testValueOfForInteger() { | 155 | + public void testValueOfForIntegerIPv4() { |
156 | IpAddress ipAddress; | 156 | IpAddress ipAddress; |
157 | 157 | ||
158 | ipAddress = IpAddress.valueOf(0x01020304); | 158 | ipAddress = IpAddress.valueOf(0x01020304); | ... | ... |
... | @@ -15,123 +15,970 @@ | ... | @@ -15,123 +15,970 @@ |
15 | */ | 15 | */ |
16 | package org.onlab.packet; | 16 | package org.onlab.packet; |
17 | 17 | ||
18 | -import static org.junit.Assert.assertEquals; | 18 | +import com.google.common.testing.EqualsTester; |
19 | +import org.junit.Test; | ||
20 | + | ||
21 | +import static org.hamcrest.Matchers.equalTo; | ||
22 | +import static org.hamcrest.Matchers.is; | ||
23 | +import static org.junit.Assert.assertThat; | ||
19 | import static org.junit.Assert.assertFalse; | 24 | import static org.junit.Assert.assertFalse; |
20 | import static org.junit.Assert.assertTrue; | 25 | import static org.junit.Assert.assertTrue; |
26 | +import static org.onlab.junit.ImmutableClassChecker.assertThatClassIsImmutable; | ||
21 | 27 | ||
22 | -import java.util.Arrays; | 28 | +/** |
29 | + * Tests for class {@link IpPrefix}. | ||
30 | + */ | ||
31 | +public class IpPrefixTest { | ||
32 | + /** | ||
33 | + * Tests the immutability of {@link IpPrefix}. | ||
34 | + */ | ||
35 | + @Test | ||
36 | + public void testImmutable() { | ||
37 | + assertThatClassIsImmutable(IpPrefix.class); | ||
38 | + } | ||
23 | 39 | ||
24 | -import org.junit.Test; | 40 | + /** |
25 | -import org.onlab.packet.IpAddress.Version; | 41 | + * Tests the maximum mask length. |
42 | + */ | ||
43 | + @Test | ||
44 | + public void testMaxMaskLength() { | ||
45 | + assertThat(IpPrefix.MAX_INET_MASK_LENGTH, is(32)); | ||
46 | + assertThat(IpPrefix.MAX_INET6_MASK_LENGTH, is(128)); | ||
47 | + } | ||
26 | 48 | ||
27 | -import com.google.common.testing.EqualsTester; | 49 | + /** |
50 | + * Tests returning the IP version of the prefix. | ||
51 | + */ | ||
52 | + @Test | ||
53 | + public void testVersion() { | ||
54 | + IpPrefix ipPrefix; | ||
28 | 55 | ||
29 | -public class IpPrefixTest { | 56 | + // IPv4 |
57 | + ipPrefix = IpPrefix.valueOf("0.0.0.0/0"); | ||
58 | + assertThat(ipPrefix.version(), is(IpAddress.Version.INET)); | ||
59 | + | ||
60 | + // IPv6 | ||
61 | + ipPrefix = IpPrefix.valueOf("::/0"); | ||
62 | + assertThat(ipPrefix.version(), is(IpAddress.Version.INET6)); | ||
63 | + } | ||
64 | + | ||
65 | + /** | ||
66 | + * Tests returning the IP address value and IP address prefix length of | ||
67 | + * an IPv4 prefix. | ||
68 | + */ | ||
69 | + @Test | ||
70 | + public void testAddressAndPrefixLengthIPv4() { | ||
71 | + IpPrefix ipPrefix; | ||
72 | + | ||
73 | + ipPrefix = IpPrefix.valueOf("1.2.3.0/24"); | ||
74 | + assertThat(ipPrefix.address(), equalTo(IpAddress.valueOf("1.2.3.0"))); | ||
75 | + assertThat(ipPrefix.prefixLength(), is(24)); | ||
76 | + | ||
77 | + ipPrefix = IpPrefix.valueOf("1.2.3.4/24"); | ||
78 | + assertThat(ipPrefix.address(), equalTo(IpAddress.valueOf("1.2.3.0"))); | ||
79 | + assertThat(ipPrefix.prefixLength(), is(24)); | ||
80 | + | ||
81 | + ipPrefix = IpPrefix.valueOf("1.2.3.4/32"); | ||
82 | + assertThat(ipPrefix.address(), equalTo(IpAddress.valueOf("1.2.3.4"))); | ||
83 | + assertThat(ipPrefix.prefixLength(), is(32)); | ||
84 | + | ||
85 | + ipPrefix = IpPrefix.valueOf("1.2.3.5/32"); | ||
86 | + assertThat(ipPrefix.address(), equalTo(IpAddress.valueOf("1.2.3.5"))); | ||
87 | + assertThat(ipPrefix.prefixLength(), is(32)); | ||
88 | + | ||
89 | + ipPrefix = IpPrefix.valueOf("0.0.0.0/0"); | ||
90 | + assertThat(ipPrefix.address(), equalTo(IpAddress.valueOf("0.0.0.0"))); | ||
91 | + assertThat(ipPrefix.prefixLength(), is(0)); | ||
92 | + | ||
93 | + ipPrefix = IpPrefix.valueOf("255.255.255.255/32"); | ||
94 | + assertThat(ipPrefix.address(), | ||
95 | + equalTo(IpAddress.valueOf("255.255.255.255"))); | ||
96 | + assertThat(ipPrefix.prefixLength(), is(32)); | ||
97 | + } | ||
98 | + | ||
99 | + /** | ||
100 | + * Tests returning the IP address value and IP address prefix length of | ||
101 | + * an IPv6 prefix. | ||
102 | + */ | ||
103 | + @Test | ||
104 | + public void testAddressAndPrefixLengthIPv6() { | ||
105 | + IpPrefix ipPrefix; | ||
106 | + | ||
107 | + ipPrefix = IpPrefix.valueOf("1100::/8"); | ||
108 | + assertThat(ipPrefix.address(), equalTo(IpAddress.valueOf("1100::"))); | ||
109 | + assertThat(ipPrefix.prefixLength(), is(8)); | ||
110 | + | ||
111 | + ipPrefix = | ||
112 | + IpPrefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8885/8"); | ||
113 | + assertThat(ipPrefix.address(), equalTo(IpAddress.valueOf("1100::"))); | ||
114 | + assertThat(ipPrefix.prefixLength(), is(8)); | ||
115 | + | ||
116 | + ipPrefix = | ||
117 | + IpPrefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8800/120"); | ||
118 | + assertThat(ipPrefix.address(), | ||
119 | + equalTo(IpAddress.valueOf("1111:2222:3333:4444:5555:6666:7777:8800"))); | ||
120 | + assertThat(ipPrefix.prefixLength(), is(120)); | ||
121 | + | ||
122 | + ipPrefix = | ||
123 | + IpPrefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8885/128"); | ||
124 | + assertThat(ipPrefix.address(), | ||
125 | + equalTo(IpAddress.valueOf("1111:2222:3333:4444:5555:6666:7777:8885"))); | ||
126 | + assertThat(ipPrefix.prefixLength(), is(128)); | ||
127 | + | ||
128 | + ipPrefix = IpPrefix.valueOf("::/0"); | ||
129 | + assertThat(ipPrefix.address(), equalTo(IpAddress.valueOf("::"))); | ||
130 | + assertThat(ipPrefix.prefixLength(), is(0)); | ||
131 | + | ||
132 | + ipPrefix = | ||
133 | + IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"); | ||
134 | + assertThat(ipPrefix.address(), | ||
135 | + equalTo(IpAddress.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"))); | ||
136 | + assertThat(ipPrefix.prefixLength(), is(128)); | ||
137 | + | ||
138 | + ipPrefix = | ||
139 | + IpPrefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8885/64"); | ||
140 | + assertThat(ipPrefix.address(), | ||
141 | + equalTo(IpAddress.valueOf("1111:2222:3333:4444::"))); | ||
142 | + assertThat(ipPrefix.prefixLength(), is(64)); | ||
143 | + } | ||
144 | + | ||
145 | + /** | ||
146 | + * Tests valueOf() converter for IPv4 integer value. | ||
147 | + */ | ||
148 | + @Test | ||
149 | + public void testValueOfForIntegerIPv4() { | ||
150 | + IpPrefix ipPrefix; | ||
151 | + | ||
152 | + ipPrefix = IpPrefix.valueOf(0x01020304, 24); | ||
153 | + assertThat(ipPrefix.toString(), is("1.2.3.0/24")); | ||
154 | + | ||
155 | + ipPrefix = IpPrefix.valueOf(0x01020304, 32); | ||
156 | + assertThat(ipPrefix.toString(), is("1.2.3.4/32")); | ||
157 | + | ||
158 | + ipPrefix = IpPrefix.valueOf(0x01020305, 32); | ||
159 | + assertThat(ipPrefix.toString(), is("1.2.3.5/32")); | ||
160 | + | ||
161 | + ipPrefix = IpPrefix.valueOf(0, 0); | ||
162 | + assertThat(ipPrefix.toString(), is("0.0.0.0/0")); | ||
163 | + | ||
164 | + ipPrefix = IpPrefix.valueOf(0, 32); | ||
165 | + assertThat(ipPrefix.toString(), is("0.0.0.0/32")); | ||
166 | + | ||
167 | + ipPrefix = IpPrefix.valueOf(0xffffffff, 0); | ||
168 | + assertThat(ipPrefix.toString(), is("0.0.0.0/0")); | ||
169 | + | ||
170 | + ipPrefix = IpPrefix.valueOf(0xffffffff, 16); | ||
171 | + assertThat(ipPrefix.toString(), is("255.255.0.0/16")); | ||
172 | + | ||
173 | + ipPrefix = IpPrefix.valueOf(0xffffffff, 32); | ||
174 | + assertThat(ipPrefix.toString(), is("255.255.255.255/32")); | ||
175 | + } | ||
176 | + | ||
177 | + /** | ||
178 | + * Tests invalid valueOf() converter for IPv4 integer value and | ||
179 | + * negative prefix length. | ||
180 | + */ | ||
181 | + @Test(expected = IllegalArgumentException.class) | ||
182 | + public void testInvalidValueOfIntegerNegativePrefixLengthIPv4() { | ||
183 | + IpPrefix ipPrefix; | ||
184 | + | ||
185 | + ipPrefix = IpPrefix.valueOf(0x01020304, -1); | ||
186 | + } | ||
187 | + | ||
188 | + /** | ||
189 | + * Tests invalid valueOf() converter for IPv4 integer value and | ||
190 | + * too long prefix length. | ||
191 | + */ | ||
192 | + @Test(expected = IllegalArgumentException.class) | ||
193 | + public void testInvalidValueOfIntegerTooLongPrefixLengthIPv4() { | ||
194 | + IpPrefix ipPrefix; | ||
195 | + | ||
196 | + ipPrefix = IpPrefix.valueOf(0x01020304, 33); | ||
197 | + } | ||
198 | + | ||
199 | + /** | ||
200 | + * Tests valueOf() converter for IPv4 byte array. | ||
201 | + */ | ||
202 | + @Test | ||
203 | + public void testValueOfByteArrayIPv4() { | ||
204 | + IpPrefix ipPrefix; | ||
205 | + byte[] value; | ||
206 | + | ||
207 | + value = new byte[] {1, 2, 3, 4}; | ||
208 | + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET, value, 24); | ||
209 | + assertThat(ipPrefix.toString(), is("1.2.3.0/24")); | ||
210 | + | ||
211 | + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET, value, 32); | ||
212 | + assertThat(ipPrefix.toString(), is("1.2.3.4/32")); | ||
213 | + | ||
214 | + value = new byte[] {1, 2, 3, 5}; | ||
215 | + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET, value, 32); | ||
216 | + assertThat(ipPrefix.toString(), is("1.2.3.5/32")); | ||
217 | + | ||
218 | + value = new byte[] {0, 0, 0, 0}; | ||
219 | + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET, value, 0); | ||
220 | + assertThat(ipPrefix.toString(), is("0.0.0.0/0")); | ||
221 | + | ||
222 | + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET, value, 32); | ||
223 | + assertThat(ipPrefix.toString(), is("0.0.0.0/32")); | ||
224 | + | ||
225 | + value = new byte[] {(byte) 0xff, (byte) 0xff, | ||
226 | + (byte) 0xff, (byte) 0xff}; | ||
227 | + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET, value, 0); | ||
228 | + assertThat(ipPrefix.toString(), is("0.0.0.0/0")); | ||
229 | + | ||
230 | + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET, value, 16); | ||
231 | + assertThat(ipPrefix.toString(), is("255.255.0.0/16")); | ||
232 | + | ||
233 | + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET, value, 32); | ||
234 | + assertThat(ipPrefix.toString(), is("255.255.255.255/32")); | ||
235 | + } | ||
236 | + | ||
237 | + /** | ||
238 | + * Tests valueOf() converter for IPv6 byte array. | ||
239 | + */ | ||
240 | + @Test | ||
241 | + public void testValueOfByteArrayIPv6() { | ||
242 | + IpPrefix ipPrefix; | ||
243 | + byte[] value; | ||
244 | + | ||
245 | + value = new byte[] {0x11, 0x11, 0x22, 0x22, | ||
246 | + 0x33, 0x33, 0x44, 0x44, | ||
247 | + 0x55, 0x55, 0x66, 0x66, | ||
248 | + 0x77, 0x77, (byte) 0x88, (byte) 0x88}; | ||
249 | + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET6, value, 120); | ||
250 | + assertThat(ipPrefix.toString(), | ||
251 | + is("1111:2222:3333:4444:5555:6666:7777:8800/120")); | ||
252 | + | ||
253 | + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET6, value, 128); | ||
254 | + assertThat(ipPrefix.toString(), | ||
255 | + is("1111:2222:3333:4444:5555:6666:7777:8888/128")); | ||
256 | + | ||
257 | + value = new byte[] {0x00, 0x00, 0x00, 0x00, | ||
258 | + 0x00, 0x00, 0x00, 0x00, | ||
259 | + 0x00, 0x00, 0x00, 0x00, | ||
260 | + 0x00, 0x00, 0x00, 0x00}; | ||
261 | + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET6, value, 0); | ||
262 | + assertThat(ipPrefix.toString(), is("::/0")); | ||
263 | + | ||
264 | + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET6, value, 128); | ||
265 | + assertThat(ipPrefix.toString(), is("::/128")); | ||
266 | + | ||
267 | + value = new byte[] {(byte) 0xff, (byte) 0xff, | ||
268 | + (byte) 0xff, (byte) 0xff, | ||
269 | + (byte) 0xff, (byte) 0xff, | ||
270 | + (byte) 0xff, (byte) 0xff, | ||
271 | + (byte) 0xff, (byte) 0xff, | ||
272 | + (byte) 0xff, (byte) 0xff, | ||
273 | + (byte) 0xff, (byte) 0xff, | ||
274 | + (byte) 0xff, (byte) 0xff}; | ||
275 | + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET6, value, 0); | ||
276 | + assertThat(ipPrefix.toString(), is("::/0")); | ||
277 | + | ||
278 | + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET6, value, 64); | ||
279 | + assertThat(ipPrefix.toString(), is("ffff:ffff:ffff:ffff::/64")); | ||
280 | + | ||
281 | + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET6, value, 128); | ||
282 | + assertThat(ipPrefix.toString(), | ||
283 | + is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128")); | ||
284 | + } | ||
285 | + | ||
286 | + /** | ||
287 | + * Tests invalid valueOf() converter for a null array for IPv4. | ||
288 | + */ | ||
289 | + @Test(expected = NullPointerException.class) | ||
290 | + public void testInvalidValueOfNullArrayIPv4() { | ||
291 | + IpPrefix ipPrefix; | ||
292 | + byte[] value; | ||
293 | + | ||
294 | + value = null; | ||
295 | + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET, value, 24); | ||
296 | + } | ||
297 | + | ||
298 | + /** | ||
299 | + * Tests invalid valueOf() converter for a null array for IPv6. | ||
300 | + */ | ||
301 | + @Test(expected = NullPointerException.class) | ||
302 | + public void testInvalidValueOfNullArrayIPv6() { | ||
303 | + IpPrefix ipPrefix; | ||
304 | + byte[] value; | ||
305 | + | ||
306 | + value = null; | ||
307 | + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET6, value, 120); | ||
308 | + } | ||
309 | + | ||
310 | + /** | ||
311 | + * Tests invalid valueOf() converter for a short array for IPv4. | ||
312 | + */ | ||
313 | + @Test(expected = IllegalArgumentException.class) | ||
314 | + public void testInvalidValueOfShortArrayIPv4() { | ||
315 | + IpPrefix ipPrefix; | ||
316 | + byte[] value; | ||
317 | + | ||
318 | + value = new byte[] {1, 2, 3}; | ||
319 | + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET, value, 24); | ||
320 | + } | ||
321 | + | ||
322 | + /** | ||
323 | + * Tests invalid valueOf() converter for a short array for IPv6. | ||
324 | + */ | ||
325 | + @Test(expected = IllegalArgumentException.class) | ||
326 | + public void testInvalidValueOfShortArrayIPv6() { | ||
327 | + IpPrefix ipPrefix; | ||
328 | + byte[] value; | ||
329 | + | ||
330 | + value = new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9}; | ||
331 | + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET6, value, 120); | ||
332 | + } | ||
333 | + | ||
334 | + /** | ||
335 | + * Tests invalid valueOf() converter for IPv4 byte array and | ||
336 | + * negative prefix length. | ||
337 | + */ | ||
338 | + @Test(expected = IllegalArgumentException.class) | ||
339 | + public void testInvalidValueOfByteArrayNegativePrefixLengthIPv4() { | ||
340 | + IpPrefix ipPrefix; | ||
341 | + byte[] value; | ||
342 | + | ||
343 | + value = new byte[] {1, 2, 3, 4}; | ||
344 | + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET, value, -1); | ||
345 | + } | ||
346 | + | ||
347 | + /** | ||
348 | + * Tests invalid valueOf() converter for IPv6 byte array and | ||
349 | + * negative prefix length. | ||
350 | + */ | ||
351 | + @Test(expected = IllegalArgumentException.class) | ||
352 | + public void testInvalidValueOfByteArrayNegativePrefixLengthIPv6() { | ||
353 | + IpPrefix ipPrefix; | ||
354 | + byte[] value; | ||
355 | + | ||
356 | + value = new byte[] {0x11, 0x11, 0x22, 0x22, | ||
357 | + 0x33, 0x33, 0x44, 0x44, | ||
358 | + 0x55, 0x55, 0x66, 0x66, | ||
359 | + 0x77, 0x77, (byte) 0x88, (byte) 0x88}; | ||
360 | + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET6, value, -1); | ||
361 | + } | ||
362 | + | ||
363 | + /** | ||
364 | + * Tests invalid valueOf() converter for IPv4 byte array and | ||
365 | + * too long prefix length. | ||
366 | + */ | ||
367 | + @Test(expected = IllegalArgumentException.class) | ||
368 | + public void testInvalidValueOfByteArrayTooLongPrefixLengthIPv4() { | ||
369 | + IpPrefix ipPrefix; | ||
370 | + byte[] value; | ||
371 | + | ||
372 | + value = new byte[] {1, 2, 3, 4}; | ||
373 | + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET, value, 33); | ||
374 | + } | ||
375 | + | ||
376 | + /** | ||
377 | + * Tests invalid valueOf() converter for IPv6 byte array and | ||
378 | + * too long prefix length. | ||
379 | + */ | ||
380 | + @Test(expected = IllegalArgumentException.class) | ||
381 | + public void testInvalidValueOfByteArrayTooLongPrefixLengthIPv6() { | ||
382 | + IpPrefix ipPrefix; | ||
383 | + byte[] value; | ||
384 | + | ||
385 | + value = new byte[] {0x11, 0x11, 0x22, 0x22, | ||
386 | + 0x33, 0x33, 0x44, 0x44, | ||
387 | + 0x55, 0x55, 0x66, 0x66, | ||
388 | + 0x77, 0x77, (byte) 0x88, (byte) 0x88}; | ||
389 | + ipPrefix = IpPrefix.valueOf(IpAddress.Version.INET6, value, 129); | ||
390 | + } | ||
391 | + | ||
392 | + /** | ||
393 | + * Tests valueOf() converter for IPv4 address. | ||
394 | + */ | ||
395 | + @Test | ||
396 | + public void testValueOfAddressIPv4() { | ||
397 | + IpAddress ipAddress; | ||
398 | + IpPrefix ipPrefix; | ||
399 | + | ||
400 | + ipAddress = IpAddress.valueOf("1.2.3.4"); | ||
401 | + ipPrefix = IpPrefix.valueOf(ipAddress, 24); | ||
402 | + assertThat(ipPrefix.toString(), is("1.2.3.0/24")); | ||
403 | + | ||
404 | + ipPrefix = IpPrefix.valueOf(ipAddress, 32); | ||
405 | + assertThat(ipPrefix.toString(), is("1.2.3.4/32")); | ||
406 | + | ||
407 | + ipAddress = IpAddress.valueOf("1.2.3.5"); | ||
408 | + ipPrefix = IpPrefix.valueOf(ipAddress, 32); | ||
409 | + assertThat(ipPrefix.toString(), is("1.2.3.5/32")); | ||
410 | + | ||
411 | + ipAddress = IpAddress.valueOf("0.0.0.0"); | ||
412 | + ipPrefix = IpPrefix.valueOf(ipAddress, 0); | ||
413 | + assertThat(ipPrefix.toString(), is("0.0.0.0/0")); | ||
414 | + | ||
415 | + ipPrefix = IpPrefix.valueOf(ipAddress, 32); | ||
416 | + assertThat(ipPrefix.toString(), is("0.0.0.0/32")); | ||
417 | + | ||
418 | + ipAddress = IpAddress.valueOf("255.255.255.255"); | ||
419 | + ipPrefix = IpPrefix.valueOf(ipAddress, 0); | ||
420 | + assertThat(ipPrefix.toString(), is("0.0.0.0/0")); | ||
30 | 421 | ||
31 | - private static final byte [] BYTES1 = new byte [] {0xa, 0x0, 0x0, 0xa}; | 422 | + ipPrefix = IpPrefix.valueOf(ipAddress, 16); |
32 | - private static final byte [] BYTES2 = new byte [] {0xa, 0x0, 0x0, 0xb}; | 423 | + assertThat(ipPrefix.toString(), is("255.255.0.0/16")); |
33 | - private static final int INTVAL0 = 0x0a000000; | ||
34 | - private static final int INTVAL1 = 0x0a00000a; | ||
35 | - private static final int INTVAL2 = 0x0a00000b; | ||
36 | - private static final String STRVAL = "10.0.0.12/16"; | ||
37 | - private static final int MASK_LENGTH = 16; | ||
38 | 424 | ||
425 | + ipPrefix = IpPrefix.valueOf(ipAddress, 32); | ||
426 | + assertThat(ipPrefix.toString(), is("255.255.255.255/32")); | ||
427 | + } | ||
428 | + | ||
429 | + /** | ||
430 | + * Tests valueOf() converter for IPv6 address. | ||
431 | + */ | ||
39 | @Test | 432 | @Test |
40 | - public void testEquality() { | 433 | + public void testValueOfAddressIPv6() { |
41 | - IpPrefix ip1 = IpPrefix.valueOf(IpAddress.Version.INET, | 434 | + IpAddress ipAddress; |
42 | - BYTES1, IpPrefix.MAX_INET_MASK_LENGTH); | 435 | + IpPrefix ipPrefix; |
43 | - IpPrefix ip2 = IpPrefix.valueOf(INTVAL1, IpPrefix.MAX_INET_MASK_LENGTH); | 436 | + |
44 | - IpPrefix ip3 = IpPrefix.valueOf(IpAddress.Version.INET, | 437 | + ipAddress = |
45 | - BYTES2, IpPrefix.MAX_INET_MASK_LENGTH); | 438 | + IpAddress.valueOf("1111:2222:3333:4444:5555:6666:7777:8888"); |
46 | - IpPrefix ip4 = IpPrefix.valueOf(INTVAL2, IpPrefix.MAX_INET_MASK_LENGTH); | 439 | + ipPrefix = IpPrefix.valueOf(ipAddress, 120); |
47 | - IpPrefix ip5 = IpPrefix.valueOf(STRVAL); | 440 | + assertThat(ipPrefix.toString(), |
441 | + is("1111:2222:3333:4444:5555:6666:7777:8800/120")); | ||
442 | + | ||
443 | + ipPrefix = IpPrefix.valueOf(ipAddress, 128); | ||
444 | + assertThat(ipPrefix.toString(), | ||
445 | + is("1111:2222:3333:4444:5555:6666:7777:8888/128")); | ||
446 | + | ||
447 | + ipAddress = IpAddress.valueOf("::"); | ||
448 | + ipPrefix = IpPrefix.valueOf(ipAddress, 0); | ||
449 | + assertThat(ipPrefix.toString(), is("::/0")); | ||
450 | + | ||
451 | + ipPrefix = IpPrefix.valueOf(ipAddress, 128); | ||
452 | + assertThat(ipPrefix.toString(), is("::/128")); | ||
48 | 453 | ||
49 | - new EqualsTester().addEqualityGroup(ip1, ip2) | 454 | + ipAddress = |
50 | - .addEqualityGroup(ip3, ip4) | 455 | + IpAddress.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"); |
51 | - .addEqualityGroup(ip5) | 456 | + ipPrefix = IpPrefix.valueOf(ipAddress, 0); |
52 | - .testEquals(); | 457 | + assertThat(ipPrefix.toString(), is("::/0")); |
53 | 458 | ||
54 | - // string conversions | 459 | + ipPrefix = IpPrefix.valueOf(ipAddress, 64); |
55 | - IpPrefix ip6 = IpPrefix.valueOf(IpAddress.Version.INET, | 460 | + assertThat(ipPrefix.toString(), is("ffff:ffff:ffff:ffff::/64")); |
56 | - BYTES1, MASK_LENGTH); | 461 | + |
57 | - IpPrefix ip7 = IpPrefix.valueOf("10.0.0.10/16"); | 462 | + ipPrefix = IpPrefix.valueOf(ipAddress, 128); |
58 | - IpPrefix ip8 = IpPrefix.valueOf(IpAddress.Version.INET, | 463 | + assertThat(ipPrefix.toString(), |
59 | - new byte [] {0xa, 0x0, 0x0, 0xc}, 16); | 464 | + is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128")); |
60 | - assertEquals("incorrect address conversion", ip6, ip7); | 465 | + } |
61 | - assertEquals("incorrect address conversion", ip5, ip8); | 466 | + |
467 | + /** | ||
468 | + * Tests invalid valueOf() converter for a null IP address. | ||
469 | + */ | ||
470 | + @Test(expected = NullPointerException.class) | ||
471 | + public void testInvalidValueOfNullAddress() { | ||
472 | + IpAddress ipAddress; | ||
473 | + IpPrefix ipPrefix; | ||
474 | + | ||
475 | + ipAddress = null; | ||
476 | + ipPrefix = IpPrefix.valueOf(ipAddress, 24); | ||
477 | + } | ||
478 | + | ||
479 | + /** | ||
480 | + * Tests invalid valueOf() converter for IPv4 address and | ||
481 | + * negative prefix length. | ||
482 | + */ | ||
483 | + @Test(expected = IllegalArgumentException.class) | ||
484 | + public void testInvalidValueOfAddressNegativePrefixLengthIPv4() { | ||
485 | + IpAddress ipAddress; | ||
486 | + IpPrefix ipPrefix; | ||
487 | + | ||
488 | + ipAddress = IpAddress.valueOf("1.2.3.4"); | ||
489 | + ipPrefix = IpPrefix.valueOf(ipAddress, -1); | ||
490 | + } | ||
491 | + | ||
492 | + /** | ||
493 | + * Tests invalid valueOf() converter for IPv6 address and | ||
494 | + * negative prefix length. | ||
495 | + */ | ||
496 | + @Test(expected = IllegalArgumentException.class) | ||
497 | + public void testInvalidValueOfAddressNegativePrefixLengthIPv6() { | ||
498 | + IpAddress ipAddress; | ||
499 | + IpPrefix ipPrefix; | ||
500 | + | ||
501 | + ipAddress = | ||
502 | + IpAddress.valueOf("1111:2222:3333:4444:5555:6666:7777:8888"); | ||
503 | + ipPrefix = IpPrefix.valueOf(ipAddress, -1); | ||
62 | } | 504 | } |
63 | 505 | ||
506 | + /** | ||
507 | + * Tests invalid valueOf() converter for IPv4 address and | ||
508 | + * too long prefix length. | ||
509 | + */ | ||
510 | + @Test(expected = IllegalArgumentException.class) | ||
511 | + public void testInvalidValueOfAddressTooLongPrefixLengthIPv4() { | ||
512 | + IpAddress ipAddress; | ||
513 | + IpPrefix ipPrefix; | ||
514 | + | ||
515 | + ipAddress = IpAddress.valueOf("1.2.3.4"); | ||
516 | + ipPrefix = IpPrefix.valueOf(ipAddress, 33); | ||
517 | + } | ||
518 | + | ||
519 | + /** | ||
520 | + * Tests invalid valueOf() converter for IPv6 address and | ||
521 | + * too long prefix length. | ||
522 | + */ | ||
523 | + @Test(expected = IllegalArgumentException.class) | ||
524 | + public void testInvalidValueOfAddressTooLongPrefixLengthIPv6() { | ||
525 | + IpAddress ipAddress; | ||
526 | + IpPrefix ipPrefix; | ||
527 | + | ||
528 | + ipAddress = | ||
529 | + IpAddress.valueOf("1111:2222:3333:4444:5555:6666:7777:8888"); | ||
530 | + ipPrefix = IpPrefix.valueOf(ipAddress, 129); | ||
531 | + } | ||
532 | + | ||
533 | + /** | ||
534 | + * Tests valueOf() converter for IPv4 string. | ||
535 | + */ | ||
64 | @Test | 536 | @Test |
65 | - public void basics() { | 537 | + public void testValueOfStringIPv4() { |
66 | - IpPrefix ip1 = IpPrefix.valueOf(IpAddress.Version.INET, | 538 | + IpPrefix ipPrefix; |
67 | - BYTES1, MASK_LENGTH); | 539 | + |
68 | - final byte [] bytes = new byte [] {0xa, 0x0, 0x0, 0x0}; | 540 | + ipPrefix = IpPrefix.valueOf("1.2.3.4/24"); |
541 | + assertThat(ipPrefix.toString(), is("1.2.3.0/24")); | ||
542 | + | ||
543 | + ipPrefix = IpPrefix.valueOf("1.2.3.4/32"); | ||
544 | + assertThat(ipPrefix.toString(), is("1.2.3.4/32")); | ||
69 | 545 | ||
70 | - // check fields | 546 | + ipPrefix = IpPrefix.valueOf("1.2.3.5/32"); |
71 | - assertEquals("incorrect IP Version", Version.INET, ip1.version()); | 547 | + assertThat(ipPrefix.toString(), is("1.2.3.5/32")); |
72 | - assertEquals("incorrect netmask", 16, ip1.prefixLength()); | 548 | + |
73 | - assertTrue("faulty toOctets()", | 549 | + ipPrefix = IpPrefix.valueOf("0.0.0.0/0"); |
74 | - Arrays.equals(bytes, ip1.address().toOctets())); | 550 | + assertThat(ipPrefix.toString(), is("0.0.0.0/0")); |
75 | - assertEquals("faulty toInt()", INTVAL0, ip1.address().toInt()); | 551 | + |
76 | - assertEquals("faulty toString()", "10.0.0.0/16", ip1.toString()); | 552 | + ipPrefix = IpPrefix.valueOf("0.0.0.0/32"); |
553 | + assertThat(ipPrefix.toString(), is("0.0.0.0/32")); | ||
554 | + | ||
555 | + ipPrefix = IpPrefix.valueOf("255.255.255.255/0"); | ||
556 | + assertThat(ipPrefix.toString(), is("0.0.0.0/0")); | ||
557 | + | ||
558 | + ipPrefix = IpPrefix.valueOf("255.255.255.255/16"); | ||
559 | + assertThat(ipPrefix.toString(), is("255.255.0.0/16")); | ||
560 | + | ||
561 | + ipPrefix = IpPrefix.valueOf("255.255.255.255/32"); | ||
562 | + assertThat(ipPrefix.toString(), is("255.255.255.255/32")); | ||
77 | } | 563 | } |
78 | 564 | ||
565 | + /** | ||
566 | + * Tests valueOf() converter for IPv6 string. | ||
567 | + */ | ||
79 | @Test | 568 | @Test |
80 | - public void netmasks() { | 569 | + public void testValueOfStringIPv6() { |
81 | - // masked | 570 | + IpPrefix ipPrefix; |
82 | - IpPrefix ip1 = IpPrefix.valueOf(IpAddress.Version.INET, | 571 | + |
83 | - BYTES1, MASK_LENGTH); | 572 | + ipPrefix = |
84 | - IpPrefix ip2 = IpPrefix.valueOf("10.0.0.10/16"); | 573 | + IpPrefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8888/120"); |
85 | - IpPrefix ip3 = IpPrefix.valueOf("10.0.0.0/16"); | 574 | + assertThat(ipPrefix.toString(), |
86 | - assertEquals("incorrect binary masked address", | 575 | + is("1111:2222:3333:4444:5555:6666:7777:8800/120")); |
87 | - ip1.toString(), "10.0.0.0/16"); | 576 | + |
88 | - assertEquals("incorrect string masked address", | 577 | + ipPrefix = |
89 | - ip2.toString(), "10.0.0.0/16"); | 578 | + IpPrefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8888/128"); |
90 | - assertEquals("incorrect network address", | 579 | + assertThat(ipPrefix.toString(), |
91 | - ip2.toString(), "10.0.0.0/16"); | 580 | + is("1111:2222:3333:4444:5555:6666:7777:8888/128")); |
581 | + | ||
582 | + ipPrefix = IpPrefix.valueOf("::/0"); | ||
583 | + assertThat(ipPrefix.toString(), is("::/0")); | ||
584 | + | ||
585 | + ipPrefix = IpPrefix.valueOf("::/128"); | ||
586 | + assertThat(ipPrefix.toString(), is("::/128")); | ||
587 | + | ||
588 | + ipPrefix = | ||
589 | + IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/0"); | ||
590 | + assertThat(ipPrefix.toString(), is("::/0")); | ||
591 | + | ||
592 | + ipPrefix = | ||
593 | + IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/64"); | ||
594 | + assertThat(ipPrefix.toString(), is("ffff:ffff:ffff:ffff::/64")); | ||
595 | + | ||
596 | + ipPrefix = | ||
597 | + IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"); | ||
598 | + assertThat(ipPrefix.toString(), | ||
599 | + is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128")); | ||
600 | + } | ||
601 | + | ||
602 | + /** | ||
603 | + * Tests invalid valueOf() converter for a null string. | ||
604 | + */ | ||
605 | + @Test(expected = NullPointerException.class) | ||
606 | + public void testInvalidValueOfNullString() { | ||
607 | + IpPrefix ipPrefix; | ||
608 | + String fromString; | ||
609 | + | ||
610 | + fromString = null; | ||
611 | + ipPrefix = IpPrefix.valueOf(fromString); | ||
612 | + } | ||
613 | + | ||
614 | + /** | ||
615 | + * Tests invalid valueOf() converter for an empty string. | ||
616 | + */ | ||
617 | + @Test(expected = IllegalArgumentException.class) | ||
618 | + public void testInvalidValueOfEmptyString() { | ||
619 | + IpPrefix ipPrefix; | ||
620 | + String fromString; | ||
621 | + | ||
622 | + fromString = ""; | ||
623 | + ipPrefix = IpPrefix.valueOf(fromString); | ||
92 | } | 624 | } |
93 | 625 | ||
626 | + /** | ||
627 | + * Tests invalid valueOf() converter for an incorrect string. | ||
628 | + */ | ||
629 | + @Test(expected = IllegalArgumentException.class) | ||
630 | + public void testInvalidValueOfIncorrectString() { | ||
631 | + IpPrefix ipPrefix; | ||
632 | + String fromString; | ||
633 | + | ||
634 | + fromString = "NoSuchIpPrefix"; | ||
635 | + ipPrefix = IpPrefix.valueOf(fromString); | ||
636 | + } | ||
637 | + | ||
638 | + /** | ||
639 | + * Tests invalid valueOf() converter for IPv4 string and | ||
640 | + * negative prefix length. | ||
641 | + */ | ||
642 | + @Test(expected = IllegalArgumentException.class) | ||
643 | + public void testInvalidValueOfStringNegativePrefixLengthIPv4() { | ||
644 | + IpPrefix ipPrefix; | ||
645 | + | ||
646 | + ipPrefix = IpPrefix.valueOf("1.2.3.4/-1"); | ||
647 | + } | ||
648 | + | ||
649 | + /** | ||
650 | + * Tests invalid valueOf() converter for IPv6 string and | ||
651 | + * negative prefix length. | ||
652 | + */ | ||
653 | + @Test(expected = IllegalArgumentException.class) | ||
654 | + public void testInvalidValueOfStringNegativePrefixLengthIPv6() { | ||
655 | + IpPrefix ipPrefix; | ||
656 | + | ||
657 | + ipPrefix = | ||
658 | + IpPrefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8888/-1"); | ||
659 | + } | ||
660 | + | ||
661 | + /** | ||
662 | + * Tests invalid valueOf() converter for IPv4 string and | ||
663 | + * too long prefix length. | ||
664 | + */ | ||
665 | + @Test(expected = IllegalArgumentException.class) | ||
666 | + public void testInvalidValueOfStringTooLongPrefixLengthIPv4() { | ||
667 | + IpPrefix ipPrefix; | ||
668 | + | ||
669 | + ipPrefix = IpPrefix.valueOf("1.2.3.4/33"); | ||
670 | + } | ||
671 | + | ||
672 | + /** | ||
673 | + * Tests invalid valueOf() converter for IPv6 string and | ||
674 | + * too long prefix length. | ||
675 | + */ | ||
676 | + @Test(expected = IllegalArgumentException.class) | ||
677 | + public void testInvalidValueOfStringTooLongPrefixLengthIPv6() { | ||
678 | + IpPrefix ipPrefix; | ||
679 | + | ||
680 | + ipPrefix = | ||
681 | + IpPrefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8888/129"); | ||
682 | + } | ||
683 | + | ||
684 | + /** | ||
685 | + * Tests IP prefix contains another IP prefix for IPv4. | ||
686 | + */ | ||
687 | + @Test | ||
688 | + public void testContainsIpPrefixIPv4() { | ||
689 | + IpPrefix ipPrefix; | ||
690 | + | ||
691 | + ipPrefix = IpPrefix.valueOf("1.2.0.0/24"); | ||
692 | + assertTrue(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/24"))); | ||
693 | + assertTrue(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/32"))); | ||
694 | + assertTrue(ipPrefix.contains(IpPrefix.valueOf("1.2.0.4/32"))); | ||
695 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/16"))); | ||
696 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1.3.0.0/24"))); | ||
697 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("0.0.0.0/16"))); | ||
698 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("0.0.0.0/0"))); | ||
699 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("255.255.255.255/32"))); | ||
700 | + | ||
701 | + ipPrefix = IpPrefix.valueOf("1.2.0.0/32"); | ||
702 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/24"))); | ||
703 | + assertTrue(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/32"))); | ||
704 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1.2.0.4/32"))); | ||
705 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/16"))); | ||
706 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1.3.0.0/24"))); | ||
707 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("0.0.0.0/16"))); | ||
708 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("0.0.0.0/0"))); | ||
709 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("255.255.255.255/32"))); | ||
710 | + | ||
711 | + ipPrefix = IpPrefix.valueOf("0.0.0.0/0"); | ||
712 | + assertTrue(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/24"))); | ||
713 | + assertTrue(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/32"))); | ||
714 | + assertTrue(ipPrefix.contains(IpPrefix.valueOf("1.2.0.4/32"))); | ||
715 | + assertTrue(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/16"))); | ||
716 | + assertTrue(ipPrefix.contains(IpPrefix.valueOf("1.3.0.0/24"))); | ||
717 | + assertTrue(ipPrefix.contains(IpPrefix.valueOf("0.0.0.0/16"))); | ||
718 | + assertTrue(ipPrefix.contains(IpPrefix.valueOf("0.0.0.0/0"))); | ||
719 | + assertTrue(ipPrefix.contains(IpPrefix.valueOf("255.255.255.255/32"))); | ||
720 | + | ||
721 | + ipPrefix = IpPrefix.valueOf("255.255.255.255/32"); | ||
722 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/24"))); | ||
723 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/32"))); | ||
724 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1.2.0.4/32"))); | ||
725 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/16"))); | ||
726 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1.3.0.0/24"))); | ||
727 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("0.0.0.0/16"))); | ||
728 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("0.0.0.0/0"))); | ||
729 | + assertTrue(ipPrefix.contains(IpPrefix.valueOf("255.255.255.255/32"))); | ||
730 | + } | ||
731 | + | ||
732 | + /** | ||
733 | + * Tests IP prefix contains another IP prefix for IPv6. | ||
734 | + */ | ||
735 | + @Test | ||
736 | + public void testContainsIpPrefixIPv6() { | ||
737 | + IpPrefix ipPrefix; | ||
738 | + | ||
739 | + ipPrefix = IpPrefix.valueOf("1111:2222:3333:4444::/120"); | ||
740 | + assertTrue(ipPrefix.contains( | ||
741 | + IpPrefix.valueOf("1111:2222:3333:4444::/120"))); | ||
742 | + assertTrue(ipPrefix.contains( | ||
743 | + IpPrefix.valueOf("1111:2222:3333:4444::/128"))); | ||
744 | + assertTrue(ipPrefix.contains( | ||
745 | + IpPrefix.valueOf("1111:2222:3333:4444::1/128"))); | ||
746 | + assertFalse(ipPrefix.contains( | ||
747 | + IpPrefix.valueOf("1111:2222:3333:4444::/64"))); | ||
748 | + assertFalse(ipPrefix.contains( | ||
749 | + IpPrefix.valueOf("1111:2222:3333:4445::/120"))); | ||
750 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("::/64"))); | ||
751 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("::/0"))); | ||
752 | + assertFalse(ipPrefix.contains( | ||
753 | + IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"))); | ||
754 | + | ||
755 | + ipPrefix = IpPrefix.valueOf("1111:2222:3333:4444::/128"); | ||
756 | + assertFalse(ipPrefix.contains( | ||
757 | + IpPrefix.valueOf("1111:2222:3333:4444::/120"))); | ||
758 | + assertTrue(ipPrefix.contains( | ||
759 | + IpPrefix.valueOf("1111:2222:3333:4444::/128"))); | ||
760 | + assertFalse(ipPrefix.contains( | ||
761 | + IpPrefix.valueOf("1111:2222:3333:4444::1/128"))); | ||
762 | + assertFalse(ipPrefix.contains( | ||
763 | + IpPrefix.valueOf("1111:2222:3333:4444::/64"))); | ||
764 | + assertFalse(ipPrefix.contains( | ||
765 | + IpPrefix.valueOf("1111:2222:3333:4445::/120"))); | ||
766 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("::/64"))); | ||
767 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("::/0"))); | ||
768 | + assertFalse(ipPrefix.contains( | ||
769 | + IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"))); | ||
770 | + | ||
771 | + ipPrefix = IpPrefix.valueOf("::/0"); | ||
772 | + assertTrue(ipPrefix.contains( | ||
773 | + IpPrefix.valueOf("1111:2222:3333:4444::/120"))); | ||
774 | + assertTrue(ipPrefix.contains( | ||
775 | + IpPrefix.valueOf("1111:2222:3333:4444::/128"))); | ||
776 | + assertTrue(ipPrefix.contains( | ||
777 | + IpPrefix.valueOf("1111:2222:3333:4444::1/128"))); | ||
778 | + assertTrue(ipPrefix.contains( | ||
779 | + IpPrefix.valueOf("1111:2222:3333:4444::/64"))); | ||
780 | + assertTrue(ipPrefix.contains( | ||
781 | + IpPrefix.valueOf("1111:2222:3333:4445::/120"))); | ||
782 | + assertTrue(ipPrefix.contains(IpPrefix.valueOf("::/64"))); | ||
783 | + assertTrue(ipPrefix.contains(IpPrefix.valueOf("::/0"))); | ||
784 | + assertTrue(ipPrefix.contains( | ||
785 | + IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"))); | ||
786 | + | ||
787 | + ipPrefix = | ||
788 | + IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"); | ||
789 | + assertFalse(ipPrefix.contains( | ||
790 | + IpPrefix.valueOf("1111:2222:3333:4444::/120"))); | ||
791 | + assertFalse(ipPrefix.contains( | ||
792 | + IpPrefix.valueOf("1111:2222:3333:4444::/128"))); | ||
793 | + assertFalse(ipPrefix.contains( | ||
794 | + IpPrefix.valueOf("1111:2222:3333:4444::1/128"))); | ||
795 | + assertFalse(ipPrefix.contains( | ||
796 | + IpPrefix.valueOf("1111:2222:3333:4444::/64"))); | ||
797 | + assertFalse(ipPrefix.contains( | ||
798 | + IpPrefix.valueOf("1111:2222:3333:4445::/120"))); | ||
799 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("::/64"))); | ||
800 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("::/0"))); | ||
801 | + assertTrue(ipPrefix.contains( | ||
802 | + IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"))); | ||
803 | + } | ||
804 | + | ||
805 | + /** | ||
806 | + * Tests IP prefix contains IP address for IPv4. | ||
807 | + */ | ||
808 | + @Test | ||
809 | + public void testContainsIpAddressIPv4() { | ||
810 | + IpPrefix ipPrefix; | ||
811 | + | ||
812 | + ipPrefix = IpPrefix.valueOf("1.2.0.0/24"); | ||
813 | + assertTrue(ipPrefix.contains(IpAddress.valueOf("1.2.0.0"))); | ||
814 | + assertTrue(ipPrefix.contains(IpAddress.valueOf("1.2.0.4"))); | ||
815 | + assertFalse(ipPrefix.contains(IpAddress.valueOf("1.3.0.0"))); | ||
816 | + assertFalse(ipPrefix.contains(IpAddress.valueOf("0.0.0.0"))); | ||
817 | + assertFalse(ipPrefix.contains(IpAddress.valueOf("255.255.255.255"))); | ||
818 | + | ||
819 | + ipPrefix = IpPrefix.valueOf("1.2.0.0/32"); | ||
820 | + assertTrue(ipPrefix.contains(IpAddress.valueOf("1.2.0.0"))); | ||
821 | + assertFalse(ipPrefix.contains(IpAddress.valueOf("1.2.0.4"))); | ||
822 | + assertFalse(ipPrefix.contains(IpAddress.valueOf("1.3.0.0"))); | ||
823 | + assertFalse(ipPrefix.contains(IpAddress.valueOf("0.0.0.0"))); | ||
824 | + assertFalse(ipPrefix.contains(IpAddress.valueOf("255.255.255.255"))); | ||
825 | + | ||
826 | + ipPrefix = IpPrefix.valueOf("0.0.0.0/0"); | ||
827 | + assertTrue(ipPrefix.contains(IpAddress.valueOf("1.2.0.0"))); | ||
828 | + assertTrue(ipPrefix.contains(IpAddress.valueOf("1.2.0.4"))); | ||
829 | + assertTrue(ipPrefix.contains(IpAddress.valueOf("1.3.0.0"))); | ||
830 | + assertTrue(ipPrefix.contains(IpAddress.valueOf("0.0.0.0"))); | ||
831 | + assertTrue(ipPrefix.contains(IpAddress.valueOf("255.255.255.255"))); | ||
832 | + | ||
833 | + ipPrefix = IpPrefix.valueOf("255.255.255.255/32"); | ||
834 | + assertFalse(ipPrefix.contains(IpAddress.valueOf("1.2.0.0"))); | ||
835 | + assertFalse(ipPrefix.contains(IpAddress.valueOf("1.2.0.4"))); | ||
836 | + assertFalse(ipPrefix.contains(IpAddress.valueOf("1.3.0.0"))); | ||
837 | + assertFalse(ipPrefix.contains(IpAddress.valueOf("0.0.0.0"))); | ||
838 | + assertTrue(ipPrefix.contains(IpAddress.valueOf("255.255.255.255"))); | ||
839 | + } | ||
840 | + | ||
841 | + /** | ||
842 | + * Tests IP prefix contains IP address for IPv6. | ||
843 | + */ | ||
94 | @Test | 844 | @Test |
95 | - public void testContainsIpPrefix() { | 845 | + public void testContainsIpAddressIPv6() { |
96 | - IpPrefix slash31 = IpPrefix.valueOf(IpAddress.Version.INET, | 846 | + IpPrefix ipPrefix; |
97 | - BYTES1, 31); | ||
98 | - IpPrefix slash32 = IpPrefix.valueOf(IpAddress.Version.INET, | ||
99 | - BYTES1, 32); | ||
100 | - IpPrefix differentSlash32 = IpPrefix.valueOf(IpAddress.Version.INET, | ||
101 | - BYTES2, 32); | ||
102 | 847 | ||
103 | - assertTrue(slash31.contains(differentSlash32)); | 848 | + ipPrefix = IpPrefix.valueOf("1111:2222:3333:4444::/120"); |
104 | - assertFalse(differentSlash32.contains(slash31)); | 849 | + assertTrue(ipPrefix.contains( |
850 | + IpAddress.valueOf("1111:2222:3333:4444::"))); | ||
851 | + assertTrue(ipPrefix.contains( | ||
852 | + IpAddress.valueOf("1111:2222:3333:4444::1"))); | ||
853 | + assertFalse(ipPrefix.contains( | ||
854 | + IpAddress.valueOf("1111:2222:3333:4445::"))); | ||
855 | + assertFalse(ipPrefix.contains(IpAddress.valueOf("::"))); | ||
856 | + assertFalse(ipPrefix.contains( | ||
857 | + IpAddress.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"))); | ||
105 | 858 | ||
106 | - assertTrue(slash31.contains(slash32)); | 859 | + ipPrefix = IpPrefix.valueOf("1111:2222:3333:4444::/128"); |
107 | - assertFalse(slash32.contains(differentSlash32)); | 860 | + assertTrue(ipPrefix.contains( |
108 | - assertFalse(differentSlash32.contains(slash32)); | 861 | + IpAddress.valueOf("1111:2222:3333:4444::"))); |
862 | + assertFalse(ipPrefix.contains( | ||
863 | + IpAddress.valueOf("1111:2222:3333:4444::1"))); | ||
864 | + assertFalse(ipPrefix.contains( | ||
865 | + IpAddress.valueOf("1111:2222:3333:4445::"))); | ||
866 | + assertFalse(ipPrefix.contains(IpAddress.valueOf("::"))); | ||
867 | + assertFalse(ipPrefix.contains( | ||
868 | + IpAddress.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"))); | ||
109 | 869 | ||
110 | - IpPrefix zero = IpPrefix.valueOf("0.0.0.0/0"); | 870 | + ipPrefix = IpPrefix.valueOf("::/0"); |
111 | - assertTrue(zero.contains(differentSlash32)); | 871 | + assertTrue(ipPrefix.contains( |
112 | - assertFalse(differentSlash32.contains(zero)); | 872 | + IpAddress.valueOf("1111:2222:3333:4444::"))); |
873 | + assertTrue(ipPrefix.contains( | ||
874 | + IpAddress.valueOf("1111:2222:3333:4444::1"))); | ||
875 | + assertTrue(ipPrefix.contains( | ||
876 | + IpAddress.valueOf("1111:2222:3333:4445::"))); | ||
877 | + assertTrue(ipPrefix.contains(IpAddress.valueOf("::"))); | ||
878 | + assertTrue(ipPrefix.contains( | ||
879 | + IpAddress.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"))); | ||
113 | 880 | ||
114 | - IpPrefix slash8 = IpPrefix.valueOf("10.0.0.0/8"); | 881 | + ipPrefix = |
115 | - assertTrue(slash8.contains(slash31)); | 882 | + IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"); |
116 | - assertFalse(slash31.contains(slash8)); | 883 | + assertFalse(ipPrefix.contains( |
884 | + IpAddress.valueOf("1111:2222:3333:4444::"))); | ||
885 | + assertFalse(ipPrefix.contains( | ||
886 | + IpAddress.valueOf("1111:2222:3333:4444::1"))); | ||
887 | + assertFalse(ipPrefix.contains( | ||
888 | + IpAddress.valueOf("1111:2222:3333:4445::"))); | ||
889 | + assertFalse(ipPrefix.contains(IpAddress.valueOf("::"))); | ||
890 | + assertTrue(ipPrefix.contains( | ||
891 | + IpAddress.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"))); | ||
117 | } | 892 | } |
118 | 893 | ||
894 | + /** | ||
895 | + * Tests equality of {@link IpPrefix} for IPv4. | ||
896 | + */ | ||
119 | @Test | 897 | @Test |
120 | - public void testContainsIpAddress() { | 898 | + public void testEqualityIPv4() { |
121 | - IpPrefix slash31 = IpPrefix.valueOf(IpAddress.Version.INET, | 899 | + new EqualsTester() |
122 | - BYTES1, 31); | 900 | + .addEqualityGroup(IpPrefix.valueOf("1.2.0.0/24"), |
123 | - IpAddress addr32 = IpAddress.valueOf(IpAddress.Version.INET, BYTES1); | 901 | + IpPrefix.valueOf("1.2.0.0/24"), |
902 | + IpPrefix.valueOf("1.2.0.4/24")) | ||
903 | + .addEqualityGroup(IpPrefix.valueOf("1.2.0.0/16"), | ||
904 | + IpPrefix.valueOf("1.2.0.0/16")) | ||
905 | + .addEqualityGroup(IpPrefix.valueOf("1.2.0.0/32"), | ||
906 | + IpPrefix.valueOf("1.2.0.0/32")) | ||
907 | + .addEqualityGroup(IpPrefix.valueOf("1.3.0.0/24"), | ||
908 | + IpPrefix.valueOf("1.3.0.0/24")) | ||
909 | + .addEqualityGroup(IpPrefix.valueOf("0.0.0.0/0"), | ||
910 | + IpPrefix.valueOf("0.0.0.0/0")) | ||
911 | + .addEqualityGroup(IpPrefix.valueOf("255.255.255.255/32"), | ||
912 | + IpPrefix.valueOf("255.255.255.255/32")) | ||
913 | + .testEquals(); | ||
914 | + } | ||
915 | + | ||
916 | + /** | ||
917 | + * Tests equality of {@link IpPrefix} for IPv6. | ||
918 | + */ | ||
919 | + @Test | ||
920 | + public void testEqualityIPv6() { | ||
921 | + new EqualsTester() | ||
922 | + .addEqualityGroup( | ||
923 | + IpPrefix.valueOf("1111:2222:3333:4444::/120"), | ||
924 | + IpPrefix.valueOf("1111:2222:3333:4444::1/120"), | ||
925 | + IpPrefix.valueOf("1111:2222:3333:4444::/120")) | ||
926 | + .addEqualityGroup( | ||
927 | + IpPrefix.valueOf("1111:2222:3333:4444::/64"), | ||
928 | + IpPrefix.valueOf("1111:2222:3333:4444::/64")) | ||
929 | + .addEqualityGroup( | ||
930 | + IpPrefix.valueOf("1111:2222:3333:4444::/128"), | ||
931 | + IpPrefix.valueOf("1111:2222:3333:4444::/128")) | ||
932 | + .addEqualityGroup( | ||
933 | + IpPrefix.valueOf("1111:2222:3333:4445::/64"), | ||
934 | + IpPrefix.valueOf("1111:2222:3333:4445::/64")) | ||
935 | + .addEqualityGroup( | ||
936 | + IpPrefix.valueOf("::/0"), | ||
937 | + IpPrefix.valueOf("::/0")) | ||
938 | + .addEqualityGroup( | ||
939 | + IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"), | ||
940 | + IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128")) | ||
941 | + .testEquals(); | ||
942 | + } | ||
943 | + | ||
944 | + /** | ||
945 | + * Tests object string representation for IPv4. | ||
946 | + */ | ||
947 | + @Test | ||
948 | + public void testToStringIPv4() { | ||
949 | + IpPrefix ipPrefix; | ||
124 | 950 | ||
125 | - assertTrue(slash31.contains(addr32)); | 951 | + ipPrefix = IpPrefix.valueOf("1.2.3.0/24"); |
952 | + assertThat(ipPrefix.toString(), is("1.2.3.0/24")); | ||
953 | + | ||
954 | + ipPrefix = IpPrefix.valueOf("1.2.3.4/24"); | ||
955 | + assertThat(ipPrefix.toString(), is("1.2.3.0/24")); | ||
956 | + | ||
957 | + ipPrefix = IpPrefix.valueOf("0.0.0.0/0"); | ||
958 | + assertThat(ipPrefix.toString(), is("0.0.0.0/0")); | ||
959 | + | ||
960 | + ipPrefix = IpPrefix.valueOf("255.255.255.255/32"); | ||
961 | + assertThat(ipPrefix.toString(), is("255.255.255.255/32")); | ||
962 | + } | ||
963 | + | ||
964 | + /** | ||
965 | + * Tests object string representation for IPv6. | ||
966 | + */ | ||
967 | + @Test | ||
968 | + public void testToStringIPv6() { | ||
969 | + IpPrefix ipPrefix; | ||
126 | 970 | ||
127 | - IpPrefix intf = IpPrefix.valueOf("192.168.10.101/24"); | 971 | + ipPrefix = IpPrefix.valueOf("1100::/8"); |
128 | - IpAddress addr = IpAddress.valueOf("192.168.10.1"); | 972 | + assertThat(ipPrefix.toString(), is("1100::/8")); |
129 | 973 | ||
130 | - assertTrue(intf.contains(addr)); | 974 | + ipPrefix = IpPrefix.valueOf("1111:2222:3333:4444:5555:6666:7777:8885/8"); |
975 | + assertThat(ipPrefix.toString(), is("1100::/8")); | ||
131 | 976 | ||
132 | - IpPrefix intf1 = IpPrefix.valueOf("10.0.0.101/24"); | 977 | + ipPrefix = IpPrefix.valueOf("::/0"); |
133 | - IpAddress addr1 = IpAddress.valueOf("10.0.0.4"); | 978 | + assertThat(ipPrefix.toString(), is("::/0")); |
134 | 979 | ||
135 | - assertTrue(intf1.contains(addr1)); | 980 | + ipPrefix = IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"); |
981 | + assertThat(ipPrefix.toString(), | ||
982 | + is("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128")); | ||
136 | } | 983 | } |
137 | } | 984 | } | ... | ... |
-
Please register or login to post a comment