63d5a52a4681f98af5a9fdcdbcbce70c92906b2d
[policy/clamp.git] /
1 /*-
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
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
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.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.clamp.controlloop.runtime.instantiation.rest;
22
23 import static org.assertj.core.api.Assertions.assertThat;
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertNotNull;
26 import static org.junit.Assert.assertNull;
27
28 import javax.ws.rs.client.Entity;
29 import javax.ws.rs.client.Invocation;
30 import javax.ws.rs.core.Response;
31 import org.junit.AfterClass;
32 import org.junit.BeforeClass;
33 import org.junit.Test;
34 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
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.instantiation.ControlLoopInstantiationProvider;
39 import org.onap.policy.clamp.controlloop.runtime.instantiation.InstantiationUtils;
40 import org.onap.policy.clamp.controlloop.runtime.util.rest.CommonRestController;
41 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
42
43 /**
44  * Class to perform unit test of {@link InstantiationController}}.
45  *
46  */
47 public class InstantiationControllerTest extends CommonRestController {
48
49     private static final String CL_INSTANTIATION_CREATE_JSON = "src/test/resources/rest/controlloops/ControlLoops.json";
50
51     private static final String CL_INSTANTIATION_UPDATE_JSON =
52             "src/test/resources/rest/controlloops/ControlLoopsUpdate.json";
53
54     private static final String CL_INSTANTIATION_CHANGE_STATE_JSON =
55             "src/test/resources/rest/controlloops/PassiveCommand.json";
56
57     private static final String INSTANTIATION_ENDPOINT = "instantiation";
58
59     private static final String INSTANTIATION_COMMAND_ENDPOINT = "instantiation/command";
60
61     private static final String TOSCA_TEMPLATE_YAML = "examples/controlloop/PMSubscriptionHandling.yaml";
62
63     /**
64      * starts Main and inserts a commissioning template.
65      *
66      * @throws Exception if an error occurs
67      */
68     @BeforeClass
69     public static void setUpBeforeClass() throws Exception {
70         CommonRestController.setUpBeforeClass("InstApi");
71
72         // to validate control Loop, it needs to define ToscaServiceTemplate
73         InstantiationUtils.storeToscaServiceTemplate(TOSCA_TEMPLATE_YAML, getParameters());
74
75         ControlLoops controlLoops =
76                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Command");
77         try (ControlLoopInstantiationProvider instantiationProvider =
78                 new ControlLoopInstantiationProvider(getParameters())) {
79             instantiationProvider.createControlLoops(controlLoops);
80         }
81     }
82
83     @AfterClass
84     public static void teardownAfterClass() {
85         CommonRestController.teardownAfterClass();
86     }
87
88     @Test
89     public void testSwagger() throws Exception {
90         super.testSwagger(INSTANTIATION_ENDPOINT);
91     }
92
93     @Test
94     public void testCreate_Unauthorized() throws Exception {
95         ControlLoops controlLoops =
96                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Unauthorized");
97
98         assertUnauthorizedPost(INSTANTIATION_ENDPOINT, Entity.json(controlLoops));
99     }
100
101     @Test
102     public void testQuery_Unauthorized() throws Exception {
103         assertUnauthorizedGet(INSTANTIATION_ENDPOINT);
104     }
105
106     @Test
107     public void testUpdate_Unauthorized() throws Exception {
108         ControlLoops controlLoops =
109                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Unauthorized");
110
111         assertUnauthorizedPut(INSTANTIATION_ENDPOINT, Entity.json(controlLoops));
112     }
113
114     @Test
115     public void testDelete_Unauthorized() throws Exception {
116         assertUnauthorizedDelete(INSTANTIATION_ENDPOINT);
117     }
118
119     @Test
120     public void testCommand_Unauthorized() throws Exception {
121         InstantiationCommand instantiationCommand = InstantiationUtils
122                 .getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Unauthorized");
123
124         assertUnauthorizedPut(INSTANTIATION_COMMAND_ENDPOINT, Entity.json(instantiationCommand));
125     }
126
127     @Test
128     public void testCreate() throws Exception {
129         ControlLoops controlLoopsFromRsc =
130                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Create");
131
132         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
133         Response resp = invocationBuilder.post(Entity.json(controlLoopsFromRsc));
134         assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
135         InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
136         InstantiationUtils.assertInstantiationResponse(instResponse, controlLoopsFromRsc);
137
138         try (ControlLoopInstantiationProvider instantiationProvider =
139                 new ControlLoopInstantiationProvider(getParameters())) {
140             for (ControlLoop controlLoopFromRsc : controlLoopsFromRsc.getControlLoopList()) {
141                 ControlLoops controlLoopsFromDb = instantiationProvider.getControlLoops(
142                         controlLoopFromRsc.getKey().getName(), controlLoopFromRsc.getKey().getVersion());
143
144                 assertNotNull(controlLoopsFromDb);
145                 assertThat(controlLoopsFromDb.getControlLoopList()).hasSize(1);
146                 assertEquals(controlLoopFromRsc, controlLoopsFromDb.getControlLoopList().get(0));
147             }
148         }
149     }
150
151     @Test
152     public void testCreateBadRequest() throws Exception {
153         ControlLoops controlLoopsFromRsc =
154                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "CreateBadRequest");
155
156         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
157         Response resp = invocationBuilder.post(Entity.json(controlLoopsFromRsc));
158         assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
159
160         // testing Bad Request: CL already defined
161         resp = invocationBuilder.post(Entity.json(controlLoopsFromRsc));
162         assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
163         InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
164         assertNotNull(instResponse.getErrorDetails());
165         assertNull(instResponse.getAffectedControlLoops());
166     }
167
168     @Test
169     public void testQuery_NoResultWithThisName() throws Exception {
170         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT + "?name=noResultWithThisName");
171         Response rawresp = invocationBuilder.buildGet().invoke();
172         assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
173         ControlLoops resp = rawresp.readEntity(ControlLoops.class);
174         assertThat(resp.getControlLoopList()).isEmpty();
175     }
176
177     @Test
178     public void testQuery() throws Exception {
179         // inserts a ControlLoops to DB
180         ControlLoops controlLoops =
181                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Query");
182         try (ControlLoopInstantiationProvider instantiationProvider =
183                 new ControlLoopInstantiationProvider(getParameters())) {
184             instantiationProvider.createControlLoops(controlLoops);
185         }
186
187         for (ControlLoop controlLoopFromRsc : controlLoops.getControlLoopList()) {
188             Invocation.Builder invocationBuilder =
189                     super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + controlLoopFromRsc.getKey().getName());
190             Response rawresp = invocationBuilder.buildGet().invoke();
191             assertEquals(Response.Status.OK.getStatusCode(), rawresp.getStatus());
192             ControlLoops controlLoopsQuery = rawresp.readEntity(ControlLoops.class);
193             assertNotNull(controlLoopsQuery);
194             assertThat(controlLoopsQuery.getControlLoopList()).hasSize(1);
195             assertEquals(controlLoopFromRsc, controlLoopsQuery.getControlLoopList().get(0));
196         }
197     }
198
199     @Test
200     public void testUpdate() throws Exception {
201         ControlLoops controlLoopsCreate =
202                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Update");
203
204         ControlLoops controlLoops =
205                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_UPDATE_JSON, "Update");
206
207         try (ControlLoopInstantiationProvider instantiationProvider =
208                 new ControlLoopInstantiationProvider(getParameters())) {
209             instantiationProvider.createControlLoops(controlLoopsCreate);
210
211             Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT);
212             Response resp = invocationBuilder.put(Entity.json(controlLoops));
213             assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
214
215             InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
216             InstantiationUtils.assertInstantiationResponse(instResponse, controlLoops);
217
218             for (ControlLoop controlLoopUpdate : controlLoops.getControlLoopList()) {
219                 ControlLoops controlLoopsFromDb = instantiationProvider
220                         .getControlLoops(controlLoopUpdate.getKey().getName(), controlLoopUpdate.getKey().getVersion());
221
222                 assertNotNull(controlLoopsFromDb);
223                 assertThat(controlLoopsFromDb.getControlLoopList()).hasSize(1);
224                 assertEquals(controlLoopUpdate, controlLoopsFromDb.getControlLoopList().get(0));
225             }
226         }
227     }
228
229     @Test
230     public void testDelete_NoResultWithThisName() throws Exception {
231         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_ENDPOINT + "?name=noResultWithThisName");
232         Response resp = invocationBuilder.delete();
233         assertEquals(Response.Status.NOT_FOUND.getStatusCode(), resp.getStatus());
234         InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
235         assertNotNull(instResponse.getErrorDetails());
236         assertNull(instResponse.getAffectedControlLoops());
237     }
238
239     @Test
240     public void testDelete() throws Exception {
241         ControlLoops controlLoopsFromRsc =
242                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "Delete");
243         try (ControlLoopInstantiationProvider instantiationProvider =
244                 new ControlLoopInstantiationProvider(getParameters())) {
245             instantiationProvider.createControlLoops(controlLoopsFromRsc);
246
247             for (ControlLoop controlLoopFromRsc : controlLoopsFromRsc.getControlLoopList()) {
248                 Invocation.Builder invocationBuilder =
249                         super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + controlLoopFromRsc.getKey().getName()
250                                 + "&version=" + controlLoopFromRsc.getKey().getVersion());
251                 Response resp = invocationBuilder.delete();
252                 assertEquals(Response.Status.OK.getStatusCode(), resp.getStatus());
253                 InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
254                 InstantiationUtils.assertInstantiationResponse(instResponse, controlLoopFromRsc);
255
256                 ControlLoops controlLoopsFromDb = instantiationProvider.getControlLoops(
257                         controlLoopFromRsc.getKey().getName(), controlLoopFromRsc.getKey().getVersion());
258                 assertThat(controlLoopsFromDb.getControlLoopList()).isEmpty();
259             }
260         }
261     }
262
263     @Test
264     public void testDeleteBadRequest() throws Exception {
265         ControlLoops controlLoopsFromRsc =
266                 InstantiationUtils.getControlLoopsFromResource(CL_INSTANTIATION_CREATE_JSON, "DelBadRequest");
267         try (ControlLoopInstantiationProvider instantiationProvider =
268                 new ControlLoopInstantiationProvider(getParameters())) {
269             instantiationProvider.createControlLoops(controlLoopsFromRsc);
270
271             for (ControlLoop controlLoopFromRsc : controlLoopsFromRsc.getControlLoopList()) {
272                 Invocation.Builder invocationBuilder =
273                         super.sendRequest(INSTANTIATION_ENDPOINT + "?name=" + controlLoopFromRsc.getKey().getName());
274                 Response resp = invocationBuilder.delete();
275                 // should be BAD_REQUEST
276                 assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), resp.getStatus());
277             }
278         }
279     }
280
281     @Test
282     public void testCommand_NotFound1() throws Exception {
283         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
284         Response resp = invocationBuilder.put(Entity.json(new InstantiationCommand()));
285         assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
286     }
287
288     @Test
289     public void testCommand_NotFound2() throws Exception {
290         InstantiationCommand command =
291                 InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Command");
292         command.setOrderedState(null);
293
294         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
295         Response resp = invocationBuilder.put(Entity.json(command));
296         assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), resp.getStatus());
297     }
298
299     @Test
300     public void testCommand() throws Exception {
301         InstantiationCommand command =
302                 InstantiationUtils.getInstantiationCommandFromResource(CL_INSTANTIATION_CHANGE_STATE_JSON, "Command");
303
304         Invocation.Builder invocationBuilder = super.sendRequest(INSTANTIATION_COMMAND_ENDPOINT);
305         Response resp = invocationBuilder.put(Entity.json(command));
306         assertEquals(Response.Status.ACCEPTED.getStatusCode(), resp.getStatus());
307         InstantiationResponse instResponse = resp.readEntity(InstantiationResponse.class);
308         InstantiationUtils.assertInstantiationResponse(instResponse, command);
309
310         // check passive state on DB
311         try (ControlLoopInstantiationProvider instantiationProvider =
312                 new ControlLoopInstantiationProvider(getParameters())) {
313             for (ToscaConceptIdentifier toscaConceptIdentifier : command.getControlLoopIdentifierList()) {
314                 ControlLoops controlLoopsGet = instantiationProvider.getControlLoops(toscaConceptIdentifier.getName(),
315                         toscaConceptIdentifier.getVersion());
316                 assertThat(controlLoopsGet.getControlLoopList()).hasSize(1);
317                 assertEquals(command.getOrderedState(), controlLoopsGet.getControlLoopList().get(0).getOrderedState());
318             }
319         }
320     }
321 }