blob: 473c720bc449073bf57e466b8f9eb2128d286c1d [file] [log] [blame]
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2014-present Open Networking Foundation
Thomas Vachuska4f1a60c2014-10-28 13:39:07 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Brian O'Connorabafb502014-12-02 22:26:20 -080016package org.onosproject.net.host.impl;
Jonathan Hartb4758a92014-09-24 10:46:45 -070017
Thomas Vachuska27bee092015-06-23 19:03:10 -070018import com.google.common.collect.HashMultimap;
19import com.google.common.collect.Lists;
20import com.google.common.collect.Multimap;
Jonathan Hartdc09a3b2014-10-27 11:34:26 -070021import org.junit.After;
Jonathan Hartfb32a6e2015-09-01 12:12:14 +020022import org.junit.Before;
Jonathan Hartb4758a92014-09-24 10:46:45 -070023import org.junit.Test;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080024import org.onlab.packet.ARP;
25import org.onlab.packet.Ethernet;
Charles Chan5d5e0622015-09-25 13:00:06 -070026import org.onlab.packet.IPv6;
Jonathan Hart3cfce8e2015-01-14 16:43:27 -080027import org.onlab.packet.IpAddress;
28import org.onlab.packet.IpPrefix;
29import org.onlab.packet.MacAddress;
Jonathan Hart6cd2f352015-01-13 17:44:45 -080030import org.onlab.packet.VlanId;
Charles Chan5d5e0622015-09-25 13:00:06 -070031import org.onlab.packet.ndp.NeighborSolicitation;
Jonathan Hart4cb39882015-08-12 23:50:55 -040032import org.onosproject.incubator.net.intf.Interface;
33import org.onosproject.incubator.net.intf.InterfaceService;
Brian O'Connorabafb502014-12-02 22:26:20 -080034import org.onosproject.net.ConnectPoint;
35import org.onosproject.net.Device;
36import org.onosproject.net.DeviceId;
37import org.onosproject.net.Host;
Brian O'Connorabafb502014-12-02 22:26:20 -080038import org.onosproject.net.Port;
39import org.onosproject.net.PortNumber;
Brian O'Connorabafb502014-12-02 22:26:20 -080040import org.onosproject.net.device.DeviceServiceAdapter;
Jonathan Hartfb32a6e2015-09-01 12:12:14 +020041import org.onosproject.net.edge.EdgePortService;
Brian O'Connorabafb502014-12-02 22:26:20 -080042import org.onosproject.net.flow.instructions.Instruction;
43import org.onosproject.net.flow.instructions.Instructions.OutputInstruction;
44import org.onosproject.net.host.HostProvider;
45import org.onosproject.net.host.InterfaceIpAddress;
Brian O'Connorabafb502014-12-02 22:26:20 -080046import org.onosproject.net.packet.OutboundPacket;
Thomas Vachuska27bee092015-06-23 19:03:10 -070047import org.onosproject.net.packet.PacketServiceAdapter;
Brian O'Connorabafb502014-12-02 22:26:20 -080048import org.onosproject.net.provider.ProviderId;
Jonathan Hartb4758a92014-09-24 10:46:45 -070049
Thomas Vachuska27bee092015-06-23 19:03:10 -070050import java.util.ArrayList;
51import java.util.Collections;
52import java.util.List;
53import java.util.Set;
54
Jonathan Hartfb32a6e2015-09-01 12:12:14 +020055import static org.easymock.EasyMock.anyObject;
Jonathan Hart2a655752015-04-07 16:46:33 -070056import static org.easymock.EasyMock.createMock;
57import static org.easymock.EasyMock.expect;
58import static org.easymock.EasyMock.expectLastCall;
59import static org.easymock.EasyMock.replay;
60import static org.easymock.EasyMock.verify;
61import static org.junit.Assert.assertArrayEquals;
62import static org.junit.Assert.assertEquals;
63import static org.junit.Assert.assertTrue;
Jonathan Hartb4758a92014-09-24 10:46:45 -070064
65public class HostMonitorTest {
66
Charles Chan5d5e0622015-09-25 13:00:06 -070067 private static final IpAddress TARGET_IPV4_ADDR =
Thomas Vachuska27bee092015-06-23 19:03:10 -070068 IpAddress.valueOf("10.0.0.1");
Charles Chan5d5e0622015-09-25 13:00:06 -070069 private static final IpAddress SOURCE_IPV4_ADDR =
Thomas Vachuska27bee092015-06-23 19:03:10 -070070 IpAddress.valueOf("10.0.0.99");
Pavlin Radoslavov76b0ae22014-10-27 15:33:19 -070071 private static final InterfaceIpAddress IA1 =
Charles Chan5d5e0622015-09-25 13:00:06 -070072 new InterfaceIpAddress(SOURCE_IPV4_ADDR, IpPrefix.valueOf("10.0.0.0/24"));
Jonathan Hartb4758a92014-09-24 10:46:45 -070073 private MacAddress sourceMac = MacAddress.valueOf(1L);
74
Charles Chan5d5e0622015-09-25 13:00:06 -070075 private static final IpAddress TARGET_IPV6_ADDR =
76 IpAddress.valueOf("1000::1");
77 private static final IpAddress SOURCE_IPV6_ADDR =
78 IpAddress.valueOf("1000::f");
79 private static final InterfaceIpAddress IA2 =
80 new InterfaceIpAddress(SOURCE_IPV6_ADDR, IpPrefix.valueOf("1000::/64"));
81 private MacAddress sourceMac2 = MacAddress.valueOf(2L);
82
Jonathan Hartfb32a6e2015-09-01 12:12:14 +020083 private EdgePortService edgePortService;
84
Jonathan Hartb4758a92014-09-24 10:46:45 -070085 private HostMonitor hostMonitor;
86
Jonathan Hartfb32a6e2015-09-01 12:12:14 +020087 @Before
88 public void setUp() {
89 edgePortService = createMock(EdgePortService.class);
90 expect(edgePortService.isEdgePoint(anyObject(ConnectPoint.class)))
91 .andReturn(true).anyTimes();
92 replay(edgePortService);
93 }
94
Jonathan Hartdc09a3b2014-10-27 11:34:26 -070095 @After
96 public void shutdown() {
97 hostMonitor.shutdown();
98 }
99
Jonathan Hartb4758a92014-09-24 10:46:45 -0700100 @Test
Charles Chan5d5e0622015-09-25 13:00:06 -0700101 public void testMonitorIpv4HostExists() throws Exception {
Jonathan Hart78613d22016-07-27 11:25:29 -0700102 testMonitorHostExists(TARGET_IPV4_ADDR);
Jonathan Hartb4758a92014-09-24 10:46:45 -0700103 }
104
105 @Test
Charles Chan5d5e0622015-09-25 13:00:06 -0700106 public void testMonitorIpv6HostExists() throws Exception {
Jonathan Hart78613d22016-07-27 11:25:29 -0700107 testMonitorHostExists(TARGET_IPV6_ADDR);
108 }
109
110 private void testMonitorHostExists(IpAddress hostIp) throws Exception {
Charles Chan5d5e0622015-09-25 13:00:06 -0700111 ProviderId id = new ProviderId("fake://", "id");
112
113 Host host = createMock(Host.class);
Jonathan Hart78613d22016-07-27 11:25:29 -0700114 expect(host.providerId()).andReturn(id).anyTimes();
Charles Chan5d5e0622015-09-25 13:00:06 -0700115 replay(host);
116
117 HostManager hostManager = createMock(HostManager.class);
Jonathan Hart78613d22016-07-27 11:25:29 -0700118 expect(hostManager.getHostsByIp(hostIp))
119 .andReturn(Collections.singleton(host))
120 .anyTimes();
Charles Chan5d5e0622015-09-25 13:00:06 -0700121 replay(hostManager);
122
123 HostProvider hostProvider = createMock(HostProvider.class);
124 expect(hostProvider.id()).andReturn(id).anyTimes();
125 hostProvider.triggerProbe(host);
Jonathan Hart78613d22016-07-27 11:25:29 -0700126 expectLastCall().times(2);
Charles Chan5d5e0622015-09-25 13:00:06 -0700127 replay(hostProvider);
128
129 hostMonitor = new HostMonitor(null, hostManager, null, edgePortService);
130
131 hostMonitor.registerHostProvider(hostProvider);
Jonathan Hart78613d22016-07-27 11:25:29 -0700132 hostMonitor.addMonitoringFor(hostIp);
Charles Chan5d5e0622015-09-25 13:00:06 -0700133
Yuta HIGUCHI19afc032017-05-20 23:44:17 -0700134 hostMonitor.run();
Charles Chan5d5e0622015-09-25 13:00:06 -0700135
136 verify(hostProvider);
137 }
138
139 @Test
140 public void testMonitorIpv4HostDoesNotExist() throws Exception {
Jonathan Hartdc09a3b2014-10-27 11:34:26 -0700141
Jonathan Hartb4758a92014-09-24 10:46:45 -0700142 HostManager hostManager = createMock(HostManager.class);
143
144 DeviceId devId = DeviceId.deviceId("fake");
145
146 Device device = createMock(Device.class);
147 expect(device.id()).andReturn(devId).anyTimes();
148 replay(device);
149
150 PortNumber portNum = PortNumber.portNumber(1L);
151
152 Port port = createMock(Port.class);
153 expect(port.number()).andReturn(portNum).anyTimes();
154 replay(port);
155
156 TestDeviceService deviceService = new TestDeviceService();
157 deviceService.addDevice(device, Collections.singleton(port));
158
159 ConnectPoint cp = new ConnectPoint(devId, portNum);
Jonathan Hartb4758a92014-09-24 10:46:45 -0700160
Charles Chan5d5e0622015-09-25 13:00:06 -0700161 expect(hostManager.getHostsByIp(TARGET_IPV4_ADDR))
Jonathan Hart4cb39882015-08-12 23:50:55 -0400162 .andReturn(Collections.emptySet()).anyTimes();
Jonathan Hartb4758a92014-09-24 10:46:45 -0700163 replay(hostManager);
164
Jonathan Hart4cb39882015-08-12 23:50:55 -0400165 InterfaceService interfaceService = createMock(InterfaceService.class);
Charles Chan9238b382017-03-14 13:14:58 -0700166 expect(interfaceService.getMatchingInterfaces(TARGET_IPV4_ADDR))
167 .andReturn(Collections.singleton(new Interface(Interface.NO_INTERFACE_NAME,
168 cp, Collections.singletonList(IA1), sourceMac, VlanId.NONE)))
Jonathan Hart4cb39882015-08-12 23:50:55 -0400169 .anyTimes();
170 replay(interfaceService);
171
Jonathan Hartb4758a92014-09-24 10:46:45 -0700172 TestPacketService packetService = new TestPacketService();
173
174
175 // Run the test
Jonathan Hartfb32a6e2015-09-01 12:12:14 +0200176 hostMonitor = new HostMonitor(packetService, hostManager, interfaceService, edgePortService);
Jonathan Hartb4758a92014-09-24 10:46:45 -0700177
Charles Chan5d5e0622015-09-25 13:00:06 -0700178 hostMonitor.addMonitoringFor(TARGET_IPV4_ADDR);
Yuta HIGUCHI19afc032017-05-20 23:44:17 -0700179 hostMonitor.run();
Jonathan Hartb4758a92014-09-24 10:46:45 -0700180
181
182 // Check that a packet was sent to our PacketService and that it has
183 // the properties we expect
Jonathan Hart78613d22016-07-27 11:25:29 -0700184 assertEquals(2, packetService.packets.size());
Jonathan Hartb4758a92014-09-24 10:46:45 -0700185 OutboundPacket packet = packetService.packets.get(0);
186
187 // Check the output port is correct
Ray Milkey42507352015-03-20 15:16:10 -0700188 assertEquals(1, packet.treatment().immediate().size());
189 Instruction instruction = packet.treatment().immediate().get(0);
Jonathan Hartb4758a92014-09-24 10:46:45 -0700190 assertTrue(instruction instanceof OutputInstruction);
191 OutputInstruction oi = (OutputInstruction) instruction;
Yuta HIGUCHI3e848a82014-11-02 20:19:42 -0800192 assertEquals(portNum, oi.port());
Jonathan Hartb4758a92014-09-24 10:46:45 -0700193
194 // Check the output packet is correct (well the important bits anyway)
Yuta HIGUCHI3e848a82014-11-02 20:19:42 -0800195 final byte[] pktData = new byte[packet.data().remaining()];
196 packet.data().get(pktData);
Jonathan Hart2a655752015-04-07 16:46:33 -0700197 Ethernet eth = Ethernet.deserializer().deserialize(pktData, 0, pktData.length);
Jonathan Hart6cd2f352015-01-13 17:44:45 -0800198 assertEquals(Ethernet.VLAN_UNTAGGED, eth.getVlanID());
199 ARP arp = (ARP) eth.getPayload();
Charles Chan5d5e0622015-09-25 13:00:06 -0700200 assertArrayEquals(SOURCE_IPV4_ADDR.toOctets(),
Jonathan Hart6cd2f352015-01-13 17:44:45 -0800201 arp.getSenderProtocolAddress());
202 assertArrayEquals(sourceMac.toBytes(),
203 arp.getSenderHardwareAddress());
Charles Chan5d5e0622015-09-25 13:00:06 -0700204 assertArrayEquals(TARGET_IPV4_ADDR.toOctets(),
Jonathan Hart6cd2f352015-01-13 17:44:45 -0800205 arp.getTargetProtocolAddress());
206 }
207
208 @Test
Charles Chan5d5e0622015-09-25 13:00:06 -0700209 public void testMonitorIpv6HostDoesNotExist() throws Exception {
210
211 HostManager hostManager = createMock(HostManager.class);
212
213 DeviceId devId = DeviceId.deviceId("fake");
214
215 Device device = createMock(Device.class);
216 expect(device.id()).andReturn(devId).anyTimes();
217 replay(device);
218
219 PortNumber portNum = PortNumber.portNumber(2L);
220
221 Port port = createMock(Port.class);
222 expect(port.number()).andReturn(portNum).anyTimes();
223 replay(port);
224
225 TestDeviceService deviceService = new TestDeviceService();
226 deviceService.addDevice(device, Collections.singleton(port));
227
228 ConnectPoint cp = new ConnectPoint(devId, portNum);
229
230 expect(hostManager.getHostsByIp(TARGET_IPV6_ADDR))
231 .andReturn(Collections.emptySet()).anyTimes();
232 replay(hostManager);
233
234 InterfaceService interfaceService = createMock(InterfaceService.class);
Charles Chan9238b382017-03-14 13:14:58 -0700235 expect(interfaceService.getMatchingInterfaces(TARGET_IPV6_ADDR))
236 .andReturn(Collections.singleton(new Interface(Interface.NO_INTERFACE_NAME, cp,
237 Collections.singletonList(IA2), sourceMac2, VlanId.NONE)))
Charles Chan5d5e0622015-09-25 13:00:06 -0700238 .anyTimes();
239 replay(interfaceService);
240
241 TestPacketService packetService = new TestPacketService();
242
243
244 // Run the test
245 hostMonitor = new HostMonitor(packetService, hostManager, interfaceService, edgePortService);
246
247 hostMonitor.addMonitoringFor(TARGET_IPV6_ADDR);
Yuta HIGUCHI19afc032017-05-20 23:44:17 -0700248 hostMonitor.run();
Charles Chan5d5e0622015-09-25 13:00:06 -0700249
250
251 // Check that a packet was sent to our PacketService and that it has
252 // the properties we expect
Jonathan Hart78613d22016-07-27 11:25:29 -0700253 assertEquals(2, packetService.packets.size());
Charles Chan5d5e0622015-09-25 13:00:06 -0700254 OutboundPacket packet = packetService.packets.get(0);
255
256 // Check the output port is correct
257 assertEquals(1, packet.treatment().immediate().size());
258 Instruction instruction = packet.treatment().immediate().get(0);
259 assertTrue(instruction instanceof OutputInstruction);
260 OutputInstruction oi = (OutputInstruction) instruction;
261 assertEquals(portNum, oi.port());
262
263 // Check the output packet is correct (well the important bits anyway)
264 final byte[] pktData = new byte[packet.data().remaining()];
265 packet.data().get(pktData);
266 Ethernet eth = Ethernet.deserializer().deserialize(pktData, 0, pktData.length);
267 assertEquals(Ethernet.VLAN_UNTAGGED, eth.getVlanID());
268 IPv6 ipv6 = (IPv6) eth.getPayload();
269 assertArrayEquals(SOURCE_IPV6_ADDR.toOctets(), ipv6.getSourceAddress());
270
271 NeighborSolicitation ns =
272 (NeighborSolicitation) ipv6.getPayload().getPayload();
273 assertArrayEquals(sourceMac2.toBytes(), ns.getOptions().get(0).data());
274
275 assertArrayEquals(TARGET_IPV6_ADDR.toOctets(), ns.getTargetAddress());
276 }
277
278 @Test
279 public void testMonitorIpv4HostDoesNotExistWithVlan() throws Exception {
Jonathan Hart6cd2f352015-01-13 17:44:45 -0800280
281 HostManager hostManager = createMock(HostManager.class);
282
283 DeviceId devId = DeviceId.deviceId("fake");
284 short vlan = 5;
285
286 Device device = createMock(Device.class);
287 expect(device.id()).andReturn(devId).anyTimes();
288 replay(device);
289
290 PortNumber portNum = PortNumber.portNumber(1L);
291
292 Port port = createMock(Port.class);
293 expect(port.number()).andReturn(portNum).anyTimes();
294 replay(port);
295
296 TestDeviceService deviceService = new TestDeviceService();
297 deviceService.addDevice(device, Collections.singleton(port));
298
299 ConnectPoint cp = new ConnectPoint(devId, portNum);
Jonathan Hart6cd2f352015-01-13 17:44:45 -0800300
Charles Chan5d5e0622015-09-25 13:00:06 -0700301 expect(hostManager.getHostsByIp(TARGET_IPV4_ADDR))
Jonathan Hart4cb39882015-08-12 23:50:55 -0400302 .andReturn(Collections.emptySet()).anyTimes();
Jonathan Hart6cd2f352015-01-13 17:44:45 -0800303 replay(hostManager);
304
Jonathan Hart4cb39882015-08-12 23:50:55 -0400305 InterfaceService interfaceService = createMock(InterfaceService.class);
Charles Chan9238b382017-03-14 13:14:58 -0700306 expect(interfaceService.getMatchingInterfaces(TARGET_IPV4_ADDR))
307 .andReturn(Collections.singleton(new Interface(Interface.NO_INTERFACE_NAME, cp,
308 Collections.singletonList(IA1), sourceMac, VlanId.vlanId(vlan))))
Jonathan Hart4cb39882015-08-12 23:50:55 -0400309 .anyTimes();
310 replay(interfaceService);
311
Jonathan Hart6cd2f352015-01-13 17:44:45 -0800312 TestPacketService packetService = new TestPacketService();
313
314
315 // Run the test
Jonathan Hartfb32a6e2015-09-01 12:12:14 +0200316 hostMonitor = new HostMonitor(packetService, hostManager, interfaceService, edgePortService);
Jonathan Hart6cd2f352015-01-13 17:44:45 -0800317
Charles Chan5d5e0622015-09-25 13:00:06 -0700318 hostMonitor.addMonitoringFor(TARGET_IPV4_ADDR);
Yuta HIGUCHI19afc032017-05-20 23:44:17 -0700319 hostMonitor.run();
Jonathan Hart6cd2f352015-01-13 17:44:45 -0800320
321
322 // Check that a packet was sent to our PacketService and that it has
323 // the properties we expect
Jonathan Hart78613d22016-07-27 11:25:29 -0700324 assertEquals(2, packetService.packets.size());
Jonathan Hart6cd2f352015-01-13 17:44:45 -0800325 OutboundPacket packet = packetService.packets.get(0);
326
327 // Check the output port is correct
Ray Milkey42507352015-03-20 15:16:10 -0700328 assertEquals(1, packet.treatment().immediate().size());
329 Instruction instruction = packet.treatment().immediate().get(0);
Jonathan Hart6cd2f352015-01-13 17:44:45 -0800330 assertTrue(instruction instanceof OutputInstruction);
331 OutputInstruction oi = (OutputInstruction) instruction;
332 assertEquals(portNum, oi.port());
333
334 // Check the output packet is correct (well the important bits anyway)
Jonathan Hart6cd2f352015-01-13 17:44:45 -0800335 final byte[] pktData = new byte[packet.data().remaining()];
336 packet.data().get(pktData);
Jonathan Hart2a655752015-04-07 16:46:33 -0700337 Ethernet eth = Ethernet.deserializer().deserialize(pktData, 0, pktData.length);
Jonathan Hart6cd2f352015-01-13 17:44:45 -0800338 assertEquals(vlan, eth.getVlanID());
Jonathan Hartb4758a92014-09-24 10:46:45 -0700339 ARP arp = (ARP) eth.getPayload();
Charles Chan5d5e0622015-09-25 13:00:06 -0700340 assertArrayEquals(SOURCE_IPV4_ADDR.toOctets(),
Yuta HIGUCHI3e848a82014-11-02 20:19:42 -0800341 arp.getSenderProtocolAddress());
342 assertArrayEquals(sourceMac.toBytes(),
343 arp.getSenderHardwareAddress());
Charles Chan5d5e0622015-09-25 13:00:06 -0700344 assertArrayEquals(TARGET_IPV4_ADDR.toOctets(),
Yuta HIGUCHI3e848a82014-11-02 20:19:42 -0800345 arp.getTargetProtocolAddress());
Jonathan Hartb4758a92014-09-24 10:46:45 -0700346 }
347
Charles Chan5d5e0622015-09-25 13:00:06 -0700348 @Test
349 public void testMonitorIpv6HostDoesNotExistWithVlan() throws Exception {
350
351 HostManager hostManager = createMock(HostManager.class);
352
353 DeviceId devId = DeviceId.deviceId("fake");
354 short vlan = 5;
355
356 Device device = createMock(Device.class);
357 expect(device.id()).andReturn(devId).anyTimes();
358 replay(device);
359
360 PortNumber portNum = PortNumber.portNumber(1L);
361
362 Port port = createMock(Port.class);
363 expect(port.number()).andReturn(portNum).anyTimes();
364 replay(port);
365
366 TestDeviceService deviceService = new TestDeviceService();
367 deviceService.addDevice(device, Collections.singleton(port));
368
369 ConnectPoint cp = new ConnectPoint(devId, portNum);
370
371 expect(hostManager.getHostsByIp(TARGET_IPV6_ADDR))
372 .andReturn(Collections.emptySet()).anyTimes();
373 replay(hostManager);
374
375 InterfaceService interfaceService = createMock(InterfaceService.class);
Charles Chan9238b382017-03-14 13:14:58 -0700376 expect(interfaceService.getMatchingInterfaces(TARGET_IPV6_ADDR))
377 .andReturn(Collections.singleton(new Interface(Interface.NO_INTERFACE_NAME, cp,
378 Collections.singletonList(IA2), sourceMac2, VlanId.vlanId(vlan))))
Charles Chan5d5e0622015-09-25 13:00:06 -0700379 .anyTimes();
380 replay(interfaceService);
381
382 TestPacketService packetService = new TestPacketService();
383
384
385 // Run the test
386 hostMonitor = new HostMonitor(packetService, hostManager, interfaceService, edgePortService);
387
388 hostMonitor.addMonitoringFor(TARGET_IPV6_ADDR);
Yuta HIGUCHI19afc032017-05-20 23:44:17 -0700389 hostMonitor.run();
Charles Chan5d5e0622015-09-25 13:00:06 -0700390
391
392 // Check that a packet was sent to our PacketService and that it has
393 // the properties we expect
Jonathan Hart78613d22016-07-27 11:25:29 -0700394 assertEquals(2, packetService.packets.size());
Charles Chan5d5e0622015-09-25 13:00:06 -0700395 OutboundPacket packet = packetService.packets.get(0);
396
397 // Check the output port is correct
398 assertEquals(1, packet.treatment().immediate().size());
399 Instruction instruction = packet.treatment().immediate().get(0);
400 assertTrue(instruction instanceof OutputInstruction);
401 OutputInstruction oi = (OutputInstruction) instruction;
402 assertEquals(portNum, oi.port());
403
404 // Check the output packet is correct (well the important bits anyway)
405 final byte[] pktData = new byte[packet.data().remaining()];
406 packet.data().get(pktData);
407 Ethernet eth = Ethernet.deserializer().deserialize(pktData, 0, pktData.length);
408 assertEquals(vlan, eth.getVlanID());
409 IPv6 ipv6 = (IPv6) eth.getPayload();
410 assertArrayEquals(SOURCE_IPV6_ADDR.toOctets(), ipv6.getSourceAddress());
411
412 NeighborSolicitation ns =
413 (NeighborSolicitation) ipv6.getPayload().getPayload();
414 assertArrayEquals(sourceMac2.toBytes(), ns.getOptions().get(0).data());
415
416 assertArrayEquals(TARGET_IPV6_ADDR.toOctets(), ns.getTargetAddress());
417 }
418
Thomas Vachuska27bee092015-06-23 19:03:10 -0700419 class TestPacketService extends PacketServiceAdapter {
Jonathan Hartb4758a92014-09-24 10:46:45 -0700420
421 List<OutboundPacket> packets = new ArrayList<>();
422
423 @Override
Jonathan Hartb4758a92014-09-24 10:46:45 -0700424 public void emit(OutboundPacket packet) {
425 packets.add(packet);
426 }
427 }
428
Yuta HIGUCHIf1f2ac02014-11-26 14:02:22 -0800429 class TestDeviceService extends DeviceServiceAdapter {
Jonathan Hartb4758a92014-09-24 10:46:45 -0700430
431 List<Device> devices = Lists.newArrayList();
432 Multimap<DeviceId, Port> devicePorts = HashMultimap.create();
433
434 void addDevice(Device device, Set<Port> ports) {
435 devices.add(device);
436 for (Port p : ports) {
437 devicePorts.put(device.id(), p);
438 }
439 }
440
441 @Override
Jonathan Hartb4758a92014-09-24 10:46:45 -0700442 public Iterable<Device> getDevices() {
443 return devices;
444 }
445
446 @Override
Jonathan Hartb4758a92014-09-24 10:46:45 -0700447 public List<Port> getPorts(DeviceId deviceId) {
448 List<Port> ports = Lists.newArrayList();
449 for (Port p : devicePorts.get(deviceId)) {
450 ports.add(p);
451 }
452 return ports;
453 }
Jonathan Hartb4758a92014-09-24 10:46:45 -0700454 }
455}