blob: 2d175342b038c006a7c72c1ef1e2d30073b2e384 [file] [log] [blame]
Jian Li8e7e6cd2018-03-30 13:33:08 +09001/*
2 * Copyright 2018-present Open Networking Foundation
3 *
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.openstacknetworking.impl;
17
18import org.junit.After;
19import org.junit.Before;
20import org.junit.Test;
21import org.onlab.packet.ARP;
22import org.onlab.packet.Ethernet;
23import org.onlab.packet.IpAddress;
24import org.onlab.packet.MacAddress;
25import org.onosproject.cfg.ComponentConfigAdapter;
Jian Lieae12362018-04-10 18:48:32 +090026import org.onosproject.cluster.ClusterServiceAdapter;
27import org.onosproject.cluster.LeadershipServiceAdapter;
28import org.onosproject.core.ApplicationId;
Jian Li8e7e6cd2018-03-30 13:33:08 +090029import org.onosproject.core.CoreServiceAdapter;
Jian Lieae12362018-04-10 18:48:32 +090030import org.onosproject.core.DefaultApplicationId;
Jian Li8e7e6cd2018-03-30 13:33:08 +090031import org.onosproject.net.DeviceId;
32import org.onosproject.net.PortNumber;
33import org.onosproject.net.packet.DefaultInboundPacket;
34import org.onosproject.net.packet.DefaultPacketContext;
35import org.onosproject.net.packet.InboundPacket;
36import org.onosproject.net.packet.OutboundPacket;
37import org.onosproject.net.packet.PacketContext;
38import org.onosproject.net.packet.PacketProcessor;
39import org.onosproject.net.packet.PacketServiceAdapter;
40import org.onosproject.openstacknetworking.api.InstancePort;
41
42import java.nio.ByteBuffer;
43
44import static org.junit.Assert.assertArrayEquals;
45import static org.junit.Assert.assertEquals;
46import static org.junit.Assert.fail;
47import static org.onosproject.net.NetTestTools.connectPoint;
48
49public class OpenstackSwitchingArpHandlerTest {
50
51 private OpenstackSwitchingArpHandler arpHandler;
52
53 protected PacketProcessor packetProcessor;
54
55 private static final MacAddress CLIENT_MAC = MacAddress.valueOf("1a:1a:1a:1a:1a:1a");
56 private static final IpAddress CLIENT_IP = IpAddress.valueOf("10.10.10.10");
57 private static final IpAddress TARGET_IP = IpAddress.valueOf("10.10.10.20");
58 private static final MacAddress EXPECTED_MAC = MacAddress.valueOf("2b:2b:2b:2b:2b:2b");
59
60 @Before
61 public void setUp() {
62 arpHandler = new OpenstackSwitchingArpHandler();
63 arpHandler.coreService = new TestCoreService();
64 arpHandler.configService = new TestConfigService();
65 arpHandler.instancePortService = new TestInstancePortService();
66 arpHandler.packetService = new TestPacketService();
67 arpHandler.osNetworkService = new TestOpenstackNetworkService();
Jian Lieae12362018-04-10 18:48:32 +090068 arpHandler.osNodeService = new TestOpenstackNodeService();
69 arpHandler.osFlowRuleService = new TestOpenstackFlowRuleService();
Jian Lieae12362018-04-10 18:48:32 +090070 arpHandler.clusterService = new TestClusterService();
71 arpHandler.leadershipService = new TestLeadershipService();
Jian Li8e7e6cd2018-03-30 13:33:08 +090072 arpHandler.activate();
73 }
74
75 @After
76 public void tearDown() {
77 arpHandler.deactivate();
78 }
79
80 /**
81 * Tests the response to an ARP Request Packet.
82 */
83 @Test
84 public void testRequest() {
85 Ethernet arpRequest = constructArpPacket(ARP.OP_REQUEST);
86 sendPacket(arpRequest);
87 }
88
89 /**
90 * Sends an Ethernet packet to the process method of the Packet processor.
91 *
92 * @param ethernet Ethernet packet
93 */
94 private void sendPacket(Ethernet ethernet) {
95 final ByteBuffer byteBuffer = ByteBuffer.wrap(ethernet.serialize());
96 InboundPacket inPacket = new DefaultInboundPacket(connectPoint("1", 1),
97 ethernet,
98 byteBuffer);
99
100 PacketContext context = new TestPacketContext(127L, inPacket, null, false);
101 packetProcessor.process(context);
102 }
103
104 /**
105 * Validates the contents of the packet sent by the OpenstackSwitchingArpHandler.
106 *
107 * @param packet Ethernet packet received
108 */
109 private void validatePacket(Ethernet packet) {
110 ARP arpPacket = (ARP) packet.getPayload();
111
112 assertEquals(arpPacket.getOpCode(), ARP.OP_REPLY);
113 assertArrayEquals(arpPacket.getSenderHardwareAddress(), EXPECTED_MAC.toBytes());
114 assertArrayEquals(arpPacket.getSenderProtocolAddress(), TARGET_IP.toOctets());
115 assertArrayEquals(arpPacket.getTargetHardwareAddress(), CLIENT_MAC.toBytes());
116 assertArrayEquals(arpPacket.getTargetProtocolAddress(), CLIENT_IP.toOctets());
117 assertEquals(arpPacket.getProtocolType(), ARP.PROTO_TYPE_IP);
118 assertEquals(arpPacket.getHardwareType(), ARP.HW_TYPE_ETHERNET);
119 }
120
121 /**
122 * Constructs an Ethernet packet containing an ARP payload.
123 *
124 * @return Ethernet packet
125 */
126 private Ethernet constructArpPacket(short pktType) {
127 if (pktType == ARP.OP_REQUEST) {
128
129 return ARP.buildArpRequest(
130 CLIENT_MAC.toBytes(),
131 CLIENT_IP.toOctets(),
132 TARGET_IP.toOctets(),
133 (short) 2);
134 }
135
136 return null;
137 }
138
139 /**
140 * Mocks the CoreService.
141 */
142 private class TestCoreService extends CoreServiceAdapter {
Jian Lieae12362018-04-10 18:48:32 +0900143 @Override
144 public ApplicationId registerApplication(String name) {
145 return new DefaultApplicationId(100, "arpTestApp");
146 }
Jian Li8e7e6cd2018-03-30 13:33:08 +0900147 }
148
149 /**
150 * Mocks the ComponentConfigRegistry.
151 */
152 private class TestConfigService extends ComponentConfigAdapter {
153 }
154
155 /**
Jian Lieae12362018-04-10 18:48:32 +0900156 * Mocks the ClusterService.
157 */
158 private class TestClusterService extends ClusterServiceAdapter {
159 }
160
161 /**
162 * Mocks the LeadershipService.
163 */
164 private class TestLeadershipService extends LeadershipServiceAdapter {
165 }
166
167 /**
168 * Mocks the OpenstackNodeService.
169 */
170 private class TestOpenstackNodeService extends OpenstackNodeServiceAdapter {
171 }
172
173 /**
174 * Mocks the OpenstackFlowRuleService.
175 */
176 private class TestOpenstackFlowRuleService extends OpenstackFlowRuleServiceAdapter {
177 }
178
179 /**
Jian Li8e7e6cd2018-03-30 13:33:08 +0900180 * Mocks the InstancePortService.
181 */
182 private class TestInstancePortService extends InstancePortServiceAdapter {
183
184 @Override
185 public InstancePort instancePort(MacAddress macAddress) {
186 return new TestInstancePort();
187 }
188
189 @Override
190 public InstancePort instancePort(IpAddress ipAddress, String osNetId) {
191 return new TestInstancePort();
192 }
193 }
194
195 /**
196 * Mocks the instance port.
197 */
198 private final class TestInstancePort implements InstancePort {
199
200 @Override
201 public String networkId() {
202 return null;
203 }
204
205 @Override
206 public String portId() {
207 return null;
208 }
209
210 @Override
211 public MacAddress macAddress() {
212 return EXPECTED_MAC;
213 }
214
215 @Override
216 public IpAddress ipAddress() {
217 return null;
218 }
219
220 @Override
221 public DeviceId deviceId() {
222 return null;
223 }
224
225 @Override
Jian Liec5c32b2018-07-13 14:28:58 +0900226 public DeviceId oldDeviceId() {
227 return null;
228 }
229
230 @Override
Jian Li8e7e6cd2018-03-30 13:33:08 +0900231 public PortNumber portNumber() {
232 return null;
233 }
Jian Liecae4382018-06-28 17:41:12 +0900234
235 @Override
Jian Liec5c32b2018-07-13 14:28:58 +0900236 public PortNumber oldPortNumber() {
237 return null;
238 }
239
240 @Override
Jian Liecae4382018-06-28 17:41:12 +0900241 public State state() {
242 return null;
243 }
244
245 @Override
246 public InstancePort updateState(State newState) {
247 return null;
248 }
Jian Liec5c32b2018-07-13 14:28:58 +0900249
250 @Override
Jian Li46b74002018-07-15 18:39:08 +0900251 public InstancePort updatePrevLocation(DeviceId oldDeviceId, PortNumber oldPortNumber) {
Jian Liec5c32b2018-07-13 14:28:58 +0900252 return null;
253 }
Jian Li8e7e6cd2018-03-30 13:33:08 +0900254 }
255
256 /**
257 * Mocks the DefaultPacket context.
258 */
259 private final class TestPacketContext extends DefaultPacketContext {
260 private TestPacketContext(long time, InboundPacket inPkt,
261 OutboundPacket outPkt, boolean block) {
262 super(time, inPkt, outPkt, block);
263 }
264
265 @Override
266 public void send() {
267 // We don't send anything out.
268 }
269 }
270
271 /**
272 * Keeps a reference to the PacketProcessor and verifies the OutboundPackets.
273 */
274 private class TestPacketService extends PacketServiceAdapter {
275 @Override
276 public void addProcessor(PacketProcessor processor, int priority) {
277 packetProcessor = processor;
278 }
279
280 @Override
281 public void emit(OutboundPacket packet) {
282 try {
283 Ethernet eth = Ethernet.deserializer().deserialize(packet.data().array(),
284 0, packet.data().array().length);
285 validatePacket(eth);
286 } catch (Exception e) {
287 fail(e.getMessage());
288 }
289 }
290 }
291
292 /**
293 * Mocks the OpenstackNetworkService.
294 */
295 private class TestOpenstackNetworkService extends OpenstackNetworkServiceAdapter {
296 }
297}