2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2021-2022 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.junit.jupiter.api.Assertions.assertNotNull;
27 import static org.junit.jupiter.api.Assertions.assertNull;
28 import static org.mockito.Mockito.mock;
30 import java.time.Instant;
31 import java.util.List;
32 import java.util.UUID;
33 import org.junit.jupiter.api.Test;
34 import org.junit.jupiter.api.extension.ExtendWith;
35 import org.onap.policy.clamp.acm.participant.intermediary.api.AutomationCompositionElementListener;
36 import org.onap.policy.clamp.acm.participant.intermediary.main.parameters.CommonTestData;
37 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElement;
38 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionElementDefinition;
39 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionOrderedState;
40 import org.onap.policy.clamp.models.acm.concepts.AutomationCompositionState;
41 import org.onap.policy.clamp.models.acm.concepts.ParticipantUpdates;
42 import org.onap.policy.clamp.models.acm.messages.dmaap.participant.AutomationCompositionStateChange;
43 import org.onap.policy.clamp.models.acm.messages.dmaap.participant.AutomationCompositionUpdate;
44 import org.onap.policy.common.utils.coder.CoderException;
45 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
46 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
47 import org.springframework.test.context.junit.jupiter.SpringExtension;
49 @ExtendWith(SpringExtension.class)
50 class AutomationCompositionHandlerTest {
52 private final CommonTestData commonTestData = new CommonTestData();
55 void automationCompositionHandlerTest() {
56 var ach = commonTestData.getMockAutomationCompositionHandler();
57 assertNotNull(ach.getAutomationCompositions());
59 assertNotNull(ach.getAutomationCompositionMap());
60 assertNotNull(ach.getElementsOnThisParticipant());
62 var elementId1 = UUID.randomUUID();
63 var element = new AutomationCompositionElement();
64 element.setId(elementId1);
65 element.setDefinition(
66 new ToscaConceptIdentifier("org.onap.policy.acm.PolicyAutomationCompositionParticipant", "1.0.1"));
68 element.setOrderedState(AutomationCompositionOrderedState.PASSIVE);
70 AutomationCompositionElementListener listener = mock(AutomationCompositionElementListener.class);
71 ach.registerAutomationCompositionElementListener(listener);
72 assertThat(ach.getListeners()).contains(listener);
76 void updateNullAutomationCompositionHandlerTest() {
77 var id = UUID.randomUUID();
79 var ach = commonTestData.getMockAutomationCompositionHandler();
80 assertNull(ach.updateAutomationCompositionElementState(null, null,
81 AutomationCompositionOrderedState.UNINITIALISED, AutomationCompositionState.PASSIVE));
83 assertNull(ach.updateAutomationCompositionElementState(null, id,
84 AutomationCompositionOrderedState.UNINITIALISED, AutomationCompositionState.PASSIVE));
88 void updateAutomationCompositionHandlerTest() throws CoderException {
89 var uuid = UUID.randomUUID();
90 var id = CommonTestData.getParticipantId();
92 var ach = commonTestData.setTestAutomationCompositionHandler(id, uuid);
93 var key = ach.getElementsOnThisParticipant().keySet().iterator().next();
94 var value = ach.getElementsOnThisParticipant().get(key);
95 assertEquals(AutomationCompositionState.UNINITIALISED, value.getState());
96 ach.updateAutomationCompositionElementState(CommonTestData.AC_ID_1, uuid,
97 AutomationCompositionOrderedState.UNINITIALISED, AutomationCompositionState.PASSIVE);
98 assertEquals(AutomationCompositionState.PASSIVE, value.getState());
100 ach.getAutomationCompositionMap().values().iterator().next().getElements().putIfAbsent(key, value);
101 ach.updateAutomationCompositionElementState(CommonTestData.AC_ID_1, key,
102 AutomationCompositionOrderedState.PASSIVE, AutomationCompositionState.RUNNING);
103 assertEquals(AutomationCompositionState.RUNNING, value.getState());
105 ach.getElementsOnThisParticipant().remove(key, value);
106 ach.getAutomationCompositionMap().values().iterator().next().getElements().clear();
107 assertNull(ach.updateAutomationCompositionElementState(CommonTestData.AC_ID_1, key,
108 AutomationCompositionOrderedState.PASSIVE, AutomationCompositionState.RUNNING));
113 void handleAutomationCompositionUpdateExceptionTest() throws CoderException {
114 var uuid = UUID.randomUUID();
115 var id = CommonTestData.getParticipantId();
116 var stateChange = getStateChange(id, uuid, AutomationCompositionOrderedState.RUNNING);
117 var ach = commonTestData.setTestAutomationCompositionHandler(id, uuid);
118 assertDoesNotThrow(() -> ach
119 .handleAutomationCompositionStateChange(mock(AutomationCompositionStateChange.class), List.of()));
121 ach.handleAutomationCompositionStateChange(stateChange, List.of());
122 var newid = new ToscaConceptIdentifier("id", "1.2.3");
123 stateChange.setAutomationCompositionId(UUID.randomUUID());
124 stateChange.setParticipantId(newid);
125 assertDoesNotThrow(() -> ach.handleAutomationCompositionStateChange(stateChange, List.of()));
127 var acd = new AutomationCompositionElementDefinition();
128 acd.setAcElementDefinitionId(id);
129 var updateMsg = new AutomationCompositionUpdate();
130 updateMsg.setAutomationCompositionId(UUID.randomUUID());
131 updateMsg.setMessageId(uuid);
132 updateMsg.setParticipantId(id);
133 updateMsg.setStartPhase(0);
134 var acElementDefinitions = List.of(acd);
135 assertDoesNotThrow(() -> ach.handleAutomationCompositionUpdate(updateMsg, acElementDefinitions));
136 updateMsg.setStartPhase(1);
137 assertDoesNotThrow(() -> ach.handleAutomationCompositionUpdate(updateMsg, acElementDefinitions));
139 ach.getAutomationCompositionMap().clear();
140 updateMsg.setStartPhase(0);
141 assertDoesNotThrow(() -> ach.handleAutomationCompositionUpdate(updateMsg, acElementDefinitions));
143 updateMsg.setAutomationCompositionId(UUID.randomUUID());
144 updateMsg.setParticipantUpdatesList(List.of(mock(ParticipantUpdates.class)));
145 assertDoesNotThrow(() -> ach.handleAutomationCompositionUpdate(updateMsg, acElementDefinitions));
147 updateMsg.setStartPhase(1);
148 var participantUpdate = new ParticipantUpdates();
149 participantUpdate.setParticipantId(id);
150 var element = new AutomationCompositionElement();
151 element.setParticipantType(id);
152 element.setDefinition(id);
153 participantUpdate.setAutomationCompositionElementList(List.of(element));
154 updateMsg.setParticipantUpdatesList(List.of(participantUpdate));
156 var acd2 = new AutomationCompositionElementDefinition();
157 acd2.setAcElementDefinitionId(id);
158 acd2.setAutomationCompositionElementToscaNodeTemplate(mock(ToscaNodeTemplate.class));
159 assertDoesNotThrow(() -> ach.handleAutomationCompositionUpdate(updateMsg, List.of(acd2)));
164 void automationCompositionStateChangeUninitialisedTest() throws CoderException {
165 var uuid = UUID.randomUUID();
166 var id = CommonTestData.getParticipantId();
168 var stateChangeUninitialised = getStateChange(id, uuid, AutomationCompositionOrderedState.UNINITIALISED);
170 var ach = commonTestData.setTestAutomationCompositionHandler(id, uuid);
171 ach.handleAutomationCompositionStateChange(stateChangeUninitialised, List.of());
172 var newid = new ToscaConceptIdentifier("id", "1.2.3");
173 stateChangeUninitialised.setAutomationCompositionId(UUID.randomUUID());
174 stateChangeUninitialised.setParticipantId(newid);
175 assertDoesNotThrow(() -> ach.handleAutomationCompositionStateChange(stateChangeUninitialised, List.of()));
179 void automationCompositionStateChangePassiveTest() throws CoderException {
180 var uuid = UUID.randomUUID();
181 var id = CommonTestData.getParticipantId();
183 var stateChangePassive = getStateChange(id, uuid, AutomationCompositionOrderedState.PASSIVE);
185 var ach = commonTestData.setTestAutomationCompositionHandler(id, uuid);
186 ach.handleAutomationCompositionStateChange(stateChangePassive, List.of());
187 var newid = new ToscaConceptIdentifier("id", "1.2.3");
188 stateChangePassive.setAutomationCompositionId(UUID.randomUUID());
189 stateChangePassive.setParticipantId(newid);
190 assertDoesNotThrow(() -> ach.handleAutomationCompositionStateChange(stateChangePassive, List.of()));
193 private AutomationCompositionStateChange getStateChange(ToscaConceptIdentifier id, UUID uuid,
194 AutomationCompositionOrderedState state) {
195 var stateChange = new AutomationCompositionStateChange();
196 stateChange.setAutomationCompositionId(UUID.randomUUID());
197 stateChange.setParticipantId(id);
198 stateChange.setMessageId(uuid);
199 stateChange.setOrderedState(state);
200 stateChange.setCurrentState(AutomationCompositionState.UNINITIALISED);
201 stateChange.setTimestamp(Instant.ofEpochMilli(3000));