Java 17 / Spring 6 / Spring Boot 3 Upgrade
[policy/pap.git] / main / src / test / java / org / onap / policy / pap / main / comm / PdpHeartbeatListenerTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2019-2021, 2023 Nordix Foundation.
4  *  Modifications Copyright (C) 2020-2021 AT&T Intellectual Property.
5  *  Modifications Copyright (C) 2021-2023 Bell Canada. 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
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
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  *
19  * SPDX-License-Identifier: Apache-2.0
20  * ============LICENSE_END=========================================================
21  */
22
23 package org.onap.policy.pap.main.comm;
24
25 import static org.assertj.core.api.Assertions.assertThat;
26 import static org.junit.jupiter.api.Assertions.assertEquals;
27 import static org.junit.jupiter.api.Assertions.assertSame;
28
29 import java.util.ArrayList;
30 import java.util.Arrays;
31 import java.util.List;
32 import java.util.stream.Collectors;
33 import org.junit.jupiter.api.Test;
34 import org.onap.policy.common.endpoints.event.comm.Topic.CommInfrastructure;
35 import org.onap.policy.models.pdp.concepts.PdpGroup;
36 import org.onap.policy.models.pdp.concepts.PdpStatus;
37 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
38 import org.onap.policy.models.pdp.concepts.PdpUpdate;
39 import org.onap.policy.models.pdp.enums.PdpHealthStatus;
40 import org.onap.policy.models.pdp.enums.PdpState;
41 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
42 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
43 import org.onap.policy.pap.main.parameters.CommonTestData;
44 import org.onap.policy.pap.main.parameters.PapParameterGroup;
45 import org.onap.policy.pap.main.parameters.PdpParameters;
46 import org.onap.policy.pap.main.rest.e2e.End2EndBase;
47 import org.springframework.beans.factory.annotation.Autowired;
48
49 /**
50  * Class to perform unit test of {@link PdpHeartbeatListener}.
51  *
52  * @author Ram Krishna Verma (ram.krishna.verma@est.tech)
53  */
54 class PdpHeartbeatListenerTest extends End2EndBase {
55
56     private static final String POLICY_VERSION = "1.0.0";
57     private static final String POLICY_NAME = "onap.policies.controlloop.operational.common.apex.SampleDomain";
58     private static final String APEX_TYPE = "apex";
59     private static final String DEFAULT_GROUP = "defaultGroup";
60     private static final String PDP_NAME = "pdp_1";
61     private static final CommInfrastructure INFRA = CommInfrastructure.NOOP;
62     private static final String TOPIC = "my-topic";
63
64     @Autowired
65     private PdpHeartbeatListener pdpHeartbeatListener;
66
67     @Test
68     void testPdpHeartbeatListener() {
69         addGroups("PdpGroups.json");
70         PapParameterGroup parameterGroup = new PapParameterGroup();
71         parameterGroup.setPdpParameters(new PdpParameters());
72
73         // Testing pdp registration success case
74         final PdpStatus status1 = new PdpStatus();
75         status1.setName(PDP_NAME);
76         status1.setState(PdpState.ACTIVE);
77         status1.setPdpGroup(DEFAULT_GROUP);
78         status1.setPdpType(APEX_TYPE);
79         status1.setHealthy(PdpHealthStatus.HEALTHY);
80         final List<ToscaConceptIdentifier> idents1 = List.of(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
81         status1.setPolicies(idents1);
82         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status1);
83         verifyPdpGroup(1);
84
85         // Testing pdp heartbeat success case
86         final PdpStatus status2 = new PdpStatus();
87         status2.setName(PDP_NAME);
88         status2.setState(PdpState.ACTIVE);
89         status2.setPdpGroup(DEFAULT_GROUP);
90         status2.setPdpType(APEX_TYPE);
91         status2.setHealthy(PdpHealthStatus.HEALTHY);
92         status2.setPdpSubgroup(APEX_TYPE);
93         final List<ToscaConceptIdentifier> idents2 = List.of(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
94         status2.setPolicies(idents2);
95         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status2);
96         verifyPdpGroup(1);
97
98         // Testing pdp heartbeat failure case with pdp missing
99         final PdpStatus status3 = new PdpStatus();
100         status3.setName("pdp_2");
101         status3.setState(PdpState.ACTIVE);
102         status3.setPdpGroup(DEFAULT_GROUP);
103         status3.setPdpType(APEX_TYPE);
104         status3.setHealthy(PdpHealthStatus.HEALTHY);
105         status3.setPdpSubgroup(APEX_TYPE);
106         final List<ToscaConceptIdentifier> idents3 = List.of(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
107         status3.setPolicies(idents3);
108         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status3);
109         verifyPdpGroup(2);
110
111         // Testing pdp registration failure case
112         final PdpStatus status4 = new PdpStatus();
113         status4.setName("pdp_3");
114         status4.setState(PdpState.ACTIVE);
115         status4.setPdpGroup("wrongGroup");
116         status4.setPdpType(APEX_TYPE);
117         status4.setHealthy(PdpHealthStatus.HEALTHY);
118         final List<ToscaConceptIdentifier> idents4 = List.of(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
119         status4.setPolicies(idents4);
120         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status4);
121         verifyPdpGroup(2);
122
123         // Testing pdp heartbeat failure case with pdp state mismatch
124         final PdpStatus status5 = new PdpStatus();
125         status5.setName(PDP_NAME);
126         status5.setState(PdpState.PASSIVE);
127         status5.setPdpGroup(DEFAULT_GROUP);
128         status5.setPdpType(APEX_TYPE);
129         status5.setHealthy(PdpHealthStatus.HEALTHY);
130         status5.setPdpSubgroup(APEX_TYPE);
131         final List<ToscaConceptIdentifier> idents5 = List.of(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
132         status5.setPolicies(idents5);
133         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status5);
134         verifyPdpGroup(2);
135
136         // Testing pdp heartbeat failure case with pdp policies mismatch
137         final PdpStatus status6 = new PdpStatus();
138         status6.setName(PDP_NAME);
139         status6.setState(PdpState.ACTIVE);
140         status6.setPdpGroup(DEFAULT_GROUP);
141         status6.setPdpType(APEX_TYPE);
142         status6.setHealthy(PdpHealthStatus.HEALTHY);
143         status6.setPdpSubgroup(APEX_TYPE);
144         final List<ToscaConceptIdentifier> idents6 =
145                 Arrays.asList(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION),
146                         new ToscaConceptIdentifier("onap.restart.tca", POLICY_VERSION));
147         status6.setPolicies(idents6);
148         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status6);
149         verifyPdpGroup(2);
150
151         // Testing pdp heartbeat failure case with pdp no policies
152         final PdpStatus status7 = new PdpStatus();
153         status7.setName(PDP_NAME);
154         status7.setState(PdpState.ACTIVE);
155         status7.setPdpGroup(DEFAULT_GROUP);
156         status7.setPdpType(APEX_TYPE);
157         status7.setHealthy(PdpHealthStatus.HEALTHY);
158         status7.setPdpSubgroup(APEX_TYPE);
159         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status7);
160         verifyPdpGroup(2);
161
162         // Testing old message for pdp_1 - should have no effect
163         final PdpStatus status7b = new PdpStatus();
164         status7b.setTimestampMs(System.currentTimeMillis() - PdpParameters.DEFAULT_MAX_AGE_MS - 1);
165         status7b.setName(PDP_NAME);
166         status7b.setState(PdpState.TERMINATED);
167         status7b.setPdpGroup(DEFAULT_GROUP);
168         status7b.setPdpType(APEX_TYPE);
169         status7b.setPdpSubgroup(APEX_TYPE);
170         status7b.setHealthy(PdpHealthStatus.HEALTHY);
171         final List<ToscaConceptIdentifier> idents7b = List.of(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
172         status7b.setPolicies(idents7b);
173         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status7b);
174         verifyPdpGroup(2);
175
176         // Testing pdp termination case for pdp_1
177         final PdpStatus status8 = new PdpStatus();
178         status8.setName(PDP_NAME);
179         status8.setState(PdpState.TERMINATED);
180         status8.setPdpGroup(DEFAULT_GROUP);
181         status8.setPdpType(APEX_TYPE);
182         status8.setPdpSubgroup(APEX_TYPE);
183         status8.setHealthy(PdpHealthStatus.HEALTHY);
184         final List<ToscaConceptIdentifier> idents8 = List.of(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
185         status8.setPolicies(idents8);
186         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status8);
187         verifyPdpGroup(1);
188
189         // Testing pdp termination case for pdp_2
190         final PdpStatus status9 = new PdpStatus();
191         status9.setName("pdp_2");
192         status9.setState(PdpState.TERMINATED);
193         status9.setPdpGroup(DEFAULT_GROUP);
194         status9.setPdpType(APEX_TYPE);
195         status9.setPdpSubgroup(APEX_TYPE);
196         status9.setHealthy(PdpHealthStatus.HEALTHY);
197         final List<ToscaConceptIdentifier> idents9 = List.of(new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION));
198         status9.setPolicies(idents9);
199         pdpHeartbeatListener.onTopicEvent(INFRA, TOPIC, status9);
200         verifyPdpGroup(0);
201
202         // Test policy lists updated in createUpdate
203         ToscaPolicy polA = new ToscaPolicy();
204         polA.setName("pol-a-1.1.1");
205         polA.setVersion("1.1.1");
206         ToscaPolicy polB = new ToscaPolicy();
207         polB.setName("pol-b-1.1.1");
208         polB.setVersion("1.1.1");
209         List<ToscaPolicy> policies = new ArrayList<>();
210         policies.add(polA);
211         policies.add(polB);
212         final PapParameterGroup testGroup = new CommonTestData().getPapParameterGroup(1);
213         List<ToscaConceptIdentifier> polsUndep =
214             policies.stream().map(ToscaPolicy::getIdentifier).collect(Collectors.toList());
215         PdpStatusMessageHandler handler = new PdpStatusMessageHandler(testGroup, pdpGroupService);
216         PdpUpdate update10 =
217             handler.createPdpUpdateMessage(status3.getPdpGroup(), new PdpSubGroup(), "pdp_2", policies, polsUndep);
218         assertSame(update10.getPoliciesToBeDeployed(), policies);
219         assertSame(update10.getPoliciesToBeUndeployed(), polsUndep);
220         assertThat(update10.getPoliciesToBeDeployed()).isInstanceOf(List.class);
221     }
222   
223     private void verifyPdpGroup(final int count) {
224         final List<PdpGroup> fetchedGroups = fetchGroups(PdpHeartbeatListenerTest.DEFAULT_GROUP);
225         for (final PdpSubGroup subGroup : fetchedGroups.get(0).getPdpSubgroups()) {
226             if (subGroup.getPdpType().equals(APEX_TYPE)) {
227                 assertEquals(count, subGroup.getPdpInstances().size());
228                 assertEquals(count, subGroup.getCurrentInstanceCount());
229                 if (count > 0) {
230                     assertEquals(PdpHealthStatus.HEALTHY, subGroup.getPdpInstances().get(0).getHealthy());
231                 }
232             }
233         }
234     }
235 }