blob: 22900cc156939c3f4d2073c50d29f0e351f9e1ec [file] [log] [blame]
Patrick Liuab1e6062014-05-05 11:12:13 -07001package net.onrc.onos.core.devicemanager;
2
3import static org.easymock.EasyMock.anyObject;
4import static org.easymock.EasyMock.createMock;
5import static org.easymock.EasyMock.createNiceMock;
6import static org.easymock.EasyMock.eq;
7import static org.easymock.EasyMock.expect;
8import static org.easymock.EasyMock.expectLastCall;
9import static org.easymock.EasyMock.replay;
Patrick Liuab1e6062014-05-05 11:12:13 -070010
11import java.util.Date;
12
13import net.floodlightcontroller.core.IFloodlightProviderService;
14import net.floodlightcontroller.core.IListener.Command;
15import net.floodlightcontroller.core.IOFSwitch;
16import net.floodlightcontroller.core.IUpdate;
17import net.floodlightcontroller.core.module.FloodlightModuleContext;
TeruU5d2c9392014-06-09 20:02:02 -070018import net.floodlightcontroller.core.module.FloodlightModuleException;
Patrick Liuab1e6062014-05-05 11:12:13 -070019import net.floodlightcontroller.test.FloodlightTestCase;
20import net.floodlightcontroller.util.MACAddress;
21import net.onrc.onos.core.datagrid.IDatagridService;
22import net.onrc.onos.core.datagrid.IEventChannel;
23import net.onrc.onos.core.datagrid.IEventChannelListener;
Patrick Liuab1e6062014-05-05 11:12:13 -070024import net.onrc.onos.core.packet.ARP;
25import net.onrc.onos.core.packet.DHCP;
26import net.onrc.onos.core.packet.Data;
27import net.onrc.onos.core.packet.Ethernet;
28import net.onrc.onos.core.packet.IPacket;
29import net.onrc.onos.core.packet.IPv4;
30import net.onrc.onos.core.packet.UDP;
31import net.onrc.onos.core.registry.IControllerRegistryService;
32import net.onrc.onos.core.topology.ITopologyListener;
33import net.onrc.onos.core.topology.ITopologyService;
TeruU5d2c9392014-06-09 20:02:02 -070034import net.onrc.onos.core.topology.MockTopology;
Patrick Liuab1e6062014-05-05 11:12:13 -070035
36import org.easymock.EasyMock;
37import org.junit.After;
38import org.junit.Before;
39import org.junit.Test;
40import org.openflow.protocol.OFPacketIn;
41import org.openflow.protocol.OFType;
42
43/**
Patrick Liuab1e6062014-05-05 11:12:13 -070044 * Unit tests for the Device Manager module (OnosDeviceManger).
45 * These test cases check the result of add/delete device and
46 * verify the result of processPacketIn through inject faked packets
47 * floodLightProvider, datagridService, networkGraphService,
48 * controllerRegistryService, eventChannel are mocked out.
49 */
50public class OnosDeviceManagerTest extends FloodlightTestCase {
51 private IPacket pkt0, pkt1, pkt2, pkt3, pkt4;
52 private IOFSwitch sw1;
53 private long sw1Dpid;
TeruU5d2c9392014-06-09 20:02:02 -070054 private long sw1DevPort, sw1DevPort2;
Patrick Liuab1e6062014-05-05 11:12:13 -070055 private OnosDeviceManager odm;
TeruU5d2c9392014-06-09 20:02:02 -070056 private OFPacketIn pktIn, pktIn2;
Patrick Liuab1e6062014-05-05 11:12:13 -070057 private FloodlightModuleContext modContext;
58 private ITopologyService networkGraphService;
59 private IEventChannel<Long, OnosDevice> eventChannel;
60 private IFloodlightProviderService floodLightProvider;
61 private Date lastSeenTimestamp;
62
63 @Override
64 @Before
Ray Milkeyff735142014-05-22 19:06:02 -070065 @SuppressWarnings("unchecked")
Patrick Liuab1e6062014-05-05 11:12:13 -070066 public void setUp() throws Exception {
67 super.setUp();
68 MockTopology topology = new MockTopology();
69 IDatagridService datagridService;
70 IControllerRegistryService controllerRegistryService;
71
TeruU5d2c9392014-06-09 20:02:02 -070072 topology.createSampleTopology2();
Patrick Liuab1e6062014-05-05 11:12:13 -070073 modContext = new FloodlightModuleContext();
74
75 floodLightProvider = createMock(IFloodlightProviderService.class);
76 datagridService = createMock(IDatagridService.class);
77 networkGraphService = createMock(ITopologyService.class);
78 controllerRegistryService = createMock(IControllerRegistryService.class);
79 eventChannel = createMock(IEventChannel.class);
80 expect(networkGraphService.getTopology()).andReturn(topology).anyTimes();
81 networkGraphService.registerTopologyListener(anyObject(ITopologyListener.class));
82 expectLastCall();
83
84 expect(datagridService.createChannel("onos.device", Long.class, OnosDevice.class))
85 .andReturn(eventChannel).once();
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -070086 expect(topology.getOutgoingLink(1L, 100L)).andReturn(null).anyTimes();
Patrick Liuab1e6062014-05-05 11:12:13 -070087 expect(datagridService.addListener(
88 eq("onos.device"),
89 anyObject(IEventChannelListener.class),
90 eq(Long.class),
91 eq(OnosDevice.class)))
92 .andReturn(eventChannel).once();
93
94 replay(datagridService);
95 replay(networkGraphService);
96 replay(controllerRegistryService);
97
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -070098 modContext.addService(IDatagridService.class, datagridService);
99 modContext.addService(ITopologyService.class, networkGraphService);
Patrick Liuab1e6062014-05-05 11:12:13 -0700100 modContext.addService(IFloodlightProviderService.class, floodLightProvider);
101 modContext.getServiceImpl(IFloodlightProviderService.class);
102 sw1Dpid = 1L;
103 sw1 = createMockSwitch(sw1Dpid);
104 replay(sw1);
105
106 sw1DevPort = 100;
TeruU5d2c9392014-06-09 20:02:02 -0700107 sw1DevPort2 = 12L;
Patrick Liuab1e6062014-05-05 11:12:13 -0700108
109 odm = new OnosDeviceManager();
110 /*
Jonathan Hart7ab71612014-05-27 13:37:31 -0700111 * Broadcast source address
Patrick Liuab1e6062014-05-05 11:12:13 -0700112 */
113 this.pkt0 = new Ethernet()
Jonathan Hart7ab71612014-05-27 13:37:31 -0700114 .setDestinationMACAddress("00:44:33:22:11:33")
115 .setSourceMACAddress("FF:FF:FF:FF:FF:FF")
Patrick Liuab1e6062014-05-05 11:12:13 -0700116 .setEtherType(Ethernet.TYPE_IPV4)
117 .setPayload(
118 new IPv4()
119 .setTtl((byte) 128)
120 .setSourceAddress("192.168.10.1")
121 .setDestinationAddress("192.168.255.255")
122 .setPayload(new UDP()
123 .setSourcePort((short) 5000)
124 .setDestinationPort((short) 5001)
125 .setPayload(new Data(new byte[]{0x01}))));
126 /*
127 * Normal IPv4 packet
128 */
129 this.pkt1 = new Ethernet()
130 .setDestinationMACAddress("00:11:22:33:44:55")
131 .setSourceMACAddress("00:44:33:22:11:00")
132 .setEtherType(Ethernet.TYPE_IPV4)
133 .setPayload(
134 new IPv4()
135 .setTtl((byte) 128)
136 .setSourceAddress("192.168.1.1")
137 .setDestinationAddress("192.168.1.2")
138 .setPayload(new UDP()
139 .setSourcePort((short) 5000)
140 .setDestinationPort((short) 5001)
141 .setPayload(new Data(new byte[]{0x01}))));
142 /*
143 * Same MAC header as pkt1,but not IP address set
144 */
145 this.pkt2 = new Ethernet()
146 .setSourceMACAddress("00:44:33:22:11:01")
147 .setDestinationMACAddress("00:11:22:33:44:55")
148 .setEtherType(Ethernet.TYPE_IPV4)
149 .setPayload(
150 new IPv4()
151 .setTtl((byte) 128)
152 .setPayload(new UDP()
153 .setSourcePort((short) 5000)
154 .setDestinationPort((short) 5001)
155 .setPayload(new Data(new byte[]{0x01}))));
156 /*
157 * DHCP packet
158 */
159 this.pkt3 = new Ethernet()
160 .setSourceMACAddress("00:44:33:22:11:01")
161 .setDestinationMACAddress("00:11:22:33:44:55")
162 .setEtherType(Ethernet.TYPE_IPV4)
163 .setPayload(
164 new IPv4()
165 .setTtl((byte) 128)
166 .setSourceAddress("192.168.1.1")
167 .setDestinationAddress("192.168.1.2")
168 .setPayload(new UDP()
169 .setSourcePort((short) 5000)
170 .setDestinationPort((short) 5001)
171 .setChecksum((short) 0)
172 .setPayload(
173 new DHCP()
174 .setOpCode(DHCP.OPCODE_REPLY)
175 .setHardwareType(DHCP.HWTYPE_ETHERNET)
176 .setHardwareAddressLength((byte) 6)
177 .setHops((byte) 0)
178 .setTransactionId(0x00003d1d)
179 .setSeconds((short) 0)
180 .setFlags((short) 0)
181 .setClientIPAddress(0)
182 .setYourIPAddress(0)
183 .setServerIPAddress(0)
184 .setGatewayIPAddress(0))));
185 /*
186 * ARP packet
187 */
188 this.pkt4 = new Ethernet()
189 .setSourceMACAddress("00:44:33:22:11:01")
190 .setDestinationMACAddress("00:11:22:33:44:55")
191 .setEtherType(Ethernet.TYPE_ARP)
192 .setPayload(
193 new ARP()
194 .setHardwareType(ARP.HW_TYPE_ETHERNET)
195 .setProtocolType(ARP.PROTO_TYPE_IP)
196 .setHardwareAddressLength((byte) 6)
197 .setProtocolAddressLength((byte) 4)
198 .setOpCode(ARP.OP_REPLY)
199 .setSenderHardwareAddress(Ethernet.toMACAddress("00:44:33:22:11:01"))
200 .setSenderProtocolAddress(IPv4.toIPv4AddressBytes("192.168.1.1"))
201 .setTargetHardwareAddress(Ethernet.toMACAddress("00:11:22:33:44:55"))
202 .setTargetProtocolAddress(IPv4.toIPv4AddressBytes("192.168.1.2")));
203
204
TeruU5d2c9392014-06-09 20:02:02 -0700205 this.pktIn = new OFPacketIn().setInPort((short) sw1DevPort);
206
207 this.pktIn2 = new OFPacketIn().setInPort((short) sw1DevPort2);
Patrick Liuab1e6062014-05-05 11:12:13 -0700208
209 lastSeenTimestamp = new Date(1);
Patrick Liuab1e6062014-05-05 11:12:13 -0700210 }
211
212 @Override
213 @After
214 public void tearDown() throws Exception {
215 }
216
217 public IOFSwitch createMockSwitch(Long id) {
218 IOFSwitch mockSwitch = createNiceMock(IOFSwitch.class);
219 expect(mockSwitch.getId()).andReturn(id).anyTimes();
220 return mockSwitch;
221 }
222
223 /**
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700224 * Test set operation on lastSeenTimstamp field in OnosDevice.
Patrick Liuab1e6062014-05-05 11:12:13 -0700225 */
226 @Test
227 public void testSetLastSeenTimestamp() {
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700228 Ethernet eth = (Ethernet) pkt1;
Patrick Liuab1e6062014-05-05 11:12:13 -0700229 OnosDevice srcDevice = odm.getSourceDeviceFromPacket(eth, sw1Dpid, sw1DevPort);
230
231 floodLightProvider.addOFMessageListener(EasyMock.eq(OFType.PACKET_IN), EasyMock.isA(OnosDeviceManager.class));
232 srcDevice.setLastSeenTimestamp(lastSeenTimestamp);
233 assertEquals(lastSeenTimestamp, srcDevice.getLastSeenTimestamp());
234 }
235 /**
236 * test the functionality to get the source device from Packet header
237 * information.
238 */
239 @Test
240 public void testGetSourceDeviceFromPacket() {
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700241 byte[] address = new byte[] {0x00, 0x44, 0x33, 0x22, 0x11, 0x01};
Patrick Liuab1e6062014-05-05 11:12:13 -0700242 MACAddress srcMac = new MACAddress(address);
Patrick Liuab1e6062014-05-05 11:12:13 -0700243 OnosDevice dev1 = new OnosDevice(srcMac,
244 null,
Patrick Liuab1e6062014-05-05 11:12:13 -0700245 sw1Dpid,
246 sw1DevPort,
247 null);
248
249 /*
250 * test DHCP packet case
251 */
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700252 Ethernet eth = (Ethernet) pkt3;
Patrick Liuab1e6062014-05-05 11:12:13 -0700253 OnosDevice dev2 = odm.getSourceDeviceFromPacket(eth, sw1Dpid, sw1DevPort);
254 assertEquals(dev1, dev2);
255
256 /*
257 * test ARP packet case
258 */
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700259 eth = (Ethernet) pkt4;
Patrick Liuab1e6062014-05-05 11:12:13 -0700260 dev2 = odm.getSourceDeviceFromPacket(eth, sw1Dpid, sw1DevPort);
261 assertEquals(dev1, dev2);
262 }
263
264 /**
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700265 * This test will invoke addOnosDevice to add a new device through Packet pkt1.
TeruU5d2c9392014-06-09 20:02:02 -0700266 * @throws FloodlightModuleException
Patrick Liuab1e6062014-05-05 11:12:13 -0700267 */
268 @Test
TeruU5d2c9392014-06-09 20:02:02 -0700269 public void testProcessPacketInAddNewDevice() throws FloodlightModuleException {
270 floodLightProvider.addOFMessageListener(EasyMock.eq(OFType.PACKET_IN),
271 EasyMock.isA(OnosDeviceManager.class));
Patrick Liuab1e6062014-05-05 11:12:13 -0700272 EasyMock.expectLastCall();
273 floodLightProvider.publishUpdate(EasyMock.isA(IUpdate.class));
274 EasyMock.expectLastCall();
TeruU5d2c9392014-06-09 20:02:02 -0700275 replay(floodLightProvider);
Patrick Liuab1e6062014-05-05 11:12:13 -0700276
TeruU5d2c9392014-06-09 20:02:02 -0700277 odm.init(modContext);
278 odm.startUp(modContext);
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700279 Command cmd = odm.processPacketIn(sw1, pktIn, (Ethernet) pkt1);
Patrick Liuab1e6062014-05-05 11:12:13 -0700280 assertEquals(Command.CONTINUE, cmd);
281
TeruU5d2c9392014-06-09 20:02:02 -0700282 EasyMock.verify(floodLightProvider);
Patrick Liuab1e6062014-05-05 11:12:13 -0700283 }
284
285 /**
TeruU5d2c9392014-06-09 20:02:02 -0700286 * Test ProcessPacket function.
287 * @throws FloodlightModuleException
288 */
289 @Test
290 public void testProcessPacketInHasLink() throws FloodlightModuleException {
291 floodLightProvider.addOFMessageListener(EasyMock.eq(OFType.PACKET_IN),
292 EasyMock.isA(OnosDeviceManager.class));
293 EasyMock.expectLastCall();
294 replay(floodLightProvider);
295
296 odm.init(modContext);
297 odm.startUp(modContext);
298 Command cmd = odm.processPacketIn(sw1, pktIn2, (Ethernet) pkt1);
299 assertEquals(Command.CONTINUE, cmd);
300
301 EasyMock.verify(floodLightProvider);
302 }
303
304 /**
305 * Test return Command.STOP path in processPacketIn method by injecting a broadcast packet.
Patrick Liuab1e6062014-05-05 11:12:13 -0700306 */
307 @Test
308 public void testProcessPacketInStop() {
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700309 Command cmd = odm.processPacketIn(sw1, pktIn, (Ethernet) pkt0);
Patrick Liuab1e6062014-05-05 11:12:13 -0700310 assertEquals(Command.STOP, cmd);
311 }
312
313 /**
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700314 * Test add a device from the information from packet.
TeruU5d2c9392014-06-09 20:02:02 -0700315 * @throws FloodlightModuleException
Patrick Liuab1e6062014-05-05 11:12:13 -0700316 */
317 @Test
TeruU5d2c9392014-06-09 20:02:02 -0700318 public void testAddOnosDevice() throws FloodlightModuleException {
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700319 Ethernet eth = (Ethernet) pkt1;
Patrick Liuab1e6062014-05-05 11:12:13 -0700320 Long longmac = eth.getSourceMAC().toLong();
321 OnosDevice srcDevice = odm.getSourceDeviceFromPacket(eth, sw1Dpid, sw1DevPort);
322
323 floodLightProvider.addOFMessageListener(EasyMock.eq(OFType.PACKET_IN), EasyMock.isA(OnosDeviceManager.class));
324 EasyMock.expectLastCall();
Patrick Liuab1e6062014-05-05 11:12:13 -0700325 floodLightProvider.publishUpdate(EasyMock.isA(IUpdate.class));
326 EasyMock.expectLastCall();
TeruU5d2c9392014-06-09 20:02:02 -0700327 replay(floodLightProvider);
Patrick Liuab1e6062014-05-05 11:12:13 -0700328
TeruU5d2c9392014-06-09 20:02:02 -0700329 odm.init(modContext);
330 odm.startUp(modContext);
Patrick Liuab1e6062014-05-05 11:12:13 -0700331 odm.addOnosDevice(longmac, srcDevice);
332
TeruU5d2c9392014-06-09 20:02:02 -0700333 EasyMock.verify(floodLightProvider);
Patrick Liuab1e6062014-05-05 11:12:13 -0700334 }
335
336 /**
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700337 * Test delete a device.
TeruU5d2c9392014-06-09 20:02:02 -0700338 * @throws FloodlightModuleException
Patrick Liuab1e6062014-05-05 11:12:13 -0700339 */
340 @Test
TeruU5d2c9392014-06-09 20:02:02 -0700341 public void testDeleteOnosDevice() throws FloodlightModuleException {
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700342 Ethernet eth = (Ethernet) pkt1;
Patrick Liuab1e6062014-05-05 11:12:13 -0700343 OnosDevice srcDevice = odm.getSourceDeviceFromPacket(eth, sw1Dpid, sw1DevPort);
344
345 floodLightProvider.addOFMessageListener(EasyMock.eq(OFType.PACKET_IN), EasyMock.isA(OnosDeviceManager.class));
346 EasyMock.expectLastCall();
Patrick Liuab1e6062014-05-05 11:12:13 -0700347 floodLightProvider.publishUpdate(EasyMock.isA(IUpdate.class));
348 EasyMock.expectLastCall();
TeruU5d2c9392014-06-09 20:02:02 -0700349 replay(floodLightProvider);
Patrick Liuab1e6062014-05-05 11:12:13 -0700350
TeruU5d2c9392014-06-09 20:02:02 -0700351 odm.init(modContext);
352 odm.startUp(modContext);
Patrick Liuab1e6062014-05-05 11:12:13 -0700353 odm.deleteOnosDevice(srcDevice);
354
TeruU5d2c9392014-06-09 20:02:02 -0700355 EasyMock.verify(floodLightProvider);
Patrick Liuab1e6062014-05-05 11:12:13 -0700356 }
357
358 /**
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700359 * Test delete a device by using its source mac address.
TeruU5d2c9392014-06-09 20:02:02 -0700360 * @throws FloodlightModuleException
Patrick Liuab1e6062014-05-05 11:12:13 -0700361 */
362 @Test
TeruU5d2c9392014-06-09 20:02:02 -0700363 public void testDeleteOnosDeviceByMac() throws FloodlightModuleException {
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700364 Ethernet eth = (Ethernet) pkt1;
Patrick Liuab1e6062014-05-05 11:12:13 -0700365 MACAddress mac = eth.getSourceMAC();
Patrick Liuab1e6062014-05-05 11:12:13 -0700366
367 floodLightProvider.addOFMessageListener(EasyMock.eq(OFType.PACKET_IN), EasyMock.isA(OnosDeviceManager.class));
368 EasyMock.expectLastCall();
Patrick Liuab1e6062014-05-05 11:12:13 -0700369 floodLightProvider.publishUpdate(EasyMock.isA(IUpdate.class));
370 EasyMock.expectLastCall();
TeruU5d2c9392014-06-09 20:02:02 -0700371 replay(floodLightProvider);
Patrick Liuab1e6062014-05-05 11:12:13 -0700372
TeruU5d2c9392014-06-09 20:02:02 -0700373 odm.init(modContext);
374 odm.startUp(modContext);
Patrick Liuab1e6062014-05-05 11:12:13 -0700375 odm.deleteOnosDeviceByMac(mac);
TeruU5d2c9392014-06-09 20:02:02 -0700376
377 EasyMock.verify(floodLightProvider);
Patrick Liuab1e6062014-05-05 11:12:13 -0700378 }
379}