package org.onap.vid.mso; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableListMultimap; import org.apache.commons.io.IOUtils; import org.onap.vid.changeManagement.RequestDetailsWrapper; import org.onap.vid.controllers.OperationalEnvironmentController; import org.onap.vid.controllers.OperationalEnvironmentController.OperationalEnvironmentManifest; import org.onap.vid.mso.MsoBusinessLogic; import org.onap.vid.mso.MsoBusinessLogicImpl; import org.onap.vid.mso.model.OperationalEnvironmentActivateInfo; import org.onap.vid.mso.model.OperationalEnvironmentDeactivateInfo; import org.onap.vid.mso.rest.OperationalEnvironment.OperationEnvironmentRequestDetails; import org.onap.vid.mso.rest.RequestDetails; import org.skyscreamer.jsonassert.JSONAssert; import org.skyscreamer.jsonassert.JSONCompareMode; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import java.io.IOException; import java.net.URL; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Test public class MsoOperationalEnvironmentTest { private MsoBusinessLogic msoBusinessLogic = new MsoBusinessLogicImpl(null,null); @Test(dataProvider = "getOperationalEnvironmentActivationPermutations") public void testJsonResultOfOperationalEnvironmentActivationRequestDetails(HashMap permutation) throws IOException { // Convert 'manifest' to model final OperationalEnvironmentManifest manifest = new ObjectMapper().readerFor(OperationalEnvironmentManifest.class).readValue(permutation.get("")); // build OperationalEnvironmentActivateInfo OperationalEnvironmentActivateInfo inputUnderTest = createOperationalEnvironmentActivateInfo("", permutation.get(""), manifest, permutation.get(""), permutation.get(""), permutation.get("")); // transform to RequestDetails, and serialize to json // -> actually, the function "msoBusinessLogic.createOperationalEnvironmentActivationRequestDetails" // is the code under test here final RequestDetailsWrapper operationalEnvironmentActivationRequestDetails = msoBusinessLogic.createOperationalEnvironmentActivationRequestDetails(inputUnderTest); String expected = buildExpectation("payload_jsons/activateOperationalEnvironmentsPayloadToMso.json", permutation); assertThatExpectationIsLikeObject(expected, operationalEnvironmentActivationRequestDetails); } @DataProvider private Object[][] getOperationalEnvironmentActivationPermutations() { final String manifest = "" + "{" + " \"serviceModelList\": [" + " {" + " \"serviceModelVersionId\": \"uuid2\"," + " \"recoveryAction\": \"retry\"" + " }" + " ]" + "}"; final ImmutableListMultimap options = ImmutableListMultimap.builder() .putAll("", "instanceId") .putAll("", "1", "0198adb8-87fd-46ef-94ae-258816629c8b") .putAll("", "relatedInstanceId", "2744cf56-4f00-4e48-917b-c3bd3b1f8984") .putAll("", "relatedInstanceName", "Brooklynn Puanani") .putAll("", "workloadContext", "VNF_E2E-extreme") .putAll("", manifest) .build(); List> permutations = permuteOptions(options); return permutations.stream().map(m -> new Object[] { m }).collect(Collectors.toList()).toArray(new Object[0][0]); } @Test(dataProvider = "getOperationalEnvironmentCreationPermutations") public void testJsonResultOfOperationalEnvironmentCreationRequestDetails(HashMap permutation) throws IOException { // build OperationalEnvironmentCreateBody OperationalEnvironmentController.OperationalEnvironmentCreateBody inputUnderTest = createOperationalEnvironmentCreateBody(permutation.get(""), permutation.get(""), permutation.get(""), permutation.get(""), permutation.get(""), permutation.get("")); // transform to RequestDetails, and serialize to json // -> actually, the function "msoBusinessLogic.createOperationalEnvironmentActivationRequestDetails" // is the code under test here final RequestDetailsWrapper operationalEnvironmentCreationRequestDetails = msoBusinessLogic.convertParametersToRequestDetails(inputUnderTest, permutation.get("")); String expected = buildExpectation("payload_jsons/createOperationalEnvironmentsPayloadToMso.json", permutation); assertThatExpectationIsLikeObject(expected, operationalEnvironmentCreationRequestDetails); } @DataProvider private Object[][] getOperationalEnvironmentCreationPermutations() { final ImmutableListMultimap options = ImmutableListMultimap.builder() // instanceName, ecompInstanceId, ecompInstanceName, operationalEnvType, tenantContext, workloadContext .putAll("", "1", "ceb60bba-7c18-49cd-a8f6-83ff2e1430b0", "Storm Landebert") .putAll("", "instanceName", "Slavica Hadrien") .putAll("", "ecompInstanceId", "58ec6753-957f-4124-8f92-c1c0bd2464a4") .putAll("", "ecompInstanceName", "Bente Keelin") .putAll("", "operationalEnvType", "VNF") .putAll("", "tenantContext", "Production") .putAll("", "workloadContext", "E2E-extreme") .build(); List> permutations = permuteOptions(options); return permutations.stream().map(m -> new Object[] { m }).collect(Collectors.toList()).toArray(new Object[0][0]); } @Test(dataProvider = "getOperationalEnvironmentDeactivationPermutations") public void testJsonResultOfOperationalEnvironmentDeactivationRequestDetails(HashMap permutation) throws IOException { OperationalEnvironmentDeactivateInfo inputUnderTest = createOperationalEnvironmentDeactivateInfo("operationalEnvId>", permutation.get("")); final RequestDetailsWrapper operationalEnvironmentDeactivationRequestDetails = msoBusinessLogic.createOperationalEnvironmentDeactivationRequestDetails(inputUnderTest); String expected = buildExpectation("payload_jsons/deactivateOperationalEnvironmentsPayloadToMso.json", permutation); assertThatExpectationIsLikeObject(expected, operationalEnvironmentDeactivationRequestDetails); } @DataProvider private Object[][] getOperationalEnvironmentDeactivationPermutations() { final ImmutableListMultimap options = ImmutableListMultimap.builder() .putAll("", "instanceName", "Slavica Hadrien") .build(); List> permutations = permuteOptions(options); return permutations.stream().map(m -> new Object[] { m }).collect(Collectors.toList()).toArray(new Object[0][0]); } private List> permuteOptions(ImmutableListMultimap options) { // try any value, where the other keys are on the default one (index zero) // result it's not the whole world of permutations, but rather a skim set, which its // size is as the number of unique values in "options" HashMap baseMutation = new HashMap<>(); for (String key : options.keySet()) { baseMutation.put(key, options.get(key).get(0)); } List> res = new LinkedList<>(); res.add(baseMutation); for (String key : options.keySet()) { final ImmutableList entry = options.get(key); for (String value : entry.subList(1, entry.size())) { // skip the first option at index zero HashMap mutation = new HashMap<>(); mutation.putAll(baseMutation); mutation.put(key, value); res.add(mutation); } } return res; } public static void assertThatExpectationIsLikeObject(String expected, Object requestDetails) throws JsonProcessingException { final String requestDetailsAsString = new ObjectMapper().enable(SerializationFeature.INDENT_OUTPUT).writeValueAsString(requestDetails); // assert for exact match try { JSONAssert.assertEquals("built mso request is not ok", expected, requestDetailsAsString, JSONCompareMode.STRICT); } catch (AssertionError | Exception e) { System.out.println("requestDetailsAsString: \n" + requestDetailsAsString); System.out.println("expected: \n" + expected); throw e; } } private String buildExpectation(String modelFileName, HashMap permutation) throws IOException { // load expected result, and populate it with current input 'permutation' values final URL resource = this.getClass().getResource("/" + modelFileName); String expected = IOUtils.toString(resource, "UTF-8"); for (Map.Entry stringStringEntry : permutation.entrySet()) { expected = expected.replaceAll(stringStringEntry.getKey(), stringStringEntry.getValue()); } return expected; } private OperationalEnvironmentActivateInfo createOperationalEnvironmentActivateInfo(String operationalEnvId, String userId, OperationalEnvironmentManifest manifest, String relatedInstanceId, String relatedInstanceName, String workloadContext) { OperationalEnvironmentController.OperationalEnvironmentActivateBody body = new OperationalEnvironmentController.OperationalEnvironmentActivateBody(relatedInstanceId, relatedInstanceName, workloadContext, manifest); return new OperationalEnvironmentActivateInfo(body, userId, operationalEnvId); } private OperationalEnvironmentDeactivateInfo createOperationalEnvironmentDeactivateInfo(String operationalEnvId, String userId) { return new OperationalEnvironmentDeactivateInfo(userId, operationalEnvId); } private OperationalEnvironmentController.OperationalEnvironmentCreateBody createOperationalEnvironmentCreateBody(String instanceName, String ecompInstanceId, String ecompInstanceName, String operationalEnvType, String tenantContext, String workloadContext) { return new OperationalEnvironmentController.OperationalEnvironmentCreateBody(instanceName, ecompInstanceId, ecompInstanceName, operationalEnvType, tenantContext, workloadContext); } }