blob: 20b002ac4b717f7a4e6c2192b911016a65f6fda6 [file] [log] [blame]
samanwita palf28207b2015-09-04 10:41:56 -07001/*
Thomas Vachuska54dc3522015-09-09 00:11:45 -07002 * Copyright 2015 Open Networking Laboratory
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;
23import org.onlab.packet.DHCPOption;
samanwita pal8969cbe2015-09-04 13:31:30 -070024import org.onlab.packet.DHCPPacketType;
samanwita palf28207b2015-09-04 10:41:56 -070025import org.onlab.packet.Ethernet;
26import org.onlab.packet.IPv4;
27import org.onlab.packet.Ip4Address;
28import org.onlab.packet.MacAddress;
29import org.onlab.packet.UDP;
30import org.onosproject.core.CoreServiceAdapter;
Thomas Vachuskaa1da42e2015-09-09 00:45:22 -070031import org.onosproject.dhcp.DhcpStore;
32import org.onosproject.dhcp.IpAssignment;
samanwita palf28207b2015-09-04 10:41:56 -070033import org.onosproject.net.Host;
34import org.onosproject.net.HostId;
Thomas Vachuska54dc3522015-09-09 00:11:45 -070035import org.onosproject.net.config.NetworkConfigRegistryAdapter;
samanwita palf28207b2015-09-04 10:41:56 -070036import org.onosproject.net.host.HostDescription;
37import org.onosproject.net.host.HostProvider;
38import org.onosproject.net.host.HostProviderRegistry;
39import org.onosproject.net.host.HostProviderService;
40import org.onosproject.net.packet.DefaultInboundPacket;
41import org.onosproject.net.packet.DefaultPacketContext;
42import org.onosproject.net.packet.InboundPacket;
43import org.onosproject.net.packet.OutboundPacket;
44import org.onosproject.net.packet.PacketContext;
45import org.onosproject.net.packet.PacketProcessor;
46import org.onosproject.net.packet.PacketServiceAdapter;
47import org.onosproject.net.provider.AbstractProvider;
48import org.onosproject.net.provider.AbstractProviderService;
49import org.onosproject.net.provider.ProviderId;
50
51import java.nio.ByteBuffer;
52import java.util.ArrayList;
Thomas Vachuska54dc3522015-09-09 00:11:45 -070053import java.util.Date;
samanwita palf28207b2015-09-04 10:41:56 -070054import java.util.HashMap;
55import java.util.List;
56import java.util.Map;
57import java.util.Set;
58
59import static org.junit.Assert.assertEquals;
60import static org.junit.Assert.fail;
61import static org.onosproject.net.NetTestTools.connectPoint;
62
63/**
64 * Set of tests of the ONOS application component.
65 */
66
Thomas Vachuskaa1da42e2015-09-09 00:45:22 -070067public class DhcpManagerTest {
samanwita palf28207b2015-09-04 10:41:56 -070068
Thomas Vachuskaa1da42e2015-09-09 00:45:22 -070069 private DhcpManager dhcpXManager;
samanwita palf28207b2015-09-04 10:41:56 -070070
71 protected PacketProcessor packetProcessor;
72
73 protected HostProviderService hostProviderService;
74
samanwita pal2a313402015-09-14 16:03:22 -070075 private static final HostId CLIENT1_HOST = HostId.hostId(MacAddress.valueOf("1a:1a:1a:1a:1a:1a"));
samanwita palf28207b2015-09-04 10:41:56 -070076
77 private static final String EXPECTED_IP = "10.2.0.2";
78
79 private static final Ip4Address BROADCAST = Ip4Address.valueOf("255.255.255.255");
80
81 private static final int TRANSACTION_ID = 1000;
82
83 private static final ProviderId PID = new ProviderId("of", "foo");
84
85 @Before
86 public void setUp() {
Thomas Vachuskaa1da42e2015-09-09 00:45:22 -070087 dhcpXManager = new DhcpManager();
88 dhcpXManager.cfgService = new TestNetworkConfigRegistry();
89 dhcpXManager.packetService = new TestPacketService();
90 dhcpXManager.coreService = new TestCoreService();
91 dhcpXManager.dhcpStore = new TestDhcpStore();
samanwita palf28207b2015-09-04 10:41:56 -070092 hostProviderService = new TestHostProviderService(new TestHostProvider());
Thomas Vachuskaa1da42e2015-09-09 00:45:22 -070093 dhcpXManager.hostProviderService = hostProviderService;
94 dhcpXManager.hostProviderRegistry = new TestHostRegistry();
95 dhcpXManager.activate();
samanwita palf28207b2015-09-04 10:41:56 -070096 }
97
98 @After
99 public void tearDown() {
Thomas Vachuskaa1da42e2015-09-09 00:45:22 -0700100 dhcpXManager.deactivate();
samanwita palf28207b2015-09-04 10:41:56 -0700101 }
102
103 /**
104 * Tests the response to a DHCP Discover Packet.
105 */
106 @Test
107 public void testDiscover() {
samanwita pal8969cbe2015-09-04 13:31:30 -0700108 Ethernet reply = constructDHCPPacket(DHCPPacketType.DHCPDISCOVER);
samanwita palf28207b2015-09-04 10:41:56 -0700109 sendPacket(reply);
110 }
111
112 /**
113 * Tests the response to a DHCP Request Packet.
114 */
115 @Test
116 public void testRequest() {
samanwita pal8969cbe2015-09-04 13:31:30 -0700117 Ethernet reply = constructDHCPPacket(DHCPPacketType.DHCPREQUEST);
samanwita palf28207b2015-09-04 10:41:56 -0700118 sendPacket(reply);
119 }
120
121 /**
122 * Sends an Ethernet packet to the process method of the Packet Processor.
123 * @param reply Ethernet packet
124 */
125 private void sendPacket(Ethernet reply) {
126 final ByteBuffer byteBuffer = ByteBuffer.wrap(reply.serialize());
127 InboundPacket inPacket = new DefaultInboundPacket(connectPoint("1", 1),
128 reply,
129 byteBuffer);
130
131 PacketContext context = new TestPacketContext(127L, inPacket, null, false);
132 packetProcessor.process(context);
133 }
134
135 /**
136 * Constructs an Ethernet packet containing a DHCP Payload.
samanwita pal8969cbe2015-09-04 13:31:30 -0700137 * @param packetType DHCP Message Type
samanwita palf28207b2015-09-04 10:41:56 -0700138 * @return Ethernet packet
139 */
samanwita pal8969cbe2015-09-04 13:31:30 -0700140 private Ethernet constructDHCPPacket(DHCPPacketType packetType) {
samanwita palf28207b2015-09-04 10:41:56 -0700141
142 // Ethernet Frame.
143 Ethernet ethReply = new Ethernet();
samanwita pal2a313402015-09-14 16:03:22 -0700144 ethReply.setSourceMACAddress(CLIENT1_HOST.mac());
samanwita palf28207b2015-09-04 10:41:56 -0700145 ethReply.setDestinationMACAddress(MacAddress.BROADCAST);
146 ethReply.setEtherType(Ethernet.TYPE_IPV4);
147 ethReply.setVlanID((short) 2);
148
149 // IP Packet
150 IPv4 ipv4Reply = new IPv4();
151 ipv4Reply.setSourceAddress(0);
152 ipv4Reply.setDestinationAddress(BROADCAST.toInt());
153 ipv4Reply.setTtl((byte) 127);
154
155 // UDP Datagram.
156 UDP udpReply = new UDP();
157 udpReply.setSourcePort((byte) UDP.DHCP_CLIENT_PORT);
158 udpReply.setDestinationPort((byte) UDP.DHCP_SERVER_PORT);
159
160 // DHCP Payload.
161 DHCP dhcpReply = new DHCP();
162 dhcpReply.setOpCode(DHCP.OPCODE_REQUEST);
163
164 dhcpReply.setYourIPAddress(0);
165 dhcpReply.setServerIPAddress(0);
166
167 dhcpReply.setTransactionId(TRANSACTION_ID);
samanwita pal2a313402015-09-14 16:03:22 -0700168 dhcpReply.setClientHardwareAddress(CLIENT1_HOST.mac().toBytes());
samanwita palf28207b2015-09-04 10:41:56 -0700169 dhcpReply.setHardwareType(DHCP.HWTYPE_ETHERNET);
170 dhcpReply.setHardwareAddressLength((byte) 6);
171
172 // DHCP Options.
173 DHCPOption option = new DHCPOption();
174 List<DHCPOption> optionList = new ArrayList<>();
175
176 // DHCP Message Type.
177 option.setCode(DHCP.DHCPOptionCode.OptionCode_MessageType.getValue());
178 option.setLength((byte) 1);
samanwita pal8969cbe2015-09-04 13:31:30 -0700179 byte[] optionData = {(byte) packetType.getValue()};
samanwita palf28207b2015-09-04 10:41:56 -0700180 option.setData(optionData);
181 optionList.add(option);
182
183 // DHCP Requested IP.
184 option = new DHCPOption();
185 option.setCode(DHCP.DHCPOptionCode.OptionCode_RequestedIP.getValue());
186 option.setLength((byte) 4);
187 optionData = Ip4Address.valueOf(EXPECTED_IP).toOctets();
188 option.setData(optionData);
189 optionList.add(option);
190
191 // End Option.
192 option = new DHCPOption();
193 option.setCode(DHCP.DHCPOptionCode.OptionCode_END.getValue());
194 option.setLength((byte) 1);
195 optionList.add(option);
196
197 dhcpReply.setOptions(optionList);
198
199 udpReply.setPayload(dhcpReply);
200 ipv4Reply.setPayload(udpReply);
201 ethReply.setPayload(ipv4Reply);
202
203 return ethReply;
204 }
205
206 /**
207 * Validates the contents of the packet sent by the DHCP Manager.
208 * @param packet Ethernet packet received
209 */
210 private void validatePacket(Ethernet packet) {
211 DHCP dhcpPacket = (DHCP) packet.getPayload().getPayload().getPayload();
samanwita pal2a313402015-09-14 16:03:22 -0700212 assertEquals(MacAddress.valueOf(dhcpPacket.getClientHardwareAddress()), CLIENT1_HOST.mac());
samanwita palf28207b2015-09-04 10:41:56 -0700213 assertEquals(Ip4Address.valueOf(dhcpPacket.getYourIPAddress()), Ip4Address.valueOf(EXPECTED_IP));
214 assertEquals(dhcpPacket.getTransactionId(), TRANSACTION_ID);
215 }
216
217 /**
218 * Mocks the DHCPStore.
219 */
Thomas Vachuskaa1da42e2015-09-09 00:45:22 -0700220 private final class TestDhcpStore implements DhcpStore {
samanwita palf28207b2015-09-04 10:41:56 -0700221
222
223 public void populateIPPoolfromRange(Ip4Address startIP, Ip4Address endIP) {
224 }
225
samanwita pal2a313402015-09-14 16:03:22 -0700226 public Ip4Address suggestIP(HostId hostId, Ip4Address requestedIP) {
samanwita palf28207b2015-09-04 10:41:56 -0700227 return Ip4Address.valueOf(EXPECTED_IP);
228 }
229
samanwita pal2a313402015-09-14 16:03:22 -0700230 public boolean assignIP(HostId hostId, Ip4Address ipAddr, int leaseTime) {
samanwita palf28207b2015-09-04 10:41:56 -0700231 return true;
232 }
233
234 public void setDefaultTimeoutForPurge(int timeInSeconds) {
235 }
236
samanwita pal2a313402015-09-14 16:03:22 -0700237 public void releaseIP(HostId hostId) {
samanwita palf28207b2015-09-04 10:41:56 -0700238 }
239
samanwita pal0bff4302015-09-15 13:37:00 -0700240 public Map<HostId, IpAssignment> listAssignedMapping() {
241 return listAllMapping();
242 }
243
244 public Map<HostId, IpAssignment> listAllMapping() {
samanwita pal2a313402015-09-14 16:03:22 -0700245 Map<HostId, IpAssignment> map = new HashMap<>();
Thomas Vachuskaa1da42e2015-09-09 00:45:22 -0700246 IpAssignment assignment = IpAssignment.builder()
Thomas Vachuska54dc3522015-09-09 00:11:45 -0700247 .ipAddress(Ip4Address.valueOf(EXPECTED_IP))
Thomas Vachuskaa1da42e2015-09-09 00:45:22 -0700248 .assignmentStatus(IpAssignment.AssignmentStatus.Option_Assigned)
Thomas Vachuska54dc3522015-09-09 00:11:45 -0700249 .leasePeriod(300)
250 .timestamp(new Date())
251 .build();
samanwita pal2a313402015-09-14 16:03:22 -0700252 map.put(CLIENT1_HOST, assignment);
samanwita palf28207b2015-09-04 10:41:56 -0700253 return map;
254 }
255
256 public boolean assignStaticIP(MacAddress macID, Ip4Address ipAddr) {
257 return true;
258 }
259
260 public boolean removeStaticIP(MacAddress macID) {
261 return true;
262 }
263
264 public Iterable<Ip4Address> getAvailableIPs() {
265 List<Ip4Address> ipList = new ArrayList<>();
266 ipList.add(Ip4Address.valueOf(EXPECTED_IP));
267 return ImmutableSet.copyOf(ipList);
268 }
269 }
270
271 /**
272 * Mocks the DefaultPacket context.
273 */
274 private final class TestPacketContext extends DefaultPacketContext {
275 private TestPacketContext(long time, InboundPacket inPkt,
276 OutboundPacket outPkt, boolean block) {
277 super(time, inPkt, outPkt, block);
278 }
279
280 @Override
281 public void send() {
282 // We don't send anything out.
283 }
284 }
285
286 /**
287 * Keeps a reference to the PacketProcessor and verifies the OutboundPackets.
288 */
289 private class TestPacketService extends PacketServiceAdapter {
290
291 @Override
292 public void addProcessor(PacketProcessor processor, int priority) {
293 packetProcessor = processor;
294 }
295
296 @Override
297 public void emit(OutboundPacket packet) {
298 try {
299 Ethernet eth = Ethernet.deserializer().deserialize(packet.data().array(),
300 0, packet.data().array().length);
301 validatePacket(eth);
302 } catch (Exception e) {
303 fail(e.getMessage());
304 }
305 }
306 }
307
308 /**
309 * Mocks the CoreService.
310 */
311 private class TestCoreService extends CoreServiceAdapter {
312
313 }
314
315 /**
316 * Mocks the NetworkConfigRegistry.
317 */
318 private class TestNetworkConfigRegistry extends NetworkConfigRegistryAdapter {
319
320 }
321
322 /**
323 * Mocks the HostProviderService.
324 */
325 private class TestHostProviderService extends AbstractProviderService<HostProvider>
326 implements HostProviderService {
327
328 protected TestHostProviderService(HostProvider provider) {
329 super(provider);
330 }
331
332 @Override
Brian O'Connorf107bd72015-09-21 15:31:03 -0700333 public void hostDetected(HostId hostId, HostDescription hostDescription, boolean replaceIps) {
alshabibeff00542015-09-23 13:22:33 -0700334
samanwita palf28207b2015-09-04 10:41:56 -0700335 }
336
337 @Override
338 public void hostVanished(HostId hostId) {
339 }
340
341 }
342
343 /**
344 * Mocks the HostProvider.
345 */
346 private static class TestHostProvider extends AbstractProvider
347 implements HostProvider {
348
349 protected TestHostProvider() {
350 super(PID);
351 }
352
353 @Override
354 public ProviderId id() {
355 return PID;
356 }
357
358 @Override
359 public void triggerProbe(Host host) {
360 }
361
362 }
363
364 /**
365 * Mocks the HostProviderRegistry.
366 */
367 private class TestHostRegistry implements HostProviderRegistry {
368
369 @Override
370 public HostProviderService register(HostProvider provider) {
371 return hostProviderService;
372 }
373
374 @Override
375 public void unregister(HostProvider provider) {
376 }
377
378 @Override
379 public Set<ProviderId> getProviders() {
380 return null;
381 }
382
383 }
384
385}