blob: 59ab91cb0475b51dbd222615bde850026f210345 [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
226 public PortNumber portNumber() {
227 return null;
228 }
229 }
230
231 /**
232 * Mocks the DefaultPacket context.
233 */
234 private final class TestPacketContext extends DefaultPacketContext {
235 private TestPacketContext(long time, InboundPacket inPkt,
236 OutboundPacket outPkt, boolean block) {
237 super(time, inPkt, outPkt, block);
238 }
239
240 @Override
241 public void send() {
242 // We don't send anything out.
243 }
244 }
245
246 /**
247 * Keeps a reference to the PacketProcessor and verifies the OutboundPackets.
248 */
249 private class TestPacketService extends PacketServiceAdapter {
250 @Override
251 public void addProcessor(PacketProcessor processor, int priority) {
252 packetProcessor = processor;
253 }
254
255 @Override
256 public void emit(OutboundPacket packet) {
257 try {
258 Ethernet eth = Ethernet.deserializer().deserialize(packet.data().array(),
259 0, packet.data().array().length);
260 validatePacket(eth);
261 } catch (Exception e) {
262 fail(e.getMessage());
263 }
264 }
265 }
266
267 /**
268 * Mocks the OpenstackNetworkService.
269 */
270 private class TestOpenstackNetworkService extends OpenstackNetworkServiceAdapter {
271 }
272}