blob: dd965f8c61c39fbd1f35e7fa7a82bee5f4052527 [file] [log] [blame]
Brian Stanke9a108972016-04-11 15:25:17 -04001/*
2 * Copyright 2016-present 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 */
16
17package org.onosproject.incubator.net.virtual.impl;
18
Brian Stanke612cebf2016-05-02 10:21:33 -040019import com.google.common.collect.Lists;
Brian Stanke9a108972016-04-11 15:25:17 -040020import org.junit.After;
21import org.junit.Before;
22import org.junit.Test;
23import org.onosproject.TestApplicationId;
24import org.onosproject.core.ApplicationId;
25import org.onosproject.core.CoreService;
26import org.onosproject.core.CoreServiceAdapter;
27import org.onosproject.core.IdGenerator;
28import org.onosproject.incubator.net.tunnel.TunnelId;
29import org.onosproject.incubator.net.virtual.NetworkId;
30import org.onosproject.incubator.net.virtual.VirtualNetworkProvider;
31import org.onosproject.incubator.net.virtual.VirtualNetworkProviderRegistry;
32import org.onosproject.incubator.net.virtual.VirtualNetworkProviderService;
33import org.onosproject.net.ConnectPoint;
34import org.onosproject.net.DeviceId;
35import org.onosproject.net.PortNumber;
Brian Stanke612cebf2016-05-02 10:21:33 -040036import org.onosproject.net.intent.FakeIntentManager;
37import org.onosproject.net.intent.FlowRuleIntent;
Brian Stanke9a108972016-04-11 15:25:17 -040038import org.onosproject.net.intent.Intent;
Brian Stanke612cebf2016-05-02 10:21:33 -040039import org.onosproject.net.intent.IntentCompiler;
40import org.onosproject.net.intent.IntentEvent;
41import org.onosproject.net.intent.IntentExtensionService;
42import org.onosproject.net.intent.IntentListener;
43import org.onosproject.net.intent.IntentTestsMocks;
Brian Stanke9a108972016-04-11 15:25:17 -040044import org.onosproject.net.intent.MockIdGenerator;
Brian Stanke612cebf2016-05-02 10:21:33 -040045import org.onosproject.net.intent.PointToPointIntent;
46import org.onosproject.net.intent.TestableIntentService;
Brian Stanke9a108972016-04-11 15:25:17 -040047import org.onosproject.net.provider.AbstractProviderService;
48import org.onosproject.net.provider.ProviderId;
49
Brian Stanke612cebf2016-05-02 10:21:33 -040050import java.util.Collections;
51import java.util.List;
Brian Stanke9a108972016-04-11 15:25:17 -040052import java.util.Set;
Brian Stanke612cebf2016-05-02 10:21:33 -040053import java.util.concurrent.Semaphore;
54import java.util.concurrent.TimeUnit;
Brian Stanke9a108972016-04-11 15:25:17 -040055import java.util.concurrent.atomic.AtomicLong;
56
57import static org.easymock.EasyMock.*;
Brian Stanke612cebf2016-05-02 10:21:33 -040058import static org.junit.Assert.*;
Brian Stanke9a108972016-04-11 15:25:17 -040059
60/**
61 * Junit tests for PtToPtIntentVirtualNetworkProvider.
62 */
63public class PtToPtIntentVirtualNetworkProviderTest {
64
65 private PtToPtIntentVirtualNetworkProvider provider;
66 private VirtualNetworkProviderRegistry providerRegistry;
67
68 private final VirtualNetworkRegistryAdapter virtualNetworkRegistry = new VirtualNetworkRegistryAdapter();
Brian Stanke612cebf2016-05-02 10:21:33 -040069 private TestableIntentService intentService = new FakeIntentManager();
70 private TestListener listener = new TestListener();
71 protected TestIntentCompiler compiler = new TestIntentCompiler();
72 private IntentExtensionService intentExtensionService;
Brian Stanke9a108972016-04-11 15:25:17 -040073
74 private static final ApplicationId APP_ID =
75 TestApplicationId.create(PtToPtIntentVirtualNetworkProvider.PTPT_INTENT_APPID);
76
77 private IdGenerator idGenerator = new MockIdGenerator();
Brian Stanke612cebf2016-05-02 10:21:33 -040078 private static final int MAX_WAIT_TIME = 5;
79 private static final int MAX_PERMITS = 2;
80 private static Semaphore created;
81 private static Semaphore removed;
Brian Stanke9a108972016-04-11 15:25:17 -040082
83 @Before
84 public void setUp() {
85 provider = new PtToPtIntentVirtualNetworkProvider();
86 provider.providerRegistry = virtualNetworkRegistry;
87 final CoreService mockCoreService = createMock(CoreService.class);
88 provider.coreService = mockCoreService;
89 expect(mockCoreService.registerApplication(PtToPtIntentVirtualNetworkProvider.PTPT_INTENT_APPID))
90 .andReturn(APP_ID).anyTimes();
91 replay(mockCoreService);
92 Intent.unbindIdGenerator(idGenerator);
93 Intent.bindIdGenerator(idGenerator);
94
Brian Stanke612cebf2016-05-02 10:21:33 -040095 intentService.addListener(listener);
Brian Stanke9a108972016-04-11 15:25:17 -040096 provider.intentService = intentService;
Brian Stanke612cebf2016-05-02 10:21:33 -040097
98 // Register a compiler and an installer both setup for success.
99 intentExtensionService = intentService;
100 intentExtensionService.registerCompiler(PointToPointIntent.class, compiler);
101
Brian Stanke9a108972016-04-11 15:25:17 -0400102 provider.activate();
Brian Stanke612cebf2016-05-02 10:21:33 -0400103 created = new Semaphore(0, true);
104 removed = new Semaphore(0, true);
Brian Stanke9a108972016-04-11 15:25:17 -0400105 }
106
107 @After
108 public void tearDown() {
Brian Stanke612cebf2016-05-02 10:21:33 -0400109 Intent.unbindIdGenerator(idGenerator);
110 intentService.removeListener(listener);
Brian Stanke9a108972016-04-11 15:25:17 -0400111 provider.deactivate();
112 provider.providerRegistry = null;
113 provider.coreService = null;
114 provider.intentService = null;
Brian Stanke612cebf2016-05-02 10:21:33 -0400115 created = null;
116 removed = null;
Brian Stanke9a108972016-04-11 15:25:17 -0400117 }
118
119 @Test
120 public void basics() {
121 assertNotNull("registration expected", provider);
122 }
123
124 /**
125 * Test a null network identifier.
126 */
127 @Test(expected = NullPointerException.class)
128 public void testCreateTunnelNullNetworkId() {
129 provider.createTunnel(null, null, null);
130 }
131
132 /**
133 * Test a null source connect point.
134 */
135 @Test(expected = NullPointerException.class)
136 public void testCreateTunnelNullSrc() {
137 ConnectPoint dst = new ConnectPoint(DeviceId.deviceId("device2"), PortNumber.portNumber(2));
138
139 provider.createTunnel(NetworkId.networkId(0), null, dst);
140 }
141
142 /**
143 * Test a null destination connect point.
144 */
145 @Test(expected = NullPointerException.class)
146 public void testCreateTunnelNullDst() {
147 ConnectPoint src = new ConnectPoint(DeviceId.deviceId("device1"), PortNumber.portNumber(1));
148
149 provider.createTunnel(NetworkId.networkId(0), src, null);
150 }
151
152 /**
153 * Test creating/destroying a valid tunnel.
154 */
155 @Test
156 public void testCreateRemoveTunnel() {
157 NetworkId networkId = NetworkId.networkId(0);
158 ConnectPoint src = new ConnectPoint(DeviceId.deviceId("device1"), PortNumber.portNumber(1));
159 ConnectPoint dst = new ConnectPoint(DeviceId.deviceId("device2"), PortNumber.portNumber(2));
160
161 TunnelId tunnelId = provider.createTunnel(networkId, src, dst);
Brian Stanke612cebf2016-05-02 10:21:33 -0400162
163 // Wait for the tunnel to go into an INSTALLED state, and that the tunnelUp method was called.
164 try {
165 if (!created.tryAcquire(MAX_PERMITS, MAX_WAIT_TIME, TimeUnit.SECONDS)) {
166 fail("Failed to wait for tunnel to get installed.");
167 }
168 } catch (InterruptedException e) {
169 fail("Semaphore exception during tunnel installation." + e.getMessage());
170 }
171
Brian Stanke9a108972016-04-11 15:25:17 -0400172 String key = String.format(PtToPtIntentVirtualNetworkProvider.KEY_FORMAT,
173 networkId.toString(), src.toString(), dst.toString());
174
175 assertEquals("TunnelId does not match as expected.", key, tunnelId.toString());
176 provider.destroyTunnel(networkId, tunnelId);
Brian Stanke612cebf2016-05-02 10:21:33 -0400177
178 // Wait for the tunnel to go into a WITHDRAWN state, and that the tunnelDown method was called.
179 try {
180 if (!removed.tryAcquire(MAX_PERMITS, MAX_WAIT_TIME, TimeUnit.SECONDS)) {
181 fail("Failed to wait for tunnel to get removed.");
182 }
183 } catch (InterruptedException e) {
184 fail("Semaphore exception during tunnel removal." + e.getMessage());
185 }
Brian Stanke9a108972016-04-11 15:25:17 -0400186 }
187
188 /**
189 * Virtual network registry implementation for this test class.
190 */
191 private class VirtualNetworkRegistryAdapter implements VirtualNetworkProviderRegistry {
192 private VirtualNetworkProvider provider;
193
194 @Override
195 public VirtualNetworkProviderService register(VirtualNetworkProvider theProvider) {
196 this.provider = theProvider;
197 return new TestVirtualNetworkProviderService(theProvider);
198 }
199
200 @Override
201 public void unregister(VirtualNetworkProvider theProvider) {
202 this.provider = null;
203 }
204
205 @Override
206 public Set<ProviderId> getProviders() {
207 return null;
208 }
209 }
210
211 /**
212 * Virtual network provider service implementation for this test class.
213 */
214 private class TestVirtualNetworkProviderService
215 extends AbstractProviderService<VirtualNetworkProvider>
216 implements VirtualNetworkProviderService {
217
218 protected TestVirtualNetworkProviderService(VirtualNetworkProvider provider) {
219 super(provider);
220 }
Brian Stanke4d579882016-04-22 13:28:46 -0400221
222 @Override
Brian Stankefb61df42016-07-25 11:47:51 -0400223 public void topologyChanged(Set<Set<ConnectPoint>> clusters) {
224
225 }
226
227 @Override
Brian Stanke612cebf2016-05-02 10:21:33 -0400228 public void tunnelUp(NetworkId networkId, ConnectPoint src, ConnectPoint dst, TunnelId tunnelId) {
229 // Release one permit on the created semaphore since the tunnelUp method was called.
230 created.release();
Brian Stanke4d579882016-04-22 13:28:46 -0400231 }
232
233 @Override
Brian Stanke612cebf2016-05-02 10:21:33 -0400234 public void tunnelDown(NetworkId networkId, ConnectPoint src, ConnectPoint dst, TunnelId tunnelId) {
235 // Release one permit on the removed semaphore since the tunnelDown method was called.
236 removed.release();
Brian Stanke4d579882016-04-22 13:28:46 -0400237 }
Brian Stanke9a108972016-04-11 15:25:17 -0400238 }
239
Brian Stanke612cebf2016-05-02 10:21:33 -0400240 private static class TestListener implements IntentListener {
241
242 @Override
243 public void event(IntentEvent event) {
244 switch (event.type()) {
245 case INSTALLED:
246 // Release one permit on the created semaphore since the Intent event was received.
247 created.release();
248 break;
249 case WITHDRAWN:
250 // Release one permit on the removed semaphore since the Intent event was received.
251 removed.release();
252 break;
253 default:
254 break;
255 }
256 }
257 }
Brian Stanke9a108972016-04-11 15:25:17 -0400258
259 /**
260 * Core service test class.
261 */
262 private class TestCoreService extends CoreServiceAdapter {
263
264 @Override
265 public IdGenerator getIdGenerator(String topic) {
266 return new IdGenerator() {
267 private AtomicLong counter = new AtomicLong(0);
268
269 @Override
270 public long getNewId() {
271 return counter.getAndIncrement();
272 }
273 };
274 }
275 }
276
Brian Stanke612cebf2016-05-02 10:21:33 -0400277 private static class TestIntentCompiler implements IntentCompiler<PointToPointIntent> {
Brian Stanke9a108972016-04-11 15:25:17 -0400278 @Override
Brian Stanke612cebf2016-05-02 10:21:33 -0400279 public List<Intent> compile(PointToPointIntent intent, List<Intent> installable) {
280 return Lists.newArrayList(new MockInstallableIntent());
Brian Stanke9a108972016-04-11 15:25:17 -0400281 }
Brian Stanke612cebf2016-05-02 10:21:33 -0400282 }
Brian Stanke9a108972016-04-11 15:25:17 -0400283
Brian Stanke612cebf2016-05-02 10:21:33 -0400284 private static class MockInstallableIntent extends FlowRuleIntent {
Brian Stanke9a108972016-04-11 15:25:17 -0400285
Brian Stanke612cebf2016-05-02 10:21:33 -0400286 public MockInstallableIntent() {
287 super(APP_ID, Collections.singletonList(new IntentTestsMocks.MockFlowRule(100)), Collections.emptyList());
Brian Stanke9a108972016-04-11 15:25:17 -0400288 }
289 }
290}