blob: ad4e3d6ac9716e12927262c99478d27b70003a67 [file] [log] [blame]
Jian Li152b8852015-12-07 14:47:25 -08001/*
2 * Copyright 2015 Open Networking Laboratory
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.openflow.controller.driver;
17
Andrea Campanelladda93562016-03-02 11:08:12 -080018import org.jboss.netty.channel.Channel;
Jian Li11111972016-04-01 23:49:00 -070019import org.jboss.netty.channel.ChannelConfig;
20import org.jboss.netty.channel.ChannelFactory;
21import org.jboss.netty.channel.ChannelFuture;
22import org.jboss.netty.channel.ChannelPipeline;
Jian Li152b8852015-12-07 14:47:25 -080023import org.junit.Before;
24import org.junit.Test;
Jian Li28247b52016-01-07 17:24:15 -080025import org.onosproject.openflow.controller.Dpid;
26import org.onosproject.openflow.controller.OpenFlowEventListener;
Jian Li11111972016-04-01 23:49:00 -070027import org.onosproject.openflow.controller.RoleState;
Jian Li152b8852015-12-07 14:47:25 -080028import org.projectfloodlight.openflow.protocol.OFMessage;
Andrea Campanelladda93562016-03-02 11:08:12 -080029
Jian Li11111972016-04-01 23:49:00 -070030import java.net.SocketAddress;
Jian Li152b8852015-12-07 14:47:25 -080031import java.util.ArrayList;
32import java.util.List;
Jian Li152b8852015-12-07 14:47:25 -080033
34import static org.hamcrest.MatcherAssert.assertThat;
35import static org.hamcrest.Matchers.hasSize;
36import static org.hamcrest.Matchers.is;
37
38/**
39 * Tests for packet processing in the abstract openflow switch class.
40 */
41public class AbstractOpenFlowSwitchTest {
42
43 OpenFlowSwitchImpl ofSwitch;
44 TestExecutorService executorService;
45
46 /**
47 * Mock executor service that tracks submits.
48 */
49 static class TestExecutorService extends ExecutorServiceAdapter {
50 private List<OFMessage> submittedMessages = new ArrayList<>();
51
52 List<OFMessage> submittedMessages() {
53 return submittedMessages;
54 }
55
56 @Override
Andrea Campanelladda93562016-03-02 11:08:12 -080057 public void execute(Runnable task) {
Jian Li152b8852015-12-07 14:47:25 -080058 AbstractOpenFlowSwitch.OFMessageHandler handler =
59 (AbstractOpenFlowSwitch.OFMessageHandler) task;
60 submittedMessages.add(handler.msg);
Jian Li152b8852015-12-07 14:47:25 -080061 }
62 }
63
64 /**
65 * Sets up switches to use as data.
66 */
67 @Before
68 public void setUp() {
69 ofSwitch = new OpenFlowSwitchImpl();
70
71 executorService = new TestExecutorService();
72 ofSwitch.executorMsgs = executorService;
Jian Li11111972016-04-01 23:49:00 -070073 Channel channel = new MockChannel();
Jian Li152b8852015-12-07 14:47:25 -080074 ofSwitch.setChannel(channel);
Jian Li11111972016-04-01 23:49:00 -070075 ofSwitch.role = RoleState.MASTER;
Jian Li28247b52016-01-07 17:24:15 -080076 ofSwitch.addEventListener(new OpenFlowEventListenerAdapter());
Jian Li152b8852015-12-07 14:47:25 -080077 }
78
79 /**
80 * Tests a packet out operation.
81 */
82 @Test
83 public void testPacketOut() {
84 OFMessage ofPacketOut = new MockOfPacketOut();
85 ofSwitch.sendMsg(ofPacketOut);
86 assertThat(executorService.submittedMessages(), hasSize(1));
87 assertThat(executorService.submittedMessages().get(0), is(ofPacketOut));
88 }
89
90 /**
91 * Tests a flow mod operation.
92 */
93 @Test
94 public void testFlowMod() {
95 OFMessage ofFlowMod = new MockOfFlowMod();
96 ofSwitch.sendMsg(ofFlowMod);
97 assertThat(executorService.submittedMessages(), hasSize(1));
98 assertThat(executorService.submittedMessages().get(0), is(ofFlowMod));
99 }
100
101 /**
102 * Tests a stats request operation.
103 */
104 @Test
105 public void testStatsRequest() {
106 OFMessage ofStatsRequest = new MockOfStatsRequest();
107 ofSwitch.sendMsg(ofStatsRequest);
108 assertThat(executorService.submittedMessages(), hasSize(1));
109 assertThat(executorService.submittedMessages().get(0), is(ofStatsRequest));
110 }
111
112 protected class OpenFlowSwitchImpl extends AbstractOpenFlowSwitch {
113
114 @Override
115 public Boolean supportNxRole() {
116 return null;
117 }
118
119 @Override
120 public void startDriverHandshake() {
121 }
122
123 @Override
124 public boolean isDriverHandshakeComplete() {
125 return false;
126 }
127
128 @Override
129 public void processDriverHandshakeMessage(OFMessage m) {
130 }
131 }
Jian Li28247b52016-01-07 17:24:15 -0800132
133 private class OpenFlowEventListenerAdapter implements OpenFlowEventListener {
134
135 @Override
136 public void handleMessage(Dpid dpid, OFMessage msg) {
137 }
138 }
Jian Li11111972016-04-01 23:49:00 -0700139
140 private class MockChannel implements Channel {
141
142 @Override
143 public Integer getId() {
144 return null;
145 }
146
147 @Override
148 public ChannelFactory getFactory() {
149 return null;
150 }
151
152 @Override
153 public Channel getParent() {
154 return null;
155 }
156
157 @Override
158 public ChannelConfig getConfig() {
159 return null;
160 }
161
162 @Override
163 public ChannelPipeline getPipeline() {
164 return null;
165 }
166
167 @Override
168 public boolean isOpen() {
169 return false;
170 }
171
172 @Override
173 public boolean isBound() {
174 return false;
175 }
176
177 @Override
178 public boolean isConnected() {
179 // we assume that the channel is connected
180 return true;
181 }
182
183 @Override
184 public SocketAddress getLocalAddress() {
185 return null;
186 }
187
188 @Override
189 public SocketAddress getRemoteAddress() {
190 return null;
191 }
192
193 @Override
194 public ChannelFuture write(Object message) {
195 return null;
196 }
197
198 @Override
199 public ChannelFuture write(Object message, SocketAddress remoteAddress) {
200 return null;
201 }
202
203 @Override
204 public ChannelFuture bind(SocketAddress localAddress) {
205 return null;
206 }
207
208 @Override
209 public ChannelFuture connect(SocketAddress remoteAddress) {
210 return null;
211 }
212
213 @Override
214 public ChannelFuture disconnect() {
215 return null;
216 }
217
218 @Override
219 public ChannelFuture unbind() {
220 return null;
221 }
222
223 @Override
224 public ChannelFuture close() {
225 return null;
226 }
227
228 @Override
229 public ChannelFuture getCloseFuture() {
230 return null;
231 }
232
233 @Override
234 public int getInterestOps() {
235 return 0;
236 }
237
238 @Override
239 public boolean isReadable() {
240 return false;
241 }
242
243 @Override
244 public boolean isWritable() {
245 return false;
246 }
247
248 @Override
249 public ChannelFuture setInterestOps(int interestOps) {
250 return null;
251 }
252
253 @Override
254 public ChannelFuture setReadable(boolean readable) {
255 return null;
256 }
257
258 @Override
259 public boolean getUserDefinedWritability(int index) {
260 return false;
261 }
262
263 @Override
264 public void setUserDefinedWritability(int index, boolean isWritable) {
265
266 }
267
268 @Override
269 public Object getAttachment() {
270 return null;
271 }
272
273 @Override
274 public void setAttachment(Object attachment) {
275
276 }
277
278 @Override
279 public int compareTo(Channel o) {
280 return 0;
281 }
282 }
Jian Li152b8852015-12-07 14:47:25 -0800283}