blob: 73d37eaefa6822f3cdfa79cf5ac86ba4c5330415 [file] [log] [blame]
TeruU8b2d1672014-04-25 17:02:56 -07001package net.onrc.onos.apps.proxyarp;
2
3import static org.junit.Assert.assertEquals;
4import static org.junit.Assert.assertTrue;
5
6import java.net.InetAddress;
7import java.net.UnknownHostException;
8import java.nio.ByteBuffer;
9import java.util.ArrayList;
10import java.util.HashMap;
11import java.util.List;
12import java.util.Map;
13
14import junit.framework.Assert;
15import net.floodlightcontroller.core.IFloodlightProviderService;
16import net.floodlightcontroller.core.module.FloodlightModuleContext;
17import net.floodlightcontroller.restserver.IRestApiService;
18import net.floodlightcontroller.util.MACAddress;
19import net.onrc.onos.api.packet.IPacketService;
20import net.onrc.onos.core.datagrid.IDatagridService;
21import net.onrc.onos.core.datagrid.IEventChannel;
22import net.onrc.onos.core.datagrid.IEventChannelListener;
23import net.onrc.onos.core.devicemanager.IOnosDeviceService;
24import net.onrc.onos.core.flowprogrammer.IFlowPusherService;
25import net.onrc.onos.core.main.config.IConfigInfoService;
26import net.onrc.onos.core.packet.ARP;
27import net.onrc.onos.core.packet.Ethernet;
28import net.onrc.onos.core.packet.IPv4;
29import net.onrc.onos.core.packetservice.SinglePacketOutNotification;
30import net.onrc.onos.core.topology.Device;
31import net.onrc.onos.core.topology.INetworkGraphService;
32import net.onrc.onos.core.topology.NetworkGraph;
33import net.onrc.onos.core.topology.Port;
34import net.onrc.onos.core.topology.Switch;
35
36import org.easymock.EasyMock;
37import org.junit.After;
38import org.junit.Before;
39import org.junit.Test;
40import org.junit.runner.RunWith;
41import org.powermock.api.easymock.PowerMock;
42import org.powermock.core.classloader.annotations.PrepareForTest;
43import org.powermock.modules.junit4.PowerMockRunner;
44
45@RunWith(PowerMockRunner.class)
46@PrepareForTest({ProxyArpManager.class, ArpCache.class})
47public class ProxyArpManagerTest {
48 String defaultStrAgingMsec = "60000";
49 String defaultStrCleanupMsec = "60000";
50
51 ProxyArpManager arpManager;
52 FloodlightModuleContext context;
53 IFloodlightProviderService floodligthProviderService;
54 IConfigInfoService configInfoService;
55 IRestApiService restApiService;
56 IDatagridService datagridService;
57 IFlowPusherService flowPusherService;
58 INetworkGraphService networkGraphService;
59 IOnosDeviceService onosDeviceService;
60 IPacketService packetService;
61 Map<String, String> config;
62
63 String srcStrMac, dstStrMac, cachedStrMac1, cachedStrMac2, srcStrIp, dstStrIp, cachedStrIp1, cachedStrIp2;
64 byte[] srcByteMac, dstByteMac;
65 MACAddress dstMac, srcMac, cachedMac1, cachedMac2;
66 InetAddress srcIp, dstIp, cachedIp1, cachedIp2;
67 Long sw1Dpid;
68 Short sw1Inport, sw1Outport;
69 Short vlanId;
70 ARP arpRequest, arpReply, rarpRequest;
71 Ethernet ethArpRequest, ethArpReply, ethRarpRequest, ethArpOtherOp;
72
73 NetworkGraph ng;
74 IEventChannel eg;
75 IEventChannelListener el;
76 Device dev1;
77 Port inPort1, outPort1;
78 Switch sw1;
79 ArpCache arpCache;
80 List<String> arpCacheComparisonList;
81
82 @Before
83 public void setUp() throws Exception {
84 makeTestedObject();
85 makeMock();
86 prepareExpectForInit();
87 prepareExpectForStartUp();
88 prepareExpectForGeneral();
89 }
90
91 private void makeTestedObject() {
92 //Made tested values
93 srcStrMac = "00:00:00:00:00:01";
94 dstStrMac = "00:00:00:00:00:02";
95 cachedStrMac1 = "00:00:00:00:00:03";
96 cachedStrMac2 = "00:00:00:00:00:04";
97 srcStrIp = "192.168.0.1";
98 dstStrIp = "192.168.0.2";
99 cachedStrIp1 = "192.168.0.3";
100 cachedStrIp2 = "192.168.0.4";
101 srcByteMac = Ethernet.toMACAddress(srcStrMac);
102 dstByteMac = Ethernet.toMACAddress(dstStrMac);
103 dstMac = new MACAddress(dstByteMac);
104 srcMac = new MACAddress(srcByteMac);
105 cachedMac1 = new MACAddress(Ethernet.toMACAddress(cachedStrMac1));
106 cachedMac2 = new MACAddress(Ethernet.toMACAddress(cachedStrMac2));
107 srcIp = null;
108 dstIp = null;
109 cachedIp1 = null;
110 cachedIp2 = null;
111 try {
112 srcIp = InetAddress.getByAddress(IPv4.toIPv4AddressBytes(srcStrIp));
113 dstIp = InetAddress.getByAddress(IPv4.toIPv4AddressBytes(dstStrIp));
114 cachedIp1 = InetAddress.getByAddress(IPv4.toIPv4AddressBytes(cachedStrIp1));
115 cachedIp2 = InetAddress.getByAddress(IPv4.toIPv4AddressBytes(cachedStrIp2));
116 } catch (UnknownHostException e) {
117 e.printStackTrace();
118 }
119 sw1Dpid = 1l;
120 sw1Inport = 1;
121 sw1Outport = 2;
122 vlanId = 1;
123
124 //Made tested packets
125 arpRequest = new ARP()
126 .setHardwareType(ARP.HW_TYPE_ETHERNET)
127 .setProtocolType(ARP.PROTO_TYPE_IP)
128 .setHardwareAddressLength((byte) 6)
129 .setProtocolAddressLength((byte) 4)
130 .setOpCode(ARP.OP_REQUEST)
131 .setSenderHardwareAddress(srcByteMac)
132 .setSenderProtocolAddress(srcIp.getAddress())
133 .setTargetProtocolAddress(dstIp.getAddress())
134 .setTargetHardwareAddress(dstByteMac);
135
136 ethArpRequest = (Ethernet) new Ethernet()
137 .setSourceMACAddress(srcStrMac)
138 .setDestinationMACAddress(dstStrMac)
139 .setEtherType(Ethernet.TYPE_ARP)
140 .setVlanID((short) 0)
141 .setPayload(arpRequest);
142
143 arpReply = new ARP()
144 .setHardwareType(ARP.HW_TYPE_ETHERNET)
145 .setProtocolType(ARP.PROTO_TYPE_IP)
146 .setHardwareAddressLength((byte) 6)
147 .setProtocolAddressLength((byte) 4)
148 .setOpCode(ARP.OP_RARP_REPLY)
149 .setSenderHardwareAddress(srcByteMac)
150 .setSenderProtocolAddress(srcIp.getAddress())
151 .setTargetProtocolAddress(dstIp.getAddress())
152 .setTargetHardwareAddress(dstByteMac);
153
154 ethArpReply = (Ethernet) new Ethernet()
155 .setSourceMACAddress(srcStrMac)
156 .setDestinationMACAddress(dstStrMac)
157 .setEtherType(Ethernet.TYPE_ARP)
158 .setVlanID((short) 0)
159 .setPayload(arpReply);
160
161 rarpRequest = new ARP()
162 .setHardwareType(ARP.HW_TYPE_ETHERNET)
163 .setProtocolType(ARP.PROTO_TYPE_IP)
164 .setHardwareAddressLength((byte) 6)
165 .setProtocolAddressLength((byte) 4)
166 .setOpCode(ARP.OP_RARP_REQUEST)
167 .setSenderHardwareAddress(srcByteMac)
168 .setSenderProtocolAddress(srcIp.getAddress())
169 .setTargetProtocolAddress(dstIp.getAddress())
170 .setTargetHardwareAddress(dstByteMac);
171
172 ethRarpRequest = (Ethernet) new Ethernet()
173 .setSourceMACAddress(srcStrMac)
174 .setDestinationMACAddress(dstStrMac)
175 .setEtherType(Ethernet.TYPE_RARP)
176 .setVlanID((short) 0)
177 .setPayload(rarpRequest);
178
179 ethArpOtherOp = (Ethernet) new Ethernet()
180 .setSourceMACAddress(srcStrMac)
181 .setDestinationMACAddress(dstStrMac)
182 .setEtherType(Ethernet.TYPE_ARP)
183 .setVlanID((short) 0)
184 .setPayload(rarpRequest);
185
186 //Made tested objects
187 arpCache = new ArpCache();
188 arpCacheComparisonList = new ArrayList<String>();
189 arpCache.update(cachedIp1, cachedMac1);
190 arpCacheComparisonList.add(cachedStrIp1
191 + " => "
192 + cachedStrMac1
193 + " : VALID");
194 arpCache.update(cachedIp2, cachedMac2);
195 arpCacheComparisonList.add(cachedStrIp2
196 + " => "
197 + cachedStrMac2
198 + " : VALID");
199
200 arpManager = new ProxyArpManager();
201 config = new HashMap<String, String>();
202 }
203
204 private void makeMock() {
205 //Mock floodlight modules
206 context = EasyMock.createMock(FloodlightModuleContext.class);
207 floodligthProviderService = EasyMock.createMock(IFloodlightProviderService.class);
208 configInfoService = EasyMock.createMock(IConfigInfoService.class);
209 restApiService = EasyMock.createMock(IRestApiService.class);
210 datagridService = EasyMock.createMock(IDatagridService.class);
211 flowPusherService = EasyMock.createMock(IFlowPusherService.class);
212 networkGraphService = EasyMock.createMock(INetworkGraphService.class);
213 onosDeviceService = EasyMock.createMock(IOnosDeviceService.class);
214 packetService = EasyMock.createMock(IPacketService.class);
215 eg = EasyMock.createMock(IEventChannel.class);
216 el = EasyMock.createMock(IEventChannelListener.class);
217
218 //Mock NetworkGraph related data
219 ng = EasyMock.createMock(NetworkGraph.class);
220 dev1 = EasyMock.createMock(Device.class);
221 inPort1 = EasyMock.createMock(Port.class);
222 outPort1 = EasyMock.createMock(Port.class);
223 sw1 = EasyMock.createMock(Switch.class);
224 }
225
226 private void prepareExpectForGeneral() {
227 EasyMock.expect(inPort1.getNumber()).andReturn((long)sw1Inport).anyTimes();
228 EasyMock.expect(outPort1.getNumber()).andReturn((long)sw1Outport).anyTimes();
229 EasyMock.expect(outPort1.getOutgoingLink()).andReturn(null).anyTimes();
230 EasyMock.expect(outPort1.getIncomingLink()).andReturn(null).anyTimes();
231 EasyMock.expect(outPort1.getSwitch()).andReturn(sw1).anyTimes();
232 EasyMock.expect(sw1.getDpid()).andReturn(sw1Dpid).anyTimes();
233 }
234
235 private void prepareExpectForInit() {
236 EasyMock.expect(context.getServiceImpl(IFloodlightProviderService.class)).andReturn(floodligthProviderService);
237 EasyMock.expect(context.getServiceImpl(IConfigInfoService.class)).andReturn(configInfoService);
238 EasyMock.expect(context.getServiceImpl(IRestApiService.class)).andReturn(restApiService);
239 EasyMock.expect(context.getServiceImpl(IDatagridService.class)).andReturn(datagridService);
240 EasyMock.expect(context.getServiceImpl(IFlowPusherService.class)).andReturn(flowPusherService);
241 EasyMock.expect(context.getServiceImpl(INetworkGraphService.class)).andReturn(networkGraphService);
242 EasyMock.expect(context.getServiceImpl(IOnosDeviceService.class)).andReturn(onosDeviceService);
243 EasyMock.expect(context.getServiceImpl(IPacketService.class)).andReturn(packetService);
244 }
245
246 private void prepareExpectForStartUp() {
247 try {
248 PowerMock.expectNew(ArpCache.class).andReturn(arpCache);
249 } catch (Exception e) {
250 Assert.fail("Exception:" + e.getMessage());
251 }
252 PowerMock.replayAll();
253 EasyMock.expect(configInfoService.getVlan()).andReturn(vlanId);
254 restApiService.addRestletRoutable(EasyMock.isA(ArpWebRoutable.class));
255 EasyMock.expectLastCall();
256 packetService.registerPacketListener(arpManager);
257 EasyMock.expectLastCall();
258 EasyMock.expect(networkGraphService.getNetworkGraph()).andReturn(ng);
259 EasyMock.expect(datagridService.addListener((String)EasyMock.anyObject(), EasyMock.isA(IEventChannelListener.class),
260 (Class)EasyMock.anyObject(), (Class)EasyMock.anyObject())).andReturn(eg).anyTimes();
261 List<ArpCacheNotification> list = new ArrayList<ArpCacheNotification>();
262 EasyMock.expect(eg.getAllEntries()).andReturn(list);
263 }
264
265 private void prepareExpectForLearnArp() {
266 eg.addEntry(EasyMock.eq(srcIp.toString()), EasyMock.isA(ArpCacheNotification.class));
267 EasyMock.expectLastCall();
268 }
269
270 @After
271 public void tearDown() throws Exception {
272 }
273
274 @Test
275 public void testConfigTimeWithNoConfig() {
276 Map<String, String> config = new HashMap<String, String>();
277 EasyMock.expect(context.getConfigParams(arpManager)).andReturn(config);
278
279 EasyMock.replay(context, floodligthProviderService, configInfoService, restApiService, datagridService, flowPusherService,
280 networkGraphService, onosDeviceService, packetService, ng, eg, el, dev1, inPort1, sw1);
281 arpManager.init(context);
282 arpManager.startUp(context);
283 assertEquals(defaultStrAgingMsec, String.valueOf(arpManager.getArpEntryTimeout()));
284 assertEquals(defaultStrCleanupMsec, String.valueOf(arpManager.getArpCleaningTimerPeriod()));
285 }
286
287 @Test
288 public void testConfigTimeWithWrongParameter() {
289 Map<String, String> config = new HashMap<String, String>();
290 String strAgingMsec = "aaaaa";
291 String strCleanupMsec = "bbbbb";
292 config.put("agingmsec", strAgingMsec);
293 config.put("cleanupmsec", strCleanupMsec);
294 EasyMock.expect(context.getConfigParams(arpManager)).andReturn(config);
295
296 EasyMock.replay(context, floodligthProviderService, configInfoService, restApiService, datagridService, flowPusherService,
297 networkGraphService, onosDeviceService, packetService, ng, eg, el, dev1, inPort1, sw1);
298 arpManager.init(context);
299 arpManager.startUp(context);
300 assertEquals(defaultStrAgingMsec, String.valueOf(arpManager.getArpEntryTimeout()));
301 assertEquals(defaultStrCleanupMsec, String.valueOf(arpManager.getArpCleaningTimerPeriod()));
302 }
303
304 @Test
305 public void testConfigTime() {
306 String strAgingMsec = "10000";
307 String strCleanupMsec = "10000";
308 config.put("agingmsec", strAgingMsec);
309 config.put("cleanupmsec", strCleanupMsec);
310 EasyMock.expect(context.getConfigParams(arpManager)).andReturn(config);
311
312 EasyMock.replay(context, floodligthProviderService, configInfoService, restApiService, datagridService, flowPusherService,
313 networkGraphService, onosDeviceService, packetService, ng, eg, el, dev1, inPort1, sw1);
314 arpManager.init(context);
315 arpManager.startUp(context);
316 assertEquals(strAgingMsec, String.valueOf(arpManager.getArpEntryTimeout()));
317 assertEquals(strCleanupMsec, String.valueOf(arpManager.getArpCleaningTimerPeriod()));
318 }
319
320 @Test
321 public void testGetMacAddress() {
322 Map<String, String> config = new HashMap<String, String>();
323 EasyMock.expect(context.getConfigParams(arpManager)).andReturn(config);
324
325 EasyMock.replay(context, floodligthProviderService, configInfoService, restApiService, datagridService, flowPusherService,
326 networkGraphService, onosDeviceService, packetService, ng, eg, el, dev1, inPort1, sw1);
327 arpManager.init(context);
328 arpManager.startUp(context);
329 MACAddress mac = arpManager.getMacAddress(cachedIp1);
330 assertEquals(cachedMac1, mac);
331 }
332
333 @Test
334 public void testGetMappings() {
335 Map<String, String> config = new HashMap<String, String>();
336 EasyMock.expect(context.getConfigParams(arpManager)).andReturn(config);
337
338 EasyMock.replay(context, floodligthProviderService, configInfoService, restApiService, datagridService, flowPusherService,
339 networkGraphService, onosDeviceService, packetService, ng, eg, el, dev1, inPort1, sw1);
340 arpManager.init(context);
341 arpManager.startUp(context);
342 List<String> list = arpManager.getMappings();
343 for(String str : list) {
344 assertTrue(arpCacheComparisonList.contains(str));
345 }
346 }
347
348 @Test
349 public void testReceivePacketWithNoArpPacket() {
350 Map<String, String> config = new HashMap<String, String>();
351 EasyMock.expect(context.getConfigParams(arpManager)).andReturn(config);
352
353 EasyMock.replay(context, floodligthProviderService, configInfoService, restApiService, datagridService, flowPusherService,
354 networkGraphService, onosDeviceService, packetService, ng, eg, el, dev1, inPort1, sw1);
355 arpManager.init(context);
356 arpManager.startUp(context);
357 arpManager.receive(sw1, inPort1, ethRarpRequest);
358 }
359
360 @Test
361 public void testReceivePacketWithOtherOpCode() {
362 Map<String, String> config = new HashMap<String, String>();
363 EasyMock.expect(context.getConfigParams(arpManager)).andReturn(config);
364
365 prepareExpectForLearnArp();
366
367 EasyMock.replay(context, floodligthProviderService, configInfoService, restApiService, datagridService, flowPusherService,
368 networkGraphService, onosDeviceService, packetService, ng, eg, el, dev1, inPort1, sw1);
369 arpManager.init(context);
370 arpManager.startUp(context);
371 arpManager.receive(sw1, inPort1, ethArpOtherOp);
372 }
373
374 @Test
375 public void testClassifyPacketToSendArpReplyNotification() {
376 Map<String, String> config = new HashMap<String, String>();
377 EasyMock.expect(context.getConfigParams(arpManager)).andReturn(config);
378
379 prepareExpectForLearnArp();
380
381 ArpReplyNotification value =
382 new ArpReplyNotification(ByteBuffer.wrap(dstIp.getAddress()).getInt(), dstMac);
383 eg.addTransientEntry(srcMac.toLong(), value);
384 EasyMock.expectLastCall();
385 EasyMock.expect(context.getServiceImpl(IDatagridService.class)).andReturn(datagridService);
386
387 EasyMock.replay(context, floodligthProviderService, configInfoService, restApiService, datagridService, flowPusherService,
388 networkGraphService, onosDeviceService, packetService, ng, eg, el, dev1, inPort1, sw1);
389 arpManager.init(context);
390 arpManager.startUp(context);
391 arpManager.receive(sw1, inPort1, ethArpReply);
392 }
393
394 @Test
395 public void testClassifyPacketToHandleArpRequest() {
396 Map<String, String> config = new HashMap<String, String>();
397 EasyMock.expect(context.getConfigParams(arpManager)).andReturn(config);
398
399 prepareExpectForLearnArp();
400
401 EasyMock.expect(configInfoService.fromExternalNetwork(EasyMock.anyLong(), EasyMock.anyShort())).andReturn(true);
402 EasyMock.expect(configInfoService.isInterfaceAddress(dstIp)).andReturn(false);
403
404 EasyMock.replay(context, floodligthProviderService, configInfoService, restApiService, datagridService, flowPusherService,
405 networkGraphService, onosDeviceService, packetService, ng, eg, el, dev1, inPort1, sw1);
406 arpManager.init(context);
407 arpManager.startUp(context);
408 arpManager.receive(sw1, inPort1, ethArpRequest);
409 }
410
411 @Test
412 public void testClassifyPacketToHandleArpRequest2() {
413 List<Port> portList = new ArrayList<Port>();
414 portList.add(outPort1);
415
416 Map<String, String> config = new HashMap<String, String>();
417 EasyMock.expect(context.getConfigParams(arpManager)).andReturn(config);
418
419 prepareExpectForLearnArp();
420
421 EasyMock.expect(configInfoService.fromExternalNetwork(EasyMock.anyLong(), EasyMock.anyShort())).andReturn(false);
422 ng.acquireReadLock();
423 EasyMock.expectLastCall();
424 EasyMock.expect(ng.getDeviceByMac(dstMac)).andReturn(dev1);
425 ng.releaseReadLock();
426 EasyMock.expectLastCall();
427 EasyMock.expect(dev1.getAttachmentPoints()).andReturn(portList);
428 eg.addTransientEntry(EasyMock.anyLong(), (SinglePacketOutNotification)EasyMock.anyObject());
429 EasyMock.expectLastCall();
430
431 EasyMock.replay(context, configInfoService, restApiService, floodligthProviderService,
432 networkGraphService, datagridService, eg, ng, dev1, inPort1, outPort1, sw1);
433 arpManager.init(context);
434 arpManager.startUp(context);
435 arpManager.receive(sw1, inPort1, ethArpRequest);
436 }
437}