blob: 39e739ffb7ce2b3bcfcadac25783351316056466 [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;
Yuta HIGUCHI8f3dfa32014-06-25 00:14:25 -070035import net.onrc.onos.core.util.Dpid;
36import net.onrc.onos.core.util.PortNumber;
Patrick Liuab1e6062014-05-05 11:12:13 -070037
38import org.easymock.EasyMock;
39import org.junit.After;
40import org.junit.Before;
41import org.junit.Test;
42import org.openflow.protocol.OFPacketIn;
43import org.openflow.protocol.OFType;
44
45/**
Patrick Liuab1e6062014-05-05 11:12:13 -070046 * Unit tests for the Device Manager module (OnosDeviceManger).
47 * These test cases check the result of add/delete device and
48 * verify the result of processPacketIn through inject faked packets
49 * floodLightProvider, datagridService, networkGraphService,
50 * controllerRegistryService, eventChannel are mocked out.
51 */
52public class OnosDeviceManagerTest extends FloodlightTestCase {
53 private IPacket pkt0, pkt1, pkt2, pkt3, pkt4;
54 private IOFSwitch sw1;
55 private long sw1Dpid;
TeruU5d2c9392014-06-09 20:02:02 -070056 private long sw1DevPort, sw1DevPort2;
Patrick Liuab1e6062014-05-05 11:12:13 -070057 private OnosDeviceManager odm;
TeruU5d2c9392014-06-09 20:02:02 -070058 private OFPacketIn pktIn, pktIn2;
Patrick Liuab1e6062014-05-05 11:12:13 -070059 private FloodlightModuleContext modContext;
60 private ITopologyService networkGraphService;
61 private IEventChannel<Long, OnosDevice> eventChannel;
62 private IFloodlightProviderService floodLightProvider;
63 private Date lastSeenTimestamp;
64
65 @Override
66 @Before
Ray Milkeyff735142014-05-22 19:06:02 -070067 @SuppressWarnings("unchecked")
Patrick Liuab1e6062014-05-05 11:12:13 -070068 public void setUp() throws Exception {
69 super.setUp();
70 MockTopology topology = new MockTopology();
71 IDatagridService datagridService;
72 IControllerRegistryService controllerRegistryService;
73
TeruU5d2c9392014-06-09 20:02:02 -070074 topology.createSampleTopology2();
Patrick Liuab1e6062014-05-05 11:12:13 -070075 modContext = new FloodlightModuleContext();
76
77 floodLightProvider = createMock(IFloodlightProviderService.class);
78 datagridService = createMock(IDatagridService.class);
79 networkGraphService = createMock(ITopologyService.class);
80 controllerRegistryService = createMock(IControllerRegistryService.class);
81 eventChannel = createMock(IEventChannel.class);
82 expect(networkGraphService.getTopology()).andReturn(topology).anyTimes();
83 networkGraphService.registerTopologyListener(anyObject(ITopologyListener.class));
84 expectLastCall();
85
86 expect(datagridService.createChannel("onos.device", Long.class, OnosDevice.class))
87 .andReturn(eventChannel).once();
Yuta HIGUCHI8f3dfa32014-06-25 00:14:25 -070088 expect(topology.getOutgoingLink(new Dpid(1L), new PortNumber((short) 100))).andReturn(null).anyTimes();
Patrick Liuab1e6062014-05-05 11:12:13 -070089 expect(datagridService.addListener(
90 eq("onos.device"),
91 anyObject(IEventChannelListener.class),
92 eq(Long.class),
93 eq(OnosDevice.class)))
94 .andReturn(eventChannel).once();
95
96 replay(datagridService);
97 replay(networkGraphService);
98 replay(controllerRegistryService);
99
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700100 modContext.addService(IDatagridService.class, datagridService);
101 modContext.addService(ITopologyService.class, networkGraphService);
Patrick Liuab1e6062014-05-05 11:12:13 -0700102 modContext.addService(IFloodlightProviderService.class, floodLightProvider);
103 modContext.getServiceImpl(IFloodlightProviderService.class);
104 sw1Dpid = 1L;
105 sw1 = createMockSwitch(sw1Dpid);
106 replay(sw1);
107
108 sw1DevPort = 100;
TeruU5d2c9392014-06-09 20:02:02 -0700109 sw1DevPort2 = 12L;
Patrick Liuab1e6062014-05-05 11:12:13 -0700110
111 odm = new OnosDeviceManager();
112 /*
Jonathan Hart7ab71612014-05-27 13:37:31 -0700113 * Broadcast source address
Patrick Liuab1e6062014-05-05 11:12:13 -0700114 */
115 this.pkt0 = new Ethernet()
Jonathan Hart7ab71612014-05-27 13:37:31 -0700116 .setDestinationMACAddress("00:44:33:22:11:33")
117 .setSourceMACAddress("FF:FF:FF:FF:FF:FF")
Patrick Liuab1e6062014-05-05 11:12:13 -0700118 .setEtherType(Ethernet.TYPE_IPV4)
119 .setPayload(
120 new IPv4()
121 .setTtl((byte) 128)
122 .setSourceAddress("192.168.10.1")
123 .setDestinationAddress("192.168.255.255")
124 .setPayload(new UDP()
125 .setSourcePort((short) 5000)
126 .setDestinationPort((short) 5001)
127 .setPayload(new Data(new byte[]{0x01}))));
128 /*
129 * Normal IPv4 packet
130 */
131 this.pkt1 = new Ethernet()
132 .setDestinationMACAddress("00:11:22:33:44:55")
133 .setSourceMACAddress("00:44:33:22:11:00")
134 .setEtherType(Ethernet.TYPE_IPV4)
135 .setPayload(
136 new IPv4()
137 .setTtl((byte) 128)
138 .setSourceAddress("192.168.1.1")
139 .setDestinationAddress("192.168.1.2")
140 .setPayload(new UDP()
141 .setSourcePort((short) 5000)
142 .setDestinationPort((short) 5001)
143 .setPayload(new Data(new byte[]{0x01}))));
144 /*
145 * Same MAC header as pkt1,but not IP address set
146 */
147 this.pkt2 = new Ethernet()
148 .setSourceMACAddress("00:44:33:22:11:01")
149 .setDestinationMACAddress("00:11:22:33:44:55")
150 .setEtherType(Ethernet.TYPE_IPV4)
151 .setPayload(
152 new IPv4()
153 .setTtl((byte) 128)
154 .setPayload(new UDP()
155 .setSourcePort((short) 5000)
156 .setDestinationPort((short) 5001)
157 .setPayload(new Data(new byte[]{0x01}))));
158 /*
159 * DHCP packet
160 */
161 this.pkt3 = new Ethernet()
162 .setSourceMACAddress("00:44:33:22:11:01")
163 .setDestinationMACAddress("00:11:22:33:44:55")
164 .setEtherType(Ethernet.TYPE_IPV4)
165 .setPayload(
166 new IPv4()
167 .setTtl((byte) 128)
168 .setSourceAddress("192.168.1.1")
169 .setDestinationAddress("192.168.1.2")
170 .setPayload(new UDP()
171 .setSourcePort((short) 5000)
172 .setDestinationPort((short) 5001)
173 .setChecksum((short) 0)
174 .setPayload(
175 new DHCP()
176 .setOpCode(DHCP.OPCODE_REPLY)
177 .setHardwareType(DHCP.HWTYPE_ETHERNET)
178 .setHardwareAddressLength((byte) 6)
179 .setHops((byte) 0)
180 .setTransactionId(0x00003d1d)
181 .setSeconds((short) 0)
182 .setFlags((short) 0)
183 .setClientIPAddress(0)
184 .setYourIPAddress(0)
185 .setServerIPAddress(0)
186 .setGatewayIPAddress(0))));
187 /*
188 * ARP packet
189 */
190 this.pkt4 = new Ethernet()
191 .setSourceMACAddress("00:44:33:22:11:01")
192 .setDestinationMACAddress("00:11:22:33:44:55")
193 .setEtherType(Ethernet.TYPE_ARP)
194 .setPayload(
195 new ARP()
196 .setHardwareType(ARP.HW_TYPE_ETHERNET)
197 .setProtocolType(ARP.PROTO_TYPE_IP)
198 .setHardwareAddressLength((byte) 6)
199 .setProtocolAddressLength((byte) 4)
200 .setOpCode(ARP.OP_REPLY)
201 .setSenderHardwareAddress(Ethernet.toMACAddress("00:44:33:22:11:01"))
202 .setSenderProtocolAddress(IPv4.toIPv4AddressBytes("192.168.1.1"))
203 .setTargetHardwareAddress(Ethernet.toMACAddress("00:11:22:33:44:55"))
204 .setTargetProtocolAddress(IPv4.toIPv4AddressBytes("192.168.1.2")));
205
206
TeruU5d2c9392014-06-09 20:02:02 -0700207 this.pktIn = new OFPacketIn().setInPort((short) sw1DevPort);
208
209 this.pktIn2 = new OFPacketIn().setInPort((short) sw1DevPort2);
Patrick Liuab1e6062014-05-05 11:12:13 -0700210
211 lastSeenTimestamp = new Date(1);
Patrick Liuab1e6062014-05-05 11:12:13 -0700212 }
213
214 @Override
215 @After
216 public void tearDown() throws Exception {
217 }
218
219 public IOFSwitch createMockSwitch(Long id) {
220 IOFSwitch mockSwitch = createNiceMock(IOFSwitch.class);
221 expect(mockSwitch.getId()).andReturn(id).anyTimes();
222 return mockSwitch;
223 }
224
225 /**
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700226 * Test set operation on lastSeenTimstamp field in OnosDevice.
Patrick Liuab1e6062014-05-05 11:12:13 -0700227 */
228 @Test
229 public void testSetLastSeenTimestamp() {
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700230 Ethernet eth = (Ethernet) pkt1;
Patrick Liuab1e6062014-05-05 11:12:13 -0700231 OnosDevice srcDevice = odm.getSourceDeviceFromPacket(eth, sw1Dpid, sw1DevPort);
232
233 floodLightProvider.addOFMessageListener(EasyMock.eq(OFType.PACKET_IN), EasyMock.isA(OnosDeviceManager.class));
234 srcDevice.setLastSeenTimestamp(lastSeenTimestamp);
235 assertEquals(lastSeenTimestamp, srcDevice.getLastSeenTimestamp());
236 }
237 /**
238 * test the functionality to get the source device from Packet header
239 * information.
240 */
241 @Test
242 public void testGetSourceDeviceFromPacket() {
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700243 byte[] address = new byte[] {0x00, 0x44, 0x33, 0x22, 0x11, 0x01};
Patrick Liuab1e6062014-05-05 11:12:13 -0700244 MACAddress srcMac = new MACAddress(address);
Patrick Liuab1e6062014-05-05 11:12:13 -0700245 OnosDevice dev1 = new OnosDevice(srcMac,
246 null,
Patrick Liuab1e6062014-05-05 11:12:13 -0700247 sw1Dpid,
248 sw1DevPort,
249 null);
250
251 /*
252 * test DHCP packet case
253 */
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700254 Ethernet eth = (Ethernet) pkt3;
Patrick Liuab1e6062014-05-05 11:12:13 -0700255 OnosDevice dev2 = odm.getSourceDeviceFromPacket(eth, sw1Dpid, sw1DevPort);
256 assertEquals(dev1, dev2);
257
258 /*
259 * test ARP packet case
260 */
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700261 eth = (Ethernet) pkt4;
Patrick Liuab1e6062014-05-05 11:12:13 -0700262 dev2 = odm.getSourceDeviceFromPacket(eth, sw1Dpid, sw1DevPort);
263 assertEquals(dev1, dev2);
264 }
265
266 /**
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700267 * This test will invoke addOnosDevice to add a new device through Packet pkt1.
TeruU5d2c9392014-06-09 20:02:02 -0700268 * @throws FloodlightModuleException
Patrick Liuab1e6062014-05-05 11:12:13 -0700269 */
270 @Test
TeruU5d2c9392014-06-09 20:02:02 -0700271 public void testProcessPacketInAddNewDevice() throws FloodlightModuleException {
272 floodLightProvider.addOFMessageListener(EasyMock.eq(OFType.PACKET_IN),
273 EasyMock.isA(OnosDeviceManager.class));
Patrick Liuab1e6062014-05-05 11:12:13 -0700274 EasyMock.expectLastCall();
275 floodLightProvider.publishUpdate(EasyMock.isA(IUpdate.class));
276 EasyMock.expectLastCall();
TeruU5d2c9392014-06-09 20:02:02 -0700277 replay(floodLightProvider);
Patrick Liuab1e6062014-05-05 11:12:13 -0700278
TeruU5d2c9392014-06-09 20:02:02 -0700279 odm.init(modContext);
280 odm.startUp(modContext);
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700281 Command cmd = odm.processPacketIn(sw1, pktIn, (Ethernet) pkt1);
Patrick Liuab1e6062014-05-05 11:12:13 -0700282 assertEquals(Command.CONTINUE, cmd);
283
TeruU5d2c9392014-06-09 20:02:02 -0700284 EasyMock.verify(floodLightProvider);
Patrick Liuab1e6062014-05-05 11:12:13 -0700285 }
286
287 /**
TeruU5d2c9392014-06-09 20:02:02 -0700288 * Test ProcessPacket function.
289 * @throws FloodlightModuleException
290 */
291 @Test
292 public void testProcessPacketInHasLink() throws FloodlightModuleException {
293 floodLightProvider.addOFMessageListener(EasyMock.eq(OFType.PACKET_IN),
294 EasyMock.isA(OnosDeviceManager.class));
295 EasyMock.expectLastCall();
296 replay(floodLightProvider);
297
298 odm.init(modContext);
299 odm.startUp(modContext);
300 Command cmd = odm.processPacketIn(sw1, pktIn2, (Ethernet) pkt1);
301 assertEquals(Command.CONTINUE, cmd);
302
303 EasyMock.verify(floodLightProvider);
304 }
305
306 /**
307 * Test return Command.STOP path in processPacketIn method by injecting a broadcast packet.
Patrick Liuab1e6062014-05-05 11:12:13 -0700308 */
309 @Test
310 public void testProcessPacketInStop() {
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700311 Command cmd = odm.processPacketIn(sw1, pktIn, (Ethernet) pkt0);
Patrick Liuab1e6062014-05-05 11:12:13 -0700312 assertEquals(Command.STOP, cmd);
313 }
314
315 /**
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700316 * Test add a device from the information from packet.
TeruU5d2c9392014-06-09 20:02:02 -0700317 * @throws FloodlightModuleException
Patrick Liuab1e6062014-05-05 11:12:13 -0700318 */
319 @Test
TeruU5d2c9392014-06-09 20:02:02 -0700320 public void testAddOnosDevice() throws FloodlightModuleException {
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700321 Ethernet eth = (Ethernet) pkt1;
Patrick Liuab1e6062014-05-05 11:12:13 -0700322 Long longmac = eth.getSourceMAC().toLong();
323 OnosDevice srcDevice = odm.getSourceDeviceFromPacket(eth, sw1Dpid, sw1DevPort);
324
325 floodLightProvider.addOFMessageListener(EasyMock.eq(OFType.PACKET_IN), EasyMock.isA(OnosDeviceManager.class));
326 EasyMock.expectLastCall();
Patrick Liuab1e6062014-05-05 11:12:13 -0700327 floodLightProvider.publishUpdate(EasyMock.isA(IUpdate.class));
328 EasyMock.expectLastCall();
TeruU5d2c9392014-06-09 20:02:02 -0700329 replay(floodLightProvider);
Patrick Liuab1e6062014-05-05 11:12:13 -0700330
TeruU5d2c9392014-06-09 20:02:02 -0700331 odm.init(modContext);
332 odm.startUp(modContext);
Patrick Liuab1e6062014-05-05 11:12:13 -0700333 odm.addOnosDevice(longmac, srcDevice);
334
TeruU5d2c9392014-06-09 20:02:02 -0700335 EasyMock.verify(floodLightProvider);
Patrick Liuab1e6062014-05-05 11:12:13 -0700336 }
337
338 /**
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700339 * Test delete a device.
TeruU5d2c9392014-06-09 20:02:02 -0700340 * @throws FloodlightModuleException
Patrick Liuab1e6062014-05-05 11:12:13 -0700341 */
342 @Test
TeruU5d2c9392014-06-09 20:02:02 -0700343 public void testDeleteOnosDevice() throws FloodlightModuleException {
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700344 Ethernet eth = (Ethernet) pkt1;
Patrick Liuab1e6062014-05-05 11:12:13 -0700345 OnosDevice srcDevice = odm.getSourceDeviceFromPacket(eth, sw1Dpid, sw1DevPort);
346
347 floodLightProvider.addOFMessageListener(EasyMock.eq(OFType.PACKET_IN), EasyMock.isA(OnosDeviceManager.class));
348 EasyMock.expectLastCall();
Patrick Liuab1e6062014-05-05 11:12:13 -0700349 floodLightProvider.publishUpdate(EasyMock.isA(IUpdate.class));
350 EasyMock.expectLastCall();
TeruU5d2c9392014-06-09 20:02:02 -0700351 replay(floodLightProvider);
Patrick Liuab1e6062014-05-05 11:12:13 -0700352
TeruU5d2c9392014-06-09 20:02:02 -0700353 odm.init(modContext);
354 odm.startUp(modContext);
Patrick Liuab1e6062014-05-05 11:12:13 -0700355 odm.deleteOnosDevice(srcDevice);
356
TeruU5d2c9392014-06-09 20:02:02 -0700357 EasyMock.verify(floodLightProvider);
Patrick Liuab1e6062014-05-05 11:12:13 -0700358 }
359
360 /**
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700361 * Test delete a device by using its source mac address.
TeruU5d2c9392014-06-09 20:02:02 -0700362 * @throws FloodlightModuleException
Patrick Liuab1e6062014-05-05 11:12:13 -0700363 */
364 @Test
TeruU5d2c9392014-06-09 20:02:02 -0700365 public void testDeleteOnosDeviceByMac() throws FloodlightModuleException {
Yuta HIGUCHI91a8f502014-06-17 10:15:29 -0700366 Ethernet eth = (Ethernet) pkt1;
Patrick Liuab1e6062014-05-05 11:12:13 -0700367 MACAddress mac = eth.getSourceMAC();
Patrick Liuab1e6062014-05-05 11:12:13 -0700368
369 floodLightProvider.addOFMessageListener(EasyMock.eq(OFType.PACKET_IN), EasyMock.isA(OnosDeviceManager.class));
370 EasyMock.expectLastCall();
Patrick Liuab1e6062014-05-05 11:12:13 -0700371 floodLightProvider.publishUpdate(EasyMock.isA(IUpdate.class));
372 EasyMock.expectLastCall();
TeruU5d2c9392014-06-09 20:02:02 -0700373 replay(floodLightProvider);
Patrick Liuab1e6062014-05-05 11:12:13 -0700374
TeruU5d2c9392014-06-09 20:02:02 -0700375 odm.init(modContext);
376 odm.startUp(modContext);
Patrick Liuab1e6062014-05-05 11:12:13 -0700377 odm.deleteOnosDeviceByMac(mac);
TeruU5d2c9392014-06-09 20:02:02 -0700378
379 EasyMock.verify(floodLightProvider);
Patrick Liuab1e6062014-05-05 11:12:13 -0700380 }
381}