2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2023-2024 Nordix Foundation.
4 * ================================================================================
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 * SPDX-License-Identifier: Apache-2.0
18 * ============LICENSE_END=========================================================
21 package org.onap.policy.clamp.acm.participant.intermediary.handler;
23 import static org.assertj.core.api.Assertions.assertThat;
24 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
25 import static org.junit.jupiter.api.Assertions.assertEquals;
26 import static org.mockito.ArgumentMatchers.any;
27 import static org.mockito.Mockito.mock;
28 import static org.mockito.Mockito.times;
29 import static org.mockito.Mockito.verify;
30 import static org.mockito.Mockito.when;
33 import java.util.UUID;
34 import org.junit.jupiter.api.Test;
35 import org.onap.policy.clamp.acm.participant.intermediary.comm.ParticipantMessagePublisher;
36 import org.onap.policy.clamp.acm.participant.intermediary.main.parameters.CommonTestData;
37 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
38 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementDefinition;
39 import org.onap.policy.clamp.models.acm.concepts.DeployState;
40 import org.onap.policy.clamp.models.acm.concepts.LockState;
41 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
42 import org.onap.policy.clamp.models.acm.concepts.SubState;
43 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionDeployAck;
44 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantPrimeAck;
45 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantStatus;
46 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
48 class AutomationCompositionOutHandlerTest {
51 void updateAutomationCompositionElementStateNullTest() {
52 var cacheProvider = mock(CacheProvider.class);
53 var acOutHandler = new AutomationCompositionOutHandler(mock(ParticipantMessagePublisher.class), cacheProvider);
56 () -> acOutHandler.updateAutomationCompositionElementState(null, null, null, null, null, null));
58 assertDoesNotThrow(() -> acOutHandler.updateAutomationCompositionElementState(UUID.randomUUID(),
59 UUID.randomUUID(), null, null, null, null));
61 assertDoesNotThrow(() -> acOutHandler.updateAutomationCompositionElementState(UUID.randomUUID(),
62 UUID.randomUUID(), DeployState.DEPLOYED, null, null, null));
64 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
65 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
66 .thenReturn(automationComposition);
67 assertDoesNotThrow(() -> acOutHandler.updateAutomationCompositionElementState(
68 automationComposition.getInstanceId(), UUID.randomUUID(), DeployState.DEPLOYED, null, null, null));
70 var elementId = automationComposition.getElements().values().iterator().next().getId();
71 assertDoesNotThrow(() -> acOutHandler.updateAutomationCompositionElementState(
72 automationComposition.getInstanceId(), elementId, null, null, null, null));
76 void updateAutomationCompositionElementStateDeployedTest() {
77 var publisher = mock(ParticipantMessagePublisher.class);
78 var cacheProvider = mock(CacheProvider.class);
79 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
81 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
82 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
83 .thenReturn(automationComposition);
84 var elementId = automationComposition.getElements().values().iterator().next().getId();
85 acOutHandler.updateAutomationCompositionElementState(automationComposition.getInstanceId(), elementId,
86 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Deployed");
87 verify(publisher).sendAutomationCompositionAck(any(AutomationCompositionDeployAck.class));
91 void updateAutomationCompositionElementStatePrepareTest() {
92 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
93 automationComposition.setSubState(SubState.PREPARING);
94 var cacheProvider = mock(CacheProvider.class);
95 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
96 .thenReturn(automationComposition);
97 var element = automationComposition.getElements().values().iterator().next();
98 element.setSubState(SubState.PREPARING);
99 var elementId = element.getId();
100 var publisher = mock(ParticipantMessagePublisher.class);
101 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
102 acOutHandler.updateAutomationCompositionElementState(automationComposition.getInstanceId(), elementId,
103 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Prepare completed");
104 verify(publisher).sendAutomationCompositionAck(any(AutomationCompositionDeployAck.class));
108 void updateAutomationCompositionElementStateLockTest() {
109 var publisher = mock(ParticipantMessagePublisher.class);
110 var cacheProvider = mock(CacheProvider.class);
111 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
113 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
114 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
115 .thenReturn(automationComposition);
116 var elementId = automationComposition.getElements().values().iterator().next().getId();
117 acOutHandler.updateAutomationCompositionElementState(automationComposition.getInstanceId(), elementId, null,
118 LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked");
119 verify(publisher).sendAutomationCompositionAck(any(AutomationCompositionDeployAck.class));
123 void updateAutomationCompositionElementStateRestartedTest() {
124 var publisher = mock(ParticipantMessagePublisher.class);
125 var cacheProvider = mock(CacheProvider.class);
126 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
128 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
129 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
130 .thenReturn(automationComposition);
131 var element = automationComposition.getElements().values().iterator().next();
132 element.setRestarting(true);
133 acOutHandler.updateAutomationCompositionElementState(automationComposition.getInstanceId(), element.getId(),
134 DeployState.DEPLOYED, LockState.LOCKED, StateChangeResult.NO_ERROR, "Restarted");
135 verify(publisher).sendAutomationCompositionAck(any(AutomationCompositionDeployAck.class));
136 assertThat(element.getRestarting()).isNull();
140 void updateAutomationCompositionElementStateDeleteTest() {
141 var publisher = mock(ParticipantMessagePublisher.class);
142 var cacheProvider = mock(CacheProvider.class);
143 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
145 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
146 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
147 .thenReturn(automationComposition);
148 for (var element : automationComposition.getElements().values()) {
149 acOutHandler.updateAutomationCompositionElementState(automationComposition.getInstanceId(), element.getId(),
150 DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Deleted");
152 verify(publisher, times(automationComposition.getElements().size()))
153 .sendAutomationCompositionAck(any(AutomationCompositionDeployAck.class));
154 verify(cacheProvider).removeAutomationComposition(automationComposition.getInstanceId());
158 void sendAcElementInfoTestNull() {
159 var publisher = mock(ParticipantMessagePublisher.class);
160 var cacheProvider = mock(CacheProvider.class);
161 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
163 assertDoesNotThrow(() -> acOutHandler.sendAcElementInfo(null, null, null, null, null));
164 assertDoesNotThrow(() -> acOutHandler.sendAcElementInfo(UUID.randomUUID(), null, null, null, null));
166 () -> acOutHandler.sendAcElementInfo(UUID.randomUUID(), UUID.randomUUID(), null, null, null));
168 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
169 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
170 .thenReturn(automationComposition);
171 assertDoesNotThrow(() -> acOutHandler.sendAcElementInfo(automationComposition.getInstanceId(),
172 UUID.randomUUID(), null, null, null));
176 void sendAcElementInfoTest() {
177 var publisher = mock(ParticipantMessagePublisher.class);
178 var cacheProvider = mock(CacheProvider.class);
179 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
181 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
182 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
183 .thenReturn(automationComposition);
184 var elementId = automationComposition.getElements().values().iterator().next().getId();
185 acOutHandler.sendAcElementInfo(automationComposition.getInstanceId(), elementId, "", "", Map.of());
186 verify(publisher).sendParticipantStatus(any(ParticipantStatus.class));
190 void updateCompositionStatePrimedTest() {
191 var cacheProvider = mock(CacheProvider.class);
192 when(cacheProvider.getParticipantId()).thenReturn(UUID.randomUUID());
193 var publisher = mock(ParticipantMessagePublisher.class);
194 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
195 var compositionId = UUID.randomUUID();
196 acOutHandler.updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Primed");
197 verify(publisher).sendParticipantPrimeAck(any(ParticipantPrimeAck.class));
198 verify(cacheProvider, times(0)).removeElementDefinition(compositionId);
202 void updateCompositionStateDeprimingTest() {
203 var cacheProvider = mock(CacheProvider.class);
204 when(cacheProvider.getParticipantId()).thenReturn(UUID.randomUUID());
205 var publisher = mock(ParticipantMessagePublisher.class);
206 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
207 var compositionId = UUID.randomUUID();
208 acOutHandler.updateCompositionState(compositionId, AcTypeState.COMMISSIONED, StateChangeResult.NO_ERROR,
210 verify(publisher).sendParticipantPrimeAck(any(ParticipantPrimeAck.class));
211 verify(cacheProvider).removeElementDefinition(compositionId);
215 void sendAcDefinitionInfoTest() {
216 var cacheProvider = mock(CacheProvider.class);
217 when(cacheProvider.getParticipantId()).thenReturn(UUID.randomUUID());
218 var compositionId = UUID.randomUUID();
219 var elementId = new ToscaConceptIdentifier("code", "1.0.0");
220 var mapAcElementsDefinitions =
221 Map.of(compositionId, Map.of(elementId, new AutomationCompositionElementDefinition()));
222 when(cacheProvider.getAcElementsDefinitions()).thenReturn(mapAcElementsDefinitions);
223 var publisher = mock(ParticipantMessagePublisher.class);
224 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
226 acOutHandler.sendAcDefinitionInfo(null, null, Map.of());
227 verify(publisher, times(0)).sendParticipantStatus(any(ParticipantStatus.class));
229 acOutHandler.sendAcDefinitionInfo(UUID.randomUUID(), null, Map.of());
230 verify(publisher, times(0)).sendParticipantStatus(any(ParticipantStatus.class));
232 acOutHandler.sendAcDefinitionInfo(compositionId, new ToscaConceptIdentifier("wrong", "1.0.0"), Map.of());
233 verify(publisher, times(0)).sendParticipantStatus(any(ParticipantStatus.class));
235 acOutHandler.sendAcDefinitionInfo(compositionId, elementId, Map.of());
236 verify(publisher).sendParticipantStatus(any(ParticipantStatus.class));
240 void updateMigrationStatusTest() {
241 var cacheProvider = mock(CacheProvider.class);
242 when(cacheProvider.getParticipantId()).thenReturn(UUID.randomUUID());
243 var publisher = mock(ParticipantMessagePublisher.class);
244 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
246 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
247 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
248 .thenReturn(automationComposition);
250 var compositionTarget = UUID.randomUUID();
251 automationComposition.setCompositionTargetId(compositionTarget);
252 automationComposition.setDeployState(DeployState.DEPLOYED);
253 when(cacheProvider.getAcElementsDefinitions()).thenReturn(Map.of(compositionTarget, Map.of()));
255 for (var element : automationComposition.getElements().values()) {
256 acOutHandler.updateAutomationCompositionElementState(automationComposition.getInstanceId(), element.getId(),
257 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "");
259 verify(publisher, times(automationComposition.getElements().size()))
260 .sendAutomationCompositionAck(any(AutomationCompositionDeployAck.class));
261 assertEquals(compositionTarget, automationComposition.getCompositionId());