2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.onap.policy.pap.main.rest.depundep;
23 import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
24 import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
25 import static org.assertj.core.api.Assertions.assertThatThrownBy;
26 import static org.junit.Assert.assertEquals;
27 import static org.junit.Assert.assertFalse;
28 import static org.junit.Assert.assertNull;
29 import static org.junit.Assert.assertSame;
30 import static org.junit.Assert.assertTrue;
31 import static org.mockito.Matchers.any;
32 import static org.mockito.Mockito.never;
33 import static org.mockito.Mockito.times;
34 import static org.mockito.Mockito.verify;
35 import static org.mockito.Mockito.when;
37 import java.util.ArrayList;
38 import java.util.Arrays;
39 import java.util.Collection;
40 import java.util.Collections;
41 import java.util.Comparator;
42 import java.util.Iterator;
43 import java.util.List;
44 import java.util.TreeSet;
45 import java.util.function.Supplier;
46 import javax.ws.rs.core.Response.Status;
47 import org.apache.commons.lang3.tuple.Pair;
48 import org.junit.Before;
49 import org.junit.Test;
50 import org.mockito.ArgumentCaptor;
51 import org.onap.policy.models.base.PfModelException;
52 import org.onap.policy.models.pdp.concepts.PdpGroup;
53 import org.onap.policy.models.pdp.concepts.PdpStateChange;
54 import org.onap.policy.models.pdp.concepts.PdpUpdate;
55 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
56 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyFilter;
57 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifier;
58 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifierOptVersion;
59 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType;
60 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier;
61 import org.onap.policy.pap.main.notification.PolicyPdpNotificationData;
63 public class TestSessionData extends ProviderSuper {
64 private static final String GROUP_NAME = "groupA";
65 private static final String PDP1 = "pdp_1";
66 private static final String PDP2 = "pdp_2";
67 private static final String PDP3 = "pdp_3";
68 private static final String POLICY_VERSION_PREFIX = "1.2.";
69 private static final String POLICY_NAME = "myPolicy";
70 private static final String POLICY_VERSION = POLICY_VERSION_PREFIX + "3";
71 private static final String POLICY_TYPE = "myType";
72 private static final String POLICY_TYPE_VERSION = "10.20.30";
73 private static final String EXPECTED_EXCEPTION = "expected exception";
75 private SessionData session;
76 private ToscaPolicyIdentifierOptVersion ident;
77 private ToscaPolicyTypeIdentifier type;
78 private ToscaPolicyTypeIdentifier type2;
79 private PdpGroup group1;
80 private PdpGroup group2;
83 * Initializes mocks and a session.
85 * @throws Exception if an error occurs
88 public void setUp() throws Exception {
91 ident = new ToscaPolicyIdentifierOptVersion(POLICY_NAME, POLICY_VERSION);
92 type = new ToscaPolicyTypeIdentifier(POLICY_TYPE, POLICY_TYPE_VERSION);
93 type2 = new ToscaPolicyTypeIdentifier(POLICY_TYPE, POLICY_TYPE_VERSION + "0");
94 group1 = loadGroup("group1.json");
95 group2 = loadGroup("group2.json");
97 session = new SessionData(dao);
101 public void testGetPolicyType() throws Exception {
102 ToscaPolicyType policy1 = makePolicyType(POLICY_TYPE, POLICY_TYPE_VERSION);
103 when(dao.getPolicyTypeList(POLICY_TYPE, POLICY_TYPE_VERSION)).thenReturn(Arrays.asList(policy1));
105 assertSame(policy1, session.getPolicyType(type));
107 // retrieve a second time - should use cache
108 assertSame(policy1, session.getPolicyType(type));
112 public void testGetPolicyType_NotFound() throws Exception {
113 when(dao.getPolicyTypeList(any(), any())).thenReturn(Collections.emptyList());
115 assertNull(session.getPolicyType(type));
119 public void testGetPolicyType_DaoEx() throws Exception {
120 PfModelException ex = new PfModelException(Status.INTERNAL_SERVER_ERROR, EXPECTED_EXCEPTION);
121 when(dao.getPolicyTypeList(POLICY_TYPE, POLICY_TYPE_VERSION)).thenThrow(ex);
123 assertThatThrownBy(() -> session.getPolicyType(type)).isSameAs(ex);
127 public void testGetPolicy_NullVersion() throws Exception {
128 ToscaPolicy policy1 = makePolicy(POLICY_NAME, POLICY_VERSION);
129 when(dao.getFilteredPolicyList(any())).thenReturn(Arrays.asList(policy1));
131 ident.setVersion(null);
132 assertSame(policy1, session.getPolicy(ident));
134 ToscaPolicyFilter filter = getPolicyFilter();
135 assertEquals(POLICY_NAME, filter.getName());
136 assertEquals(ToscaPolicyFilter.LATEST_VERSION, filter.getVersion());
137 assertEquals(null, filter.getVersionPrefix());
139 // retrieve a second time using full version - should use cache
140 assertSame(policy1, session.getPolicy(new ToscaPolicyIdentifierOptVersion(policy1.getIdentifier())));
141 verify(dao).getFilteredPolicyList(any());
145 public void testGetPolicy_MajorVersion() throws Exception {
146 ToscaPolicy policy1 = makePolicy(POLICY_NAME, POLICY_VERSION);
147 when(dao.getFilteredPolicyList(any())).thenReturn(Arrays.asList(policy1));
149 ident.setVersion("1");
150 assertSame(policy1, session.getPolicy(ident));
152 ToscaPolicyFilter filter = getPolicyFilter();
153 assertEquals(POLICY_NAME, filter.getName());
154 assertEquals(ToscaPolicyFilter.LATEST_VERSION, filter.getVersion());
155 assertEquals("1.", filter.getVersionPrefix());
157 // retrieve a second time using full version - should use cache
158 assertSame(policy1, session.getPolicy(new ToscaPolicyIdentifierOptVersion(policy1.getIdentifier())));
159 verify(dao).getFilteredPolicyList(any());
163 public void testGetPolicy_MajorMinorVersion() throws Exception {
164 ToscaPolicy policy1 = makePolicy(POLICY_NAME, POLICY_VERSION);
165 when(dao.getFilteredPolicyList(any())).thenReturn(Arrays.asList(policy1));
167 ident.setVersion(POLICY_VERSION);
168 assertSame(policy1, session.getPolicy(ident));
170 ToscaPolicyFilter filter = getPolicyFilter();
171 assertEquals(POLICY_NAME, filter.getName());
172 assertEquals(POLICY_VERSION, filter.getVersion());
173 assertEquals(null, filter.getVersionPrefix());
175 // retrieve a second time using full version - should use cache
176 assertSame(policy1, session.getPolicy(new ToscaPolicyIdentifierOptVersion(policy1.getIdentifier())));
177 verify(dao).getFilteredPolicyList(any());
181 public void testGetPolicy_NotFound() throws Exception {
182 when(dao.getFilteredPolicyList(any())).thenReturn(Collections.emptyList());
184 assertNull(session.getPolicy(ident));
188 public void testGetPolicy_DaoEx() throws Exception {
189 PfModelException ex = new PfModelException(Status.INTERNAL_SERVER_ERROR, EXPECTED_EXCEPTION);
190 when(dao.getFilteredPolicyList(any())).thenThrow(ex);
192 assertThatThrownBy(() -> session.getPolicy(ident)).isSameAs(ex);
196 public void testIsVersionPrefix() {
197 assertTrue(SessionData.isVersionPrefix("1"));
198 assertTrue(SessionData.isVersionPrefix("12"));
199 assertTrue(SessionData.isVersionPrefix("1.2"));
200 assertTrue(SessionData.isVersionPrefix("1.23"));
202 assertFalse(SessionData.isVersionPrefix("1."));
203 assertFalse(SessionData.isVersionPrefix("1.2."));
204 assertFalse(SessionData.isVersionPrefix("1.2.3"));
205 assertFalse(SessionData.isVersionPrefix("1.2.3."));
206 assertFalse(SessionData.isVersionPrefix("1.2.3.4"));
210 public void testAddRequests_testGetPdpStateChanges_testGetPdpUpdates() {
211 // pre-load with a update and state-change for other PDPs
212 PdpUpdate update2 = makeUpdate(PDP2);
213 session.addUpdate(update2);
215 PdpStateChange change3 = makeStateChange(PDP3);
216 session.addStateChange(change3);
219 PdpUpdate update = makeUpdate(PDP1);
220 PdpStateChange change = makeStateChange(PDP1);
221 session.addRequests(update, change);
222 verifyRequests(update, update2, change, change3);
225 * repeat with a new pair
227 update = makeUpdate(PDP1);
228 change = makeStateChange(PDP1);
229 session.addRequests(update, change);
230 verifyRequests(update, update2, change, change3);
232 // just make an update this time
233 update = makeUpdate(PDP1);
234 session.addUpdate(update);
235 verifyRequests(update, update2, change, change3);
238 private void verifyRequests(PdpUpdate update, PdpUpdate update2, PdpStateChange change, PdpStateChange change3) {
239 List<Pair<PdpUpdate, PdpStateChange>> requests = sort(session.getPdpRequests(), this::compare);
240 assertEquals(3, requests.size());
242 System.out.println(requests);
243 System.out.println(update);
245 Iterator<Pair<PdpUpdate, PdpStateChange>> reqiter = requests.iterator();
246 Pair<PdpUpdate, PdpStateChange> pair = reqiter.next();
247 assertSame(update, pair.getLeft());
248 assertSame(change, pair.getRight());
250 pair = reqiter.next();
251 assertSame(update2, pair.getLeft());
252 assertSame(null, pair.getRight());
254 pair = reqiter.next();
255 assertSame(null, pair.getLeft());
256 assertSame(change3, pair.getRight());
258 // verify individual lists
259 List<PdpUpdate> updates = Arrays.asList(update, update2);
260 assertEquals(sort(updates, this::compare), sort(session.getPdpUpdates(), this::compare));
262 List<PdpStateChange> changes = Arrays.asList(change, change3);
263 assertEquals(sort(changes, this::compare), sort(session.getPdpStateChanges(), this::compare));
267 public void testAddRequests_MismatchedNames() {
268 PdpUpdate update = makeUpdate(PDP1);
269 PdpStateChange change = makeStateChange(PDP2);
270 assertThatIllegalArgumentException().isThrownBy(() -> session.addRequests(update, change))
271 .withMessage("PDP name mismatch pdp_1, pdp_2");
275 public void testAddUpdate_testGetPdpUpdates() {
276 // several different updates, but one duplicate
277 PdpUpdate update1 = makeUpdate(PDP1);
278 session.addUpdate(update1);
280 PdpUpdate update2 = makeUpdate(PDP2);
281 session.addUpdate(update2);
283 PdpUpdate update3 = makeUpdate(PDP3);
284 session.addUpdate(update3);
286 List<PdpUpdate> lst = sort(getUpdateRequests(), this::compare);
287 assertEquals(Arrays.asList(update1, update2, update3).toString(), lst.toString());
290 update2 = makeUpdate(PDP2);
291 session.addUpdate(update2);
293 lst = sort(getUpdateRequests(), this::compare);
294 assertEquals(Arrays.asList(update1, update2, update3).toString(), lst.toString());
298 public void testAddStateChange_testGetPdpStateChanges() {
299 // several different changes, but one duplicate
300 PdpStateChange change1 = makeStateChange(PDP1);
301 session.addStateChange(change1);
303 PdpStateChange change2 = makeStateChange(PDP2);
304 session.addStateChange(change2);
306 PdpStateChange change3 = makeStateChange(PDP3);
307 session.addStateChange(change3);
309 List<PdpStateChange> lst = sort(getStateChangeRequests(), this::compare);
310 assertEquals(Arrays.asList(change1, change2, change3).toString(), lst.toString());
313 change2 = makeStateChange(PDP2);
314 session.addStateChange(change2);
316 lst = sort(getStateChangeRequests(), this::compare);
317 assertEquals(Arrays.asList(change1, change2, change3).toString(), lst.toString());
320 private ToscaPolicyType makePolicyType(String name, String version) {
321 ToscaPolicyType type = new ToscaPolicyType();
324 type.setVersion(version);
329 private ToscaPolicy makePolicy(String name, String version) {
330 ToscaPolicy policy = new ToscaPolicy();
332 policy.setName(name);
333 policy.setVersion(version);
339 public void testCreate() throws Exception {
340 assertTrue(session.isUnchanged());
342 session.create(group1);
343 assertSame(group1, session.getGroup(group1.getName()));
344 assertFalse(session.isUnchanged());
347 session.create(group2);
348 assertSame(group1, session.getGroup(group1.getName()));
349 assertSame(group2, session.getGroup(group2.getName()));
350 assertFalse(session.isUnchanged());
353 assertThatIllegalStateException().isThrownBy(() -> session.create(group1))
354 .withMessage("group already cached: groupA");
358 public void testUpdate() throws Exception {
359 assertTrue(session.isUnchanged());
361 // force the groups into the cache
362 when(dao.getFilteredPdpGroups(any())).thenReturn(Arrays.asList(group1, group2));
363 session.getActivePdpGroupsByPolicyType(type);
368 when(dao.getFilteredPdpGroups(any())).thenReturn(Arrays.asList(group1));
369 PdpGroup newgrp = new PdpGroup(group1);
370 session.update(newgrp);
371 assertFalse(session.isUnchanged());
374 newgrp = new PdpGroup(group1);
375 session.update(newgrp);
376 assertFalse(session.isUnchanged());
381 when(dao.getFilteredPdpGroups(any())).thenReturn(Arrays.asList(group2));
382 newgrp = new PdpGroup(group2);
383 session.update(newgrp);
384 assertFalse(session.isUnchanged());
387 newgrp = new PdpGroup(group2);
388 session.update(newgrp);
389 assertFalse(session.isUnchanged());
393 public void testUpdate_NotInCache() throws Exception {
394 when(dao.getFilteredPdpGroups(any())).thenReturn(Arrays.asList(group1));
396 assertThatIllegalStateException().isThrownBy(() -> session.update(new PdpGroup(group1)))
397 .withMessage("group not cached: groupA");
401 public void testGetGroup() throws Exception {
402 when(dao.getPdpGroups(GROUP_NAME)).thenReturn(Arrays.asList(group1));
404 assertSame(group1, session.getGroup(GROUP_NAME));
405 verify(dao).getPdpGroups(any());
408 assertSame(group1, session.getGroup(GROUP_NAME));
410 // should not access dao again
411 verify(dao, times(1)).getPdpGroups(any());
415 public void testGetGroup_NotFound() throws Exception {
416 when(dao.getPdpGroups(GROUP_NAME)).thenReturn(Collections.emptyList());
418 assertNull(session.getGroup(GROUP_NAME));
419 verify(dao).getPdpGroups(any());
422 assertNull(session.getGroup(GROUP_NAME));
424 // SHOULD access dao again
425 verify(dao, times(2)).getPdpGroups(GROUP_NAME);
428 when(dao.getPdpGroups(GROUP_NAME)).thenReturn(Arrays.asList(group1));
429 assertSame(group1, session.getGroup(GROUP_NAME));
430 verify(dao, times(3)).getPdpGroups(GROUP_NAME);
434 public void testGetGroup_DaoEx() throws Exception {
435 PfModelException ex = new PfModelException(Status.BAD_REQUEST, EXPECTED_EXCEPTION);
436 when(dao.getPdpGroups(GROUP_NAME)).thenThrow(ex);
438 assertThatThrownBy(() -> session.getGroup(GROUP_NAME)).isSameAs(ex);
442 public void testGetActivePdpGroupsByPolicyType() throws Exception {
443 List<PdpGroup> groups = Arrays.asList(group1, group2);
444 when(dao.getFilteredPdpGroups(any())).thenReturn(groups);
447 assertEquals(groups, session.getActivePdpGroupsByPolicyType(type));
448 assertEquals(groups, session.getActivePdpGroupsByPolicyType(type));
449 assertEquals(groups, session.getActivePdpGroupsByPolicyType(type));
451 // only invoked once - should have used the cache for the rest
452 verify(dao, times(1)).getFilteredPdpGroups(any());
456 public void testAddGroup() throws Exception {
457 List<PdpGroup> groups = Arrays.asList(group1, group2);
458 when(dao.getFilteredPdpGroups(any())).thenReturn(groups);
460 // query by each type
461 assertEquals(groups, session.getActivePdpGroupsByPolicyType(type));
462 assertEquals(groups, session.getActivePdpGroupsByPolicyType(type2));
464 // invoked once for each type
465 verify(dao, times(2)).getFilteredPdpGroups(any());
467 // repeat - should be no more invocations
468 assertEquals(groups, session.getActivePdpGroupsByPolicyType(type));
469 assertEquals(groups, session.getActivePdpGroupsByPolicyType(type2));
470 verify(dao, times(2)).getFilteredPdpGroups(any());
474 public void testUpdateDb() throws Exception {
475 // force the groups into the cache
476 PdpGroup group3 = loadGroup("group3.json");
477 when(dao.getFilteredPdpGroups(any())).thenReturn(Arrays.asList(group1, group2, group3));
478 session.getActivePdpGroupsByPolicyType(type);
480 // create groups 4 & 5
481 PdpGroup group4 = loadGroup("group4.json");
482 session.create(group4);
484 PdpGroup group5 = loadGroup("group5.json");
485 session.create(group5);
488 when(dao.getFilteredPdpGroups(any())).thenReturn(Arrays.asList(group1));
489 PdpGroup newgrp1 = new PdpGroup(group1);
490 session.update(newgrp1);
493 newgrp1 = new PdpGroup(newgrp1);
494 session.update(newgrp1);
497 when(dao.getFilteredPdpGroups(any())).thenReturn(Arrays.asList(group3));
498 PdpGroup newgrp3 = new PdpGroup(group3);
499 session.update(newgrp3);
502 when(dao.getFilteredPdpGroups(any())).thenReturn(Arrays.asList(group5));
503 PdpGroup newgrp5 = new PdpGroup(group5);
504 session.update(newgrp5);
506 // push the changes to the DB
509 // expect one create for groups 4 & 5 (group5 replaced by newgrp5)
510 List<PdpGroup> creates = getGroupCreates();
511 assertEquals(2, creates.size());
512 assertSame(group4, creates.get(0));
513 assertSame(newgrp5, creates.get(1));
515 // expect one update for groups 1 & 3
516 List<PdpGroup> updates = getGroupUpdates();
517 assertEquals(2, updates.size());
518 assertSame(newgrp1, updates.get(0));
519 assertSame(newgrp3, updates.get(1));
523 public void testUpdateDb_Empty() throws Exception {
524 // force data into the cache
525 when(dao.getFilteredPdpGroups(any())).thenReturn(Arrays.asList(group1, group2));
526 session.getActivePdpGroupsByPolicyType(type);
529 verify(dao, never()).createPdpGroups(any());
530 verify(dao, never()).updatePdpGroups(any());
534 public void testDeleteGroupFromDb() throws Exception {
535 session.deleteGroupFromDb(group1);
537 verify(dao).deletePdpGroup(group1.getName());
541 public void testTrackDeploy() throws PfModelException {
542 testTrack(session::getDeployData, session::getUndeployData, session::trackDeploy);
546 * Tests trackDeploy() when there is something in the undeployed list.
548 * @throws PfModelException if an error occurs
551 public void testTrackDeployRemoveUndeploy() throws PfModelException {
552 testTrack(session::getDeployData, session::getUndeployData, session::trackUndeploy, session::trackDeploy);
556 public void testTrackUndeploy() throws PfModelException {
557 testTrack(session::getUndeployData, session::getDeployData, session::trackUndeploy);
561 * Tests trackUndeploy() when there is something in the deployed list.
563 * @throws PfModelException if an error occurs
566 public void testTrackUndeployRemoveUndeploy() throws PfModelException {
567 testTrack(session::getUndeployData, session::getDeployData, session::trackDeploy, session::trackUndeploy);
570 protected void testTrack(Supplier<Collection<PolicyPdpNotificationData>> expected,
571 Supplier<Collection<PolicyPdpNotificationData>> unexpected, TrackEx... trackFuncs)
572 throws PfModelException {
574 ToscaPolicy policy = makePolicy(POLICY_NAME, POLICY_VERSION);
575 policy.setType(POLICY_TYPE);
576 policy.setTypeVersion(POLICY_TYPE_VERSION);
578 when(dao.getFilteredPolicyList(any())).thenReturn(Arrays.asList(policy));
580 ToscaPolicyIdentifier policyId = new ToscaPolicyIdentifier(POLICY_NAME, POLICY_VERSION);
581 List<String> pdps = Arrays.asList(PDP1, PDP2);
583 for (TrackEx trackFunc : trackFuncs) {
584 trackFunc.accept(policyId, pdps);
587 // "unexpected" list should be empty of any PDPs
588 Collection<PolicyPdpNotificationData> dataList = unexpected.get();
589 assertTrue(dataList.size() <= 1);
590 if (!dataList.isEmpty()) {
591 PolicyPdpNotificationData data = dataList.iterator().next();
592 assertTrue(data.getPdps().isEmpty());
595 dataList = expected.get();
596 assertEquals(1, dataList.size());
598 PolicyPdpNotificationData data = dataList.iterator().next();
599 assertEquals(policyId, data.getPolicyId());
600 assertEquals(type, data.getPolicyType());
601 assertEquals("[pdp_1, pdp_2]", new TreeSet<>(data.getPdps()).toString());
604 private PdpUpdate makeUpdate(String pdpName) {
605 PdpUpdate update = new PdpUpdate();
607 update.setName(pdpName);
612 private PdpStateChange makeStateChange(String pdpName) {
613 PdpStateChange change = new PdpStateChange();
615 change.setName(pdpName);
620 private ToscaPolicyFilter getPolicyFilter() throws Exception {
621 ArgumentCaptor<ToscaPolicyFilter> captor = ArgumentCaptor.forClass(ToscaPolicyFilter.class);
622 verify(dao).getFilteredPolicyList(captor.capture());
624 return captor.getValue();
627 private List<PdpUpdate> getUpdateRequests() {
628 return session.getPdpUpdates();
631 private List<PdpStateChange> getStateChangeRequests() {
632 return session.getPdpStateChanges();
635 private <T> List<T> sort(Collection<T> collection, Comparator<T> comparator) {
636 List<T> lst = new ArrayList<>(collection);
637 Collections.sort(lst, comparator);
642 private int compare(Pair<PdpUpdate, PdpStateChange> left, Pair<PdpUpdate, PdpStateChange> right) {
643 return getName(left).compareTo(getName(right));
646 private int compare(PdpUpdate left, PdpUpdate right) {
647 return left.getName().compareTo(right.getName());
650 private int compare(PdpStateChange left, PdpStateChange right) {
651 return left.getName().compareTo(right.getName());
654 private String getName(Pair<PdpUpdate, PdpStateChange> pair) {
655 return (pair.getKey() != null ? pair.getKey().getName() : pair.getValue().getName());
659 private static interface TrackEx {
660 public void accept(ToscaPolicyIdentifier policyId, Collection<String> pdps) throws PfModelException;