2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2021 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.controlloop.runtime.instantiation;
23 import static org.assertj.core.api.Assertions.assertThat;
24 import static org.assertj.core.api.Assertions.assertThatThrownBy;
26 import java.io.IOException;
27 import java.util.ArrayList;
28 import org.junit.Assert;
29 import org.junit.BeforeClass;
30 import org.junit.Test;
31 import org.onap.policy.clamp.controlloop.common.exception.ControlLoopException;
32 import org.onap.policy.clamp.controlloop.common.exception.ControlLoopRuntimeException;
33 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
34 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
35 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoops;
36 import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationCommand;
37 import org.onap.policy.clamp.controlloop.models.messages.rest.instantiation.InstantiationResponse;
38 import org.onap.policy.clamp.controlloop.runtime.util.CommonTestData;
39 import org.onap.policy.models.base.PfModelException;
40 import org.onap.policy.models.provider.PolicyModelsProviderParameters;
41 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
44 * Class to perform unit test of {@link ControlLoopInstantiationProvider}}.
47 public class ControlLoopInstantiationProviderTest {
49 private static final String CL_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/controlloops/ControlLoops.json";
50 private static final String CL_INSTANTIATION_UPDATE_JSON =
51 "src/test/resources/rest/controlloops/ControlLoopsUpdate.json";
52 private static final String CL_INSTANTIATION_CHANGE_STATE_JSON =
53 "src/test/resources/rest/controlloops/PassiveCommand.json";
55 private static final String CONTROL_LOOP_NOT_FOUND = "Control Loop not found";
56 private static final String DELETE_BAD_REQUEST = "Control Loop State is still %s";
57 private static final String ORDERED_STATE_INVALID = "ordered state invalid or not specified on command";
59 private static PolicyModelsProviderParameters databaseProviderParameters;
62 public static void setupDbProviderParameters() throws ControlLoopException, PfModelException {
63 databaseProviderParameters =
64 CommonTestData.geParameterGroup(0, "instantproviderdb").getDatabaseProviderParameters();
68 public void testInstantiationCrud() throws Exception {
69 ControlLoops controlLoopsCreate =
70 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Crud");
72 ControlLoops controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
73 assertThat(controlLoopsDb.getControlLoopList()).isEmpty();
75 try (ControlLoopInstantiationProvider instantiationProvider =
76 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
77 InstantiationResponse instantiationResponse = instantiationProvider.createControlLoops(controlLoopsCreate);
78 InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsCreate);
80 controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
81 assertThat(controlLoopsDb.getControlLoopList()).isNotEmpty();
82 Assert.assertEquals(controlLoopsCreate, controlLoopsDb);
84 for (ControlLoop controlLoop : controlLoopsCreate.getControlLoopList()) {
85 ControlLoops controlLoopsGet =
86 instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
87 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
88 Assert.assertEquals(controlLoop, controlLoopsGet.getControlLoopList().get(0));
91 ControlLoops controlLoopsUpdate =
92 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Crud");
93 Assert.assertNotEquals(controlLoopsUpdate, controlLoopsDb);
95 instantiationResponse = instantiationProvider.updateControlLoops(controlLoopsUpdate);
96 InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsUpdate);
98 controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
99 assertThat(controlLoopsDb.getControlLoopList()).isNotEmpty();
100 Assert.assertEquals(controlLoopsUpdate, controlLoopsDb);
102 InstantiationCommand instantiationCommand =
103 InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Crud");
104 instantiationResponse = instantiationProvider.issueControlLoopCommand(instantiationCommand);
105 InstantiationUtils.assertInstantiationResponse(instantiationResponse, instantiationCommand);
107 for (ToscaConceptIdentifier toscaConceptIdentifier : instantiationCommand.getControlLoopIdentifierList()) {
108 ControlLoops controlLoopsGet = instantiationProvider.getControlLoops(toscaConceptIdentifier.getName(),
109 toscaConceptIdentifier.getVersion());
110 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
111 Assert.assertEquals(instantiationCommand.getOrderedState(),
112 controlLoopsGet.getControlLoopList().get(0).getOrderedState());
115 // in order to delete a controlLoop the state must be UNINITIALISED
116 controlLoopsCreate.getControlLoopList().forEach(cl -> cl.setState(ControlLoopState.UNINITIALISED));
117 instantiationProvider.updateControlLoops(controlLoopsCreate);
119 for (ControlLoop controlLoop : controlLoopsCreate.getControlLoopList()) {
120 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
123 controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
124 assertThat(controlLoopsDb.getControlLoopList()).isEmpty();
128 private ControlLoops getControlLoopsFromDb(ControlLoops controlLoopsSource) throws Exception {
129 ControlLoops controlLoopsDb = new ControlLoops();
130 controlLoopsDb.setControlLoopList(new ArrayList<>());
132 try (ControlLoopInstantiationProvider instantiationProvider =
133 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
135 for (ControlLoop controlLoop : controlLoopsSource.getControlLoopList()) {
136 ControlLoops controlLoopsFromDb =
137 instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
138 controlLoopsDb.getControlLoopList().addAll(controlLoopsFromDb.getControlLoopList());
140 return controlLoopsDb;
145 public void testInstantiationDelete() throws Exception {
146 ControlLoops controlLoops =
147 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Delete");
148 assertThat(getControlLoopsFromDb(controlLoops).getControlLoopList()).isEmpty();
150 ControlLoop controlLoop0 = controlLoops.getControlLoopList().get(0);
152 try (ControlLoopInstantiationProvider instantiationProvider =
153 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
155 assertThatThrownBy(() -> {
156 instantiationProvider.deleteControlLoop(controlLoop0.getName(), controlLoop0.getVersion());
157 }).hasMessageMatching(CONTROL_LOOP_NOT_FOUND);
159 InstantiationUtils.assertInstantiationResponse(instantiationProvider.createControlLoops(controlLoops),
162 for (ControlLoopState state : ControlLoopState.values()) {
163 if (!ControlLoopState.UNINITIALISED.equals(state)) {
164 assertThatDeleteThrownBy(controlLoops, state);
168 controlLoop0.setState(ControlLoopState.UNINITIALISED);
169 instantiationProvider.updateControlLoops(controlLoops);
171 for (ControlLoop controlLoop : controlLoops.getControlLoopList()) {
172 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
175 for (ControlLoop controlLoop : controlLoops.getControlLoopList()) {
176 ControlLoops controlLoopsGet =
177 instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
178 assertThat(controlLoopsGet.getControlLoopList()).isEmpty();
183 private void assertThatDeleteThrownBy(ControlLoops controlLoops, ControlLoopState state) throws Exception {
184 ControlLoop controlLoop = controlLoops.getControlLoopList().get(0);
186 controlLoop.setState(state);
188 try (ControlLoopInstantiationProvider instantiationProvider =
189 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
191 instantiationProvider.updateControlLoops(controlLoops);
192 assertThatThrownBy(() -> {
193 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
194 }).hasMessageMatching(String.format(DELETE_BAD_REQUEST, state));
199 public void testCreateControlLoops_NoDuplicates() throws Exception {
201 ControlLoops controlLoopsCreate =
202 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "NoDuplicates");
204 ControlLoops controlLoopsDb = getControlLoopsFromDb(controlLoopsCreate);
205 assertThat(controlLoopsDb.getControlLoopList()).isEmpty();
207 try (ControlLoopInstantiationProvider instantiationProvider =
208 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
209 InstantiationResponse instantiationResponse = instantiationProvider.createControlLoops(controlLoopsCreate);
210 InstantiationUtils.assertInstantiationResponse(instantiationResponse, controlLoopsCreate);
212 assertThatThrownBy(() -> {
213 instantiationProvider.createControlLoops(controlLoopsCreate);
214 }).hasMessageMatching(
215 controlLoopsCreate.getControlLoopList().get(0).getKey().asIdentifier() + " already defined");
217 for (ControlLoop controlLoop : controlLoopsCreate.getControlLoopList()) {
218 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
224 public void testIssueControlLoopCommand_OrderedStateInvalid() throws ControlLoopRuntimeException, IOException {
225 try (ControlLoopInstantiationProvider instantiationProvider =
226 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
227 assertThatThrownBy(() -> {
228 instantiationProvider.issueControlLoopCommand(new InstantiationCommand());
229 }).hasMessageMatching(ORDERED_STATE_INVALID);
234 public void testInstantiationVersions() throws Exception {
236 // create controlLoops V1
237 ControlLoops controlLoopsV1 =
238 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "V1");
239 assertThat(getControlLoopsFromDb(controlLoopsV1).getControlLoopList()).isEmpty();
241 try (ControlLoopInstantiationProvider instantiationProvider =
242 new ControlLoopInstantiationProvider(databaseProviderParameters)) {
243 InstantiationUtils.assertInstantiationResponse(instantiationProvider.createControlLoops(controlLoopsV1),
246 // create controlLoops V2
247 ControlLoops controlLoopsV2 =
248 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "V2");
249 assertThat(getControlLoopsFromDb(controlLoopsV2).getControlLoopList()).isEmpty();
250 InstantiationUtils.assertInstantiationResponse(instantiationProvider.createControlLoops(controlLoopsV2),
253 // GET controlLoops V2
254 for (ControlLoop controlLoop : controlLoopsV2.getControlLoopList()) {
255 ControlLoops controlLoopsGet =
256 instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
257 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
258 Assert.assertEquals(controlLoop, controlLoopsGet.getControlLoopList().get(0));
261 // DELETE controlLoops V1
262 for (ControlLoop controlLoop : controlLoopsV1.getControlLoopList()) {
263 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
266 // GET controlLoops V1 is not available
267 for (ControlLoop controlLoop : controlLoopsV1.getControlLoopList()) {
268 ControlLoops controlLoopsGet =
269 instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
270 assertThat(controlLoopsGet.getControlLoopList()).isEmpty();
273 // GET controlLoops V2 is still available
274 for (ControlLoop controlLoop : controlLoopsV2.getControlLoopList()) {
275 ControlLoops controlLoopsGet =
276 instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
277 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
278 Assert.assertEquals(controlLoop, controlLoopsGet.getControlLoopList().get(0));
281 // DELETE controlLoops V2
282 for (ControlLoop controlLoop : controlLoopsV2.getControlLoopList()) {
283 instantiationProvider.deleteControlLoop(controlLoop.getName(), controlLoop.getVersion());
286 // GET controlLoops V2 is not available
287 for (ControlLoop controlLoop : controlLoopsV2.getControlLoopList()) {
288 ControlLoops controlLoopsGet =
289 instantiationProvider.getControlLoops(controlLoop.getName(), controlLoop.getVersion());
290 assertThat(controlLoopsGet.getControlLoopList()).isEmpty();