blob: e931e26823809fd76c3b8d479c3329b8987a7569 [file] [log] [blame]
samanwita palf28207b2015-09-04 10:41:56 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
samanwita palf28207b2015-09-04 10:41:56 -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 */
16package org.onosproject.dhcp.impl;
17
18import com.google.common.collect.ImmutableSet;
19import org.junit.After;
20import org.junit.Before;
21import org.junit.Test;
22import org.onlab.packet.DHCP;
Yi Tsengc7403c22017-06-19 16:23:22 -070023import org.onlab.packet.dhcp.DhcpOption;
samanwita palf28207b2015-09-04 10:41:56 -070024import org.onlab.packet.Ethernet;
25import org.onlab.packet.IPv4;
26import org.onlab.packet.Ip4Address;
samanwita palc40e5ed2015-09-24 11:01:51 -070027import org.onlab.packet.IpAddress;
samanwita palf28207b2015-09-04 10:41:56 -070028import org.onlab.packet.MacAddress;
29import org.onlab.packet.UDP;
Hyunsun Moon04b1fe92016-05-18 21:28:06 -070030import org.onosproject.cfg.ComponentConfigAdapter;
samanwita palf28207b2015-09-04 10:41:56 -070031import org.onosproject.core.CoreServiceAdapter;
Thomas Vachuskaa1da42e2015-09-09 00:45:22 -070032import org.onosproject.dhcp.DhcpStore;
33import org.onosproject.dhcp.IpAssignment;
samanwita palf28207b2015-09-04 10:41:56 -070034import org.onosproject.net.Host;
35import org.onosproject.net.HostId;
Charles Chan888e20a2017-05-01 15:44:23 -070036import org.onosproject.net.HostLocation;
Thomas Vachuska54dc3522015-09-09 00:11:45 -070037import org.onosproject.net.config.NetworkConfigRegistryAdapter;
samanwita palf28207b2015-09-04 10:41:56 -070038import org.onosproject.net.host.HostDescription;
39import org.onosproject.net.host.HostProvider;
40import org.onosproject.net.host.HostProviderRegistry;
41import org.onosproject.net.host.HostProviderService;
42import org.onosproject.net.packet.DefaultInboundPacket;
43import org.onosproject.net.packet.DefaultPacketContext;
44import org.onosproject.net.packet.InboundPacket;
45import org.onosproject.net.packet.OutboundPacket;
46import org.onosproject.net.packet.PacketContext;
47import org.onosproject.net.packet.PacketProcessor;
48import org.onosproject.net.packet.PacketServiceAdapter;
49import org.onosproject.net.provider.AbstractProvider;
50import org.onosproject.net.provider.AbstractProviderService;
51import org.onosproject.net.provider.ProviderId;
52
53import java.nio.ByteBuffer;
54import java.util.ArrayList;
Thomas Vachuska54dc3522015-09-09 00:11:45 -070055import java.util.Date;
samanwita palf28207b2015-09-04 10:41:56 -070056import java.util.HashMap;
57import java.util.List;
58import java.util.Map;
59import java.util.Set;
60
61import static org.junit.Assert.assertEquals;
62import static org.junit.Assert.fail;
63import static org.onosproject.net.NetTestTools.connectPoint;
64
65/**
66 * Set of tests of the ONOS application component.
67 */
68
Thomas Vachuskaa1da42e2015-09-09 00:45:22 -070069public class DhcpManagerTest {
samanwita palf28207b2015-09-04 10:41:56 -070070
Thomas Vachuskaa1da42e2015-09-09 00:45:22 -070071 private DhcpManager dhcpXManager;
samanwita palf28207b2015-09-04 10:41:56 -070072
73 protected PacketProcessor packetProcessor;
74
75 protected HostProviderService hostProviderService;
76
samanwita pal2a313402015-09-14 16:03:22 -070077 private static final HostId CLIENT1_HOST = HostId.hostId(MacAddress.valueOf("1a:1a:1a:1a:1a:1a"));
samanwita palf28207b2015-09-04 10:41:56 -070078
79 private static final String EXPECTED_IP = "10.2.0.2";
80
81 private static final Ip4Address BROADCAST = Ip4Address.valueOf("255.255.255.255");
82
83 private static final int TRANSACTION_ID = 1000;
84
85 private static final ProviderId PID = new ProviderId("of", "foo");
86
87 @Before
88 public void setUp() {
Thomas Vachuskaa1da42e2015-09-09 00:45:22 -070089 dhcpXManager = new DhcpManager();
90 dhcpXManager.cfgService = new TestNetworkConfigRegistry();
91 dhcpXManager.packetService = new TestPacketService();
92 dhcpXManager.coreService = new TestCoreService();
93 dhcpXManager.dhcpStore = new TestDhcpStore();
samanwita palf28207b2015-09-04 10:41:56 -070094 hostProviderService = new TestHostProviderService(new TestHostProvider());
Thomas Vachuskaa1da42e2015-09-09 00:45:22 -070095 dhcpXManager.hostProviderService = hostProviderService;
96 dhcpXManager.hostProviderRegistry = new TestHostRegistry();
Hyunsun Moon04b1fe92016-05-18 21:28:06 -070097 dhcpXManager.componentConfigService = new TestComponentConfig();
Thomas Vachuskaa1da42e2015-09-09 00:45:22 -070098 dhcpXManager.activate();
samanwita palf28207b2015-09-04 10:41:56 -070099 }
100
101 @After
102 public void tearDown() {
Thomas Vachuskaa1da42e2015-09-09 00:45:22 -0700103 dhcpXManager.deactivate();
samanwita palf28207b2015-09-04 10:41:56 -0700104 }
105
106 /**
107 * Tests the response to a DHCP Discover Packet.
108 */
109 @Test
110 public void testDiscover() {
Yi Tsengc7403c22017-06-19 16:23:22 -0700111 Ethernet reply = constructDhcpPacket(DHCP.MsgType.DHCPDISCOVER);
samanwita palf28207b2015-09-04 10:41:56 -0700112 sendPacket(reply);
113 }
114
115 /**
116 * Tests the response to a DHCP Request Packet.
117 */
118 @Test
119 public void testRequest() {
Yi Tsengc7403c22017-06-19 16:23:22 -0700120 Ethernet reply = constructDhcpPacket(DHCP.MsgType.DHCPREQUEST);
samanwita palf28207b2015-09-04 10:41:56 -0700121 sendPacket(reply);
122 }
123
124 /**
125 * Sends an Ethernet packet to the process method of the Packet Processor.
126 * @param reply Ethernet packet
127 */
128 private void sendPacket(Ethernet reply) {
129 final ByteBuffer byteBuffer = ByteBuffer.wrap(reply.serialize());
130 InboundPacket inPacket = new DefaultInboundPacket(connectPoint("1", 1),
131 reply,
132 byteBuffer);
133
134 PacketContext context = new TestPacketContext(127L, inPacket, null, false);
135 packetProcessor.process(context);
136 }
137
138 /**
139 * Constructs an Ethernet packet containing a DHCP Payload.
samanwita pal8969cbe2015-09-04 13:31:30 -0700140 * @param packetType DHCP Message Type
samanwita palf28207b2015-09-04 10:41:56 -0700141 * @return Ethernet packet
142 */
Yi Tsengc7403c22017-06-19 16:23:22 -0700143 private Ethernet constructDhcpPacket(DHCP.MsgType packetType) {
samanwita palf28207b2015-09-04 10:41:56 -0700144
145 // Ethernet Frame.
146 Ethernet ethReply = new Ethernet();
samanwita pal2a313402015-09-14 16:03:22 -0700147 ethReply.setSourceMACAddress(CLIENT1_HOST.mac());
samanwita palf28207b2015-09-04 10:41:56 -0700148 ethReply.setDestinationMACAddress(MacAddress.BROADCAST);
149 ethReply.setEtherType(Ethernet.TYPE_IPV4);
150 ethReply.setVlanID((short) 2);
151
152 // IP Packet
153 IPv4 ipv4Reply = new IPv4();
154 ipv4Reply.setSourceAddress(0);
155 ipv4Reply.setDestinationAddress(BROADCAST.toInt());
156 ipv4Reply.setTtl((byte) 127);
157
158 // UDP Datagram.
159 UDP udpReply = new UDP();
160 udpReply.setSourcePort((byte) UDP.DHCP_CLIENT_PORT);
161 udpReply.setDestinationPort((byte) UDP.DHCP_SERVER_PORT);
162
163 // DHCP Payload.
164 DHCP dhcpReply = new DHCP();
165 dhcpReply.setOpCode(DHCP.OPCODE_REQUEST);
166
167 dhcpReply.setYourIPAddress(0);
168 dhcpReply.setServerIPAddress(0);
169
170 dhcpReply.setTransactionId(TRANSACTION_ID);
samanwita pal2a313402015-09-14 16:03:22 -0700171 dhcpReply.setClientHardwareAddress(CLIENT1_HOST.mac().toBytes());
samanwita palf28207b2015-09-04 10:41:56 -0700172 dhcpReply.setHardwareType(DHCP.HWTYPE_ETHERNET);
173 dhcpReply.setHardwareAddressLength((byte) 6);
174
175 // DHCP Options.
Yi Tsengc7403c22017-06-19 16:23:22 -0700176 DhcpOption option = new DhcpOption();
177 List<DhcpOption> optionList = new ArrayList<>();
samanwita palf28207b2015-09-04 10:41:56 -0700178
179 // DHCP Message Type.
180 option.setCode(DHCP.DHCPOptionCode.OptionCode_MessageType.getValue());
181 option.setLength((byte) 1);
samanwita pal8969cbe2015-09-04 13:31:30 -0700182 byte[] optionData = {(byte) packetType.getValue()};
samanwita palf28207b2015-09-04 10:41:56 -0700183 option.setData(optionData);
184 optionList.add(option);
185
186 // DHCP Requested IP.
Yi Tsengc7403c22017-06-19 16:23:22 -0700187 option = new DhcpOption();
samanwita palf28207b2015-09-04 10:41:56 -0700188 option.setCode(DHCP.DHCPOptionCode.OptionCode_RequestedIP.getValue());
189 option.setLength((byte) 4);
190 optionData = Ip4Address.valueOf(EXPECTED_IP).toOctets();
191 option.setData(optionData);
192 optionList.add(option);
193
194 // End Option.
Yi Tsengc7403c22017-06-19 16:23:22 -0700195 option = new DhcpOption();
samanwita palf28207b2015-09-04 10:41:56 -0700196 option.setCode(DHCP.DHCPOptionCode.OptionCode_END.getValue());
197 option.setLength((byte) 1);
198 optionList.add(option);
199
200 dhcpReply.setOptions(optionList);
201
202 udpReply.setPayload(dhcpReply);
203 ipv4Reply.setPayload(udpReply);
204 ethReply.setPayload(ipv4Reply);
205
206 return ethReply;
207 }
208
209 /**
210 * Validates the contents of the packet sent by the DHCP Manager.
211 * @param packet Ethernet packet received
212 */
213 private void validatePacket(Ethernet packet) {
214 DHCP dhcpPacket = (DHCP) packet.getPayload().getPayload().getPayload();
samanwita pal2a313402015-09-14 16:03:22 -0700215 assertEquals(MacAddress.valueOf(dhcpPacket.getClientHardwareAddress()), CLIENT1_HOST.mac());
samanwita palf28207b2015-09-04 10:41:56 -0700216 assertEquals(Ip4Address.valueOf(dhcpPacket.getYourIPAddress()), Ip4Address.valueOf(EXPECTED_IP));
217 assertEquals(dhcpPacket.getTransactionId(), TRANSACTION_ID);
218 }
219
220 /**
221 * Mocks the DHCPStore.
222 */
Thomas Vachuskaa1da42e2015-09-09 00:45:22 -0700223 private final class TestDhcpStore implements DhcpStore {
samanwita palf28207b2015-09-04 10:41:56 -0700224
225
226 public void populateIPPoolfromRange(Ip4Address startIP, Ip4Address endIP) {
227 }
228
samanwita pal2a313402015-09-14 16:03:22 -0700229 public Ip4Address suggestIP(HostId hostId, Ip4Address requestedIP) {
samanwita palf28207b2015-09-04 10:41:56 -0700230 return Ip4Address.valueOf(EXPECTED_IP);
231 }
232
Hyunsun Moon04b1fe92016-05-18 21:28:06 -0700233 public boolean assignIP(HostId hostId, IpAssignment ipAssignment) {
samanwita palf28207b2015-09-04 10:41:56 -0700234 return true;
235 }
236
237 public void setDefaultTimeoutForPurge(int timeInSeconds) {
238 }
239
samanwita palc40e5ed2015-09-24 11:01:51 -0700240 public Ip4Address releaseIP(HostId hostId) {
241 return null;
samanwita palf28207b2015-09-04 10:41:56 -0700242 }
243
samanwita pal0bff4302015-09-15 13:37:00 -0700244 public Map<HostId, IpAssignment> listAssignedMapping() {
245 return listAllMapping();
246 }
247
248 public Map<HostId, IpAssignment> listAllMapping() {
samanwita pal2a313402015-09-14 16:03:22 -0700249 Map<HostId, IpAssignment> map = new HashMap<>();
Thomas Vachuskaa1da42e2015-09-09 00:45:22 -0700250 IpAssignment assignment = IpAssignment.builder()
Thomas Vachuska54dc3522015-09-09 00:11:45 -0700251 .ipAddress(Ip4Address.valueOf(EXPECTED_IP))
Thomas Vachuskaa1da42e2015-09-09 00:45:22 -0700252 .assignmentStatus(IpAssignment.AssignmentStatus.Option_Assigned)
Thomas Vachuska54dc3522015-09-09 00:11:45 -0700253 .leasePeriod(300)
254 .timestamp(new Date())
255 .build();
samanwita pal2a313402015-09-14 16:03:22 -0700256 map.put(CLIENT1_HOST, assignment);
samanwita palf28207b2015-09-04 10:41:56 -0700257 return map;
258 }
259
Hyunsun Moon04b1fe92016-05-18 21:28:06 -0700260 public boolean assignStaticIP(MacAddress macID, IpAssignment ipAssignment) {
samanwita palf28207b2015-09-04 10:41:56 -0700261 return true;
262 }
263
264 public boolean removeStaticIP(MacAddress macID) {
265 return true;
266 }
267
268 public Iterable<Ip4Address> getAvailableIPs() {
269 List<Ip4Address> ipList = new ArrayList<>();
270 ipList.add(Ip4Address.valueOf(EXPECTED_IP));
271 return ImmutableSet.copyOf(ipList);
272 }
danielcd9deed2015-10-30 17:16:16 +0900273 public IpAssignment getIpAssignmentFromAllocationMap(HostId hostId) {
274 return null;
275 }
samanwita palf28207b2015-09-04 10:41:56 -0700276 }
277
278 /**
279 * Mocks the DefaultPacket context.
280 */
281 private final class TestPacketContext extends DefaultPacketContext {
282 private TestPacketContext(long time, InboundPacket inPkt,
283 OutboundPacket outPkt, boolean block) {
284 super(time, inPkt, outPkt, block);
285 }
286
287 @Override
288 public void send() {
289 // We don't send anything out.
290 }
291 }
292
293 /**
294 * Keeps a reference to the PacketProcessor and verifies the OutboundPackets.
295 */
296 private class TestPacketService extends PacketServiceAdapter {
297
298 @Override
299 public void addProcessor(PacketProcessor processor, int priority) {
300 packetProcessor = processor;
301 }
302
303 @Override
304 public void emit(OutboundPacket packet) {
305 try {
306 Ethernet eth = Ethernet.deserializer().deserialize(packet.data().array(),
307 0, packet.data().array().length);
308 validatePacket(eth);
309 } catch (Exception e) {
310 fail(e.getMessage());
311 }
312 }
313 }
314
315 /**
316 * Mocks the CoreService.
317 */
318 private class TestCoreService extends CoreServiceAdapter {
319
320 }
321
322 /**
323 * Mocks the NetworkConfigRegistry.
324 */
325 private class TestNetworkConfigRegistry extends NetworkConfigRegistryAdapter {
326
327 }
328
329 /**
Hyunsun Moon04b1fe92016-05-18 21:28:06 -0700330 * Mocks the ComponentConfigRegistry.
331 */
332 private class TestComponentConfig extends ComponentConfigAdapter {
333
334 }
335
336 /**
samanwita palf28207b2015-09-04 10:41:56 -0700337 * Mocks the HostProviderService.
338 */
339 private class TestHostProviderService extends AbstractProviderService<HostProvider>
340 implements HostProviderService {
341
342 protected TestHostProviderService(HostProvider provider) {
343 super(provider);
344 }
345
346 @Override
Brian O'Connorf107bd72015-09-21 15:31:03 -0700347 public void hostDetected(HostId hostId, HostDescription hostDescription, boolean replaceIps) {
alshabibeff00542015-09-23 13:22:33 -0700348
samanwita palf28207b2015-09-04 10:41:56 -0700349 }
350
351 @Override
352 public void hostVanished(HostId hostId) {
353 }
354
samanwita palc40e5ed2015-09-24 11:01:51 -0700355 @Override
356 public void removeIpFromHost(HostId hostId, IpAddress ipAddress) {
357
358 }
359
Charles Chan888e20a2017-05-01 15:44:23 -0700360 @Override
361 public void removeLocationFromHost(HostId hostId, HostLocation location) {
362
363 }
samanwita palf28207b2015-09-04 10:41:56 -0700364 }
365
366 /**
367 * Mocks the HostProvider.
368 */
369 private static class TestHostProvider extends AbstractProvider
370 implements HostProvider {
371
372 protected TestHostProvider() {
373 super(PID);
374 }
375
376 @Override
377 public ProviderId id() {
378 return PID;
379 }
380
381 @Override
382 public void triggerProbe(Host host) {
383 }
384
385 }
386
387 /**
388 * Mocks the HostProviderRegistry.
389 */
390 private class TestHostRegistry implements HostProviderRegistry {
391
392 @Override
393 public HostProviderService register(HostProvider provider) {
394 return hostProviderService;
395 }
396
397 @Override
398 public void unregister(HostProvider provider) {
399 }
400
401 @Override
402 public Set<ProviderId> getProviders() {
403 return null;
404 }
405
406 }
407
408}