2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2023-2025 OpenInfra Foundation Europe. All rights reserved.
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.junit.jupiter.api.Assertions.assertDoesNotThrow;
24 import static org.junit.jupiter.api.Assertions.assertEquals;
25 import static org.mockito.ArgumentMatchers.any;
26 import static org.mockito.Mockito.mock;
27 import static org.mockito.Mockito.times;
28 import static org.mockito.Mockito.verify;
29 import static org.mockito.Mockito.when;
32 import java.util.UUID;
33 import org.junit.jupiter.api.Test;
34 import org.onap.policy.clamp.acm.participant.intermediary.comm.ParticipantMessagePublisher;
35 import org.onap.policy.clamp.acm.participant.intermediary.handler.cache.AcDefinition;
36 import org.onap.policy.clamp.acm.participant.intermediary.handler.cache.CacheProvider;
37 import org.onap.policy.clamp.acm.participant.intermediary.main.parameters.CommonTestData;
38 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
39 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementDefinition;
40 import org.onap.policy.clamp.models.acm.concepts.DeployState;
41 import org.onap.policy.clamp.models.acm.concepts.LockState;
42 import org.onap.policy.clamp.models.acm.concepts.StateChangeResult;
43 import org.onap.policy.clamp.models.acm.concepts.SubState;
44 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionDeployAck;
45 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantPrimeAck;
46 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantStatus;
47 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
49 class AutomationCompositionOutHandlerTest {
51 private static final ToscaConceptIdentifier ELEMENT_ID = new ToscaConceptIdentifier("code", "1.0.0");
54 void updateAutomationCompositionElementStateNullTest() {
55 var cacheProvider = mock(CacheProvider.class);
56 var publisher = mock(ParticipantMessagePublisher.class);
57 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
60 () -> acOutHandler.updateAutomationCompositionElementState(null, null, null, null, null, null));
62 assertDoesNotThrow(() -> acOutHandler.updateAutomationCompositionElementState(null,
63 UUID.randomUUID(), null, null, null, null));
65 assertDoesNotThrow(() -> acOutHandler.updateAutomationCompositionElementState(UUID.randomUUID(),
66 null, null, null, null, null));
68 assertDoesNotThrow(() -> acOutHandler.updateAutomationCompositionElementState(UUID.randomUUID(),
69 UUID.randomUUID(), null, null, null, null));
71 assertDoesNotThrow(() -> acOutHandler.updateAutomationCompositionElementState(UUID.randomUUID(),
72 UUID.randomUUID(), DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, null));
74 assertDoesNotThrow(() -> acOutHandler.updateAutomationCompositionElementState(UUID.randomUUID(),
75 UUID.randomUUID(), DeployState.DEPLOYED, null, null, null));
77 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
78 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
79 .thenReturn(automationComposition);
80 assertDoesNotThrow(() -> acOutHandler.updateAutomationCompositionElementState(
81 automationComposition.getInstanceId(), UUID.randomUUID(), DeployState.DEPLOYED,
82 null, StateChangeResult.NO_ERROR, null));
84 var elementId = automationComposition.getElements().values().iterator().next().getId();
85 assertDoesNotThrow(() -> acOutHandler.updateAutomationCompositionElementState(
86 automationComposition.getInstanceId(), elementId, null, null,
87 StateChangeResult.NO_ERROR, null));
89 assertDoesNotThrow(() -> acOutHandler.updateAutomationCompositionElementStage(
90 elementId, null, StateChangeResult.NO_ERROR, 0, null));
91 assertDoesNotThrow(() -> acOutHandler.updateAutomationCompositionElementStage(
92 null, elementId, StateChangeResult.NO_ERROR, 0, null));
93 assertDoesNotThrow(() -> acOutHandler.updateAutomationCompositionElementStage(
94 UUID.randomUUID(), elementId, StateChangeResult.NO_ERROR, 0, null));
95 assertDoesNotThrow(() -> acOutHandler.updateAutomationCompositionElementStage(
96 automationComposition.getInstanceId(), UUID.randomUUID(),
97 StateChangeResult.NO_ERROR, 0, null));
98 assertDoesNotThrow(() -> acOutHandler.updateAutomationCompositionElementState(
99 automationComposition.getInstanceId(), elementId, DeployState.DEPLOYED, LockState.LOCKED,
100 StateChangeResult.NO_ERROR, null));
101 assertDoesNotThrow(() -> acOutHandler.updateAutomationCompositionElementState(
102 automationComposition.getInstanceId(), elementId, DeployState.DEPLOYING, null,
103 StateChangeResult.NO_ERROR, ""));
104 assertDoesNotThrow(() -> acOutHandler.updateAutomationCompositionElementState(
105 automationComposition.getInstanceId(), elementId, DeployState.DEPLOYED, null,
106 StateChangeResult.TIMEOUT, ""));
108 verify(publisher, times(0)).sendAutomationCompositionAck(any());
112 void updateAutomationCompositionElementStageTest() {
113 var publisher = mock(ParticipantMessagePublisher.class);
114 var cacheProvider = mock(CacheProvider.class);
115 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
116 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
117 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
118 .thenReturn(automationComposition);
119 var elementId = automationComposition.getElements().values().iterator().next().getId();
120 acOutHandler.updateAutomationCompositionElementStage(
121 automationComposition.getInstanceId(), elementId, StateChangeResult.NO_ERROR, 0, "OK");
122 verify(publisher).sendAutomationCompositionAck(any(AutomationCompositionDeployAck.class));
126 void updateAutomationCompositionElementStateDeployedTest() {
127 var publisher = mock(ParticipantMessagePublisher.class);
128 var cacheProvider = mock(CacheProvider.class);
129 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
131 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
132 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
133 .thenReturn(automationComposition);
134 var elementId = automationComposition.getElements().values().iterator().next().getId();
135 acOutHandler.updateAutomationCompositionElementState(automationComposition.getInstanceId(), elementId,
136 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Deployed");
137 verify(publisher).sendAutomationCompositionAck(any(AutomationCompositionDeployAck.class));
141 void updateAutomationCompositionElementStatePrepareTest() {
142 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
143 automationComposition.setSubState(SubState.PREPARING);
144 var cacheProvider = mock(CacheProvider.class);
145 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
146 .thenReturn(automationComposition);
147 var element = automationComposition.getElements().values().iterator().next();
148 element.setSubState(SubState.PREPARING);
149 var elementId = element.getId();
150 var publisher = mock(ParticipantMessagePublisher.class);
151 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
152 acOutHandler.updateAutomationCompositionElementState(automationComposition.getInstanceId(), elementId,
153 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "Prepare completed");
154 verify(publisher).sendAutomationCompositionAck(any(AutomationCompositionDeployAck.class));
158 void updateAcElementStatePrepareFailTest() {
159 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
160 automationComposition.setSubState(SubState.PREPARING);
161 var cacheProvider = mock(CacheProvider.class);
162 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
163 .thenReturn(automationComposition);
164 var element = automationComposition.getElements().values().iterator().next();
165 element.setSubState(SubState.PREPARING);
166 var elementId = element.getId();
167 var publisher = mock(ParticipantMessagePublisher.class);
168 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
169 acOutHandler.updateAutomationCompositionElementState(automationComposition.getInstanceId(), elementId,
170 DeployState.DEPLOYED, null, StateChangeResult.FAILED, "Prepare failed");
171 verify(publisher).sendAutomationCompositionAck(any(AutomationCompositionDeployAck.class));
175 void updateAutomationCompositionElementStateLockTest() {
176 var publisher = mock(ParticipantMessagePublisher.class);
177 var cacheProvider = mock(CacheProvider.class);
178 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
180 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
181 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
182 .thenReturn(automationComposition);
183 var elementId = automationComposition.getElements().values().iterator().next().getId();
184 acOutHandler.updateAutomationCompositionElementState(automationComposition.getInstanceId(), elementId, null,
185 LockState.LOCKED, StateChangeResult.NO_ERROR, "Locked");
186 verify(publisher).sendAutomationCompositionAck(any(AutomationCompositionDeployAck.class));
190 void updateAutomationCompositionElementStateDeleteTest() {
191 var publisher = mock(ParticipantMessagePublisher.class);
192 var cacheProvider = mock(CacheProvider.class);
193 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
195 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
196 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
197 .thenReturn(automationComposition);
198 for (var element : automationComposition.getElements().values()) {
199 acOutHandler.updateAutomationCompositionElementState(automationComposition.getInstanceId(), element.getId(),
200 DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Deleted");
202 verify(publisher, times(automationComposition.getElements().size()))
203 .sendAutomationCompositionAck(any(AutomationCompositionDeployAck.class));
204 verify(cacheProvider).removeAutomationComposition(automationComposition.getInstanceId());
208 void sendAcElementInfoTestNull() {
209 var publisher = mock(ParticipantMessagePublisher.class);
210 var cacheProvider = mock(CacheProvider.class);
211 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
213 assertDoesNotThrow(() -> acOutHandler.sendAcElementInfo(null, null, null, null, null));
214 assertDoesNotThrow(() -> acOutHandler.sendAcElementInfo(UUID.randomUUID(), null, null, null, null));
216 () -> acOutHandler.sendAcElementInfo(UUID.randomUUID(), UUID.randomUUID(), null, null, null));
218 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
219 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
220 .thenReturn(automationComposition);
221 assertDoesNotThrow(() -> acOutHandler.sendAcElementInfo(automationComposition.getInstanceId(),
222 UUID.randomUUID(), null, null, null));
226 void sendAcElementInfoTest() {
227 var publisher = mock(ParticipantMessagePublisher.class);
228 var cacheProvider = mock(CacheProvider.class);
229 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
231 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
232 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
233 .thenReturn(automationComposition);
234 var elementId = automationComposition.getElements().values().iterator().next().getId();
235 acOutHandler.sendAcElementInfo(automationComposition.getInstanceId(), elementId, "", "", Map.of());
236 verify(publisher).sendParticipantStatus(any(ParticipantStatus.class));
240 void updateCompositionStateNullTest() {
241 var publisher = mock(ParticipantMessagePublisher.class);
242 var cacheProvider = mock(CacheProvider.class);
243 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
246 () -> acOutHandler.updateCompositionState(null, null, null, null));
247 assertDoesNotThrow(() -> acOutHandler.updateCompositionState(UUID.randomUUID(), null,
248 StateChangeResult.NO_ERROR, null));
250 () -> acOutHandler.updateCompositionState(UUID.randomUUID(), AcTypeState.PRIMED, null, null));
251 assertDoesNotThrow(() -> acOutHandler.updateCompositionState(UUID.randomUUID(), AcTypeState.PRIMING,
252 StateChangeResult.NO_ERROR, null));
253 assertDoesNotThrow(() -> acOutHandler.updateCompositionState(UUID.randomUUID(), AcTypeState.DEPRIMING,
254 StateChangeResult.NO_ERROR, null));
255 assertDoesNotThrow(() -> acOutHandler.updateCompositionState(UUID.randomUUID(), AcTypeState.PRIMED,
256 StateChangeResult.TIMEOUT, null));
258 verify(publisher, times(0)).sendParticipantPrimeAck(any());
262 void updateCompositionStatePrimedTest() {
263 var cacheProvider = mock(CacheProvider.class);
264 when(cacheProvider.getParticipantId()).thenReturn(UUID.randomUUID());
265 var publisher = mock(ParticipantMessagePublisher.class);
266 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
267 var compositionId = UUID.randomUUID();
268 acOutHandler.updateCompositionState(compositionId, AcTypeState.PRIMED, StateChangeResult.NO_ERROR, "Primed");
269 verify(publisher).sendParticipantPrimeAck(any(ParticipantPrimeAck.class));
270 verify(cacheProvider, times(0)).removeElementDefinition(compositionId);
274 void updateCompositionStateDeprimingTest() {
275 var cacheProvider = mock(CacheProvider.class);
276 when(cacheProvider.getParticipantId()).thenReturn(UUID.randomUUID());
277 var publisher = mock(ParticipantMessagePublisher.class);
278 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
279 var compositionId = UUID.randomUUID();
280 acOutHandler.updateCompositionState(compositionId, AcTypeState.COMMISSIONED, StateChangeResult.NO_ERROR,
282 verify(publisher).sendParticipantPrimeAck(any(ParticipantPrimeAck.class));
283 verify(cacheProvider).removeElementDefinition(compositionId);
287 void sendAcDefinitionInfoTest() {
288 var cacheProvider = mock(CacheProvider.class);
289 when(cacheProvider.getParticipantId()).thenReturn(UUID.randomUUID());
290 var compositionId = UUID.randomUUID();
291 var acDefinition = new AcDefinition();
292 acDefinition.setCompositionId(compositionId);
293 acDefinition.getElements().put(ELEMENT_ID, new AutomationCompositionElementDefinition());
294 when(cacheProvider.getAcElementsDefinitions()).thenReturn(Map.of(compositionId, acDefinition));
295 var publisher = mock(ParticipantMessagePublisher.class);
296 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
298 acOutHandler.sendAcDefinitionInfo(null, null, Map.of());
299 verify(publisher, times(0)).sendParticipantStatus(any(ParticipantStatus.class));
301 acOutHandler.sendAcDefinitionInfo(UUID.randomUUID(), null, Map.of());
302 verify(publisher, times(0)).sendParticipantStatus(any(ParticipantStatus.class));
304 acOutHandler.sendAcDefinitionInfo(compositionId, new ToscaConceptIdentifier("wrong", "1.0.0"), Map.of());
305 verify(publisher, times(0)).sendParticipantStatus(any(ParticipantStatus.class));
307 acOutHandler.sendAcDefinitionInfo(compositionId, ELEMENT_ID, Map.of());
308 verify(publisher).sendParticipantStatus(any(ParticipantStatus.class));
312 void sendAcDefinitionInfoSingleTest() {
313 var cacheProvider = mock(CacheProvider.class);
314 when(cacheProvider.getParticipantId()).thenReturn(UUID.randomUUID());
315 var compositionId = UUID.randomUUID();
316 var acDefinition = new AcDefinition();
317 acDefinition.setCompositionId(compositionId);
318 acDefinition.getElements().put(ELEMENT_ID, new AutomationCompositionElementDefinition());
319 when(cacheProvider.getAcElementsDefinitions()).thenReturn(Map.of(compositionId, acDefinition));
320 var publisher = mock(ParticipantMessagePublisher.class);
321 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
323 // if there is only one element
324 acOutHandler.sendAcDefinitionInfo(compositionId, null, Map.of());
325 verify(publisher).sendParticipantStatus(any(ParticipantStatus.class));
329 void updateMigrationStatusTest() {
330 var cacheProvider = mock(CacheProvider.class);
331 when(cacheProvider.getParticipantId()).thenReturn(UUID.randomUUID());
332 var publisher = mock(ParticipantMessagePublisher.class);
333 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
335 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
336 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
337 .thenReturn(automationComposition);
339 var compositionTarget = UUID.randomUUID();
340 automationComposition.setCompositionTargetId(compositionTarget);
341 automationComposition.setDeployState(DeployState.DEPLOYED);
342 when(cacheProvider.getAcElementsDefinitions()).thenReturn(Map.of(compositionTarget, new AcDefinition()));
344 for (var element : automationComposition.getElements().values()) {
345 acOutHandler.updateAutomationCompositionElementState(automationComposition.getInstanceId(), element.getId(),
346 DeployState.DEPLOYED, null, StateChangeResult.NO_ERROR, "");
348 verify(publisher, times(automationComposition.getElements().size()))
349 .sendAutomationCompositionAck(any(AutomationCompositionDeployAck.class));
350 assertEquals(compositionTarget, automationComposition.getCompositionId());
354 void updateFailMigrationTest() {
355 var cacheProvider = mock(CacheProvider.class);
356 when(cacheProvider.getParticipantId()).thenReturn(UUID.randomUUID());
357 var publisher = mock(ParticipantMessagePublisher.class);
358 var acOutHandler = new AutomationCompositionOutHandler(publisher, cacheProvider);
360 var automationComposition = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
361 when(cacheProvider.getAutomationComposition(automationComposition.getInstanceId()))
362 .thenReturn(automationComposition);
364 automationComposition.setCompositionTargetId(UUID.randomUUID());
365 automationComposition.setDeployState(DeployState.MIGRATING);
366 var compositionId = automationComposition.getCompositionId();
367 for (var element : automationComposition.getElements().values()) {
368 element.setDeployState(DeployState.MIGRATING);
369 acOutHandler.updateAutomationCompositionElementState(automationComposition.getInstanceId(),
370 element.getId(), DeployState.DEPLOYED, null, StateChangeResult.FAILED, "");
372 verify(publisher, times(automationComposition.getElements().size()))
373 .sendAutomationCompositionAck(any(AutomationCompositionDeployAck.class));
374 assertEquals(compositionId, automationComposition.getCompositionId());