blob: 3fef8dd75be8012bb124b02e3d666cf0cf9b510a [file] [log] [blame]
Ray Milkey7ec0d1b2015-11-13 08:51:35 -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.impl;
17
18import java.net.URI;
19import java.net.URISyntaxException;
20import java.util.ArrayList;
21import java.util.List;
22import java.util.concurrent.Future;
23
24import org.junit.Before;
25import org.junit.Test;
26import org.onosproject.openflow.ExecutorServiceAdapter;
Ray Milkey7ec0d1b2015-11-13 08:51:35 -080027import org.onosproject.openflow.MockOfPortStatus;
Ray Milkey7ec0d1b2015-11-13 08:51:35 -080028import org.onosproject.openflow.OpenFlowSwitchListenerAdapter;
29import org.onosproject.openflow.OpenflowSwitchDriverAdapter;
Jian Li152b8852015-12-07 14:47:25 -080030import org.onosproject.openflow.MockOfFeaturesReply;
31import org.onosproject.openflow.MockOfPacketIn;
32import org.onosproject.openflow.OfMessageAdapter;
Ray Milkey7ec0d1b2015-11-13 08:51:35 -080033import org.onosproject.openflow.controller.Dpid;
34import org.onosproject.openflow.controller.OpenFlowPacketContext;
35import org.onosproject.openflow.controller.OpenFlowSwitch;
36import org.onosproject.openflow.controller.PacketListener;
37import org.projectfloodlight.openflow.protocol.OFMessage;
38import org.projectfloodlight.openflow.protocol.OFType;
39
40import static junit.framework.TestCase.fail;
41import static org.hamcrest.MatcherAssert.assertThat;
42import static org.hamcrest.Matchers.equalTo;
43import static org.hamcrest.Matchers.hasSize;
44import static org.hamcrest.Matchers.is;
45
46/**
47 * Tests for packet processing in the open flow controller impl class.
48 */
49public class OpenFlowControllerImplPacketsTest {
50 OpenFlowControllerImpl controller;
51 OpenFlowControllerImpl.OpenFlowSwitchAgent agent;
52 Dpid dpid1;
53 OpenFlowSwitch switch1;
54 OpenFlowSwitchListenerAdapter switchListener;
55 TestPacketListener packetListener;
Jian Li28247b52016-01-07 17:24:15 -080056 TestExecutorService statsExecutorService;
57 TestExecutorService pktInExecutorService;
58 TestExecutorService flowRmvExecutorService;
Ray Milkey7ec0d1b2015-11-13 08:51:35 -080059
60 /**
61 * Mock packet listener that accumulates packets.
62 */
63 class TestPacketListener implements PacketListener {
64 List<OpenFlowPacketContext> contexts = new ArrayList<>();
65
66 @Override
67 public void handlePacket(OpenFlowPacketContext pktCtx) {
68 contexts.add(pktCtx);
69 }
70
71 List<OpenFlowPacketContext> contexts() {
72 return contexts;
73 }
74 }
75
76
77 /**
78 * Mock executor service that tracks submits.
79 */
80 static class TestExecutorService extends ExecutorServiceAdapter {
81 private List<OFMessage> submittedMessages = new ArrayList<>();
82
83 List<OFMessage> submittedMessages() {
84 return submittedMessages;
85 }
86
87 @Override
88 public Future<?> submit(Runnable task) {
89 OpenFlowControllerImpl.OFMessageHandler handler =
90 (OpenFlowControllerImpl.OFMessageHandler) task;
91 submittedMessages.add(handler.msg);
92 return null;
93 }
94 }
95
96 /**
97 * Sets up switches to use as data, mocks and launches a controller instance.
98 */
99 @Before
100 public void setUp() {
101 try {
102 switch1 = new OpenflowSwitchDriverAdapter();
103 dpid1 = Dpid.dpid(new URI("of:0000000000000111"));
104 } catch (URISyntaxException ex) {
105 // Does not happen
106 fail();
107 }
108
109 controller = new OpenFlowControllerImpl();
110 agent = controller.agent;
111 switchListener = new OpenFlowSwitchListenerAdapter();
112 controller.addListener(switchListener);
Jian Li28247b52016-01-07 17:24:15 -0800113 controller.monitorAllEvents(true);
Ray Milkey7ec0d1b2015-11-13 08:51:35 -0800114
115 packetListener = new TestPacketListener();
116 controller.addPacketListener(100, packetListener);
117
Jian Li28247b52016-01-07 17:24:15 -0800118 statsExecutorService = new TestExecutorService();
119 pktInExecutorService = new TestExecutorService();
120 flowRmvExecutorService = new TestExecutorService();
121
122 controller.executorMsgs = statsExecutorService;
123 controller.executorPacketIn = pktInExecutorService;
124 controller.executorFlowRemoved = flowRmvExecutorService;
125
Ray Milkey7ec0d1b2015-11-13 08:51:35 -0800126 }
127
128 /**
129 * Tests a port status operation.
130 */
131 @Test
132 public void testPortStatus() {
133 OFMessage portStatusPacket = new MockOfPortStatus();
134 controller.processPacket(dpid1, portStatusPacket);
135 assertThat(switchListener.portChangedDpids().size(), is(1));
136 assertThat(switchListener.portChangedDpids().containsKey(dpid1),
137 is(true));
138 assertThat(switchListener.portChangedDpids().get(dpid1),
139 equalTo(portStatusPacket));
140 }
141
142 /**
143 * Tests a features reply operation.
144 */
145 @Test
146 public void testFeaturesReply() {
147 OFMessage ofFeaturesReplyPacket = new MockOfFeaturesReply();
148 controller.processPacket(dpid1, ofFeaturesReplyPacket);
149 assertThat(switchListener.changedDpids(), hasSize(1));
150 assertThat(switchListener.changedDpids().get(0),
151 equalTo(dpid1));
152 }
153
154 /**
Jian Li152b8852015-12-07 14:47:25 -0800155 * Tests a packet in listen operation.
Ray Milkey7ec0d1b2015-11-13 08:51:35 -0800156 */
157 @Test
Jian Li152b8852015-12-07 14:47:25 -0800158 public void testPacketInListen() {
Ray Milkey7ec0d1b2015-11-13 08:51:35 -0800159 agent.addConnectedSwitch(dpid1, switch1);
160 OFMessage packetInPacket = new MockOfPacketIn();
161 controller.processPacket(dpid1, packetInPacket);
162 assertThat(packetListener.contexts(), hasSize(1));
Jian Li28247b52016-01-07 17:24:15 -0800163 assertThat(pktInExecutorService.submittedMessages(), hasSize(1));
164 assertThat(pktInExecutorService.submittedMessages().get(0), is(packetInPacket));
Ray Milkey7ec0d1b2015-11-13 08:51:35 -0800165 }
166
167 /**
168 * Tests an error operation.
169 */
170 @Test
171 public void testError() {
172 agent.addConnectedSwitch(dpid1, switch1);
173 OfMessageAdapter errorPacket = new OfMessageAdapter(OFType.ERROR);
174 controller.processPacket(dpid1, errorPacket);
Jian Li28247b52016-01-07 17:24:15 -0800175 assertThat(statsExecutorService.submittedMessages(), hasSize(1));
176 assertThat(statsExecutorService.submittedMessages().get(0), is(errorPacket));
Ray Milkey7ec0d1b2015-11-13 08:51:35 -0800177 }
Jian Li152b8852015-12-07 14:47:25 -0800178
179 /**
180 * Tests a packet in operation.
181 */
182 @Test
183 public void testFlowRemoved() {
184 agent.addConnectedSwitch(dpid1, switch1);
185 OFMessage flowRemovedPacket = new MockOfFlowRemoved();
186 controller.processPacket(dpid1, flowRemovedPacket);
Jian Li28247b52016-01-07 17:24:15 -0800187 assertThat(flowRmvExecutorService.submittedMessages(), hasSize(1));
188 assertThat(flowRmvExecutorService.submittedMessages().get(0), is(flowRemovedPacket));
Jian Li152b8852015-12-07 14:47:25 -0800189 }
Ray Milkey7ec0d1b2015-11-13 08:51:35 -0800190}