2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2019 Nordix Foundation.
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;
23 import static org.assertj.core.api.Assertions.assertThatThrownBy;
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertNull;
26 import static org.junit.Assert.assertSame;
27 import static org.junit.Assert.assertTrue;
28 import static org.mockito.Matchers.any;
29 import static org.mockito.Mockito.never;
30 import static org.mockito.Mockito.verify;
31 import static org.mockito.Mockito.when;
33 import java.util.ArrayList;
34 import java.util.Arrays;
35 import java.util.Collections;
36 import java.util.List;
37 import java.util.TreeMap;
38 import javax.ws.rs.core.Response.Status;
39 import org.junit.AfterClass;
40 import org.junit.Before;
41 import org.junit.Test;
42 import org.onap.policy.common.utils.services.Registry;
43 import org.onap.policy.models.base.PfModelException;
44 import org.onap.policy.models.pdp.concepts.PdpGroup;
45 import org.onap.policy.models.pdp.concepts.PdpGroups;
46 import org.onap.policy.models.pdp.concepts.PdpStateChange;
47 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
48 import org.onap.policy.models.pdp.concepts.PdpUpdate;
49 import org.onap.policy.models.pdp.enums.PdpState;
50 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier;
52 public class TestPdpGroupCreateOrUpdateProvider extends ProviderSuper {
53 private static final String EXPECTED_EXCEPTION = "expected exception";
55 private static final String PDP2 = "pdpB";
56 private static final String PDP4 = "pdpD";
58 private PdpGroupCreateOrUpdateProvider prov;
61 public static void tearDownAfterClass() {
62 Registry.newRegistry();
66 * Configures mocks and objects.
68 * @throws Exception if an error occurs
72 public void setUp() throws Exception {
76 when(dao.getPolicyTypeList("typeA", "100.2.3")).thenReturn(Arrays.asList(loadPolicyType("daoPolicyType.json")));
78 prov = new PdpGroupCreateOrUpdateProvider();
82 public void testCreateOrUpdateGroups() throws Exception {
83 prov.createOrUpdateGroups(loadPdpGroups("emptyGroups.json"));
85 // no groups, so no action should have been taken
86 assertNoGroupAction();
90 public void testCreateOrUpdateGroups_InvalidRequest() throws Exception {
91 assertThatThrownBy(() -> prov.createOrUpdateGroups(new PdpGroups())).isInstanceOf(PfModelException.class)
92 .hasMessageContaining("is null");
94 assertNoGroupAction();
98 public void testCreateOrUpdate_Invalid() throws Exception {
99 PdpGroups groups = loadPdpGroups("createGroups.json");
100 groups.getGroups().get(0).setPdpGroupState(PdpState.TERMINATED);
102 assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).isInstanceOf(PfModelException.class)
103 .hasMessageContaining("pdpGroupState");
105 assertNoGroupAction();
109 public void testAddGroup() throws Exception {
110 PdpGroups groups = loadPdpGroups("createGroups.json");
111 PdpGroup group = groups.getGroups().get(0);
112 group.setPdpGroupState(PdpState.PASSIVE);
114 prov.createOrUpdateGroups(groups);
116 // should not have updated the state
117 assertEquals(PdpState.PASSIVE, group.getPdpGroupState());
119 assertSame(group, getGroupCreates().get(0));
123 public void testAddGroup_Invalid() throws Exception {
124 PdpGroups groups = loadPdpGroups("createGroups.json");
125 groups.getGroups().get(0).setPdpGroupState(PdpState.TERMINATED);
127 assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).isInstanceOf(PfModelException.class)
128 .hasMessageContaining("pdpGroupState");
130 assertNoGroupAction();
134 public void testAddGroup_InvalidSubGroup() throws Exception {
135 PdpGroups groups = loadPdpGroups("createGroups.json");
137 groups.getGroups().get(0).getPdpSubgroups().get(0).getSupportedPolicyTypes().get(0).setVersion("99.99.99");
139 assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).isInstanceOf(PfModelException.class)
140 .hasMessageContaining("unknown policy type");
142 assertNoGroupAction();
146 public void testValidateGroupOnly_NullState() throws PfModelException {
147 PdpGroups groups = loadPdpGroups("createGroups.json");
148 groups.getGroups().get(0).setPdpGroupState(null);
149 prov.createOrUpdateGroups(groups);
153 public void testValidateGroupOnly_Active() throws PfModelException {
154 PdpGroups groups = loadPdpGroups("createGroups.json");
155 groups.getGroups().get(0).setPdpGroupState(PdpState.ACTIVE);
156 prov.createOrUpdateGroups(groups);
160 public void testValidateGroupOnly_Passive() throws PfModelException {
161 PdpGroups groups = loadPdpGroups("createGroups.json");
162 groups.getGroups().get(0).setPdpGroupState(PdpState.PASSIVE);
163 prov.createOrUpdateGroups(groups);
167 public void testValidateGroupOnly_Invalid() {
168 PdpGroups groups = loadPdpGroups("createGroups.json");
169 groups.getGroups().get(0).setPdpGroupState(PdpState.TERMINATED);
171 assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).isInstanceOf(PfModelException.class)
172 .hasMessageContaining("pdpGroupState");
176 public void testUpdateGroup() throws Exception {
177 PdpGroups groups = loadPdpGroups("createGroups.json");
179 // DB group = new group
180 PdpGroup group = new PdpGroup(groups.getGroups().get(0));
181 when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
183 prov.createOrUpdateGroups(groups);
185 assertNoGroupAction();
189 public void testUpdateGroup_PropertiesChanged() throws Exception {
190 PdpGroups groups = loadPdpGroups("createGroups.json");
192 PdpGroup group = new PdpGroup(groups.getGroups().get(0));
193 group.setProperties(new TreeMap<>());
195 when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
197 assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).isInstanceOf(PfModelException.class)
198 .hasMessageContaining("properties");
200 assertNoGroupAction();
204 public void testUpdateGroup_NewDescription() throws Exception {
205 PdpGroups groups = loadPdpGroups("createGroups.json");
206 PdpGroup newgrp = groups.getGroups().get(0);
207 PdpGroup group = new PdpGroup(newgrp);
208 group.setDescription("old description");
209 when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
211 prov.createOrUpdateGroups(groups);
213 assertGroupUpdateOnly(group);
215 assertEquals(group.getDescription(), "my description");
216 assertEquals(newgrp.toString(), group.toString());
220 public void testUpdateGroup_NewState() throws Exception {
221 PdpGroups groups = loadPdpGroups("createGroups.json");
222 PdpGroup newgrp = groups.getGroups().get(0);
223 PdpGroup group = new PdpGroup(newgrp);
224 group.setPdpGroupState(PdpState.TEST);
225 when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
227 prov.createOrUpdateGroups(groups);
229 assertGroupUpdateOnly(group);
231 assertEquals(PdpState.ACTIVE, group.getPdpGroupState());
232 assertEquals(newgrp.toString(), group.toString());
236 public void testUpdateGroup_NewSubGroup() throws Exception {
237 PdpGroups groups = loadPdpGroups("createGroupsNewSub.json");
238 PdpGroup group = loadPdpGroups("createGroups.json").getGroups().get(0);
239 when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
241 prov.createOrUpdateGroups(groups);
243 PdpGroup newgrp = groups.getGroups().get(0);
244 assertEquals(newgrp.toString(), group.toString());
245 assertGroupUpdateOnly(group);
249 public void testUpdateGroup_UpdatedSubGroup() throws Exception {
250 PdpGroups groups = loadPdpGroups("createGroups.json");
251 PdpGroup newgrp = groups.getGroups().get(0);
252 PdpGroup group = new PdpGroup(newgrp);
253 when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
255 // something different in this subgroup
256 group.getPdpSubgroups().get(0).setDesiredInstanceCount(10);
258 prov.createOrUpdateGroups(groups);
260 assertEquals(newgrp.toString(), group.toString());
261 assertGroupUpdateOnly(group);
265 public void testUpdateGroup_notifyPdpsDelSubGroups() throws Exception {
266 PdpGroup dbgroup = new PdpGroup(loadPdpGroups("createGroupsDelSub.json").getGroups().get(0));
267 when(dao.getPdpGroups(dbgroup.getName())).thenReturn(Arrays.asList(dbgroup));
269 PdpGroups groups = loadPdpGroups("createGroups.json");
271 prov.createOrUpdateGroups(groups);
273 // verify that DB group was updated
274 List<PdpGroup> updates = getGroupUpdates();
275 assertEquals(1, updates.size());
276 dbgroup = updates.get(0);
278 PdpGroup newgrp = groups.getGroups().get(0);
280 Collections.sort(newgrp.getPdpSubgroups().get(0).getPolicies());
281 Collections.sort(dbgroup.getPdpSubgroups().get(0).getPolicies());
283 assertEquals(newgrp.toString(), dbgroup.toString());
285 // no deployment notifications
286 verify(notifier, never()).addDeploymentData(any());
288 // this requires a PDP UPDATE message
289 List<PdpUpdate> pdpUpdates = getUpdateRequests(2);
290 assertEquals(2, pdpUpdates.size());
292 PdpUpdate pdpUpdate = pdpUpdates.get(0);
293 assertEquals(PDP2, pdpUpdate.getName());
294 assertNull(pdpUpdate.getPdpGroup());
296 pdpUpdate = pdpUpdates.get(1);
297 assertEquals(PDP4, pdpUpdate.getName());
298 assertNull(pdpUpdate.getPdpGroup());
300 // it also requires a PDP STATE-CHANGE message
301 List<PdpStateChange> changes = getStateChangeRequests(2);
302 assertEquals(2, changes.size());
304 PdpStateChange change = changes.get(0);
305 assertEquals(PDP2, change.getName());
306 assertEquals(PdpState.PASSIVE, change.getState());
308 change = changes.get(1);
309 assertEquals(PDP4, change.getName());
310 assertEquals(PdpState.PASSIVE, change.getState());
314 public void testUpdateField_Unchanged() throws Exception {
315 PdpGroups groups = loadPdpGroups("createGroups.json");
316 PdpGroup newgrp = groups.getGroups().get(0);
317 PdpGroup group = new PdpGroup(newgrp);
318 when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
320 prov.createOrUpdateGroups(groups);
322 assertNoGroupAction();
326 public void testUpdateField_WasNull() throws Exception {
327 PdpGroups groups = loadPdpGroups("createGroups.json");
328 PdpGroup newgrp = groups.getGroups().get(0);
329 PdpGroup group = new PdpGroup(newgrp);
330 when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
332 group.setDescription(null);
334 prov.createOrUpdateGroups(groups);
336 assertEquals(newgrp.toString(), group.toString());
337 assertGroupUpdateOnly(group);
341 public void testUpdateField_NowNull() throws Exception {
342 PdpGroups groups = loadPdpGroups("createGroups.json");
343 PdpGroup newgrp = groups.getGroups().get(0);
344 PdpGroup group = new PdpGroup(newgrp);
345 when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
347 newgrp.setDescription(null);
349 prov.createOrUpdateGroups(groups);
351 assertEquals(newgrp.toString(), group.toString());
352 assertGroupUpdateOnly(group);
356 public void testUpdateField_Changed() throws Exception {
357 PdpGroups groups = loadPdpGroups("createGroups.json");
358 PdpGroup newgrp = groups.getGroups().get(0);
359 PdpGroup group = new PdpGroup(newgrp);
360 when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
362 newgrp.setDescription(group.getDescription() + "-changed");
364 prov.createOrUpdateGroups(groups);
366 assertEquals(newgrp.toString(), group.toString());
367 assertGroupUpdateOnly(group);
371 public void testAddSubGroup() throws Exception {
372 PdpGroups groups = loadPdpGroups("createGroupsNewSub.json");
373 PdpGroup group = loadPdpGroups("createGroups.json").getGroups().get(0);
374 when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
376 prov.createOrUpdateGroups(groups);
378 PdpGroup newgrp = groups.getGroups().get(0);
380 PdpSubGroup newsub = newgrp.getPdpSubgroups().get(1);
381 newsub.setCurrentInstanceCount(0);
382 newsub.setPdpInstances(new ArrayList<>(0));
384 assertEquals(newgrp.toString(), group.toString());
385 assertGroupUpdateOnly(group);
389 * Tests addSubgroup() when the new subgroup has a wild-card policy type.
391 * @throws Exception if an error occurs
394 public void testAddSubGroupWildCardPolicyType() throws Exception {
395 when(dao.getFilteredPolicyList(any())).thenReturn(loadPolicies("daoPolicyListWildCard.json"));
396 when(dao.getPolicyTypeList("some.*", "2.3.4")).thenReturn(Collections.emptyList());
398 PdpGroups groups = loadPdpGroups("createGroupsWildCard.json");
399 PdpGroup group = loadPdpGroups("createGroups.json").getGroups().get(0);
400 when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
402 prov.createOrUpdateGroups(groups);
404 PdpGroup newgrp = groups.getGroups().get(0);
406 PdpSubGroup newsub = newgrp.getPdpSubgroups().get(1);
407 newsub.setCurrentInstanceCount(0);
408 newsub.setPdpInstances(new ArrayList<>(0));
410 assertEquals(newgrp.toString(), group.toString());
414 public void testAddSubGroup_ValidationPolicyTypeNotFound() throws Exception {
415 PdpGroups groups = loadPdpGroups("createGroupsNewSub.json");
416 PdpGroup group = loadPdpGroups("createGroups.json").getGroups().get(0);
417 when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
419 when(dao.getPolicyTypeList(any(), any())).thenReturn(Collections.emptyList());
421 assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).hasMessageContaining("unknown policy type");
425 public void testAddSubGroup_ValidationPolicyTypeDaoEx() throws Exception {
426 PdpGroups groups = loadPdpGroups("createGroupsNewSub.json");
427 PdpGroup group = loadPdpGroups("createGroups.json").getGroups().get(0);
428 when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
430 PfModelException exc = new PfModelException(Status.CONFLICT, EXPECTED_EXCEPTION);
431 when(dao.getPolicyTypeList(any(), any())).thenThrow(exc);
433 assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).isSameAs(exc);
437 public void testAddSubGroup_ValidateVersionPrefixMatch() throws Exception {
438 PdpGroups groups = loadPdpGroups("createGroups.json");
439 PdpGroup newgrp = groups.getGroups().get(0);
440 PdpGroup dbgroup = new PdpGroup(newgrp);
441 when(dao.getPdpGroups(dbgroup.getName())).thenReturn(Arrays.asList(dbgroup));
443 when(dao.getFilteredPolicyList(any())).thenReturn(loadPolicies("createGroupNewPolicy.json"))
444 .thenReturn(loadPolicies("daoPolicyList.json")).thenReturn(loadPolicies("createGroupNewPolicy.json"));
446 PdpGroups reqgroups = loadPdpGroups("createGroupsVersPrefix.json");
448 prov.createOrUpdateGroups(reqgroups);
450 Collections.sort(newgrp.getPdpSubgroups().get(0).getPolicies());
451 Collections.sort(dbgroup.getPdpSubgroups().get(0).getPolicies());
453 assertEquals(newgrp.toString(), dbgroup.toString());
457 public void testUpdateSubGroup_Invalid() throws Exception {
458 PdpGroups groups = loadPdpGroups("createGroups.json");
459 PdpGroup newgrp = groups.getGroups().get(0);
460 PdpGroup group = new PdpGroup(newgrp);
461 when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
464 newgrp.getPdpSubgroups().get(0).setProperties(new TreeMap<>());
466 assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).isInstanceOf(PfModelException.class)
467 .hasMessageContaining("properties");
469 assertNoGroupAction();
473 public void testUpdateSubGroup_SupportedPolicies() throws Exception {
474 PdpGroups groups = loadPdpGroups("createGroups.json");
475 PdpGroup newgrp = groups.getGroups().get(0);
476 PdpGroup group = new PdpGroup(newgrp);
477 when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
479 newgrp.getPdpSubgroups().get(0).getSupportedPolicyTypes()
480 .add(new ToscaPolicyTypeIdentifier("typeX.*", "9.8.7"));
482 prov.createOrUpdateGroups(groups);
484 assertEquals(newgrp.toString(), group.toString());
485 assertGroupUpdateOnly(group);
489 public void testUpdateSubGroup_DesiredCount() throws Exception {
490 PdpGroups groups = loadPdpGroups("createGroups.json");
491 PdpGroup newgrp = groups.getGroups().get(0);
492 PdpGroup group = new PdpGroup(newgrp);
493 when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
495 newgrp.getPdpSubgroups().get(0).setDesiredInstanceCount(20);
497 prov.createOrUpdateGroups(groups);
499 assertEquals(newgrp.toString(), group.toString());
500 assertGroupUpdateOnly(group);
504 public void testUpdateSubGroup_Unchanged() throws Exception {
505 PdpGroups groups = loadPdpGroups("createGroups.json");
506 PdpGroup newgrp = groups.getGroups().get(0);
507 PdpGroup group = new PdpGroup(newgrp);
508 when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
510 prov.createOrUpdateGroups(groups);
512 Collections.sort(newgrp.getPdpSubgroups().get(0).getPolicies());
513 Collections.sort(group.getPdpSubgroups().get(0).getPolicies());
515 assertEquals(newgrp.toString(), group.toString());
518 verify(notifier, never()).addDeploymentData(any());
519 verify(notifier, never()).addUndeploymentData(any());
522 assertNoGroupAction();
526 public void testValidateSubGroup_PropertiesMismatch() throws Exception {
527 PdpGroups groups = loadPdpGroups("createGroups.json");
528 PdpGroup newgrp = groups.getGroups().get(0);
529 PdpGroup group = new PdpGroup(newgrp);
530 when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
532 newgrp.setProperties(new TreeMap<>());
534 assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).isInstanceOf(PfModelException.class)
535 .hasMessageContaining("properties");
537 assertNoGroupAction();
540 protected void assertUpdate(List<PdpUpdate> updates, String groupName, String pdpType, String pdpName) {
542 PdpUpdate update = updates.remove(0);
544 assertEquals(groupName, update.getPdpGroup());
545 assertEquals(pdpType, update.getPdpSubgroup());
546 assertEquals(pdpName, update.getName());
547 assertTrue(update.getPolicies().contains(policy1));
550 private void assertNoGroupAction() throws Exception {
551 verify(dao, never()).createPdpGroups(any());
552 verify(dao, never()).updatePdpGroups(any());
553 verify(reqmap, never()).addRequest(any(), any());
556 private void assertGroupUpdateOnly(PdpGroup group) throws Exception {
557 verify(dao, never()).createPdpGroups(any());
558 verify(reqmap, never()).addRequest(any(), any());
560 List<PdpGroup> updates = getGroupUpdates();
561 assertEquals(Arrays.asList(group), updates);