2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2024-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.sim.main.handler;
23 import static org.assertj.core.api.Assertions.assertThat;
24 import static org.junit.jupiter.api.Assertions.assertEquals;
25 import static org.junit.jupiter.api.Assertions.assertTrue;
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;
32 import java.util.HashMap;
34 import java.util.UUID;
35 import org.junit.jupiter.api.Test;
36 import org.onap.policy.clamp.acm.participant.intermediary.api.CompositionDto;
37 import org.onap.policy.clamp.acm.participant.intermediary.api.ParticipantIntermediaryApi;
38 import org.onap.policy.clamp.acm.participant.sim.comm.CommonTestData;
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.StateChangeResult;
42 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
43 import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate;
45 class SimulatorServiceTest {
48 void testGetAutomationCompositions() {
49 var intermediaryApi = mock(ParticipantIntermediaryApi.class);
50 var simulatorService = new SimulatorService(intermediaryApi);
52 var map = CommonTestData.getTestAutomationCompositionMap();
53 when(intermediaryApi.getAutomationCompositions()).thenReturn(map);
54 var result = simulatorService.getAutomationCompositions();
55 assertEquals(map.values().iterator().next(), result.getAutomationCompositionList().get(0));
59 void testGetAutomationComposition() {
60 var intermediaryApi = mock(ParticipantIntermediaryApi.class);
61 var simulatorService = new SimulatorService(intermediaryApi);
63 var instance = CommonTestData.getTestAutomationCompositionMap().values().iterator().next();
64 when(intermediaryApi.getAutomationComposition(instance.getInstanceId())).thenReturn(instance);
65 var result = simulatorService.getAutomationComposition(instance.getInstanceId());
66 assertEquals(instance, result);
70 void testSetOutProperties() {
71 var intermediaryApi = mock(ParticipantIntermediaryApi.class);
72 var simulatorService = new SimulatorService(intermediaryApi);
74 var instanceId = UUID.randomUUID();
75 var elementId = UUID.randomUUID();
76 var useState = "useState";
77 var operationalState = "operationalState";
78 Map<String, Object> map = Map.of("id", "1234");
80 simulatorService.setOutProperties(instanceId, elementId, useState, operationalState, map);
81 verify(intermediaryApi).sendAcElementInfo(instanceId, elementId, useState, operationalState, map);
85 void testGetDataList() {
86 var intermediaryApi = mock(ParticipantIntermediaryApi.class);
87 var simulatorService = new SimulatorService(intermediaryApi);
89 var map = CommonTestData.getTestAutomationCompositionMap();
90 when(intermediaryApi.getAutomationCompositions()).thenReturn(map);
91 var result = simulatorService.getDataList();
92 var data = result.getList().get(0);
93 var automationcomposition = map.values().iterator().next();
94 assertEquals(automationcomposition.getInstanceId(), data.getAutomationCompositionId());
95 var element = automationcomposition.getElements().values().iterator().next();
96 assertEquals(element.getId(), data.getAutomationCompositionElementId());
100 void testGetCompositionDataList() {
101 var acElementDefinition = new AutomationCompositionElementDefinition();
102 var toscaConceptIdentifier = new ToscaConceptIdentifier("code", "1.0.0");
103 acElementDefinition.setAcElementDefinitionId(toscaConceptIdentifier);
104 acElementDefinition.setAutomationCompositionElementToscaNodeTemplate(new ToscaNodeTemplate());
105 Map<String, Object> outProperties = Map.of("code", "value");
106 Map<String, Object> inProperties = Map.of("key", "value");
107 acElementDefinition.getAutomationCompositionElementToscaNodeTemplate().setProperties(inProperties);
108 acElementDefinition.setOutProperties(outProperties);
109 var elementsDefinitions = Map.of(toscaConceptIdentifier, acElementDefinition);
110 var compositionId = UUID.randomUUID();
111 var map = Map.of(compositionId, elementsDefinitions);
112 var intermediaryApi = mock(ParticipantIntermediaryApi.class);
113 when(intermediaryApi.getAcElementsDefinitions()).thenReturn(map);
114 var simulatorService = new SimulatorService(intermediaryApi);
116 var result = simulatorService.getCompositionDataList();
117 assertThat(result.getList()).hasSize(1);
118 assertEquals(result.getList().get(0).getCompositionId(), compositionId);
119 assertEquals(result.getList().get(0).getCompositionDefinitionElementId(), toscaConceptIdentifier);
120 assertEquals(result.getList().get(0).getOutProperties(), outProperties);
121 assertEquals(result.getList().get(0).getIntProperties(), inProperties);
125 void testSetCompositionData() {
126 var intermediaryApi = mock(ParticipantIntermediaryApi.class);
127 var simulatorService = new SimulatorService(intermediaryApi);
129 var compositionId = UUID.randomUUID();
130 simulatorService.setCompositionOutProperties(compositionId, null, Map.of());
131 verify(intermediaryApi).sendAcDefinitionInfo(compositionId, null, Map.of());
135 void testInterrupted() {
136 var intermediaryApi = mock(ParticipantIntermediaryApi.class);
137 var simulatorService = new SimulatorService(intermediaryApi) {
139 protected boolean isInterrupted(int timeMs, String msg, UUID elementId) {
144 simulatorService.deploy(UUID.randomUUID(), UUID.randomUUID(), new HashMap<>());
145 simulatorService.undeploy(UUID.randomUUID(), UUID.randomUUID(), new HashMap<>());
146 simulatorService.lock(UUID.randomUUID(), UUID.randomUUID());
147 simulatorService.unlock(UUID.randomUUID(), UUID.randomUUID());
148 simulatorService.delete(UUID.randomUUID(), UUID.randomUUID());
149 simulatorService.update(UUID.randomUUID(), UUID.randomUUID());
150 simulatorService.prime(mock(CompositionDto.class));
151 simulatorService.deprime(mock(CompositionDto.class));
152 simulatorService.migrate(UUID.randomUUID(), UUID.randomUUID(), 0, new HashMap<>(), new HashMap<>());
153 simulatorService.review(UUID.randomUUID(), UUID.randomUUID());
154 simulatorService.prepare(UUID.randomUUID(), UUID.randomUUID(), 0, new HashMap<>(), new HashMap<>());
155 simulatorService.migratePrecheck(UUID.randomUUID(), UUID.randomUUID());
156 verify(intermediaryApi, times(0)).sendAcDefinitionInfo(any(), any(), any());
160 void testImmediateInterruption() throws InterruptedException {
161 var intermediaryApi = mock(ParticipantIntermediaryApi.class);
162 var simulatorService = new SimulatorService(intermediaryApi);
164 Thread testThread = new Thread(() -> {
165 boolean result = simulatorService.isInterrupted(5000, "test", UUID.randomUUID());
166 assertTrue(result, "Thread was supposed to be interrupted");
170 testThread.interrupt();
175 void testDeleteInMigration() {
176 var intermediaryApi = mock(ParticipantIntermediaryApi.class);
177 var simulatorService = new SimulatorService(intermediaryApi);
178 var instanceId = UUID.randomUUID();
179 var elementId = UUID.randomUUID();
180 simulatorService.deleteInMigration(instanceId, elementId);
181 verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId,
182 DeployState.DELETED, null, StateChangeResult.NO_ERROR, "Deleted");
184 simulatorService.getConfig().setMigrateSuccess(false);
185 simulatorService.deleteInMigration(instanceId, elementId);
186 verify(intermediaryApi).updateAutomationCompositionElementState(instanceId, elementId,
187 DeployState.UNDEPLOYED, null, StateChangeResult.FAILED, "Delete failed!");