2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2021-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.assertFalse;
25 import static org.junit.jupiter.api.Assertions.assertTrue;
26 import static org.mockito.ArgumentMatchers.any;
27 import static org.mockito.Mockito.clearInvocations;
28 import static org.mockito.Mockito.mock;
29 import static org.mockito.Mockito.times;
30 import static org.mockito.Mockito.verify;
31 import static org.mockito.Mockito.when;
33 import java.util.List;
34 import java.util.UUID;
35 import org.junit.jupiter.api.Test;
36 import org.onap.policy.clamp.acm.participant.intermediary.comm.ParticipantMessagePublisher;
37 import org.onap.policy.clamp.acm.participant.intermediary.handler.cache.CacheProvider;
38 import org.onap.policy.clamp.acm.participant.intermediary.main.parameters.CommonTestData;
39 import org.onap.policy.clamp.models.acm.concepts.AcTypeState;
40 import org.onap.policy.clamp.models.acm.concepts.ParticipantSupportedElementType;
41 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionDeploy;
42 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionMigration;
43 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionPrepare;
44 import org.onap.policy.clamp.models.acm.messages.kafka.participant.AutomationCompositionStateChange;
45 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantAckMessage;
46 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantDeregister;
47 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantDeregisterAck;
48 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantMessage;
49 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantMessageType;
50 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantPrime;
51 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantRegister;
52 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantRegisterAck;
53 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantStatus;
54 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantStatusReq;
55 import org.onap.policy.clamp.models.acm.messages.kafka.participant.ParticipantSync;
56 import org.onap.policy.clamp.models.acm.messages.kafka.participant.PropertiesUpdate;
57 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.DeployOrder;
58 import org.onap.policy.clamp.models.acm.messages.rest.instantiation.LockOrder;
60 class ParticipantHandlerTest {
63 void handleParticipantStatusReqTest() {
64 var publisher = mock(ParticipantMessagePublisher.class);
65 when(publisher.isActive()).thenReturn(true);
66 var cacheProvider = mock(CacheProvider.class);
67 var msgExecutor = mock(MsgExecutor.class);
68 var participantHandler = new ParticipantHandler(mock(AutomationCompositionHandler.class),
69 mock(AcLockHandler.class), mock(AcSubStateHandler.class), mock(AcDefinitionHandler.class),
70 publisher, cacheProvider, msgExecutor);
71 participantHandler.handleParticipantStatusReq(new ParticipantStatusReq());
72 verify(publisher).sendParticipantRegister(any(ParticipantRegister.class));
74 when(cacheProvider.isRegistered()).thenReturn(true);
75 clearInvocations(publisher);
76 participantHandler.handleParticipantStatusReq(new ParticipantStatusReq());
77 verify(publisher).sendParticipantStatus(any(ParticipantStatus.class));
81 void handleAutomationCompositionDeployTest() {
82 var cacheProvider = mock(CacheProvider.class);
83 var automationCompositionDeploy = new AutomationCompositionDeploy();
84 automationCompositionDeploy.setAutomationCompositionId(UUID.randomUUID());
85 automationCompositionDeploy.setRevisionIdInstance(UUID.randomUUID());
86 when(cacheProvider.isInstanceUpdated(automationCompositionDeploy.getAutomationCompositionId(),
87 automationCompositionDeploy.getRevisionIdInstance())).thenReturn(true);
88 var acHandler = mock(AutomationCompositionHandler.class);
89 var msgExecutor = new MsgExecutor(cacheProvider, mock(ParticipantMessagePublisher.class));
90 var participantHandler = new ParticipantHandler(acHandler, mock(AcLockHandler.class),
91 mock(AcSubStateHandler.class), mock(AcDefinitionHandler.class), mock(ParticipantMessagePublisher.class),
92 cacheProvider, msgExecutor);
93 participantHandler.handleAutomationCompositionDeploy(automationCompositionDeploy);
94 verify(acHandler).handleAutomationCompositionDeploy(automationCompositionDeploy);
98 void handleAutomationCompositionStateChangeTest() {
99 var acStateChange = new AutomationCompositionStateChange();
100 acStateChange.setCompositionId(UUID.randomUUID());
101 acStateChange.setRevisionIdComposition(UUID.randomUUID());
102 var cacheProvider = mock(CacheProvider.class);
103 when(cacheProvider.isCompositionDefinitionUpdated(acStateChange.getCompositionId(),
104 acStateChange.getRevisionIdComposition())).thenReturn(true);
106 acStateChange.setDeployOrderedState(DeployOrder.DEPLOY);
107 acStateChange.setLockOrderedState(LockOrder.NONE);
108 var acHandler = mock(AutomationCompositionHandler.class);
109 var acLockHandler = mock(AcLockHandler.class);
110 var msgExecutor = new MsgExecutor(cacheProvider, mock(ParticipantMessagePublisher.class));
111 var participantHandler = new ParticipantHandler(acHandler, acLockHandler, mock(AcSubStateHandler.class),
112 mock(AcDefinitionHandler.class), mock(ParticipantMessagePublisher.class), cacheProvider, msgExecutor);
113 participantHandler.handleAutomationCompositionStateChange(acStateChange);
114 verify(acHandler).handleAutomationCompositionStateChange(acStateChange);
116 acStateChange.setDeployOrderedState(DeployOrder.NONE);
117 acStateChange.setLockOrderedState(LockOrder.LOCK);
118 participantHandler.handleAutomationCompositionStateChange(acStateChange);
119 verify(acLockHandler).handleAutomationCompositionStateChange(acStateChange);
123 void handleAutomationCompositionMigrationTest() {
124 var cacheProvider = mock(CacheProvider.class);
125 var migrationMsg = new AutomationCompositionMigration();
126 migrationMsg.setCompositionId(UUID.randomUUID());
127 migrationMsg.setRevisionIdComposition(UUID.randomUUID());
128 when(cacheProvider.isCompositionDefinitionUpdated(migrationMsg.getCompositionId(),
129 migrationMsg.getRevisionIdComposition())).thenReturn(true);
131 migrationMsg.setAutomationCompositionId(UUID.randomUUID());
132 migrationMsg.setRevisionIdInstance(UUID.randomUUID());
133 when(cacheProvider.isInstanceUpdated(migrationMsg.getAutomationCompositionId(),
134 migrationMsg.getRevisionIdInstance())).thenReturn(true);
136 migrationMsg.setCompositionTargetId(UUID.randomUUID());
137 migrationMsg.setRevisionIdCompositionTarget(UUID.randomUUID());
138 when(cacheProvider.isCompositionDefinitionUpdated(migrationMsg.getCompositionTargetId(),
139 migrationMsg.getRevisionIdCompositionTarget())).thenReturn(true);
141 var acHandler = mock(AutomationCompositionHandler.class);
142 var acSubStateHandler = mock(AcSubStateHandler.class);
143 var msgExecutor = new MsgExecutor(cacheProvider, mock(ParticipantMessagePublisher.class));
144 var participantHandler = new ParticipantHandler(acHandler, mock(AcLockHandler.class),
145 acSubStateHandler, mock(AcDefinitionHandler.class), mock(ParticipantMessagePublisher.class),
146 cacheProvider, msgExecutor);
147 participantHandler.handleAutomationCompositionMigration(migrationMsg);
148 verify(acHandler).handleAutomationCompositionMigration(migrationMsg);
150 migrationMsg.setPrecheck(true);
151 participantHandler.handleAutomationCompositionMigration(migrationMsg);
152 verify(acSubStateHandler).handleAcMigrationPrecheck(migrationMsg);
156 void handleAcPropertyUpdateTest() {
157 var propertyUpdateMsg = new PropertiesUpdate();
158 propertyUpdateMsg.setCompositionId(UUID.randomUUID());
159 propertyUpdateMsg.setRevisionIdComposition(UUID.randomUUID());
160 var cacheProvider = mock(CacheProvider.class);
161 when(cacheProvider.isCompositionDefinitionUpdated(propertyUpdateMsg.getCompositionId(),
162 propertyUpdateMsg.getRevisionIdComposition())).thenReturn(true);
164 propertyUpdateMsg.setAutomationCompositionId(UUID.randomUUID());
165 propertyUpdateMsg.setRevisionIdInstance(UUID.randomUUID());
166 when(cacheProvider.isInstanceUpdated(propertyUpdateMsg.getAutomationCompositionId(),
167 propertyUpdateMsg.getRevisionIdInstance())).thenReturn(true);
169 var acHandler = mock(AutomationCompositionHandler.class);
170 var msgExecutor = new MsgExecutor(cacheProvider, mock(ParticipantMessagePublisher.class));
171 var participantHandler = new ParticipantHandler(acHandler, mock(AcLockHandler.class),
172 mock(AcSubStateHandler.class), mock(AcDefinitionHandler.class), mock(ParticipantMessagePublisher.class),
173 cacheProvider, msgExecutor);
174 participantHandler.handleAcPropertyUpdate(propertyUpdateMsg);
175 verify(acHandler).handleAcPropertyUpdate(propertyUpdateMsg);
179 void sendHandleAutomationCompositionPrepare() {
180 var acPrepareMsg = new AutomationCompositionPrepare();
181 acPrepareMsg.setParticipantId(UUID.randomUUID());
182 acPrepareMsg.setRevisionIdComposition(UUID.randomUUID());
183 acPrepareMsg.setPreDeploy(false);
185 var cacheProvider = mock(CacheProvider.class);
186 var acSubStateHandler = mock(AcSubStateHandler.class);
187 var msgExecutor = new MsgExecutor(cacheProvider, mock(ParticipantMessagePublisher.class));
188 var participantHandler = new ParticipantHandler(mock(AutomationCompositionHandler.class),
189 mock(AcLockHandler.class), acSubStateHandler, mock(AcDefinitionHandler.class),
190 mock(ParticipantMessagePublisher.class), cacheProvider, msgExecutor);
192 participantHandler.handleAutomationCompositionPrepare(acPrepareMsg);
193 verify(acSubStateHandler).handleAcPrepare(acPrepareMsg);
197 void appliesToTest() {
198 var cacheProvider = mock(CacheProvider.class);
199 when(cacheProvider.getParticipantId()).thenReturn(CommonTestData.getParticipantId());
200 when(cacheProvider.getReplicaId()).thenReturn(CommonTestData.getReplicaId());
201 var msgExecutor = mock(MsgExecutor.class);
202 var participantHandler = new ParticipantHandler(mock(AutomationCompositionHandler.class),
203 mock(AcLockHandler.class), mock(AcSubStateHandler.class), mock(AcDefinitionHandler.class),
204 mock(ParticipantMessagePublisher.class), cacheProvider, msgExecutor);
206 var participantAckMsg = new ParticipantAckMessage(ParticipantMessageType.AUTOMATION_COMPOSITION_DEPLOY);
207 assertTrue(participantHandler.appliesTo(participantAckMsg));
209 var participantMsg = new ParticipantMessage(ParticipantMessageType.PARTICIPANT_STATUS);
210 assertTrue(participantHandler.appliesTo(participantMsg));
212 participantMsg.setParticipantId(UUID.randomUUID());
213 assertFalse(participantHandler.appliesTo(participantMsg));
217 void sendParticipantRegister() {
218 var publisher = mock(ParticipantMessagePublisher.class);
219 var cacheProvider = mock(CacheProvider.class);
220 when(cacheProvider.getParticipantId()).thenReturn(CommonTestData.getParticipantId());
221 when(cacheProvider.getSupportedAcElementTypes()).thenReturn(List.of(new ParticipantSupportedElementType()));
222 var msgExecutor = mock(MsgExecutor.class);
223 var participantHandler = new ParticipantHandler(mock(AutomationCompositionHandler.class),
224 mock(AcLockHandler.class), mock(AcSubStateHandler.class), mock(AcDefinitionHandler.class), publisher,
225 cacheProvider, msgExecutor);
227 participantHandler.sendParticipantRegister();
228 verify(publisher).sendParticipantRegister(any(ParticipantRegister.class));
232 void handleParticipantRegisterAckTest() {
233 var publisher = mock(ParticipantMessagePublisher.class);
234 var cacheProvider = mock(CacheProvider.class);
235 when(cacheProvider.getParticipantId()).thenReturn(CommonTestData.getParticipantId());
236 var msgExecutor = mock(MsgExecutor.class);
237 var participantHandler = new ParticipantHandler(mock(AutomationCompositionHandler.class),
238 mock(AcLockHandler.class), mock(AcSubStateHandler.class), mock(AcDefinitionHandler.class), publisher,
239 cacheProvider, msgExecutor);
241 participantHandler.handleParticipantRegisterAck(new ParticipantRegisterAck());
242 verify(publisher).sendParticipantStatus(any(ParticipantStatus.class));
246 void sendParticipantDeregisterTest() {
247 var publisher = mock(ParticipantMessagePublisher.class);
248 var cacheProvider = mock(CacheProvider.class);
249 when(cacheProvider.getParticipantId()).thenReturn(CommonTestData.getParticipantId());
250 var msgExecutor = mock(MsgExecutor.class);
251 var participantHandler = new ParticipantHandler(mock(AutomationCompositionHandler.class),
252 mock(AcLockHandler.class), mock(AcSubStateHandler.class), mock(AcDefinitionHandler.class), publisher,
253 cacheProvider, msgExecutor);
255 participantHandler.sendParticipantDeregister();
256 verify(publisher).sendParticipantDeregister(any(ParticipantDeregister.class));
260 void handleParticipantDeregisterAckTest() {
261 var msgExecutor = mock(MsgExecutor.class);
262 var participantHandler = new ParticipantHandler(mock(AutomationCompositionHandler.class),
263 mock(AcLockHandler.class), mock(AcSubStateHandler.class), mock(AcDefinitionHandler.class),
264 mock(ParticipantMessagePublisher.class), mock(CacheProvider.class), msgExecutor);
265 var participantDeregisterAck = new ParticipantDeregisterAck();
266 assertDoesNotThrow(() -> participantHandler.handleParticipantDeregisterAck(participantDeregisterAck));
270 void handleParticipantPrimeTest() {
271 var participantPrime = new ParticipantPrime();
272 participantPrime.setCompositionId(UUID.randomUUID());
273 participantPrime.setMessageId(UUID.randomUUID());
275 var acHandler = mock(AcDefinitionHandler.class);
276 var msgExecutor = mock(MsgExecutor.class);
277 var participantHandler = new ParticipantHandler(mock(AutomationCompositionHandler.class),
278 mock(AcLockHandler.class), mock(AcSubStateHandler.class), acHandler,
279 mock(ParticipantMessagePublisher.class), mock(CacheProvider.class), msgExecutor);
281 participantHandler.handleParticipantPrime(participantPrime);
282 verify(acHandler).handlePrime(participantPrime);
286 void handleParticipantRestartTest() {
287 var participantSyncMsg = new ParticipantSync();
288 participantSyncMsg.setState(AcTypeState.PRIMED);
289 participantSyncMsg.setCompositionId(UUID.randomUUID());
290 participantSyncMsg.setReplicaId(CommonTestData.getReplicaId());
292 var cacheProvider = mock(CacheProvider.class);
293 when(cacheProvider.getReplicaId()).thenReturn(CommonTestData.getReplicaId());
294 var publisher = mock(ParticipantMessagePublisher.class);
295 var acHandler = mock(AcDefinitionHandler.class);
296 var msgExecutor = mock(MsgExecutor.class);
297 var participantHandler = new ParticipantHandler(mock(AutomationCompositionHandler.class),
298 mock(AcLockHandler.class), mock(AcSubStateHandler.class), acHandler, publisher, cacheProvider,
301 participantSyncMsg.getExcludeReplicas().add(cacheProvider.getReplicaId());
302 participantHandler.handleParticipantSync(participantSyncMsg);
303 verify(acHandler, times(0)).handleParticipantSync(participantSyncMsg);
305 participantSyncMsg.getExcludeReplicas().clear();
306 participantHandler.handleParticipantSync(participantSyncMsg);
307 verify(acHandler).handleParticipantSync(participantSyncMsg);
311 void sendHeartbeatTest() {
312 var cacheProvider = mock(CacheProvider.class);
313 when(cacheProvider.getParticipantId()).thenReturn(CommonTestData.getParticipantId());
314 when(cacheProvider.isRegistered()).thenReturn(false);
315 when(cacheProvider.getAutomationCompositions()).thenReturn(CommonTestData.getTestAutomationCompositionMap());
316 var publisher = mock(ParticipantMessagePublisher.class);
317 when(publisher.isActive()).thenReturn(true);
318 var acHandler = mock(AcDefinitionHandler.class);
319 var msgExecutor = mock(MsgExecutor.class);
320 var participantHandler = new ParticipantHandler(mock(AutomationCompositionHandler.class),
321 mock(AcLockHandler.class), mock(AcSubStateHandler.class), acHandler, publisher, cacheProvider,
323 participantHandler.sendHeartbeat();
324 verify(publisher).sendParticipantRegister(any(ParticipantRegister.class));
326 when(cacheProvider.isRegistered()).thenReturn(true);
327 clearInvocations(publisher);
328 participantHandler.sendHeartbeat();
329 verify(publisher).sendParticipantStatus(any(ParticipantStatus.class));