891192c75f0ca574974a9514302d82d8a5c639e6
[vid.git] / vid-app-common / src / test / java / org / onap / vid / mso / MsoOperationalEnvironmentTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * VID
4  * ================================================================================
5  * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.vid.mso;
22
23 import com.fasterxml.jackson.core.JsonProcessingException;
24 import com.fasterxml.jackson.databind.ObjectMapper;
25 import com.fasterxml.jackson.databind.SerializationFeature;
26 import com.google.common.collect.ImmutableList;
27 import com.google.common.collect.ImmutableListMultimap;
28 import org.apache.commons.io.IOUtils;
29 import org.apache.log4j.LogManager;
30 import org.apache.log4j.Logger;
31 import org.onap.vid.changeManagement.RequestDetailsWrapper;
32 import org.onap.vid.controller.OperationalEnvironmentController;
33 import org.onap.vid.controller.OperationalEnvironmentController.OperationalEnvironmentManifest;
34 import org.onap.vid.mso.model.OperationalEnvironmentActivateInfo;
35 import org.onap.vid.mso.model.OperationalEnvironmentDeactivateInfo;
36 import org.onap.vid.mso.rest.OperationalEnvironment.OperationEnvironmentRequestDetails;
37 import org.onap.vid.mso.rest.RequestDetails;
38 import org.skyscreamer.jsonassert.JSONAssert;
39 import org.skyscreamer.jsonassert.JSONCompareMode;
40 import org.testng.annotations.DataProvider;
41 import org.testng.annotations.Test;
42
43 import java.io.IOException;
44 import java.net.URL;
45 import java.util.HashMap;
46 import java.util.LinkedList;
47 import java.util.List;
48 import java.util.Map;
49 import java.util.stream.Collectors;
50
51 public class MsoOperationalEnvironmentTest {
52
53     private MsoBusinessLogic msoBusinessLogic = new MsoBusinessLogicImpl(null,null);
54     private static final Logger logger = LogManager.getLogger(MsoOperationalEnvironmentTest.class);
55
56     @Test(dataProvider = "getOperationalEnvironmentActivationPermutations")
57     public void testJsonResultOfOperationalEnvironmentActivationRequestDetails(HashMap<String, String> permutation) throws IOException {
58
59         // Convert 'manifest' to model
60         final OperationalEnvironmentManifest manifest = new ObjectMapper().readerFor(OperationalEnvironmentManifest.class).readValue(permutation.get("<manifest>"));
61
62         // build OperationalEnvironmentActivateInfo
63         OperationalEnvironmentActivateInfo inputUnderTest = createOperationalEnvironmentActivateInfo("<instanceId>", permutation.get("<userId>"), manifest, permutation.get("<relatedInstanceId>"), permutation.get("<relatedInstanceName>"), permutation.get("<workloadContext>"));
64
65         // transform to RequestDetails, and serialize to json
66         //   -> actually, the function "msoBusinessLogic.createOperationalEnvironmentActivationRequestDetails"
67         //      is the code under test here
68         final RequestDetailsWrapper<RequestDetails> operationalEnvironmentActivationRequestDetails = msoBusinessLogic.createOperationalEnvironmentActivationRequestDetails(inputUnderTest);
69
70         String expected = buildExpectation("payload_jsons/activateOperationalEnvironmentsPayloadToMso.json", permutation);
71
72         assertThatExpectationIsLikeObject(expected, operationalEnvironmentActivationRequestDetails);
73     }
74
75     @DataProvider
76     private Object[][] getOperationalEnvironmentActivationPermutations() {
77         final String manifest = "" +
78                 "{" +
79                 "  \"serviceModelList\": [" +
80                 "    {" +
81                 "      \"serviceModelVersionId\": \"uuid2\"," +
82                 "      \"recoveryAction\": \"retry\"" +
83                 "    }" +
84                 "  ]" +
85                 "}";
86
87
88         final ImmutableListMultimap<String, String> options = ImmutableListMultimap.<String, String>builder()
89                 .putAll("<instanceId>", "instanceId")
90                 .putAll("<userId>", "1", "0198adb8-87fd-46ef-94ae-258816629c8b")
91                 .putAll("<relatedInstanceId>", "relatedInstanceId", "2744cf56-4f00-4e48-917b-c3bd3b1f8984")
92                 .putAll("<relatedInstanceName>", "relatedInstanceName", "Brooklynn Puanani")
93                 .putAll("<workloadContext>", "workloadContext", "VNF_E2E-extreme")
94                 .putAll("<manifest>", manifest)
95                 .build();
96
97         List<HashMap<String, String>> permutations = permuteOptions(options);
98
99         return permutations.stream().map(m -> new Object[] { m }).collect(Collectors.toList()).toArray(new Object[0][0]);
100     }
101
102     @Test(dataProvider = "getOperationalEnvironmentCreationPermutations")
103     public void testJsonResultOfOperationalEnvironmentCreationRequestDetails(HashMap<String, String> permutation) throws IOException {
104
105         // build OperationalEnvironmentCreateBody
106         OperationalEnvironmentController.OperationalEnvironmentCreateBody inputUnderTest = createOperationalEnvironmentCreateBody(permutation.get("<instanceName>"), permutation.get("<ecompInstanceId>"), permutation.get("<ecompInstanceName>"), permutation.get("<operationalEnvType>"), permutation.get("<tenantContext>"), permutation.get("<workloadContext>"));
107
108         // transform to RequestDetails, and serialize to json
109         //   -> actually, the function "msoBusinessLogic.createOperationalEnvironmentActivationRequestDetails"
110         //      is the code under test here
111         final RequestDetailsWrapper<OperationEnvironmentRequestDetails> operationalEnvironmentCreationRequestDetails = msoBusinessLogic.convertParametersToRequestDetails(inputUnderTest, permutation.get("<userId>"));
112
113         String expected = buildExpectation("payload_jsons/createOperationalEnvironmentsPayloadToMso.json", permutation);
114
115         assertThatExpectationIsLikeObject(expected, operationalEnvironmentCreationRequestDetails);
116     }
117
118     @DataProvider
119     private Object[][] getOperationalEnvironmentCreationPermutations() {
120
121         final ImmutableListMultimap<String, String> options = ImmutableListMultimap.<String, String>builder()
122                 // instanceName, ecompInstanceId, ecompInstanceName, operationalEnvType, tenantContext, workloadContext
123                 .putAll("<userId>", "1", "ceb60bba-7c18-49cd-a8f6-83ff2e1430b0", "Storm Landebert")
124                 .putAll("<instanceName>", "instanceName", "Slavica Hadrien")
125                 .putAll("<ecompInstanceId>", "ecompInstanceId", "58ec6753-957f-4124-8f92-c1c0bd2464a4")
126                 .putAll("<ecompInstanceName>", "ecompInstanceName", "Bente Keelin")
127                 .putAll("<operationalEnvType>", "operationalEnvType", "VNF")
128                 .putAll("<tenantContext>", "tenantContext", "Production")
129                 .putAll("<workloadContext>", "workloadContext", "E2E-extreme")
130                 .build();
131
132         List<HashMap<String, String>> permutations = permuteOptions(options);
133
134         return permutations.stream().map(m -> new Object[] { m }).collect(Collectors.toList()).toArray(new Object[0][0]);
135     }
136
137     @Test(dataProvider = "getOperationalEnvironmentDeactivationPermutations")
138     public void testJsonResultOfOperationalEnvironmentDeactivationRequestDetails(HashMap<String, String> permutation) throws IOException {
139
140         OperationalEnvironmentDeactivateInfo inputUnderTest = createOperationalEnvironmentDeactivateInfo("operationalEnvId>", permutation.get("<userId>"));
141
142         final RequestDetailsWrapper<RequestDetails> operationalEnvironmentDeactivationRequestDetails = msoBusinessLogic.createOperationalEnvironmentDeactivationRequestDetails(inputUnderTest);
143
144         String expected = buildExpectation("payload_jsons/deactivateOperationalEnvironmentsPayloadToMso.json", permutation);
145
146         assertThatExpectationIsLikeObject(expected, operationalEnvironmentDeactivationRequestDetails);
147     }
148
149     @DataProvider
150     private Object[][] getOperationalEnvironmentDeactivationPermutations() {
151
152         final ImmutableListMultimap<String, String> options = ImmutableListMultimap.<String, String>builder()
153                 .putAll("<userId>", "instanceName", "Slavica Hadrien")
154                 .build();
155
156         List<HashMap<String, String>> permutations = permuteOptions(options);
157
158         return permutations.stream().map(m -> new Object[] { m }).collect(Collectors.toList()).toArray(new Object[0][0]);
159     }
160
161     private List<HashMap<String, String>> permuteOptions(ImmutableListMultimap<String, String> options) {
162         // try any value, where the other keys are on the default one (index zero)
163         // result it's not the whole world of permutations, but rather a skim set, which its
164         // size is as the number of unique values in "options"
165
166         HashMap<String, String> baseMutation = new HashMap<>();
167         for (String key : options.keySet()) {
168             baseMutation.put(key, options.get(key).get(0));
169         }
170
171         List<HashMap<String, String>> res = new LinkedList<>();
172         res.add(baseMutation);
173
174         for (String key : options.keySet()) {
175             final ImmutableList<String> entry = options.get(key);
176             for (String value : entry.subList(1, entry.size())) { // skip the first option at index zero
177                 HashMap<String, String> mutation = new HashMap<>();
178                 mutation.putAll(baseMutation);
179                 mutation.put(key, value);
180                 res.add(mutation);
181             }
182         }
183         return res;
184     }
185
186     public static void assertThatExpectationIsLikeObject(String expected, Object requestDetails) throws JsonProcessingException {
187         final String requestDetailsAsString = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT).writeValueAsString(requestDetails);
188
189         // assert for exact match
190         try {
191             JSONAssert.assertEquals("built mso request is not ok", expected, requestDetailsAsString, JSONCompareMode.STRICT);
192         } catch (AssertionError | Exception e) {
193             logger.info("requestDetailsAsString: \n" + requestDetailsAsString);
194             logger.info("expected: \n" + expected);
195             throw e;
196         }
197     }
198
199     private String buildExpectation(String modelFileName, HashMap<String, String> permutation) throws IOException {
200         // load expected result, and populate it with current input 'permutation' values
201         final URL resource = this.getClass().getResource("/" + modelFileName);
202         String expected = IOUtils.toString(resource, "UTF-8");
203
204         for (Map.Entry<String, String> stringStringEntry : permutation.entrySet()) {
205             expected = expected.replaceAll(stringStringEntry.getKey(), stringStringEntry.getValue());
206         }
207         return expected;
208     }
209
210     private OperationalEnvironmentActivateInfo createOperationalEnvironmentActivateInfo(String operationalEnvId, String userId, OperationalEnvironmentManifest manifest, String relatedInstanceId, String relatedInstanceName, String workloadContext) {
211         OperationalEnvironmentController.OperationalEnvironmentActivateBody body = new OperationalEnvironmentController.OperationalEnvironmentActivateBody(relatedInstanceId, relatedInstanceName, workloadContext, manifest);
212         return new OperationalEnvironmentActivateInfo(body, userId, operationalEnvId);
213     }
214
215     private OperationalEnvironmentDeactivateInfo createOperationalEnvironmentDeactivateInfo(String operationalEnvId, String userId) {
216         return new OperationalEnvironmentDeactivateInfo(userId, operationalEnvId);
217     }
218
219     private OperationalEnvironmentController.OperationalEnvironmentCreateBody createOperationalEnvironmentCreateBody(String instanceName, String ecompInstanceId, String ecompInstanceName, String operationalEnvType, String tenantContext, String workloadContext) {
220         return new OperationalEnvironmentController.OperationalEnvironmentCreateBody(instanceName, ecompInstanceId, ecompInstanceName, operationalEnvType, tenantContext, workloadContext);
221     }
222 }