blob: 0d2c4408ba6cc844bf969c511c2f31157afec230 [file] [log] [blame]
Brian O'Connoreba4e342015-04-30 22:50:13 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2015-present Open Networking Laboratory
Brian O'Connoreba4e342015-04-30 22:50:13 -07003 *
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.net.intent.impl;
17
18import com.google.common.collect.Sets;
19import org.junit.After;
20import org.junit.Before;
21import org.junit.Test;
22import org.onosproject.cfg.ComponentConfigAdapter;
23import org.onosproject.core.IdGenerator;
24import org.onosproject.net.intent.Intent;
25import org.onosproject.net.intent.IntentData;
26import org.onosproject.net.intent.IntentEvent;
27import org.onosproject.net.intent.IntentService;
28import org.onosproject.net.intent.IntentStore;
29import org.onosproject.net.intent.IntentStoreDelegate;
30import org.onosproject.net.intent.MockIdGenerator;
31import org.onosproject.store.Timestamp;
Thomas Vachuskac97aa612015-06-23 16:00:18 -070032import org.onosproject.store.trivial.SimpleIntentStore;
33import org.onosproject.store.trivial.SystemClockTimestamp;
Brian O'Connoreba4e342015-04-30 22:50:13 -070034
35import static org.easymock.EasyMock.*;
36import static org.junit.Assert.assertTrue;
37import static org.onosproject.net.intent.IntentState.*;
38import static org.onosproject.net.intent.IntentTestsMocks.MockIntent;
39
40/**
41 * Test intent cleanup using Mocks.
42 * FIXME remove this or IntentCleanupTest
43 */
44public class IntentCleanupTestMock {
45
46 private IntentCleanup cleanup;
47 private IntentService service;
48 private IntentStore store;
49 protected IdGenerator idGenerator; // global or one per test? per test for now.
50
51 @Before
52 public void setUp() {
53 service = createMock(IntentService.class);
54 store = new SimpleIntentStore();
55 cleanup = new IntentCleanup();
56 idGenerator = new MockIdGenerator();
57
58 service.addListener(cleanup);
59 expectLastCall().once();
60 replay(service);
61
62 cleanup.cfgService = new ComponentConfigAdapter();
63 cleanup.service = service;
64 cleanup.store = store;
65 cleanup.period = 1000;
66 cleanup.retryThreshold = 3;
67 cleanup.activate();
68
69 verify(service);
70 reset(service);
71
72 assertTrue("store should be empty",
73 Sets.newHashSet(cleanup.store.getIntents()).isEmpty());
74
Thomas Vachuska23235962017-02-03 11:44:15 -080075 Intent.unbindIdGenerator(idGenerator);
Brian O'Connoreba4e342015-04-30 22:50:13 -070076 Intent.bindIdGenerator(idGenerator);
77 }
78
79 @After
80 public void tearDown() {
81 service.removeListener(cleanup);
82 expectLastCall().once();
83 replay(service);
84
85 cleanup.deactivate();
86
87 verify(service);
88 reset(service);
89
90 Intent.unbindIdGenerator(idGenerator);
91 }
92
93 /**
94 * Trigger resubmit of intent in CORRUPT during periodic poll.
95 */
Brian O'Connoreba4e342015-04-30 22:50:13 -070096 @Test
97 public void corruptPoll() {
98 IntentStoreDelegate mockDelegate = new IntentStoreDelegate() {
99 @Override
100 public void process(IntentData intentData) {
101 intentData.setState(CORRUPT);
102 store.write(intentData);
103 }
104
105 @Override
106 public void notify(IntentEvent event) {}
107 };
108 store.setDelegate(mockDelegate);
109
110 Intent intent = new MockIntent(1L);
111 Timestamp version = new SystemClockTimestamp(1L);
112 IntentData data = new IntentData(intent, INSTALL_REQ, version);
113 store.addPending(data);
114
115 service.submit(intent);
116 expectLastCall().once();
117 replay(service);
118
Jihwan Kimfc1bf342016-11-12 00:37:07 +0900119 synchronized (service) {
Jihwan Kima19e1b72016-11-12 11:39:38 +0900120 cleanup.run();
Jihwan Kimfc1bf342016-11-12 00:37:07 +0900121 }
Brian O'Connoreba4e342015-04-30 22:50:13 -0700122 verify(service);
123 reset(service);
124 }
125
126 /**
127 * Trigger resubmit of intent in INSTALL_REQ for too long.
128 */
129 @Test
130 public void pendingPoll() {
131 IntentStoreDelegate mockDelegate = new IntentStoreDelegate() {
132 @Override
133 public void process(IntentData intentData) {}
134
135 @Override
136 public void notify(IntentEvent event) {
137 cleanup.event(event);
138 }
139 };
140 store.setDelegate(mockDelegate);
141
142 Intent intent = new MockIntent(1L);
143 Timestamp version = new SystemClockTimestamp(1L);
144 IntentData data = new IntentData(intent, INSTALL_REQ, version);
145 store.addPending(data);
146
Brian O'Connor38224302016-08-02 22:03:01 -0700147 service.addPending(data);
Brian O'Connoreba4e342015-04-30 22:50:13 -0700148 expectLastCall().once();
149 replay(service);
150
151 cleanup.run();
152 verify(service);
153 reset(service);
154 }
155
156 /**
157 * Trigger resubmit of intent in INSTALLING for too long.
158 */
159 @Test
160 public void installingPoll() {
161 IntentStoreDelegate mockDelegate = new IntentStoreDelegate() {
162 @Override
163 public void process(IntentData intentData) {
164 intentData.setState(INSTALLING);
165 store.write(intentData);
166 }
167
168 @Override
169 public void notify(IntentEvent event) {
170 cleanup.event(event);
171 }
172 };
173 store.setDelegate(mockDelegate);
174
175 Intent intent = new MockIntent(1L);
176 Timestamp version = new SystemClockTimestamp(1L);
177 IntentData data = new IntentData(intent, INSTALL_REQ, version);
178 store.addPending(data);
179
Brian O'Connor38224302016-08-02 22:03:01 -0700180 service.addPending(data);
Brian O'Connoreba4e342015-04-30 22:50:13 -0700181 expectLastCall().once();
182 replay(service);
183
184 cleanup.run();
185 verify(service);
186 reset(service);
187 }
188
189 /**
190 * Only submit one of two intents because one is too new.
191 */
192 @Test
193 public void skipPoll() {
194 IntentStoreDelegate mockDelegate = new IntentStoreDelegate() {
195 @Override
196 public void process(IntentData intentData) {
197 intentData.setState(CORRUPT);
198 store.write(intentData);
199 }
200
201 @Override
202 public void notify(IntentEvent event) {}
203 };
204 store.setDelegate(mockDelegate);
205
206 Intent intent = new MockIntent(1L);
207 IntentData data = new IntentData(intent, INSTALL_REQ, null);
208 store.addPending(data);
209
210 Intent intent2 = new MockIntent(2L);
211 Timestamp version = new SystemClockTimestamp(1L);
212 data = new IntentData(intent2, INSTALL_REQ, version);
213 store.addPending(data);
214
215 service.submit(intent2);
216 expectLastCall().once();
217 replay(service);
218
219 cleanup.run();
220 verify(service);
221 reset(service);
222 }
223
224 /**
225 * Verify resubmit in response to CORRUPT event.
226 */
227 @Test
228 public void corruptEvent() {
229 IntentStoreDelegate mockDelegate = new IntentStoreDelegate() {
230 @Override
231 public void process(IntentData intentData) {
232 intentData.setState(CORRUPT);
233 store.write(intentData);
234 }
235
236 @Override
237 public void notify(IntentEvent event) {
238 cleanup.event(event);
239 }
240 };
241 store.setDelegate(mockDelegate);
242
243
244 Intent intent = new MockIntent(1L);
245 IntentData data = new IntentData(intent, INSTALL_REQ, null);
246
247 service.submit(intent);
248 expectLastCall().once();
249 replay(service);
250
251 store.addPending(data);
252
253 verify(service);
254 reset(service);
255 }
256
257 /**
258 * Intent should not be retried because threshold is reached.
259 */
260 @Test
261 public void corruptEventThreshold() {
262 IntentStoreDelegate mockDelegate = new IntentStoreDelegate() {
263 @Override
264 public void process(IntentData intentData) {
265 intentData.setState(CORRUPT);
266 intentData.setErrorCount(cleanup.retryThreshold);
267 store.write(intentData);
268 }
269
270 @Override
271 public void notify(IntentEvent event) {
272 cleanup.event(event);
273 }
274 };
275 store.setDelegate(mockDelegate);
276
277
278 Intent intent = new MockIntent(1L);
279 IntentData data = new IntentData(intent, INSTALL_REQ, null);
280
281 replay(service);
282
283 store.addPending(data);
284
285 verify(service);
286 reset(service);
287 }
288}