aboutsummaryrefslogtreecommitdiffstats
path: root/vid-app-common/src/test/java/org/onap/vid/services
diff options
context:
space:
mode:
Diffstat (limited to 'vid-app-common/src/test/java/org/onap/vid/services')
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/services/AAIServiceTreeTest.java160
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/services/AAITreeConverterTest.java222
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/services/AAITreeNodeBuilderTest.java131
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/services/AaiResponseTranslatorTest.java5
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/services/AsyncInstantiationBaseTest.java220
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/services/AsyncInstantiationBusinessLogicTest.java877
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/services/AuditServiceImplTest.java36
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/services/BulkInstantiationServiceImplTest.java36
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/services/ChangeManagementServiceImplTest.java20
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/services/ChangeManagementServiceTest.java29
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/services/ChangeManagementServiceUnitTest.java9
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/services/CloudOwnerServiceTest.java125
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/services/CsvServiceTest.java162
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/services/JobsBrokerServiceTest.java1287
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/services/PortDetailsTranslatorTest.java261
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/services/SchedulerServiceImplTest.java179
16 files changed, 2619 insertions, 1140 deletions
diff --git a/vid-app-common/src/test/java/org/onap/vid/services/AAIServiceTreeTest.java b/vid-app-common/src/test/java/org/onap/vid/services/AAIServiceTreeTest.java
new file mode 100644
index 000000000..815c6b9ee
--- /dev/null
+++ b/vid-app-common/src/test/java/org/onap/vid/services/AAIServiceTreeTest.java
@@ -0,0 +1,160 @@
+package org.onap.vid.services;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Streams;
+import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import org.jetbrains.annotations.NotNull;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.onap.vid.asdc.parser.ServiceModelInflator;
+import org.onap.vid.asdc.parser.ServiceModelInflator.Names;
+import org.onap.vid.model.aaiTree.AAITreeNode;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+import java.util.List;
+
+import static java.util.Collections.emptyList;
+import static java.util.Collections.emptyMap;
+import static java.util.stream.Collectors.toList;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.when;
+
+public class AAIServiceTreeTest {
+
+ @Mock
+ private VidService sdcService;
+ @Mock
+ private ServiceModelInflator serviceModelInflator;
+ @InjectMocks
+ private AAIServiceTree aaiServiceTree;
+
+ @BeforeTest
+ public void initMocks() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ private final static String nullString = "null placeholder";
+
+
+
+ @Test
+ public void enrichNodesWithModelCustomizationName_simple3NodesCase_nodesEnriched() {
+
+ when(serviceModelInflator.toNamesByVersionId(any())).thenReturn(ImmutableMap.of(
+ "version id a", new Names("name a", "key a"),
+ "version id b", new Names("name b", "key b"),
+ "version id c", new Names("name c", "key c")
+ ));
+
+ final ImmutableList<String> versionIds = ImmutableList.of("version id a", "version id b", "version id c");
+ final ImmutableList<Names> expectedNames = ImmutableList.of(
+ new Names("name a", "key a"),
+ new Names("name b", "key b"),
+ new Names("name c", "key c"));
+
+
+ final List<AAITreeNode> nodesUnderTest = nodesWithVersionIds(versionIds);
+ aaiServiceTree.enrichNodesWithModelCustomizationName(nodesUnderTest, null);
+
+ assertThat(toStrings(nodesUnderTest), containsInAnyOrder(toStringsArray(nodesWithVersionIdsAndCustomizationNames(versionIds, expectedNames))));
+ }
+
+ @Test
+ public void enrichNodesWithModelCustomizationName_noNodes_noError() {
+
+ when(serviceModelInflator.toNamesByVersionId(any())).thenReturn(ImmutableMap.of(
+ "11c6dc3e-cd6a-41b3-a50e-b5a10f7157d0", new Names("my model cust name", "my key")
+ ));
+
+ aaiServiceTree.enrichNodesWithModelCustomizationName(emptyList(), null);
+ }
+
+ @Test
+ public void enrichNodesWithModelCustomizationName_nothingInModel_nodesUnchanged() {
+
+ when(serviceModelInflator.toNamesByVersionId(any())).thenReturn(emptyMap());
+
+ final ImmutableList<String> versionIds = ImmutableList.of("version id a", "version id b", "version id c");
+ final Names nullNames = new Names(nullString, nullString);
+ final ImmutableList<Names> expectedNames = ImmutableList.of(nullNames, nullNames, nullNames);
+
+
+ final List<AAITreeNode> nodesUnderTest = nodesWithVersionIds(versionIds);
+
+ aaiServiceTree.enrichNodesWithModelCustomizationName(nodesUnderTest, null);
+
+ assertThat(toStrings(nodesUnderTest), containsInAnyOrder(toStringsArray(nodesWithVersionIdsAndCustomizationNames(versionIds, expectedNames))));
+ }
+
+ @Test
+ public void enrichNodesWithModelCustomizationName_staggered4NodesAndNull_3nodesEnriched2isNull() {
+
+ when(serviceModelInflator.toNamesByVersionId(any())).thenReturn(ImmutableMap.of(
+ "version id Z", new Names("name Z", "key Z"),
+ "version id d", new Names(null, "key d"),
+ "version id c", new Names("name c", null),
+ "version id a", new Names("name a", "key a")
+ ));
+
+ final ImmutableList<String> versionIds = ImmutableList.of("version id a", "version id b", "version id c", "version id d", nullString);
+ final ImmutableList<Names> expectedNames = ImmutableList.of(
+ new Names("name a", "key a"),
+ new Names(nullString, nullString),
+ new Names("name c", nullString),
+ new Names(nullString, "key d"),
+ new Names(nullString, nullString)
+ );
+
+
+ final List<AAITreeNode> nodesUnderTest = nodesWithVersionIds(versionIds);
+
+ aaiServiceTree.enrichNodesWithModelCustomizationName(nodesUnderTest, null);
+
+ assertThat(toStrings(nodesUnderTest), containsInAnyOrder(toStringsArray(nodesWithVersionIdsAndCustomizationNames(versionIds, expectedNames))));
+ }
+
+
+
+ @NotNull
+ private String[] toStringsArray(List<AAITreeNode> nodes) {
+ return toStrings(nodes).toArray(new String[] {});
+ }
+
+ @NotNull
+ private List<String> toStrings(List<AAITreeNode> nodes) {
+ return nodes.stream().map(n -> {
+ final ReflectionToStringBuilder reflectionToStringBuilder = new ReflectionToStringBuilder(n, ToStringStyle.SHORT_PREFIX_STYLE);
+ reflectionToStringBuilder.setExcludeNullValues(true);
+ return reflectionToStringBuilder.toString();
+ }).collect(toList());
+ }
+
+ @NotNull
+ private List<AAITreeNode> nodesWithVersionIdsAndCustomizationNames(List<String> versionIds, List<Names> customizationNames) {
+ return Streams
+ .zip(versionIds.stream(), customizationNames.stream(), this::nodeWithVersionIdAndCustomizationName)
+ .collect(toList());
+ }
+
+ @NotNull
+ private List<AAITreeNode> nodesWithVersionIds(List<String> versionIds) {
+ return versionIds.stream()
+ .map(versionId -> nodeWithVersionIdAndCustomizationName(versionId, new Names(nullString, nullString)))
+ .collect(toList());
+ }
+
+ private AAITreeNode nodeWithVersionIdAndCustomizationName(String versionId, Names names) {
+ AAITreeNode newNode = new AAITreeNode();
+ newNode.setModelVersionId(versionId.equals(nullString) ? null : versionId);
+ newNode.setModelCustomizationName(names.getModelCustomizationName().equals(nullString) ? null : names.getModelCustomizationName());
+ newNode.setKeyInModel(names.getModelKey().equals(nullString) ? null : names.getModelKey());
+ return newNode;
+ }
+
+} \ No newline at end of file
diff --git a/vid-app-common/src/test/java/org/onap/vid/services/AAITreeConverterTest.java b/vid-app-common/src/test/java/org/onap/vid/services/AAITreeConverterTest.java
new file mode 100644
index 000000000..0fac65e4f
--- /dev/null
+++ b/vid-app-common/src/test/java/org/onap/vid/services/AAITreeConverterTest.java
@@ -0,0 +1,222 @@
+package org.opencomp.vid.services;
+
+import com.google.common.collect.ImmutableList;
+import org.mockito.InjectMocks;
+import org.mockito.MockitoAnnotations;
+import org.onap.vid.aai.util.AAITreeConverter;
+import org.onap.vid.model.Action;
+import org.onap.vid.model.aaiTree.*;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import java.util.List;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.*;
+import static org.onap.vid.asdc.parser.ToscaParserImpl2.Constants.A_LA_CARTE;
+
+public class AAITreeConverterTest {
+
+ @InjectMocks
+ private AAITreeConverter aaiTreeConverter;
+
+ @BeforeTest
+ public void initMocks() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @Test
+ public void testConvertTreeToUIModel_NoChildren() throws Exception {
+
+ AAITreeNode aaiTree = generateAaiTreeToConvert(0, 0);
+
+ ServiceInstance result = aaiTreeConverter.convertTreeToUIModel(aaiTree, "global-customer-id", "service-type", A_LA_CARTE);
+
+ assertService(result, 0, 0, true);
+ }
+
+ @Test
+ public void testConvertTreeToUIModel_MultipleChildren() throws Exception {
+
+ AAITreeNode aaiTree = generateAaiTreeToConvert(2, 2);
+
+ ServiceInstance serviceInstance = aaiTreeConverter.convertTreeToUIModel(aaiTree, "global-customer-id", "service-type", null);
+
+ assertService(serviceInstance, 2, 2, false);
+
+ int nodesCounter = 0;
+ assertThat(serviceInstance.getVnfs().entrySet(), hasSize(2));
+ assertVnf(serviceInstance.getVnfs().get("vnf-model-version-id:00"+(nodesCounter++)), 0, 0, false);
+ assertVnf(serviceInstance.getVnfs().get("vnf-model-version-id:00"+(nodesCounter++)), 0, 0, false);
+
+ assertThat(serviceInstance.getNetworks().entrySet(), hasSize(2));
+ assertNetwork(serviceInstance.getNetworks().get("network-model-version-id:00"+(nodesCounter++)), false);
+ assertNetwork(serviceInstance.getNetworks().get("network-model-version-id:00"+(nodesCounter)), false);
+ }
+
+ @DataProvider
+ public static Object[][] vnfWithChildren() {
+ return new Object[][]{
+ {ImmutableList.of(), ImmutableList.of()},
+ {ImmutableList.of(true, false), ImmutableList.of()},
+ {ImmutableList.of(), ImmutableList.of(false)}
+ };
+ }
+
+ @Test(dataProvider = "vnfWithChildren")
+ public void testComplexVnfConversion(List<Boolean> vfModules, List<Boolean> networks) {
+
+ AAITreeNode vnfTreeNode = createVnf(1, false);
+ int nodesCounter = 0;
+
+ for (Boolean customizationName: vfModules) {
+ vnfTreeNode.getChildren().add(createVfModule(nodesCounter++, customizationName));
+ }
+
+ for (Boolean customizationName: networks) {
+ vnfTreeNode.getChildren().add(createNetwork(nodesCounter++, customizationName));
+ }
+
+ Vnf actualVnf = Vnf.from(vnfTreeNode);
+
+ assertVnf(actualVnf, vfModules.size(), networks.size(), false);
+
+ nodesCounter = 0;
+ for (Boolean customizationName: vfModules) {
+ String key = customizationName ? "vfModule key in model" : "vfModule-model-version-id";
+
+ assertThat(actualVnf.getVfModules(), hasKey(key));
+ assertThat(actualVnf.getVfModules().get(key), hasKey(key + ":00" + nodesCounter));
+ VfModule actualVfModule = actualVnf.getVfModules().get(key).get(key + ":00" + nodesCounter);
+ assertVfModule(actualVfModule, customizationName);
+ nodesCounter++;
+ }
+
+ for (Boolean customizationName: networks) {
+ String key = customizationName ? "network key in model" : "network-model-version-id";
+
+ assertThat(actualVnf.getNetworks(), hasKey(key + ":00" + nodesCounter));
+ Network actualNetwork = actualVnf.getNetworks().get(key + ":00" + nodesCounter);
+ assertNetwork(actualNetwork, customizationName);
+ nodesCounter++;
+ }
+ }
+
+ @Test
+ public void testNetworkConversion() {
+ AAITreeNode networkTreeNode = createNetwork(1, true);
+
+ Network actualNetwork = Network.from(networkTreeNode);
+
+ assertNetwork(actualNetwork, true);
+ }
+
+ private AAITreeNode createVnf(int uniqueNumber, boolean hasCustomizationName) {
+ AAITreeNode vnfTreeNode = new AAITreeNode();
+ vnfTreeNode.setId("vnf-instance-id");
+ vnfTreeNode.setName("vnf-instance-name");
+ vnfTreeNode.setType("generic-vnf");
+ vnfTreeNode.setModelVersionId("vnf-model-version-id");
+ if (hasCustomizationName) {
+ vnfTreeNode.setModelCustomizationName("vnf model customization name");
+ vnfTreeNode.setKeyInModel("vnf key in model");
+ }
+ vnfTreeNode.setUniqueNumber(uniqueNumber);
+ return vnfTreeNode;
+ }
+
+ private AAITreeNode createVfModule(int uniqueNumber, boolean hasCustomizationName) {
+ AAITreeNode vfModuleTreeNode = new AAITreeNode();
+ vfModuleTreeNode.setId("vfModule-instance-id");
+ vfModuleTreeNode.setName("vfModule-instance-name");
+ vfModuleTreeNode.setType("vf-module");
+ vfModuleTreeNode.setModelVersionId("vfModule-model-version-id");
+ if (hasCustomizationName) {
+ vfModuleTreeNode.setModelCustomizationName("vfModule model customization name");
+ vfModuleTreeNode.setKeyInModel("vfModule key in model");
+ }
+ vfModuleTreeNode.setUniqueNumber(uniqueNumber);
+
+ return vfModuleTreeNode;
+ }
+
+ private AAITreeNode createNetwork(int uniqueNumber, boolean hasCustomizationName) {
+ AAITreeNode networkTreeNode = new AAITreeNode();
+ networkTreeNode.setId("network-instance-id");
+ networkTreeNode.setName("network-instance-name");
+ networkTreeNode.setType("l3-network");
+ networkTreeNode.setModelVersionId("network-model-version-id");
+ if (hasCustomizationName) {
+ networkTreeNode.setModelCustomizationName("network model customization name");
+ networkTreeNode.setKeyInModel("network key in model");
+ }
+ networkTreeNode.setUniqueNumber(uniqueNumber);
+
+ return networkTreeNode;
+ }
+
+ private void assertService(ServiceInstance serviceInstance, int expectedVnfs, int expectedNetworks, boolean isALaCarte) {
+ assertThat(serviceInstance.getInstanceId(), is("service-instance-id"));
+ assertThat(serviceInstance.getInstanceName(), is("service-instance-name"));
+ assertThat(serviceInstance.getAction(), is(Action.None));
+ assertThat(serviceInstance.getGlobalSubscriberId(), is("global-customer-id"));
+ assertThat(serviceInstance.getSubscriptionServiceType(), is("service-type"));
+ assertThat(serviceInstance.getModelInfo().getModelType(), is("service"));
+ assertThat(serviceInstance.getVnfs().entrySet(), hasSize(expectedVnfs));
+ assertThat(serviceInstance.getNetworks().entrySet(), hasSize(expectedNetworks));
+ assertThat(serviceInstance.getIsALaCarte(), is(isALaCarte));
+ }
+
+ private void assertVnf(Vnf actualVnf, int expectedVfModules, int expectedNetworks, boolean hasCustomizationName) {
+ assertThat(actualVnf.getInstanceId(), is("vnf-instance-id"));
+ assertThat(actualVnf.getInstanceName(), is("vnf-instance-name"));
+ assertThat(actualVnf.getAction(), is(Action.None));
+ assertThat(actualVnf.getModelInfo().getModelType(), is("vnf"));
+ assertThat(actualVnf.getModelInfo().getModelVersionId(), is("vnf-model-version-id"));
+ assertThat(actualVnf.getVfModules().entrySet(), hasSize(expectedVfModules));
+ assertThat(actualVnf.getNetworks().entrySet(), hasSize(expectedNetworks));
+ assertThat(actualVnf.getTrackById(), is(not(emptyOrNullString())));
+ String expectedCustomizationName = hasCustomizationName ? "vnf model customization name" : null;
+ assertThat(actualVnf.getModelInfo().getModelCustomizationName(), is(expectedCustomizationName));
+ }
+
+ private void assertVfModule(VfModule actualVfModule, boolean hasCustomizationName) {
+ assertThat(actualVfModule.getInstanceId(), is("vfModule-instance-id"));
+ assertThat(actualVfModule.getInstanceName(), is("vfModule-instance-name"));
+ assertThat(actualVfModule.getAction(), is(Action.None));
+ assertThat(actualVfModule.getModelInfo().getModelType(), is("vfModule"));
+ assertThat(actualVfModule.getModelInfo().getModelVersionId(), is("vfModule-model-version-id"));
+ assertThat(actualVfModule.getTrackById(), is(not(emptyOrNullString())));
+ String expectedCustomizationName = hasCustomizationName ? "vfModule model customization name" : null;
+ assertThat(actualVfModule.getModelInfo().getModelCustomizationName(), is(expectedCustomizationName));
+ }
+
+ private void assertNetwork(Network actualNetwork, boolean hasCustomizationName) {
+ assertThat(actualNetwork.getInstanceId(), is("network-instance-id"));
+ assertThat(actualNetwork.getInstanceName(), is("network-instance-name"));
+ assertThat(actualNetwork.getAction(), is(Action.None));
+ assertThat(actualNetwork.getModelInfo().getModelType(), is("network"));
+ assertThat(actualNetwork.getModelInfo().getModelVersionId(), is("network-model-version-id"));
+ assertThat(actualNetwork.getTrackById(), is(not(emptyOrNullString())));
+ String expectedCustomizationName = hasCustomizationName ? "network model customization name" : null;
+ assertThat(actualNetwork.getModelInfo().getModelCustomizationName(), is(expectedCustomizationName));
+ }
+
+ private AAITreeNode generateAaiTreeToConvert(int numberOfVnfs, int numberOfNetworks) {
+ int counter = 0;
+ AAITreeNode aaiTree = new AAITreeNode();
+ aaiTree.setId("service-instance-id");
+ aaiTree.setName("service-instance-name");
+
+ for (int i = 0; i < numberOfVnfs; i++) {
+ aaiTree.getChildren().add(createVnf(counter++, false));
+ }
+
+ for (int i = 0; i < numberOfNetworks; i++) {
+ aaiTree.getChildren().add(createNetwork(counter++, false));
+ }
+
+ return aaiTree;
+ }
+} \ No newline at end of file
diff --git a/vid-app-common/src/test/java/org/onap/vid/services/AAITreeNodeBuilderTest.java b/vid-app-common/src/test/java/org/onap/vid/services/AAITreeNodeBuilderTest.java
new file mode 100644
index 000000000..5eac5f924
--- /dev/null
+++ b/vid-app-common/src/test/java/org/onap/vid/services/AAITreeNodeBuilderTest.java
@@ -0,0 +1,131 @@
+package org.onap.vid.services;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.onap.vid.aai.AaiClientInterface;
+import org.onap.vid.model.aaiTree.AAITreeNode;
+import org.onap.vid.utils.Unchecked;
+import org.testng.Assert;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.ConcurrentSkipListSet;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import static java.util.Comparator.comparing;
+import static org.mockito.Mockito.when;
+import static org.onap.vid.services.AAIServiceTree.AAI_TREE_PATHS;
+
+public class AAITreeNodeBuilderTest {
+
+ AAITreeNodeBuilder aaiTreeNodeBuilder;
+
+ @Mock
+ AaiClientInterface aaiClientMock;
+
+ @Mock
+ ThreadPoolExecutor threadPoolMock;
+
+
+ @BeforeTest
+ public void initMocks() {
+ MockitoAnnotations.initMocks(this);
+ aaiTreeNodeBuilder = new AAITreeNodeBuilder(aaiClientMock);
+ }
+
+ @Test
+ public void buildNode_buildGroupNode_NodeIsAsExpected(){
+ ConcurrentSkipListSet<AAITreeNode> nodesAccumulator = new ConcurrentSkipListSet<>(comparing(AAITreeNode::getUniqueNodeKey));
+ ConcurrentLinkedQueue<String> visitedNodes = new ConcurrentLinkedQueue<>();
+ when(aaiClientMock.typedAaiGet(Unchecked.toURI("anyUrl"), JsonNode.class)).thenReturn(createGroupJson());
+
+ AAITreeNode groupNode = aaiTreeNodeBuilder.buildNode("instance-group",
+ "anyUrl",
+ nodesAccumulator,
+ threadPoolMock,
+ visitedNodes,
+ new AtomicInteger(0),
+ AAI_TREE_PATHS).get(0);
+
+ AAITreeNode expectedGroupNode = createExpectedGroupNode();
+ assertNodeIsAsExpected(expectedGroupNode,groupNode);
+ }
+
+ private void assertNodeIsAsExpected(AAITreeNode expectedGroupNode, AAITreeNode groupNode) {
+ Assert.assertEquals(groupNode.getId(), expectedGroupNode.getId());
+ Assert.assertEquals(groupNode.getType(), expectedGroupNode.getType());
+ Assert.assertEquals(groupNode.getName(), expectedGroupNode.getName());
+ Assert.assertEquals(groupNode.getModelVersionId(), expectedGroupNode.getModelVersionId());
+ Assert.assertEquals(groupNode.getModelInvariantId(), expectedGroupNode.getModelInvariantId());
+ Assert.assertEquals(groupNode.getInMaint(), expectedGroupNode.getInMaint());
+ Assert.assertEquals(groupNode.getAdditionalProperties(), expectedGroupNode.getAdditionalProperties());
+ }
+
+ private AAITreeNode createExpectedGroupNode() {
+ AAITreeNode expectedNode = new AAITreeNode();
+ expectedNode.setId("c4fcf022-31a0-470a-b5b8-c18335b7af32");
+ expectedNode.setType("instance-group");
+ expectedNode.setName("Test vE-Flex");
+ expectedNode.setModelVersionId("Test vE-Flex");
+ expectedNode.setModelInvariantId("dd182d7d-6949-4b90-b3cc-5befe400742e");
+ expectedNode.setInMaint(false);
+ HashMap<String,Object> additionalProperties = new HashMap<>();
+ additionalProperties.put("inMaint","false");
+ additionalProperties.put("description","Test vE-Flex instance-group");
+ additionalProperties.put("instance-group-type","ha");
+ additionalProperties.put("instance-group-role","test-IG-role");
+ additionalProperties.put("resource-version","1533315433086");
+ additionalProperties.put("instance-group-function","vTSBC Customer Landing Network Collection");
+ expectedNode.setAdditionalProperties(additionalProperties);
+
+
+ return expectedNode;
+ }
+
+ private JsonNode createGroupJson() {
+ ObjectMapper objectMapper = new ObjectMapper();
+ JsonNode groupNode = null;
+ try {
+ groupNode = objectMapper.readTree("" +
+ "{" +
+ " \"id\": \"c4fcf022-31a0-470a-b5b8-c18335b7af32\"," +
+ " \"instance-group-role\": \"test-IG-role\"," +
+ " \"description\": \"Test vE-Flex instance-group\"," +
+ " \"instance-group-type\": \"ha\"," +
+ " \"resource-version\": \"1533315433086\"," +
+ " \"instance-group-name\": \"Test vE-Flex\"," +
+ " \"model-invariant-id\": \"dd182d7d-6949-4b90-b3cc-5befe400742e\"," +
+ " \"model-version-id\": \"Test vE-Flex\"," +
+ " \"inMaint\": \"false\"," +
+ " \"instance-group-function\": \"vTSBC Customer Landing Network Collection\"," +
+ " \"relationship-list\": {" +
+ " \"relationship\": [{" +
+ " \"related-to\": \"generic-vnf\"," +
+ " \"relationship-label\": \"org.onap.relationships.inventory.MemberOf\" ," +
+ " \"related-link\": \"/aai/v14/network/generic-vnfs/generic-vnf/8c54c369-2876-4423-9b33-80f783f29082\" ," +
+ " \"relationship-data\": [{" +
+ " \"relationship-key\": \"generic-vnf.vnf-id\"," +
+ " \"relationship-value\": \"8c54c369-2876-4423-9b33-80f783f29082\"" +
+ " }" +
+ " ]," +
+ " \"related-to-property\": [{" +
+ " \"property-key\": \"generic-vnf.vnf-name\"," +
+ " \"property-value\": \"zrdm5bffad01\"" +
+ " }" +
+ " ]" +
+ " }" +
+ " ]" +
+ " }" +
+ " }");
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return groupNode;
+ }
+}
diff --git a/vid-app-common/src/test/java/org/onap/vid/services/AaiResponseTranslatorTest.java b/vid-app-common/src/test/java/org/onap/vid/services/AaiResponseTranslatorTest.java
index 04890e339..841ea10ac 100644
--- a/vid-app-common/src/test/java/org/onap/vid/services/AaiResponseTranslatorTest.java
+++ b/vid-app-common/src/test/java/org/onap/vid/services/AaiResponseTranslatorTest.java
@@ -1,7 +1,7 @@
package org.onap.vid.services;
-import org.codehaus.jackson.JsonNode;
-import org.codehaus.jackson.map.ObjectMapper;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
import org.onap.vid.aai.AaiResponseTranslator;
import org.onap.vid.aai.AaiResponseTranslator.PortMirroringConfigData;
import org.onap.vid.aai.AaiResponseTranslator.PortMirroringConfigDataError;
@@ -13,7 +13,6 @@ import java.io.IOException;
import static org.hamcrest.CoreMatchers.*;
import static org.hamcrest.MatcherAssert.assertThat;
-@Test
public class AaiResponseTranslatorTest {
private static final ObjectMapper objectMapper = new ObjectMapper();
diff --git a/vid-app-common/src/test/java/org/onap/vid/services/AsyncInstantiationBaseTest.java b/vid-app-common/src/test/java/org/onap/vid/services/AsyncInstantiationBaseTest.java
index 5ead3fce4..ed8d91fe6 100644
--- a/vid-app-common/src/test/java/org/onap/vid/services/AsyncInstantiationBaseTest.java
+++ b/vid-app-common/src/test/java/org/onap/vid/services/AsyncInstantiationBaseTest.java
@@ -1,52 +1,25 @@
-/*-
- * ============LICENSE_START=======================================================
- * VID
- * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
- * Modifications Copyright (C) 2018 Nokia. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
package org.onap.vid.services;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
-import io.joshworks.restclient.http.HttpResponse;
-import jersey.repackaged.com.google.common.collect.ImmutableList;
-import org.apache.http.HttpStatus;
-import org.apache.http.HttpVersion;
-import org.apache.http.entity.StringEntity;
-import org.apache.http.impl.DefaultHttpResponseFactory;
-import org.apache.http.message.BasicStatusLine;
-import org.onap.vid.aai.AaiOverTLSClientInterface;
-import org.onap.vid.aai.AaiResponse;
-import org.onap.vid.aai.model.AaiNodeQueryResponse;
-import org.onap.vid.aai.model.ResourceType;
-import org.onap.vid.domain.mso.ModelInfo;
-import org.onap.vid.domain.mso.RequestStatus;
-import org.onap.vid.model.serviceInstantiation.ServiceInstantiation;
-import org.onap.vid.model.serviceInstantiation.VfModule;
-import org.onap.vid.model.serviceInstantiation.Vnf;
+import org.onap.vid.aai.AaiClientInterface;
+import org.onap.vid.aai.ExceptionWithRequestInfo;
+import org.onap.vid.model.Action;
+import org.onap.vid.model.serviceInstantiation.*;
import org.onap.vid.mso.RestObject;
+import org.onap.vid.mso.model.ModelInfo;
import org.onap.vid.mso.rest.AsyncRequestStatus;
+import org.onap.vid.mso.rest.RequestStatus;
+import org.onap.vid.utils.TimeUtils;
+import org.springframework.http.HttpMethod;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.togglz.core.manager.FeatureManager;
import javax.inject.Inject;
-import java.io.UnsupportedEncodingException;
+import java.time.ZonedDateTime;
import java.util.*;
+import static java.util.Collections.emptyMap;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
@@ -65,6 +38,14 @@ public class AsyncInstantiationBaseTest extends AbstractTestNGSpringContextTests
public static final String TENANT_NAME = "USP-SIP-IC-24335-T-01";
public static final String AIC_ZONE_ID = "NFT1";
public static final String AIC_ZONE_NAME = "NFTJSSSS-NFT1";
+ public static final String TEST_API = "GR_API";
+ public static final String SERVICE_MODEL_VERSION_ID = "3c40d244-808e-42ca-b09a-256d83d19d0a";
+ public static final String VF_MODULE_0_MODEL_CUSTOMIZATION_NAME = "a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f";
+ public static final String VF_MODULE_1_MODEL_CUSTOMIZATION_NAME = "72d9d1cd-f46d-447a-abdb-451d6fb05fa8";
+ public static final String VF_MODULE_0_MODEL_VERSION_ID = "4c75f813-fa91-45a4-89d0-790ff5f1ae79";
+ public static final String VF_MODULE_1_MODEL_VERSION_ID = "56e2b103-637c-4d1a-adc8-3a7f4a6c3240";
+ public static final String VNF_NAME = "vmxnjr001";
+ public static final String VNF_GROUP_NAME = "VNF_GROUP_NAME";
protected HashMap<String, String> instanceParamsMapWithoutParams;
protected HashMap<String, String> vfModuleInstanceParamsMapWithParamsToRemove;
@@ -74,34 +55,53 @@ public class AsyncInstantiationBaseTest extends AbstractTestNGSpringContextTests
protected FeatureManager featureManager;
@Inject
- protected AaiOverTLSClientInterface aaiClient;
+ protected AaiClientInterface aaiClient;
+
+ @Inject
+ protected CloudOwnerService cloudOwnerService;
+
+ public ServiceInstantiation generateMockMacroServiceInstantiationPayload(boolean isPause, Map<String, Vnf> vnfs, int bulkSize, boolean isUserProvidedNaming, String projectName, boolean rollbackOnFailure) {
+ return generateMockServiceInstantiationPayload(isPause, vnfs, Collections.EMPTY_MAP, Collections.EMPTY_MAP, bulkSize, isUserProvidedNaming, projectName, rollbackOnFailure, false, null, Action.Create, null);
+ }
- public ServiceInstantiation generateMockServiceInstantiationPayload(boolean isPause, Map<String, Vnf> vnfs, int bulkSize, boolean isUserProvidedNaming, String projectName, boolean rollbackOnFailure) {
+ public ServiceInstantiation generateMockALaCarteServiceInstantiationPayload(boolean isPause, Map<String, Vnf> vnfs, Map<String, Network> networks, Map<String, InstanceGroup> vnfGroups, int bulkSize, boolean isUserProvidedNaming, String projectName, boolean rollbackOnFailure, String testApi) {
+ return generateMockServiceInstantiationPayload(isPause, vnfs, networks, vnfGroups, bulkSize, isUserProvidedNaming, projectName, rollbackOnFailure, true, testApi, Action.Create, null);
+ }
+
+ public ServiceInstantiation generateMockALaCarteServiceDeletionPayload(boolean isPause, Map<String, Vnf> vnfs, Map<String, Network> networks, Map<String, InstanceGroup> vnfGroups, int bulkSize, boolean isUserProvidedNaming, String projectName, boolean rollbackOnFailure, String testApi, String instanceId) {
+ return generateMockServiceInstantiationPayload(isPause, vnfs, networks, vnfGroups, bulkSize, isUserProvidedNaming, projectName, rollbackOnFailure, true, testApi, Action.Delete, instanceId);
+ }
+ private ServiceInstantiation generateMockServiceInstantiationPayload(boolean isPause, Map<String, Vnf> vnfs, Map<String, Network> networks, Map<String, InstanceGroup> vnfGroups, int bulkSize, boolean isUserProvidedNaming, String projectName, boolean rollbackOnFailure, boolean isAlacarte, String testApi, Action action, String instanceId) {
ModelInfo modelInfo = createModelInfo();
List<Map<String,String>> instanceParams = createInstanceParams();
- return new ServiceInstantiation (
- modelInfo,
+ return new ServiceInstantiation ( modelInfo,
AsyncInstantiationBusinessLogicTest.OWNING_ENTITY_ID,
AsyncInstantiationBusinessLogicTest.PACKET_CORE,
projectName,
AsyncInstantiationBusinessLogicTest.SUBSCRIBER_ID,
AsyncInstantiationBusinessLogicTest.SUBSCRIBER_NAME,
AsyncInstantiationBusinessLogicTest.PRODUCT_FAMILY_ID,
- isUserProvidedNaming ? AsyncInstantiationBusinessLogicTest.INSTANCE_NAME : "" ,
- isUserProvidedNaming,
+ isUserProvidedNaming ? AsyncInstantiationBusinessLogicTest.INSTANCE_NAME : null,
AsyncInstantiationBusinessLogicTest.SUBSCRIPTION_SERVICE_TYPE,
AsyncInstantiationBusinessLogicTest.LCP_CLOUD_REGION_ID,
+ null,
AsyncInstantiationBusinessLogicTest.A6CA3EE0394ADE9403F075DB23167E,
AsyncInstantiationBusinessLogicTest.TENANT_NAME,
AsyncInstantiationBusinessLogicTest.AIC_ZONE_ID,
AsyncInstantiationBusinessLogicTest.AIC_ZONE_NAME,
vnfs,
+ networks,
+ vnfGroups,
instanceParams,
isPause,
bulkSize,
- rollbackOnFailure
+ rollbackOnFailure,
+ isAlacarte,
+ testApi,
+ instanceId,
+ action.name()
);
}
@@ -114,30 +114,58 @@ public class AsyncInstantiationBaseTest extends AbstractTestNGSpringContextTests
return instanceParams;
}
- private VfModule createVfModule(String modelName, String modelVersionId, String modelCustomizationId,
- List<Map<String, String>> instanceParams, String instanceName, String volumeGroupInstanceName) {
+ protected VfModule createVfModule(String modelName, String modelVersionId, String modelCustomizationId,
+ List<Map<String, String>> instanceParams, Map<String, String> supplementaryParams, String instanceName, String volumeGroupInstanceName, boolean isAlacarte) {
ModelInfo vfModuleInfo = new ModelInfo();
vfModuleInfo.setModelType("vfModule");
vfModuleInfo.setModelName(modelName);
vfModuleInfo.setModelVersionId(modelVersionId);
vfModuleInfo.setModelCustomizationId(modelCustomizationId);
- return new VfModule(vfModuleInfo , instanceName, volumeGroupInstanceName, instanceParams);
+ vfModuleInfo.setModelCustomizationName(modelName);
+
+ if (isAlacarte) {
+ vfModuleInfo.setModelInvariantId("22222222-f63c-463e-ba94-286933b895f9");
+ vfModuleInfo.setModelVersion("10.0");
+ return new VfModule(vfModuleInfo, instanceName, volumeGroupInstanceName, Action.Create.name(), "mdt1", null, "88a6ca3ee0394ade9403f075db23167e", instanceParams, supplementaryParams, false, true, null);
+ }
+
+ return new VfModule(vfModuleInfo, instanceName, volumeGroupInstanceName, Action.Create.name(), null, null, null, instanceParams, supplementaryParams, false, false, null);
}
- private ModelInfo createVnfModelInfo() {
+ protected ModelInfo createVnfModelInfo(boolean isAlacarte) {
ModelInfo vnfModelInfo = new ModelInfo();
vnfModelInfo.setModelType("vnf");
vnfModelInfo.setModelName("2016-73_MOW-AVPN-vPE-BV-L");
vnfModelInfo.setModelVersionId("7f40c192-f63c-463e-ba94-286933b895f8");
vnfModelInfo.setModelCustomizationName("2016-73_MOW-AVPN-vPE-BV-L 0");
vnfModelInfo.setModelCustomizationId("ab153b6e-c364-44c0-bef6-1f2982117f04");
+ //added two conditional fields according to MSO AID - needed only in alacarte
+ if (isAlacarte) {
+ vnfModelInfo.setModelInvariantId("11111111-f63c-463e-ba94-286933b895f9");
+ vnfModelInfo.setModelVersion("10.0");
+ }
+ return vnfModelInfo;
+ }
+
+ private ModelInfo createNetworkModelInfo(boolean isAlacarte) {
+ ModelInfo vnfModelInfo = new ModelInfo();
+ vnfModelInfo.setModelType("network");
+ vnfModelInfo.setModelName("2016-73_MOW-AVPN-vPE-BV-L");
+ vnfModelInfo.setModelVersionId("7f40c192-f63c-463e-ba94-286933b895f8");
+ vnfModelInfo.setModelCustomizationName("2016-73_MOW-AVPN-vPE-BV-L 0");
+ vnfModelInfo.setModelCustomizationId("ab153b6e-c364-44c0-bef6-1f2982117f04");
+ //added two conditional fields according to MSO AID - needed only in alacarte
+ if (isAlacarte) {
+ vnfModelInfo.setModelInvariantId("11111111-f63c-463e-ba94-286933b895f9");
+ vnfModelInfo.setModelVersion("10.0");
+ }
return vnfModelInfo;
}
private ModelInfo createModelInfo() {
ModelInfo modelInfo = new ModelInfo();
modelInfo.setModelType("service");
- modelInfo.setModelVersionId("3c40d244-808e-42ca-b09a-256d83d19d0a");
+ modelInfo.setModelVersionId(SERVICE_MODEL_VERSION_ID);
modelInfo.setModelVersion("10.0");
modelInfo.setModelInvariantId("5d48acb5-097d-4982-aeb2-f4a3bd87d31b");
modelInfo.setModelName("MOW AVPN vMX BV vPE 1 Service");
@@ -145,29 +173,68 @@ public class AsyncInstantiationBaseTest extends AbstractTestNGSpringContextTests
}
protected Map<String, Vnf> createVnfList(HashMap<String, String> vfModuleInstanceParamsMap, List vnfInstanceParams, boolean isUserProvidedNaming) {
+ return createVnfList(vfModuleInstanceParamsMap, vnfInstanceParams, isUserProvidedNaming, false);
+ }
+
+ protected Map<String, Vnf> createVnfList(HashMap<String, String> vfModuleInstanceParamsMap, List vnfInstanceParams, boolean isUserProvidedNaming, boolean isAlacarte) {
Map<String, Vnf> vnfs = new HashMap<>();
- ModelInfo vnfModelInfo = createVnfModelInfo();
+ ModelInfo vnfModelInfo = createVnfModelInfo(isAlacarte);
Map<String, Map<String, VfModule>> vfModules = new HashMap<>();
- List<Map<String, String>> instanceParams1 =ImmutableList.of((ImmutableMap.of("vmx_int_net_len", "24")));
- VfModule vfModule1 = createVfModule("201673MowAvpnVpeBvL..AVPN_base_vPE_BV..module-0", "4c75f813-fa91-45a4-89d0-790ff5f1ae79", "a25e8e8c-58b8-4eec-810c-97dcc1f5cb7f", instanceParams1, "vmxnjr001_AVPN_base_vPE_BV_base", null);
+ List<Map<String, String>> instanceParams1 = ImmutableList.of((ImmutableMap.of("vmx_int_net_len", "24")));
+ VfModule vfModule1 = createVfModule("201673MowAvpnVpeBvL..AVPN_base_vPE_BV..module-0", VF_MODULE_0_MODEL_VERSION_ID, VF_MODULE_0_MODEL_CUSTOMIZATION_NAME, instanceParams1, new HashMap<>(), (isUserProvidedNaming ? "vmxnjr001_AVPN_base_vPE_BV_base" : null), null, isAlacarte);
List<Map<String, String>> instanceParams2 = ImmutableList.of(vfModuleInstanceParamsMap);
- VfModule vfModule2 = createVfModule("201673MowAvpnVpeBvL..AVPN_vRE_BV..module-1", "56e2b103-637c-4d1a-adc8-3a7f4a6c3240", "72d9d1cd-f46d-447a-abdb-451d6fb05fa8", instanceParams2, "vmxnjr001_AVPN_base_vRE_BV_expansion", "myVgName");
+ VfModule vfModule2 = createVfModule("201673MowAvpnVpeBvL..AVPN_vRE_BV..module-1", VF_MODULE_1_MODEL_VERSION_ID, VF_MODULE_1_MODEL_CUSTOMIZATION_NAME, instanceParams2, new HashMap<>(), (isUserProvidedNaming ? "vmxnjr001_AVPN_base_vRE_BV_expansion": null), (isUserProvidedNaming ? "myVgName" : null), isAlacarte);
String vfModuleModelName = vfModule1.getModelInfo().getModelName();
vfModules.put(vfModuleModelName, new LinkedHashMap<>());
- vfModules.get(vfModuleModelName).put(vfModule1.getInstanceName(),vfModule1);
- vfModules.get(vfModuleModelName).put(vfModule2.getInstanceName(), vfModule2);
+ vfModules.get(vfModuleModelName).put(vfModuleModelName + ":001", vfModule1);
+ vfModules.get(vfModuleModelName).put(vfModuleModelName + ":002", vfModule2);
- Vnf vnf = new Vnf(vnfModelInfo, "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", "vmxnjr001", isUserProvidedNaming,
- "platformName", "mdt1", "88a6ca3ee0394ade9403f075db23167e", vnfInstanceParams,"lineOfBusinessName" ,vfModules);
+ Vnf vnf = new Vnf(vnfModelInfo, "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", (isUserProvidedNaming ? VNF_NAME : null), Action.Create.name(),
+ "platformName", "mdt1", null, "88a6ca3ee0394ade9403f075db23167e", vnfInstanceParams,"lineOfBusinessName" , false, null, vfModules);
- vnfs.put(vnf.getInstanceName(), vnf);
+ vnfs.put(vnf.getModelInfo().getModelName(), vnf);
return vnfs;
}
+ protected Map<String, Network> createNetworkList(List vnfInstanceParams, boolean isUserProvidedNaming, boolean isALaCarte) {
+ Map<String, Network> networks = new HashMap<>();
+ ModelInfo networkModelInfo = createNetworkModelInfo(isALaCarte);
+
+ Network network = new Network(networkModelInfo, "a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb", isUserProvidedNaming ? VNF_NAME : null, Action.Create.name(),
+ "platformName", "mdt1", null, "88a6ca3ee0394ade9403f075db23167e", vnfInstanceParams,"lineOfBusinessName" , false, null);
+
+ networks.put(network.getModelInfo().getModelName(), network);
+ return networks;
+ }
+
+ protected InstanceGroup createInstanceGroup(boolean isUserProvidedNaming, Action action) {
+ ModelInfo modelInfo = new ModelInfo();
+ modelInfo.setModelType("instanceGroup");
+ modelInfo.setModelName("2016-73_MOW-AVPN-vPE-BV-L");
+ modelInfo.setModelVersionId("7f40c192-f63c-463e-ba94-286933b895f8");
+ modelInfo.setModelCustomizationName("2016-73_MOW-AVPN-vPE-BV-L 0");
+ modelInfo.setModelCustomizationId("ab153b6e-c364-44c0-bef6-1f2982117f04");
+ modelInfo.setModelInvariantId("11111111-f63c-463e-ba94-286933b895f9");
+ modelInfo.setModelVersion("10.0");
+
+ return new InstanceGroup(modelInfo, (isUserProvidedNaming ? VNF_GROUP_NAME : null), action.name(), false, null);
+ }
+
+ protected ModelInfo createServiceModelInfo() {
+ ModelInfo siModelInfo = new ModelInfo();
+ siModelInfo.setModelName("sriov");
+ siModelInfo.setModelType("service");
+ siModelInfo.setModelInvariantId("ff3514e3-5a33-55df-13ab-12abad84e7ff");
+ siModelInfo.setModelVersionId("fe6985cd-ea33-3346-ac12-ab121484a3fe");
+ siModelInfo.setModelVersion("1.0");
+
+ return siModelInfo;
+ }
+
protected void createInstanceParamsMaps() {
instanceParamsMapWithoutParams = new HashMap<>();
instanceParamsMapWithoutParams.put("availability_zone_0" , "mtpocdv-kvm-az01");
@@ -182,10 +249,11 @@ public class AsyncInstantiationBaseTest extends AbstractTestNGSpringContextTests
vnfInstanceParamsMapWithParamsToRemove.put(AsyncInstantiationBusinessLogic.PARAMS_TO_IGNORE.get(1), "should be removed");
}
- protected AsyncRequestStatus asyncRequestStatusResponse(String msoStatus) {
+ public static AsyncRequestStatus asyncRequestStatusResponse(String msoStatus) {
AsyncRequestStatus asyncRequestStatus = new AsyncRequestStatus(new AsyncRequestStatus.Request(new RequestStatus()));
asyncRequestStatus.request.requestStatus.setRequestState(msoStatus);
asyncRequestStatus.request.requestId = UUID.randomUUID().toString();
+ asyncRequestStatus.request.startTime = TimeUtils.zonedDateTimeToString(ZonedDateTime.now());
return asyncRequestStatus;
}
@@ -200,23 +268,31 @@ public class AsyncInstantiationBaseTest extends AbstractTestNGSpringContextTests
return restObject;
}
- protected void mockAaiClientAnyNameFree() throws UnsupportedEncodingException {
- when(aaiClient.searchNodeTypeByName(any(), any())).thenReturn(aaiNodeQueryResponseNameFree());
+ protected void mockAaiClientAnyNameFree() {
+ when(aaiClient.isNodeTypeExistsByName(any(), any())).thenReturn(false);
}
- protected HttpResponse<AaiNodeQueryResponse> aaiNodeQueryResponseNameFree() throws UnsupportedEncodingException {
- org.apache.http.HttpResponse response = new DefaultHttpResponseFactory().newHttpResponse(new BasicStatusLine(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, null), null);
- response.setEntity(new StringEntity(""));
-
- return HttpResponse.fallback(new AaiNodeQueryResponse(null));
+ protected ExceptionWithRequestInfo aaiNodeQueryBadResponseException() {
+ return new ExceptionWithRequestInfo(HttpMethod.GET, "url", "raw data", 500, null);
}
- protected AaiResponse<AaiNodeQueryResponse> aaiNodeQueryBadResponse() {
- return new AaiResponse<>(null,"", 404);
+ protected ServiceInstantiation generateALaCarteWithVnfsServiceInstantiationPayload() {
+ Map<String, Vnf> vnfs = createVnfList(vfModuleInstanceParamsMapWithParamsToRemove, Collections.singletonList(vnfInstanceParamsMapWithParamsToRemove) , true);
+ ServiceInstantiation serviceInstantiation = generateMockALaCarteServiceInstantiationPayload(false, vnfs, emptyMap(), emptyMap(), 1, true, PROJECT_NAME, false, "VNF_API");
+ return serviceInstantiation;
}
- protected AaiResponse<AaiNodeQueryResponse> aaiNodeQueryResponseNameUsed(ResourceType type) {
- AaiNodeQueryResponse mockAaiNodeQuery = new AaiNodeQueryResponse(ImmutableList.of(new AaiNodeQueryResponse.ResultData(type, "/some/mocked/link")));
- return new AaiResponse<>(mockAaiNodeQuery,"", 200);
+ protected ServiceInstantiation generateALaCarteUpdateWith1ExistingGroup2NewGroupsPayload() {
+ final InstanceGroup instanceGroup1 = createInstanceGroup(true, Action.None);
+ final InstanceGroup instanceGroup2 = createInstanceGroup(false, Action.Create);
+ final InstanceGroup instanceGroup3 = createInstanceGroup(true, Action.Create);
+ Map<String, InstanceGroup> groups = ImmutableMap.of(
+ "foo:001", instanceGroup1,
+ "foo:002", instanceGroup2,
+ "foo:003", instanceGroup3
+ );
+ return generateMockServiceInstantiationPayload(false, emptyMap(), emptyMap(), groups,
+ 1, true, PROJECT_NAME, false, true, "VNF_API",
+ Action.None, "1234567890");
}
}
diff --git a/vid-app-common/src/test/java/org/onap/vid/services/AsyncInstantiationBusinessLogicTest.java b/vid-app-common/src/test/java/org/onap/vid/services/AsyncInstantiationBusinessLogicTest.java
index 9711fa858..96b39bcb1 100644
--- a/vid-app-common/src/test/java/org/onap/vid/services/AsyncInstantiationBusinessLogicTest.java
+++ b/vid-app-common/src/test/java/org/onap/vid/services/AsyncInstantiationBusinessLogicTest.java
@@ -1,29 +1,96 @@
package org.onap.vid.services;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import net.javacrumbs.jsonunit.JsonAssert;
+import org.apache.commons.io.IOUtils;
+import org.hibernate.SessionFactory;
+import org.json.JSONException;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.mockito.stubbing.Answer;
+import org.onap.portalsdk.core.domain.FusionObject;
+import org.onap.portalsdk.core.service.DataAccessService;
import org.onap.portalsdk.core.util.SystemProperties;
+import org.onap.vid.aai.ExceptionWithRequestInfo;
+import org.onap.vid.aai.model.ResourceType;
+import org.onap.vid.changeManagement.RequestDetailsWrapper;
import org.onap.vid.config.DataSourceConfig;
import org.onap.vid.config.MockedAaiClientAndFeatureManagerConfig;
+import org.onap.vid.exceptions.GenericUncheckedException;
+import org.onap.vid.exceptions.MaxRetriesException;
+import org.onap.vid.exceptions.OperationNotAllowedException;
+import org.onap.vid.job.Job;
+import org.onap.vid.job.Job.JobStatus;
+import org.onap.vid.job.JobAdapter;
+import org.onap.vid.job.JobType;
+import org.onap.vid.job.JobsBrokerService;
+import org.onap.vid.job.impl.JobDaoImpl;
+import org.onap.vid.job.impl.JobSharedData;
+import org.onap.vid.model.Action;
+import org.onap.vid.model.JobAuditStatus;
+import org.onap.vid.model.JobAuditStatus.SourceStatus;
+import org.onap.vid.model.NameCounter;
+import org.onap.vid.model.ServiceInfo;
+import org.onap.vid.model.serviceInstantiation.*;
+import org.onap.vid.mso.MsoOperationalEnvironmentTest;
+import org.onap.vid.mso.model.*;
+import org.onap.vid.mso.rest.AsyncRequestStatus;
+import org.onap.vid.properties.Features;
+import org.onap.vid.testUtils.TestUtils;
+import org.onap.vid.utils.DaoUtils;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
+import org.testng.Assert;
+import org.testng.annotations.*;
+
+import javax.inject.Inject;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.Optional;
+import java.util.*;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import static com.google.common.collect.Maps.newHashMap;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.contains;
+import static org.hamcrest.Matchers.*;
+import static org.hamcrest.core.Every.everyItem;
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.mockito.Matchers.any;
+import static org.mockito.Mockito.*;
+import static org.onap.vid.job.Job.JobStatus.*;
+import static org.testng.Assert.*;
@ContextConfiguration(classes = {DataSourceConfig.class, SystemProperties.class, MockedAaiClientAndFeatureManagerConfig.class})
public class AsyncInstantiationBusinessLogicTest extends AsyncInstantiationBaseTest {
-/*
-TO BE FIXED
+
@Inject
private DataAccessService dataAccessService;
@Mock
- private JobAdapter jobAdapter;
+ private JobAdapter jobAdapterMock;
@Mock
- private JobsBrokerService jobsBrokerService;
-
+ private JobsBrokerService jobsBrokerServiceMock;
@Autowired
private SessionFactory sessionFactory;
- private AsyncInstantiationBusinessLogic asyncInstantiationBL;
+ private AsyncInstantiationBusinessLogicImpl asyncInstantiationBL;
private int serviceCount = 0;
@@ -36,13 +103,27 @@ TO BE FIXED
@BeforeClass
void initServicesInfoService() {
MockitoAnnotations.initMocks(this);
- asyncInstantiationBL = new AsyncInstantiationBusinessLogicImpl(dataAccessService, jobAdapter, jobsBrokerService, sessionFactory, aaiClient);
+ asyncInstantiationBL = new AsyncInstantiationBusinessLogicImpl(dataAccessService, jobAdapterMock, jobsBrokerServiceMock, sessionFactory, aaiClient, featureManager, cloudOwnerService);
createInstanceParamsMaps();
}
@BeforeMethod
void defineMocks() {
+ Mockito.reset(aaiClient);
+ Mockito.reset(jobAdapterMock);
+ Mockito.reset(jobsBrokerServiceMock);
mockAaiClientAnyNameFree();
+ enableAddCloudOwnerOnMsoRequest();
+ }
+
+ private void enableAddCloudOwnerOnMsoRequest() {
+ enableAddCloudOwnerOnMsoRequest(true);
+ }
+
+ private void enableAddCloudOwnerOnMsoRequest(boolean isActive) {
+ // always turn on the feature flag
+ when(featureManager.isActive(Features.FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST)).thenReturn(isActive);
+ when(aaiClient.getCloudOwnerByCloudRegionId(anyString())).thenReturn("att-aic");
}
@BeforeMethod
@@ -187,7 +268,7 @@ TO BE FIXED
dataAccessService.saveDomainObject(jobDao, getPropsMap());
}
- @Test
+ @Test(enabled = false)
public void testServiceInfoAreOrderedAsExpected() {
int userId = 2222;
createNewTestServicesInfo(String.valueOf(userId));
@@ -196,7 +277,7 @@ TO BE FIXED
assertThat("Services aren't ordered as expected", serviceInfoListResult, equalTo(expectedOrderServiceInfo));
}
- @Test
+ @Test(enabled = false)
public void testServiceInfoAreFilteredAsExpected() {
int userId = 2222;
createNewTestServicesInfoForFilter(String.valueOf(userId));
@@ -212,29 +293,32 @@ TO BE FIXED
assertThat("Services aren't ordered filtered as expected", serviceInfoFilteredByUser, equalTo(expectedFilterByUser));
}
- @Test(dataProvider = "pauseAndInstanceParams", enabled = false) //Test is irrelevant with unique names feature
- public void createServiceInstantiationMsoRequest(Boolean isPause, HashMap<String, String> vfModuleInstanceParamsMap, List vnfInstanceParams) throws Exception {
- ServiceInstantiation serviceInstantiationPayload = generateMockServiceInstantiationPayload(isPause, createVnfList(vfModuleInstanceParamsMap, vnfInstanceParams, true));
- final URL resource = this.getClass().getResource("/payload_jsons/bulk_service_request.json");
- RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
- asyncInstantiationBL.generateServiceInstantiationRequest(null, serviceInstantiationPayload, "az2016");
- String expected = IOUtils.toString(resource, "UTF-8");
- MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
- }
-
- @Test(dataProvider = "pauseAndInstanceParams")
- public void createServiceInstantiationMsoRequestUniqueName(Boolean isPause, HashMap<String, String> vfModuleInstanceParamsMap, List vnfInstanceParams) throws Exception {
- Mockito.reset(aaiClient);
- mockAaiClientAnyNameFree();
- ServiceInstantiation serviceInstantiationPayload = generateMockServiceInstantiationPayload(isPause, createVnfList(vfModuleInstanceParamsMap, vnfInstanceParams, true));
+ @Test(enabled = false, dataProvider = "pauseAndInstanceParams")
+ public void createMacroServiceInstantiationMsoRequestUniqueName(Boolean isPause, HashMap<String, String> vfModuleInstanceParamsMap, List vnfInstanceParams) throws Exception {
+ defineMocks();
+ ServiceInstantiation serviceInstantiationPayload = generateMockMacroServiceInstantiationPayload(isPause, createVnfList(vfModuleInstanceParamsMap, vnfInstanceParams, true), 2, true, PROJECT_NAME, false);
final URL resource = this.getClass().getResource("/payload_jsons/bulk_service_request_unique_names.json");
- List<UUID> uuids = new ArrayList<>();
+ when(jobAdapterMock.createServiceInstantiationJob(any(), any(), any(), any(), anyString(), any())).thenAnswer(invocation -> {
+ Object[] args = invocation.getArguments();
+ return new MockedJob((String)args[4]);
+ });
+
+ when(jobsBrokerServiceMock.add(any(MockedJob.class))).thenAnswer((Answer<UUID>) invocation -> {
+ Object[] args = invocation.getArguments();
+ MockedJob job = (MockedJob) args[0];
+ MockedJob.putJob(job.uuid, job);
+ return job.getUuid();
+ });
+
+ when(featureManager.isActive(Features.FLAG_SHIFT_VFMODULE_PARAMS_TO_VNF)).thenReturn(true);
+
+ List<UUID> uuids = asyncInstantiationBL.pushBulkJob(serviceInstantiationPayload, "az2016");
for (int i = 0; i < 2; i++) {
- UUID currentUuid = createJobAndServiceInfo();
- uuids.add(currentUuid);
+ UUID currentUuid = uuids.get(i);
RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
- asyncInstantiationBL.generateServiceInstantiationRequest(currentUuid, serviceInstantiationPayload, "az2016");
- String unique = String.format("00%s", i + 1);
+ asyncInstantiationBL.generateMacroServiceInstantiationRequest(currentUuid, serviceInstantiationPayload,
+ MockedJob.getJob(currentUuid).getOptimisticUniqueServiceInstanceName(), "az2016");
+ String unique = i==0 ? "" : String.format("_00%s", i);
String expected = IOUtils.toString(resource, "UTF-8")
.replace("{SERVICE_UNIQENESS}", unique)
.replace("{VNF_UNIQENESS}", unique)
@@ -243,17 +327,17 @@ TO BE FIXED
.replace("{VG_UNIQUENESS}", unique);
MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
Optional<ServiceInfo> optionalServiceInfo = getJobById(currentUuid);
- assertThat(optionalServiceInfo.get().getServiceInstanceName(), equalTo("vPE_Service_" + unique));
- verifySearchNodeTypeByName(unique, "vPE_Service_", ResourceType.SERVICE_INSTANCE);
- verifySearchNodeTypeByName(unique, "vmxnjr001_", ResourceType.GENERIC_VNF);
- verifySearchNodeTypeByName(unique, "vmxnjr001_AVPN_base_vPE_BV_base_", ResourceType.VF_MODULE);
- verifySearchNodeTypeByName(unique, "vmxnjr001_AVPN_base_vRE_BV_expansion_", ResourceType.VF_MODULE);
- verifySearchNodeTypeByName(unique, "myVgName_", ResourceType.VOLUME_GROUP);
+ assertThat(optionalServiceInfo.get().getServiceInstanceName(), equalTo("vPE_Service" + unique));
+ verifySearchNodeTypeByName(unique, "vPE_Service", ResourceType.SERVICE_INSTANCE);
+ verifySearchNodeTypeByName(unique, VNF_NAME, ResourceType.GENERIC_VNF);
+ verifySearchNodeTypeByName(unique, "vmxnjr001_AVPN_base_vPE_BV_base", ResourceType.VF_MODULE);
+ verifySearchNodeTypeByName(unique, "vmxnjr001_AVPN_base_vRE_BV_expansion", ResourceType.VF_MODULE);
+ verifySearchNodeTypeByName(unique, "myVgName", ResourceType.VOLUME_GROUP);
}
}
protected void verifySearchNodeTypeByName(String unique, String resourceName, ResourceType serviceInstance) {
- verify(aaiClient, times(1)).searchNodeTypeByName(resourceName + unique, serviceInstance);
+ verify(aaiClient, times(1)).isNodeTypeExistsByName(resourceName + unique, serviceInstance);
}
private HashMap<String, Object> getPropsMap() {
@@ -262,40 +346,37 @@ TO BE FIXED
return props;
}
- @Test(enabled = false) //probably not needed with name uniqueness feature
- public void pushBulkJob_bulkWithSize3_instancesNamesAreExactlyAsExpected() {
+
+ @DataProvider
+ public static Object[][] dataProviderForInstanceNames() {
+ return new Object[][]{
+ {true, ImmutableList.of("vPE_Service", "vPE_Service_001", "vPE_Service_002")},
+ {false, ImmutableList.of("", "", "")},
+ };
+ }
+
+ @Test(enabled = false, dataProvider="dataProviderForInstanceNames")
+ public void pushBulkJob_bulkWithSize3_instancesNamesAreExactlyAsExpected(boolean isUserProvidedNaming, List<String> expectedNames) {
int bulkSize = 3;
- final ServiceInstantiation request = generateMockServiceInstantiationPayload(
+ final ServiceInstantiation request = generateMockMacroServiceInstantiationPayload(
false,
createVnfList(instanceParamsMapWithoutParams, Collections.EMPTY_LIST, true),
- bulkSize, true,PROJECT_NAME, true
+ bulkSize, isUserProvidedNaming, PROJECT_NAME, true
);
- // in "createJob()" we will probe the service, with the generated names
- final Job job = mock(Job.class);
- when(job.getStatus()).thenReturn(PENDING);
- when(jobAdapter.createJob(any(), any(), any(), any(), any())).thenReturn(job);
-
-
- final List<UUID> uuids = asyncInstantiationBL.pushBulkJob(request, "myUserId");
-
+ // in "createServiceInstantiationJob()" we will probe the service, with the generated names
+ configureMockitoWithMockedJob();
- ArgumentCaptor<ServiceInstantiation> serviceInstantiationCaptor = new ArgumentCaptor<ServiceInstantiation>();
- verify(jobAdapter, times(bulkSize)).createJob(any(), serviceInstantiationCaptor.capture(), any(), any(), any());
- assertThat(serviceInstantiationCaptor.getAllValues().stream().map(v -> v.getInstanceName()).collect(Collectors.toList()),
- containsInAnyOrder("vPE_Service_001", "vPE_Service_002", "vPE_Service_003"));
+ asyncInstantiationBL.pushBulkJob(request, "myUserId");
- assertThat(uuids, hasSize(bulkSize));
+ List<ServiceInfo> serviceInfoList = dataAccessService.getList(ServiceInfo.class, getPropsMap());
+ assertEquals(serviceInfoList.stream().map(ServiceInfo::getServiceInstanceName).collect(Collectors.toList()), expectedNames);
}
- @Test
- public void generateMockServiceInstantiationPayload_serializeBackAndForth_sourceShouldBeTheSame() throws IOException {
- ServiceInstantiation serviceInstantiationPayload = generateMockServiceInstantiationPayload(
- false,
- createVnfList(instanceParamsMapWithoutParams, ImmutableList.of(vnfInstanceParamsMapWithParamsToRemove, vnfInstanceParamsMapWithParamsToRemove), true),
- 2, false,PROJECT_NAME, false);
+ @Test(enabled = false, dataProvider = "aLaCarteAndMacroPayload")
+ public void generateMockServiceInstantiationPayload_serializeBackAndForth_sourceShouldBeTheSame(ServiceInstantiation serviceInstantiationPayload) throws IOException {
ObjectMapper mapper = new ObjectMapper();
final String asString = mapper.writeValueAsString(serviceInstantiationPayload);
@@ -305,6 +386,20 @@ TO BE FIXED
JsonAssert.assertJsonEquals(asString, asString2);
}
+ @DataProvider
+ public Object[][] aLaCarteAndMacroPayload() {
+ ServiceInstantiation macroPayload = generateMockMacroServiceInstantiationPayload(
+ false,
+ createVnfList(instanceParamsMapWithoutParams, ImmutableList.of(vnfInstanceParamsMapWithParamsToRemove, vnfInstanceParamsMapWithParamsToRemove), true),
+ 2, false,PROJECT_NAME, false);
+ ServiceInstantiation aLaCartePayload = generateALaCarteServiceInstantiationPayload();
+
+ return new Object[][]{
+ {macroPayload},
+ {aLaCartePayload}
+ };
+ }
+
public static class ServiceInfoComparator implements Comparator<ServiceInfo> {
@Override
@@ -356,13 +451,13 @@ TO BE FIXED
};
}
- private ServiceInstantiation generateMockServiceInstantiationPayload(boolean isPause, Map<String, Vnf> vnfs) {
- return generateMockServiceInstantiationPayload(isPause, vnfs, 1, true, PROJECT_NAME, false);
+ private ServiceInstantiation generateMacroMockServiceInstantiationPayload(boolean isPause, Map<String, Vnf> vnfs) {
+ return generateMockMacroServiceInstantiationPayload(isPause, vnfs, 1, true, PROJECT_NAME, false);
}
- @Test
+ @Test(enabled = false)
public void testUpdateServiceInfo_WithExistingServiceInfo_ServiceInfoIsUpdated() {
- UUID uuid = createJobAndServiceInfo();
+ UUID uuid = createFakedJobAndServiceInfo();
final String STEPH_CURRY = "Steph Curry";
asyncInstantiationBL.updateServiceInfo(uuid, x -> {
x.setServiceInstanceName(STEPH_CURRY);
@@ -378,7 +473,7 @@ TO BE FIXED
return serviceInfoList.stream().filter(x -> jobId.equals(x.getJobId())).findFirst();
}
- private UUID createJobAndServiceInfo() {
+ private UUID createFakedJobAndServiceInfo() {
UUID uuid = UUID.randomUUID();
addNewJob(uuid);
ServiceInfo serviceInfo = new ServiceInfo();
@@ -389,14 +484,14 @@ TO BE FIXED
return uuid;
}
- @Test(expectedExceptions = GenericUncheckedException.class, expectedExceptionsMessageRegExp = UPDATE_SERVICE_INFO_EXCEPTION_MESSAGE)
+ @Test(enabled = false, expectedExceptions = GenericUncheckedException.class, expectedExceptionsMessageRegExp = UPDATE_SERVICE_INFO_EXCEPTION_MESSAGE)
public void testUpdateServiceInfo_WithNonExisting_ThrowException() {
asyncInstantiationBL.updateServiceInfo(UUID.randomUUID(), x -> x.setServiceInstanceName("not matter"));
}
- @Test(expectedExceptions = GenericUncheckedException.class, expectedExceptionsMessageRegExp = UPDATE_SERVICE_INFO_EXCEPTION_MESSAGE)
+ @Test(enabled = false, expectedExceptions = GenericUncheckedException.class, expectedExceptionsMessageRegExp = UPDATE_SERVICE_INFO_EXCEPTION_MESSAGE)
public void testUpdateServiceInfo_WithDoubleServiceWithSameJobUuid_ThrowException() {
- UUID uuid = createJobAndServiceInfo();
+ UUID uuid = createFakedJobAndServiceInfo();
ServiceInfo serviceInfo = new ServiceInfo();
serviceInfo.setJobId(uuid);
dataAccessService.saveDomainObject(serviceInfo, getPropsMap());
@@ -404,36 +499,45 @@ TO BE FIXED
}
+ @DataProvider
+ public static Object[][] isPauseAndPropertyDataProvider() {
+ return new Object[][]{
+ {true, "mso.restapi.serviceInstanceAssign"},
+ {false, "mso.restapi.serviceInstanceCreate"},
+ };
+ }
+
- @Test
- public void testRequestPath_WithPauseFlagTrue_RequestPathIsAsExpected() {
- ServiceInstantiation serviceInstantiationPauseFlagTrue = generateMockServiceInstantiationPayload(true, createVnfList(instanceParamsMapWithoutParams, Collections.EMPTY_LIST, true));
+ @Test(enabled = false, dataProvider = "isPauseAndPropertyDataProvider")
+ public void testServiceInstantiationPath_RequestPathIsAsExpected(boolean isPause, String expectedProperty) {
+ ServiceInstantiation serviceInstantiationPauseFlagTrue = generateMacroMockServiceInstantiationPayload(isPause, createVnfList(instanceParamsMapWithoutParams, Collections.EMPTY_LIST, true));
String path = asyncInstantiationBL.getServiceInstantiationPath(serviceInstantiationPauseFlagTrue);
- Assert.assertEquals(path, SystemProperties.getProperty("mso.restapi.serviceInstanceAssign"));
+ Assert.assertEquals(path, SystemProperties.getProperty(expectedProperty));
}
- @Test
- public void testRequestPath_WithPauseFlagFalse_RequestPathIsAsExpected() {
- ServiceInstantiation serviceInstantiationPauseFlagFalse = generateMockServiceInstantiationPayload(false, createVnfList(instanceParamsMapWithoutParams, Collections.EMPTY_LIST, true));
- String path = asyncInstantiationBL.getServiceInstantiationPath(serviceInstantiationPauseFlagFalse);
- Assert.assertEquals(path, SystemProperties.getProperty("mso.restapi.serviceInstanceCreate"));
+ @Test(enabled = false)
+ public void testCreateVnfEndpoint_useProvidedInstanceId() {
+ String path = asyncInstantiationBL.getVnfInstantiationPath("myGreatId");
+ assertThat(path, equalTo("/serviceInstances/v7/myGreatId/vnfs"));
}
- @Test
+ @Test(enabled = false)
public void createServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected() throws IOException {
- createServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected(true);
+ createMacroServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected(true);
}
- @Test
+ @Test(enabled = false)
public void createServiceInfo_WithUserProvidedNamingFalseAndNoVfmodules_ServiceInfoIsAsExpected() throws IOException {
- createServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected(false);
+ createMacroServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected(false);
}
- private void createServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected(boolean withVfmodules) throws IOException {
- ServiceInstantiation serviceInstantiationPayload = generateMockServiceInstantiationPayload(true,
+ private void createMacroServiceInfo_WithUserProvidedNamingFalse_ServiceInfoIsAsExpected(boolean withVfmodules) throws IOException {
+ when(featureManager.isActive(Features.FLAG_SHIFT_VFMODULE_PARAMS_TO_VNF)).thenReturn(true);
+
+ ServiceInstantiation serviceInstantiationPayload = generateMockMacroServiceInstantiationPayload(true,
createVnfList(vfModuleInstanceParamsMapWithParamsToRemove, Collections.EMPTY_LIST, false),
1,
- false,PROJECT_NAME, true);
+ false, PROJECT_NAME, true);
URL resource;
if (withVfmodules) {
resource = this.getClass().getResource("/payload_jsons/bulk_service_request_ecomp_naming.json");
@@ -444,27 +548,183 @@ TO BE FIXED
}
RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
- asyncInstantiationBL.generateServiceInstantiationRequest(null, serviceInstantiationPayload, "az2016");
+ asyncInstantiationBL.generateMacroServiceInstantiationRequest(null, serviceInstantiationPayload, serviceInstantiationPayload.getInstanceName(), "az2016");
String expected = IOUtils.toString(resource, "UTF-8");
MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
}
- @Test
+ @Test(enabled = false)
+ public void createALaCarteService_WithUserProvidedNamingFalse_RequestDetailsIsAsExpected() throws IOException {
+ ServiceInstantiation serviceInstantiationPayload = generateMockALaCarteServiceInstantiationPayload(false,
+ newHashMap(),
+ newHashMap(),
+ newHashMap(),
+ 1,
+ false, PROJECT_NAME, true, null);
+
+ RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
+ asyncInstantiationBL.generateALaCarteServiceInstantiationRequest(null, serviceInstantiationPayload, serviceInstantiationPayload.getInstanceName(), "az2016");
+
+ URL resource = this.getClass().getResource("/payload_jsons/bulk_alacarte_service_request_naming_false.json");
+ String expected = IOUtils.toString(resource, "UTF-8");
+ MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
+ }
+
+ @Test(enabled = false)
+ public void generateALaCarteServiceInstantiationRequest_withVnfList_HappyFllow() throws IOException {
+ ServiceInstantiation serviceInstantiationPayload = generateALaCarteWithVnfsServiceInstantiationPayload();
+ RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
+ asyncInstantiationBL.generateALaCarteServiceInstantiationRequest(null, serviceInstantiationPayload, serviceInstantiationPayload.getInstanceName(), "az2016");
+
+ String serviceExpected = IOUtils.toString(this.getClass().getResource("/payload_jsons/bulk_alacarte_service_request.json"), "UTF-8");
+ MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(serviceExpected, result);
+ }
+
+ @Test(enabled = false, dataProvider = "createVnfParameters")
+ public void createVnfRequestDetails_detailsAreAsExpected(boolean isFlagAddCloudOwnerActive, boolean isUserProvidedNaming, String file) throws IOException {
+
+ final List<Vnf> vnfList = new ArrayList<>(createVnfList(new HashMap<>(), null, isUserProvidedNaming, true).values());
+ ModelInfo siModelInfo = createServiceModelInfo();
+ String serviceInstanceId = "aa3514e3-5a33-55df-13ab-12abad84e7aa";
+
+ //we validate that the asyncInstantiationBL call to getUniqueName by simulate that aai retrun that original
+ //vnf name is used, and only next picked name is free.
+ Mockito.reset(aaiClient);
+ mockAaiClientAaiStatusOK();
+ when(aaiClient.isNodeTypeExistsByName(eq(VNF_NAME), eq(ResourceType.GENERIC_VNF))).thenReturn(true);
+ when(aaiClient.isNodeTypeExistsByName(eq(VNF_NAME+"_001"), eq(ResourceType.GENERIC_VNF))).thenReturn(false);
+ enableAddCloudOwnerOnMsoRequest(isFlagAddCloudOwnerActive);
+
+ String expected = IOUtils.toString(this.getClass().getResource(file), "UTF-8");
+ final RequestDetailsWrapper<VnfInstantiationRequestDetails> result = asyncInstantiationBL.generateVnfInstantiationRequest(vnfList.get(0), siModelInfo, serviceInstanceId, "pa0916");
+ MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
+ }
+
+ @DataProvider
+ public static Object[][] createVnfParameters() {
+ return new Object[][]{
+ {true, true, "/payload_jsons/bulk_vnf_request.json"},
+ {false, true, "/payload_jsons/bulk_vnf_request_without_cloud_owner.json"},
+ {true, false, "/payload_jsons/bulk_vnf_request_without_instance_name.json"},
+ };
+ }
+
+ @DataProvider
+ public static Object[][] vfModuleRequestDetails(Method test) {
+ return new Object[][]{
+ {"cc3514e3-5a33-55df-13ab-12abad84e7cc", true, "/payload_jsons/vfmodule_instantiation_request.json"},
+ {null, true, "/payload_jsons/vfmodule_instantiation_request_without_volume_group.json"},
+ {null, false, "/payload_jsons/vfmodule_instantiation_request_without_instance_name.json"}
+ };
+ }
+
+ @Test(enabled = false, dataProvider = "vfModuleRequestDetails")
+ public void createVfModuleRequestDetails_detailsAreAsExpected(String volumeGroupInstanceId, boolean isUserProvidedNaming, String fileName) throws IOException {
+
+ ModelInfo siModelInfo = createServiceModelInfo();
+ ModelInfo vnfModelInfo = createVnfModelInfo(true);
+ List<Map<String, String>> instanceParams = ImmutableList.of(ImmutableMap.of("vmx_int_net_len", "24",
+ "vre_a_volume_size_0" , "120"));
+ Map<String, String> supplementaryParams = ImmutableMap.of("vre_a_volume_size_0" , "100",
+ "availability_zone_0" , "mtpocdv-kvm-az01");
+ VfModule vfModule = createVfModule("201673MowAvpnVpeBvL..AVPN_vRE_BV..module-1", "56e2b103-637c-4d1a-adc8-3a7f4a6c3240",
+ "72d9d1cd-f46d-447a-abdb-451d6fb05fa8", instanceParams, supplementaryParams,
+ (isUserProvidedNaming ? "vmxnjr001_AVPN_base_vRE_BV_expansion": null), "myVgName", true);
+
+ String serviceInstanceId = "aa3514e3-5a33-55df-13ab-12abad84e7aa";
+ String vnfInstanceId = "bb3514e3-5a33-55df-13ab-12abad84e7bb";
+
+ Mockito.reset(aaiClient);
+ mockAaiClientAaiStatusOK();
+ enableAddCloudOwnerOnMsoRequest();
+ when(aaiClient.isNodeTypeExistsByName(eq("vmxnjr001_AVPN_base_vRE_BV_expansion"), eq(ResourceType.VF_MODULE))).thenReturn(false);
+
+ String expected = IOUtils.toString(this.getClass().getResource(fileName), "UTF-8");
+ final RequestDetailsWrapper<VfModuleInstantiationRequestDetails> result = asyncInstantiationBL.generateVfModuleInstantiationRequest(
+ vfModule, siModelInfo, serviceInstanceId,
+ vnfModelInfo, vnfInstanceId, volumeGroupInstanceId, "pa0916");
+ MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
+ }
+
+ @DataProvider
+ public static Object[][] expectedAggregatedParams() {
+ return new Object[][]{
+ {ImmutableMap.of("a", "b", "c", "d"), ImmutableMap.of("e", "f", "g", "h"), ImmutableList.of(ImmutableMap.of("c", "d", "a", "b", "e", "f", "g", "h"))},
+ {ImmutableMap.of("a", "b", "c", "g"), ImmutableMap.of("c", "d", "e", "f"), ImmutableList.of(ImmutableMap.of("a", "b", "c", "d", "e", "f"))},
+ {ImmutableMap.of(), ImmutableMap.of("c", "d", "e", "f"), ImmutableList.of(ImmutableMap.of("c", "d", "e", "f"))},
+ {ImmutableMap.of("a", "b", "c", "g"), ImmutableMap.of(), ImmutableList.of(ImmutableMap.of("a", "b", "c", "g"))},
+ {ImmutableMap.of(), ImmutableMap.of(), ImmutableList.of()},
+ {null, ImmutableMap.of(), ImmutableList.of()},
+ {ImmutableMap.of(), null, ImmutableList.of()},
+ };
+ }
+
+ @Test(enabled = false, dataProvider = "expectedAggregatedParams")
+ public void testAggregateInstanceParamsAndSuppFile(Map<String, String> instanceParams, Map<String, String> suppParams, List<VfModuleInstantiationRequestDetails.UserParamMap<String, String>> expected) {
+ List<VfModuleInstantiationRequestDetails.UserParamMap<String, String>> aggParams = ((AsyncInstantiationBusinessLogicImpl)asyncInstantiationBL).aggregateAllInstanceParams(instanceParams, suppParams);
+ assertThat("Aggregated params are not as expected", aggParams, equalTo(expected));
+ }
+
+ @DataProvider
+ public static Object[][] expectedNetworkRequestDetailsParameters() {
+ return new Object[][]{
+ {true, "/payload_jsons/network_instantiation_request.json"},
+ {false, "/payload_jsons/network_instantiation_request_without_instance_name.json"}
+ };
+ }
+
+ @Test(enabled = false, dataProvider = "expectedNetworkRequestDetailsParameters")
+ public void createNetworkRequestDetails_detailsAreAsExpected(boolean isUserProvidedNaming, String filePath) throws IOException {
+
+ final List<Network> networksList = new ArrayList<>(createNetworkList(null, isUserProvidedNaming, true).values());
+ ModelInfo siModelInfo = createServiceModelInfo();
+ String serviceInstanceId = "aa3514e3-5a33-55df-13ab-12abad84e7aa";
+
+ Mockito.reset(aaiClient);
+ mockAaiClientAaiStatusOK();
+ enableAddCloudOwnerOnMsoRequest();
+ when(aaiClient.isNodeTypeExistsByName(eq(VNF_NAME), eq(ResourceType.L3_NETWORK))).thenReturn(true);
+ when(aaiClient.isNodeTypeExistsByName(eq(VNF_NAME+"_001"), eq(ResourceType.L3_NETWORK))).thenReturn(false);
+
+ String expected = IOUtils.toString(this.getClass().getResource(filePath), "UTF-8");
+ final RequestDetailsWrapper<NetworkInstantiationRequestDetails> result = asyncInstantiationBL.generateNetworkInstantiationRequest(networksList.get(0), siModelInfo, serviceInstanceId, "pa0916");
+ MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
+ }
+
+ @Test(enabled = false)
+ public void createInstanceGroupRequestDetails_detailsAreAsExpected() throws IOException {
+
+ final InstanceGroup instanceGroup = createInstanceGroup(true, Action.Create);
+ ModelInfo siModelInfo = createServiceModelInfo();
+ String serviceInstanceId = "aa3514e3-5a33-55df-13ab-12abad84e7aa";
+
+ Mockito.reset(aaiClient);
+ mockAaiClientAaiStatusOK();
+ enableAddCloudOwnerOnMsoRequest();
+ when(aaiClient.isNodeTypeExistsByName(eq(VNF_GROUP_NAME), eq(ResourceType.INSTANCE_GROUP))).thenReturn(true);
+ when(aaiClient.isNodeTypeExistsByName(eq(VNF_GROUP_NAME+"_001"), eq(ResourceType.INSTANCE_GROUP))).thenReturn(false);
+
+ String expected = IOUtils.toString(this.getClass().getResource("/payload_jsons/instance_group_instantiation_request.json"), "UTF-8");
+ final RequestDetailsWrapper<InstanceGroupInstantiationRequestDetails> result = asyncInstantiationBL.generateInstanceGroupInstantiationRequest(instanceGroup, siModelInfo, serviceInstanceId, "az2018");
+ MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
+ }
+
+ @Test(enabled = false)
public void checkIfNullProjectNameSentToMso(){
- ServiceInstantiation serviceInstantiationPayload = generateMockServiceInstantiationPayload(true,
+ ServiceInstantiation serviceInstantiationPayload = generateMockMacroServiceInstantiationPayload(true,
createVnfList(vfModuleInstanceParamsMapWithParamsToRemove, Collections.EMPTY_LIST, false),
1,
false,null,false);
RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
- asyncInstantiationBL.generateServiceInstantiationRequest(null, serviceInstantiationPayload, "az2016");
+ asyncInstantiationBL.generateMacroServiceInstantiationRequest(null, serviceInstantiationPayload, serviceInstantiationPayload.getInstanceName(), "az2016");
JsonNode jsonNode = new ObjectMapper().valueToTree(result.requestDetails);
Assert.assertTrue(jsonNode.get("project").isNull());
- serviceInstantiationPayload = generateMockServiceInstantiationPayload(true,
+ serviceInstantiationPayload = generateMockMacroServiceInstantiationPayload(true,
createVnfList(vfModuleInstanceParamsMapWithParamsToRemove, Collections.EMPTY_LIST, false),
1,
false,"not null",false);
- result = asyncInstantiationBL.generateServiceInstantiationRequest(null, serviceInstantiationPayload, "az2016");
+ result = asyncInstantiationBL.generateMacroServiceInstantiationRequest(null, serviceInstantiationPayload, serviceInstantiationPayload.getInstanceName(), "az2016");
jsonNode = new ObjectMapper().valueToTree(result.requestDetails);
Assert.assertTrue(jsonNode.get("project").get("projectName").asText().equalsIgnoreCase("not null"));
@@ -472,19 +732,40 @@ TO BE FIXED
}
- @Test
- public void pushBulkJob_verifyCreatedDateBehavior_createdDateIsTheSameForAllServicesInSameBulk() {
+ @Test(enabled = false)
+ public void pushBulkJob_macroServiceverifyCreatedDateBehavior_createdDateIsTheSameForAllServicesInSameBulk() {
LocalDateTime startTestDate = LocalDateTime.now().withNano(0);
- final ServiceInstantiation request = generateMockServiceInstantiationPayload(
+ final ServiceInstantiation request = generateMockMacroServiceInstantiationPayload(
false,
createVnfList(instanceParamsMapWithoutParams, Collections.EMPTY_LIST, true),
100, true,PROJECT_NAME, true
);
- // in "createJob()" we will probe the service, with the generated names
- final Job job = mock(Job.class);
- when(job.getStatus()).thenReturn(PENDING);
- when(jobAdapter.createJob(any(), any(), any(), any(), any())).thenReturn(job);
+ pushJobAndAssertDates(startTestDate, request);
+ }
+
+ @Test(enabled = false)
+ public void whenCreateServiceInfo_thenModelId_isModelVersionId() {
+ ServiceInfo serviceInfo = asyncInstantiationBL.createServiceInfo("userID",
+ generateALaCarteWithVnfsServiceInstantiationPayload(),
+ UUID.randomUUID(),
+ UUID.randomUUID(),
+ new Date(),
+ "myName", ServiceInfo.ServiceAction.INSTANTIATE);
+ assertEquals(SERVICE_MODEL_VERSION_ID, serviceInfo.getServiceModelId());
+
+ }
+
+ @Test(enabled = false)
+ public void pushBulkJob_aLaCarteServiceverifyCreatedDateBehavior_createdDateIsTheSameForAllServicesInSameBulk() {
+ LocalDateTime startTestDate = LocalDateTime.now().withNano(0);
+ final ServiceInstantiation request = generateALaCarteServiceInstantiationPayload();
+ pushJobAndAssertDates(startTestDate, request);
+ }
+
+ protected void pushJobAndAssertDates(LocalDateTime startTestDate, ServiceInstantiation request) {
+ // in "createServiceInstantiationJob()" we will probe the service, with the generated names
+ configureMockitoWithMockedJob();
asyncInstantiationBL.pushBulkJob(request, "myUserId");
List<ServiceInfo> serviceInfoList = dataAccessService.getList(ServiceInfo.class, getPropsMap());
@@ -502,6 +783,13 @@ TO BE FIXED
assertFalse(creationDate.isAfter(endTestDate));
}
+ protected void configureMockitoWithMockedJob() {
+ Mockito.reset(jobAdapterMock);
+ final Job job = mock(Job.class);
+ when(job.getStatus()).thenReturn(PENDING);
+ when(jobAdapterMock.createServiceInstantiationJob(any(), any(), any(), any(), any(), any())).thenReturn(job);
+ }
+
@DataProvider
public static Object[][] msoToJobStatusDataProvider() {
return new Object[][]{
@@ -519,8 +807,8 @@ TO BE FIXED
};
}
- @Test(dataProvider = "msoToJobStatusDataProvider")
- void whenGetStatusFromMso_calcRightJobStatus(String msoStatus, Job.JobStatus expectedJobStatus) {
+ @Test(enabled = false, dataProvider = "msoToJobStatusDataProvider")
+ public void whenGetStatusFromMso_calcRightJobStatus(String msoStatus, Job.JobStatus expectedJobStatus) {
AsyncRequestStatus asyncRequestStatus = asyncRequestStatusResponse(msoStatus);
assertThat(asyncInstantiationBL.calcStatus(asyncRequestStatus), equalTo(expectedJobStatus));
}
@@ -564,7 +852,7 @@ TO BE FIXED
}
- @Test(dataProvider = "auditStatuses")
+ @Test(enabled = false, dataProvider = "auditStatuses")
public void givenSomeAuditStatuses_getStatusesOfSpecificSourceAndJobId_getSortedResultsMatchingToParameters(SourceStatus expectedSource, String [] expectedSortedStatuses){
UUID jobUuid = UUID.randomUUID();
List<JobAuditStatus> auditStatusList = com.google.common.collect.ImmutableList.of(
@@ -582,7 +870,7 @@ TO BE FIXED
- @Test
+ @Test(enabled = false)
public void addSomeVidStatuses_getThem_verifyGetInsertedWithoutDuplicates(){
ImmutableList<JobStatus> statusesToBeInserted = ImmutableList.of(PENDING, IN_PROGRESS, IN_PROGRESS, COMPLETED);
UUID jobUuid = UUID.randomUUID();
@@ -627,7 +915,7 @@ TO BE FIXED
};
}
- @Test(dataProvider = "msoAuditStatuses")
+ @Test(enabled = false, dataProvider = "msoAuditStatuses")
public void addSomeMsoStatuses_getThem_verifyGetInsertedWithoutDuplicates(UUID jobUuid, ImmutableList<JobAuditStatus> msoStatuses, ImmutableList<String> expectedStatuses, String assertionReason) {
msoStatuses.forEach(status -> {
asyncInstantiationBL.auditMsoStatus(status.getJobId(), status.getJobStatus(), status.getRequestId() != null ? status.getRequestId().toString() : null, status.getAdditionalInfo());
@@ -636,7 +924,7 @@ TO BE FIXED
assertThat( assertionReason, statusesFromDB, is(expectedStatuses));
}
- @Test
+ @Test(enabled = false)
public void addSameStatusOfVidAndMso_verifyThatBothWereAdded(){
UUID jobUuid = UUID.randomUUID();
JobStatus sameStatus = IN_PROGRESS;
@@ -650,45 +938,35 @@ TO BE FIXED
assertThat(list,everyItem(hasProperty("jobStatus", is(sameStatus.toString()))));
}
- @Test
- public void verifyAsyncRequestStatus_canBeReadFromSample() throws IOException {
- String body = "{" +
- " \"request\": {" +
- " \"requestId\": \"c0011670-0e1a-4b74-945d-8bf5aede1d9c\"," +
- " \"startTime\": \"Mon, 11 Dec 2017 07:27:49 GMT\"," +
- " \"requestScope\": \"service\"," +
- " \"requestType\": \"createInstance\"," +
- " \"instanceReferences\": {" +
- " \"serviceInstanceId\": \"f8791436-8d55-4fde-b4d5-72dd2cf13cfb\"," +
- " \"serviceInstanceName\": \"asdfasdf234234asdf\"," +
- " \"requestorId\": \"il883e\"" +
- " }," +
- " \"requestStatus\": {" +
- " \"requestState\": \"COMPLETE\"," +
- " \"statusMessage\": \"Service Instance was created successfully.\"," +
- " \"percentProgress\": 100," +
- " \"finishTime\": \"Mon, 11 Dec 2017 07:27:53 GMT\"" +
- " }" +
- " }" +
- "}";
- ObjectMapper objectMapper = new ObjectMapper();
- AsyncRequestStatus asyncRequestStatus = objectMapper.readValue(body, AsyncRequestStatus.class);
- assertThat(asyncRequestStatus.request.requestStatus.getRequestState(), equalTo("COMPLETE"));
+ @DataProvider
+ public static Object[][] msoRequestStatusFiles(Method test) {
+ return new Object[][]{
+ {"/responses/mso/orchestrationRequestsServiceInstance.json"},
+ {"/responses/mso/orchestrationRequestsVnf.json"},
+ {"/responses/mso/orchestrationRequestsMockedMinimalResponse.json"}
+ };
+ }
+ @Test(enabled = false, dataProvider="msoRequestStatusFiles")
+ public void verifyAsyncRequestStatus_canBeReadFromSample(String msoResponseFile) throws IOException {
+ AsyncRequestStatus asyncRequestStatus = TestUtils.readJsonResourceFileAsObject(
+ msoResponseFile,
+ AsyncRequestStatus.class);
+ assertThat(asyncRequestStatus.request.requestStatus.getRequestState(), equalTo("COMPLETE"));
}
- @Test
+ @Test(enabled = false)
public void deleteJobInfo_pending_deleted() {
- doNothing().when(jobsBrokerService).delete(any());
+ doNothing().when(jobsBrokerServiceMock).delete(any());
UUID uuid = createServicesInfoWithDefaultValues(PENDING);
asyncInstantiationBL.deleteJob(uuid);
assertNotNull(asyncInstantiationBL.getServiceInfoByJobId(uuid).getDeletedAt(), "service info wasn't deleted");
}
- @Test(expectedExceptions = IllegalStateException.class, expectedExceptionsMessageRegExp = DELETE_SERVICE_INFO_STATUS_EXCEPTION_MESSAGE)
+ @Test(enabled = false, expectedExceptions = IllegalStateException.class, expectedExceptionsMessageRegExp = DELETE_SERVICE_INFO_STATUS_EXCEPTION_MESSAGE)
public void deleteJobInfo_notAllowdStatus_shouldSendError() {
UUID uuid = createServicesInfoWithDefaultValues(COMPLETED);
- doThrow(new IllegalStateException(DELETE_SERVICE_INFO_STATUS_EXCEPTION_MESSAGE)).when(jobsBrokerService).delete(any());
+ doThrow(new IllegalStateException(DELETE_SERVICE_INFO_STATUS_EXCEPTION_MESSAGE)).when(jobsBrokerServiceMock).delete(any());
try {
asyncInstantiationBL.deleteJob(uuid);
} catch (Exception e) {
@@ -704,7 +982,7 @@ TO BE FIXED
.map(v -> new Object[]{v}).collect(Collectors.toList()).toArray(new Object[][]{});
}
- @Test(dataProvider = "jobStatusesFinal")
+ @Test(enabled = false, dataProvider = "jobStatusesFinal")
public void whenHideService_theServiceNotReturnedInServiceList(JobStatus jobStatus) {
UUID uuidToHide = createServicesInfoWithDefaultValues(jobStatus);
UUID uuidToShown = createServicesInfoWithDefaultValues(jobStatus);
@@ -729,7 +1007,7 @@ TO BE FIXED
.map(v -> new Object[]{v}).collect(Collectors.toList()).toArray(new Object[][]{});
}
- @Test( dataProvider = "jobStatusesNotFinal",
+ @Test(enabled = false, dataProvider = "jobStatusesNotFinal",
expectedExceptions = OperationNotAllowedException.class,
expectedExceptionsMessageRegExp = "jobId.*Service status does not allow hide service, status = .*")
public void hideServiceInfo_notAllowedStatus_shouldSendError(JobStatus jobStatus) {
@@ -742,14 +1020,14 @@ TO BE FIXED
}
}
- @Test
+ @Test(enabled = false)
public void whenUseGetCounterInMultiThreads_EachThreadGetDifferentCounter() throws InterruptedException {
int SIZE = 200;
ExecutorService executor = Executors.newFixedThreadPool(SIZE);
- List<Callable<Integer>> tasks = IntStream.rangeClosed(1, SIZE)
+ List<Callable<Integer>> tasks = IntStream.rangeClosed(0, SIZE)
.mapToObj(x-> ((Callable<Integer>)() -> asyncInstantiationBL.getCounterForName("a")))
.collect(Collectors.toList());
- Set<Integer> expectedResults = IntStream.rangeClosed(1, SIZE).boxed().collect(Collectors.toSet());
+ Set<Integer> expectedResults = IntStream.rangeClosed(0, SIZE).boxed().collect(Collectors.toSet());
executor.invokeAll(tasks)
.forEach(future -> {
try {
@@ -763,23 +1041,23 @@ TO BE FIXED
assertThat(expectedResults.size(), is(0));
}
- @Test
+ @Test(enabled = false)
public void whenUseGetCounterForSameName_numbersReturnedByOrder() {
String name = UUID.randomUUID().toString();
int SIZE=10;
- for (int i=1; i<=SIZE; i++) {
+ for (int i=0; i<SIZE; i++) {
assertThat(asyncInstantiationBL.getCounterForName(name), is(i));
}
}
- @Test
+ @Test(enabled = false)
public void whenNamedInUsedInAai_getNextNumber() {
String name = someCommonStepsAndGetName();
ResourceType type = ResourceType.GENERIC_VNF;
- when(aaiClient.searchNodeTypeByName(name+"_001", type)).thenReturn(aaiNodeQueryResponseNameUsed(type));
- when(aaiClient.searchNodeTypeByName(name+"_002", type)).thenReturn(aaiNodeQueryResponseNameFree());
- assertThat(asyncInstantiationBL.getUniqueName(name, type), equalTo(name+"_002"));
+ when(aaiClient.isNodeTypeExistsByName(name, type)).thenReturn(true);
+ when(aaiClient.isNodeTypeExistsByName(name+"_001", type)).thenReturn(false);
+ assertThat(asyncInstantiationBL.getUniqueName(name, type), equalTo(name+"_001"));
}
private String someCommonStepsAndGetName() {
@@ -788,32 +1066,335 @@ TO BE FIXED
}
private void mockAaiClientAaiStatusOK() {
- when(aaiClient.searchNodeTypeByName(eq(AsyncInstantiationBusinessLogicImpl.NAME_FOR_CHECK_AAI_STATUS), any())).thenReturn(aaiNodeQueryResponseNameFree());
+ when(aaiClient.isNodeTypeExistsByName(eq(AsyncInstantiationBusinessLogicImpl.NAME_FOR_CHECK_AAI_STATUS), any())).thenReturn(false);
}
- @Test(expectedExceptions=InvalidAAIResponseException.class)
+ @Test(enabled = false, expectedExceptions=ExceptionWithRequestInfo.class)
public void whenAaiBadResponseCode_throwInvalidAAIResponseException() {
String name = someCommonStepsAndGetName();
ResourceType type = ResourceType.SERVICE_INSTANCE;
- when(aaiClient.searchNodeTypeByName(name+"_001", type)).thenReturn(aaiNodeQueryBadResponse());
+ when(aaiClient.isNodeTypeExistsByName(name, type)).thenThrow(aaiNodeQueryBadResponseException());
asyncInstantiationBL.getUniqueName(name, type);
}
- @Test(expectedExceptions=MaxRetriesException.class)
+ @Test(enabled = false, expectedExceptions=MaxRetriesException.class)
public void whenAaiAlwaysReturnNameUsed_throwInvalidAAIResponseException() {
String name = someCommonStepsAndGetName();
ResourceType type = ResourceType.VF_MODULE;
- when(aaiClient.searchNodeTypeByName(any(), eq(type))).thenReturn(aaiNodeQueryResponseNameUsed(type));
+ when(aaiClient.isNodeTypeExistsByName(any(), eq(type))).thenReturn(true);
asyncInstantiationBL.setMaxRetriesGettingFreeNameFromAai(10);
asyncInstantiationBL.getUniqueName(name, type);
}
- @Test
+ @Test(enabled = false)
public void testFormattingOfNameAndCounter() {
AsyncInstantiationBusinessLogicImpl bl = (AsyncInstantiationBusinessLogicImpl) asyncInstantiationBL;
+ assertThat(bl.formatNameAndCounter("x", 0), equalTo("x"));
assertThat(bl.formatNameAndCounter("x", 3), equalTo("x_003"));
assertThat(bl.formatNameAndCounter("x", 99), equalTo("x_099"));
assertThat(bl.formatNameAndCounter("x", 100), equalTo("x_100"));
assertThat(bl.formatNameAndCounter("x", 1234), equalTo("x_1234"));
- }*/
+ }
+
+ @Test(enabled = false)
+ public void pushBulkJob_verifyAlacarteFlow_useALaCartServiceInstantiationJobType(){
+ final ServiceInstantiation request = generateALaCarteServiceInstantiationPayload();
+
+ // in "createServiceInstantiationJob()" we will probe the service, with the generated names
+ configureMockitoWithMockedJob();
+
+ ArgumentCaptor<JobType> argumentCaptor = ArgumentCaptor.forClass(JobType.class);
+ asyncInstantiationBL.pushBulkJob(request, "myUserId");
+ verify(jobAdapterMock).createServiceInstantiationJob(argumentCaptor.capture(),any(),any(),anyString(), anyString(), anyInt());
+ assertTrue(argumentCaptor.getValue().equals(JobType.ALaCarteServiceInstantiation));
+ }
+
+ @Test(enabled = false)
+ public void pushBulkJob_verifyMacroFlow_useMacroServiceInstantiationJobType(){
+ final ServiceInstantiation request = generateMacroMockServiceInstantiationPayload(false, Collections.emptyMap());
+
+ // in "createServiceInstantiationJob()" we will probe the service, with the generated names
+ configureMockitoWithMockedJob();
+
+ ArgumentCaptor<JobType> argumentCaptor = ArgumentCaptor.forClass(JobType.class);
+ asyncInstantiationBL.pushBulkJob(request, "myUserId");
+ verify(jobAdapterMock).createServiceInstantiationJob(argumentCaptor.capture(),any(),any(),anyString(), anyString(), anyInt());
+ assertTrue(argumentCaptor.getValue().equals(JobType.MacroServiceInstantiation));
+ }
+
+ @Test(enabled = false)
+ public void generateALaCarteServiceInstantiationRequest_verifyRequestIsAsExpected() throws IOException {
+ ServiceInstantiation serviceInstantiationPayload = generateALaCarteServiceInstantiationPayload();
+ final URL resource = this.getClass().getResource("/payload_jsons/bulk_alacarte_service_request.json");
+ RequestDetailsWrapper<ServiceInstantiationRequestDetails> result =
+ asyncInstantiationBL.generateALaCarteServiceInstantiationRequest(null, serviceInstantiationPayload, serviceInstantiationPayload.getInstanceName(), "az2016");
+ String expected = IOUtils.toString(resource, "UTF-8");
+ MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
+ }
+
+ @Test(enabled = false)
+ public void generateALaCarteServiceDeletionRequest_verifyRequestIsAsExpected() throws IOException {
+ final URL resource = this.getClass().getResource("/payload_jsons/bulk_alacarte_service_deletion_request.json");
+ String expected = IOUtils.toString(resource, "UTF-8");
+
+ ServiceInstantiation serviceDeletionPayload = generateALaCarteServiceDeletionPayload();
+ RequestDetailsWrapper<ServiceDeletionRequestDetails> result =
+ asyncInstantiationBL.generateALaCarteServiceDeletionRequest(null, serviceDeletionPayload, "az2016");
+
+ MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
+ }
+
+ @Test(enabled = false)
+ public void getALaCarteServiceDeletionPath_verifyPathIsAsExpected() throws IOException {
+
+ String expected = "/serviceInstantiation/v7/serviceInstances/f36f5734-e9df-4fbf-9f35-61be13f028a1";
+
+ String result = asyncInstantiationBL.getServiceDeletionPath("f36f5734-e9df-4fbf-9f35-61be13f028a1");
+
+ assertThat(expected,equalTo(result));
+ }
+
+ @Test(enabled = false)
+ public void getInstanceGroupsDeletionPath_verifyPathIsAsExpected() {
+
+ assertEquals(asyncInstantiationBL.getInstanceGroupDeletePath("9aada4af-0f9b-424f-ae21-e693bd3e005b"),
+ "/serviceInstantiation/v7/instanceGroups/9aada4af-0f9b-424f-ae21-e693bd3e005b");
+ }
+
+ @DataProvider
+ public static Object[][] testBuildVnfInstanceParamsDataProvider(Method test) {
+ return new Object[][]{
+ {
+ Collections.EMPTY_LIST,
+ ImmutableList.of(
+ ImmutableList.of(ImmutableMap.of("k1","v1","k2","v2")),
+ ImmutableList.of(ImmutableMap.of("k3","v3","k2","v2"))
+ ),
+ true,
+ ImmutableList.of(ImmutableMap.of("k1","v1","k2","v2","k3","v3"))
+ },
+ {
+ ImmutableList.of(ImmutableMap.of("j1", "w1", "k1","v1", "vnf_name","w2", "vf_module_name","w3")), //vnf_name, vf_module_name are excluded
+ ImmutableList.of(
+ ImmutableList.of(ImmutableMap.of("k1","v1","k2","v2")),
+ ImmutableList.of(ImmutableMap.of("k3","v3","k2","v2")),
+ ImmutableList.of(Collections.EMPTY_MAP),
+ Collections.singletonList(null)
+ ),
+ true,
+ ImmutableList.of(ImmutableMap.of("k1","v1","k2","v2","k3","v3","j1", "w1"))
+ },
+ {
+ Collections.EMPTY_LIST,
+ Arrays.asList(null, null),
+ true,
+ Collections.EMPTY_LIST //mso is expect to empty list and not list with empty map
+ },
+ {
+ ImmutableList.of(Collections.EMPTY_MAP),
+ ImmutableList.of(
+ ImmutableList.of(Collections.EMPTY_MAP),
+ ImmutableList.of(Collections.EMPTY_MAP)
+ ),
+ true,
+ Collections.EMPTY_LIST //mso is expect to empty list and not list with empty map
+ },
+ {
+ Collections.EMPTY_LIST,
+ ImmutableList.of(
+ ImmutableList.of(ImmutableMap.of("k1","v1","k2","v2")),
+ ImmutableList.of(ImmutableMap.of("k3","v3","k2","v2"))
+ ),
+ false,
+ Collections.EMPTY_LIST //mso is expect to empty list and not list with empty map
+ },
+ {
+ ImmutableList.of(ImmutableMap.of("j1", "w1", "k1","v1", "vnf_name","w2", "vf_module_name","w3")),
+ ImmutableList.of(
+ ImmutableList.of(Collections.EMPTY_MAP)
+ ),
+ false,
+ ImmutableList.of(ImmutableMap.of("j1", "w1", "k1","v1"))
+ },
+ {
+ ImmutableList.of(ImmutableMap.of("vnf_name","w2", "vf_module_name", "w3", "j2", "w2", "j4","w4")),
+ ImmutableList.of(
+ ImmutableList.of(ImmutableMap.of("k1","v1","k2","v2")),
+ ImmutableList.of(ImmutableMap.of("k3","v3","k2","v2"))
+ ),
+ false,
+ ImmutableList.of(ImmutableMap.of("j2", "w2", "j4","w4"))
+ },
+
+ };
+ }
+
+ @Test(enabled = false, dataProvider="testBuildVnfInstanceParamsDataProvider")
+ public void testBuildVnfInstanceParams(List<Map<String, String>> currentVnfInstanceParams,
+ List<List<Map<String, String>>> vfModulesInstanceParams,
+ boolean isFeatureActive,
+ List<Map<String,String>> expectedResult){
+ when(featureManager.isActive(Features.FLAG_SHIFT_VFMODULE_PARAMS_TO_VNF)).thenReturn(isFeatureActive);
+ List<VfModuleMacro> vfModules =
+ vfModulesInstanceParams.stream().map(params-> new VfModuleMacro(new ModelInfo(), null, null, params)).collect(Collectors.toList());
+ List<Map<String,String>> actual = asyncInstantiationBL.buildVnfInstanceParams(currentVnfInstanceParams, vfModules);
+ assertThat(actual, equalTo(expectedResult));
+
+ }
+
+ @Test(enabled = false)
+ public void whenLcpRegionNotEmpty_thenCloudRegionIdOfResourceIsLegacy() {
+ String legacyCloudRegion = "legacyCloudRegion";
+ Vnf vnf = new Vnf(new ModelInfo(), null, null, Action.Create.name(), null, "anyCloudRegion", legacyCloudRegion, null, null, null, false, null, null);
+ assertThat(vnf.getLcpCloudRegionId(), equalTo(legacyCloudRegion));
+
+
+ }
+
+ @Test(enabled = false)
+ public void whenLcpRegionNotEmpty_thenCloudRegionIdOfServiceIsLegacy() {
+ String legacyCloudRegion = "legacyCloudRegion";
+ ServiceInstantiation service = new ServiceInstantiation(new ModelInfo(), null, null, null, null, null, null,
+ null, null, "anyCloudRegion", legacyCloudRegion, null, null, null, null, null, null, null, null,
+ false, 1,false, false, null, null, Action.Create.name());
+ assertThat(service.getLcpCloudRegionId(), equalTo(legacyCloudRegion));
+ }
+
+ @Test(enabled = false)
+ public void createVolumeGroup_verifyResultAsExpected() throws IOException {
+ final URL resource = this.getClass().getResource("/payload_jsons/volumegroup_instantiation_request.json");
+ VfModule vfModule = createVfModule("201673MowAvpnVpeBvL..AVPN_vRE_BV..module-1",
+ "56e2b103-637c-4d1a-adc8-3a7f4a6c3240",
+ "72d9d1cd-f46d-447a-abdb-451d6fb05fa8",
+ Collections.emptyList(),
+ Collections.emptyMap(),
+ "vmxnjr001_AVPN_base_vRE_BV_expansion",
+ "myVgName",
+ true);
+ vfModule.getModelInfo().setModelInvariantId("ff5256d2-5a33-55df-13ab-12abad84e7ff");
+ vfModule.getModelInfo().setModelVersion("1");
+ ModelInfo vnfModelInfo = createVnfModelInfo(true);
+ RequestDetailsWrapper<VolumeGroupRequestDetails> result =
+ asyncInstantiationBL.generateVolumeGroupInstantiationRequest(vfModule,
+ createServiceModelInfo(),
+ "ff3514e3-5a33-55df-13ab-12abad84e7ff",
+ vnfModelInfo,
+ "vnfInstanceId",
+ "az2016");
+ String expected = IOUtils.toString(resource, "UTF-8");
+ MsoOperationalEnvironmentTest.assertThatExpectationIsLikeObject(expected, result);
+ }
+
+ @Test(enabled = false)
+ public void getJobTypeByRequest_verifyResultAsExpected(){
+ ServiceInstantiation service = new ServiceInstantiation(new ModelInfo(), null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ false, 1,false, false, null, null, Action.Create.name());
+ JobType jobType = asyncInstantiationBL.getJobType(service) ;
+ assertThat(jobType, equalTo(JobType.MacroServiceInstantiation));
+ service = new ServiceInstantiation(new ModelInfo(), null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ false, 1,false, true, null, null, Action.Create.name());
+ jobType = asyncInstantiationBL.getJobType(service);
+ assertThat(jobType, equalTo(JobType.ALaCarteServiceInstantiation));
+ service = new ServiceInstantiation(new ModelInfo(), null, null, null, null, null, null,
+ null, null, null, null, null, null, null, null, null, null, null, null,
+ false, 1,false, true, null, null, Action.Delete.name());
+ jobType = asyncInstantiationBL.getJobType(service);
+ assertThat(jobType, equalTo(JobType.ALaCarteService));
+ }
+
+ protected ServiceInstantiation generateALaCarteServiceInstantiationPayload() {
+ return generateMockALaCarteServiceInstantiationPayload(false, Collections.EMPTY_MAP, Collections.EMPTY_MAP, Collections.EMPTY_MAP, 1, true, PROJECT_NAME, false, "VNF_API");
+ }
+
+ private ServiceInstantiation generateALaCarteServiceDeletionPayload() {
+ return generateMockALaCarteServiceDeletionPayload(false, Collections.EMPTY_MAP, Collections.EMPTY_MAP, Collections.EMPTY_MAP, 1, true, PROJECT_NAME, false, "VNF_API", "1234567890");
+ }
+
+ static class MockedJob implements Job {
+
+ private static Map<UUID, MockedJob> uuidToJob = new HashMap<>();
+
+ public static void putJob(UUID uuid, MockedJob job) {
+ uuidToJob.put(uuid, job);
+ }
+
+ public static MockedJob getJob(UUID uuid) {
+ return uuidToJob.get(uuid);
+ }
+
+
+ private String optimisticUniqueServiceInstanceName;
+
+ public MockedJob(String optimisticUniqueServiceInstanceName) {
+ this.optimisticUniqueServiceInstanceName = optimisticUniqueServiceInstanceName;
+ }
+
+ private UUID uuid = UUID.randomUUID();
+
+ @Override
+ public UUID getUuid() {
+ return uuid;
+ }
+
+ @Override
+ public void setUuid(UUID uuid) {
+ this.uuid = uuid;
+ }
+
+ @Override
+ public JobStatus getStatus() {
+ return JobStatus.PENDING;
+ }
+
+ @Override
+ public void setStatus(JobStatus status) {
+
+ }
+
+ @Override
+ public Map<String, Object> getData() {
+ return null;
+ }
+
+ @Override
+ public JobSharedData getSharedData() {
+ return new JobSharedData(uuid, "", null);
+ }
+
+ @Override
+ public void setTypeAndData(JobType jobType, Map<String, Object> commandData) {
+
+ }
+
+ @Override
+ public UUID getTemplateId() {
+ return null;
+ }
+
+ @Override
+ public void setTemplateId(UUID templateId) {
+
+ }
+
+ @Override
+ public Integer getIndexInBulk() {
+ return null;
+ }
+
+ @Override
+ public void setIndexInBulk(Integer indexInBulk) {
+
+ }
+
+ @Override
+ public JobType getType() {
+ return null;
+ }
+
+ public String getOptimisticUniqueServiceInstanceName() {
+ return optimisticUniqueServiceInstanceName;
+ }
+ }
}
diff --git a/vid-app-common/src/test/java/org/onap/vid/services/AuditServiceImplTest.java b/vid-app-common/src/test/java/org/onap/vid/services/AuditServiceImplTest.java
index 3d2a20b63..a1e027f82 100644
--- a/vid-app-common/src/test/java/org/onap/vid/services/AuditServiceImplTest.java
+++ b/vid-app-common/src/test/java/org/onap/vid/services/AuditServiceImplTest.java
@@ -19,18 +19,28 @@
*/
package org.onap.vid.services;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.MockitoAnnotations.initMocks;
-
-import java.util.UUID;
import org.glassfish.grizzly.http.util.HttpStatus;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
+import org.onap.vid.model.JobAuditStatus;
+import org.onap.vid.mso.rest.AsyncRequestStatusList;
+import org.onap.vid.testUtils.TestUtils;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
+import java.io.IOException;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+import static java.util.stream.Collectors.toList;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.*;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.MockitoAnnotations.initMocks;
+
public class AuditServiceImplTest {
@Mock
private AsyncInstantiationBusinessLogic asyncInstantiationBL;
@@ -60,4 +70,20 @@ public class AuditServiceImplTest {
Mockito.anyString(),
Mockito.anyString());
}
+
+ @Test
+ public void testConvertMsoResponseStatusToJobAuditStatus_missingDateFromMso_shouldNoError() throws IOException {
+ final AsyncRequestStatusList asyncRequestStatusList = TestUtils.readJsonResourceFileAsObject("/orchestrationRequestsByServiceInstanceId.json", AsyncRequestStatusList.class);
+
+ AuditServiceImpl auditService = new AuditServiceImpl(null, null);
+
+ final List<JobAuditStatus> jobAuditStatuses = auditService.convertMsoResponseStatusToJobAuditStatus(asyncRequestStatusList.getRequestList(), "foo");
+
+ final List<Date> dates = jobAuditStatuses.stream().map(JobAuditStatus::getCreatedDate).collect(toList());
+ final List<String> statuses = jobAuditStatuses.stream().map(JobAuditStatus::getJobStatus).collect(toList());
+
+ assertThat(dates, containsInAnyOrder(notNullValue(), notNullValue(), nullValue()));
+ assertThat(statuses, containsInAnyOrder("COMPLETE", "COMPLETE", "IN_PROGRESS"));
+ }
+
}
diff --git a/vid-app-common/src/test/java/org/onap/vid/services/BulkInstantiationServiceImplTest.java b/vid-app-common/src/test/java/org/onap/vid/services/BulkInstantiationServiceImplTest.java
index 6677da357..76963facb 100644
--- a/vid-app-common/src/test/java/org/onap/vid/services/BulkInstantiationServiceImplTest.java
+++ b/vid-app-common/src/test/java/org/onap/vid/services/BulkInstantiationServiceImplTest.java
@@ -19,17 +19,6 @@
*/
package org.onap.vid.services;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.reset;
-import static org.mockito.Mockito.when;
-import static org.mockito.MockitoAnnotations.initMocks;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.UUID;
-import javax.ws.rs.NotFoundException;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.onap.vid.job.Job;
@@ -43,6 +32,14 @@ import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Test;
+import javax.ws.rs.NotFoundException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import static org.mockito.Mockito.*;
+import static org.mockito.MockitoAnnotations.initMocks;
+
public class BulkInstantiationServiceImplTest {
@Mock
@@ -66,23 +63,6 @@ public class BulkInstantiationServiceImplTest {
}
@Test
- public void saveBulkTest() {
- UUID uuid = UUID.randomUUID();
- Map<String, Object> bulkRequest = new HashMap<>();
- List<Job> jobList = new ArrayList<>();
- jobList.add(createJob(uuid));
- when(jobAdapter.createBulkOfJobs(bulkRequest)).thenReturn(jobList);
-
- JobBulk jobBulk = createJobBulk(jobList);
- when(jobAdapter.toModelBulk(jobList)).thenReturn(jobBulk);
-
- JobBulk result = testSubject.saveBulk(bulkRequest);
-
- Assert.assertEquals(result.getJobs().size(), jobList.size());
- Assert.assertEquals(result.getJobs().get(0).getUuid(), uuid);
- }
-
- @Test
public void getJobTest() {
UUID uuid = UUID.randomUUID();
Job job = createJob(uuid);
diff --git a/vid-app-common/src/test/java/org/onap/vid/services/ChangeManagementServiceImplTest.java b/vid-app-common/src/test/java/org/onap/vid/services/ChangeManagementServiceImplTest.java
index 00d9e1735..47411e2a2 100644
--- a/vid-app-common/src/test/java/org/onap/vid/services/ChangeManagementServiceImplTest.java
+++ b/vid-app-common/src/test/java/org/onap/vid/services/ChangeManagementServiceImplTest.java
@@ -15,7 +15,6 @@ import static org.mockito.Mockito.verify;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNull;
-@Test
public class ChangeManagementServiceImplTest {
@Mock
@@ -27,6 +26,9 @@ public class ChangeManagementServiceImplTest {
@Mock
SchedulerRestInterfaceIfc schedulerRestInterface;
+ @Mock
+ CloudOwnerService cloudOwnerService;
+
@BeforeMethod
public void initMocks(){
MockitoAnnotations.initMocks(this);
@@ -34,14 +36,14 @@ public class ChangeManagementServiceImplTest {
@Test
public void doChangeManagement_requestIsNull_returnsNull() throws Exception {
- ChangeManagementServiceImpl changeManagementService = new ChangeManagementServiceImpl(dataAccessServiceMock, msoBusinessLogicMock, schedulerRestInterface);
+ ChangeManagementServiceImpl changeManagementService = new ChangeManagementServiceImpl(dataAccessServiceMock, msoBusinessLogicMock, schedulerRestInterface, cloudOwnerService);
ResponseEntity<String> result = changeManagementService.doChangeManagement(null,"anyString");
assertNull(result);
}
@Test
public void doChangeManagement_currentRequestDetailsIsNull_returnsNull() throws Exception {
- ChangeManagementServiceImpl changeManagementService = new ChangeManagementServiceImpl(dataAccessServiceMock, msoBusinessLogicMock, schedulerRestInterface);
+ ChangeManagementServiceImpl changeManagementService = new ChangeManagementServiceImpl(dataAccessServiceMock, msoBusinessLogicMock, schedulerRestInterface, cloudOwnerService);
ChangeManagementServiceImpl changeManagementServiceSpied = Mockito.spy(changeManagementService);
Mockito.doReturn(null).when(changeManagementServiceSpied).findRequestByVnfName(Matchers.anyList(),Mockito.anyString());
@@ -59,7 +61,7 @@ public class ChangeManagementServiceImplTest {
ArgumentCaptor<RequestDetails> argumentCaptor = ArgumentCaptor.forClass(RequestDetails.class);
verify(msoBusinessLogicMock).updateVnf(argumentCaptor.capture(),Mockito.any(),Mockito.any());
- assertEquals(argumentCaptor.getValue().getVnfInstanceId(),requestDetails.getVnfInstanceId());
+ assertEquals(argumentCaptor.getValue().getVnfInstanceId(), requestDetails.getVnfInstanceId());
}
@Test
@@ -71,7 +73,7 @@ public class ChangeManagementServiceImplTest {
ArgumentCaptor<RequestDetails> argumentCaptor = ArgumentCaptor.forClass(RequestDetails.class);
verify(msoBusinessLogicMock).replaceVnf(argumentCaptor.capture(),Mockito.any(),Mockito.any());
- assertEquals(argumentCaptor.getValue().getVnfInstanceId(),requestDetails.getVnfInstanceId());
+ assertEquals(argumentCaptor.getValue().getVnfInstanceId(), requestDetails.getVnfInstanceId());
}
@Test
@@ -83,7 +85,7 @@ public class ChangeManagementServiceImplTest {
ArgumentCaptor<RequestDetails> argumentCaptor = ArgumentCaptor.forClass(RequestDetails.class);
verify(msoBusinessLogicMock).updateVnfSoftware(argumentCaptor.capture(),Mockito.any(),Mockito.any());
- assertEquals(argumentCaptor.getValue().getVnfInstanceId(),requestDetails.getVnfInstanceId());
+ assertEquals(argumentCaptor.getValue().getVnfInstanceId(), requestDetails.getVnfInstanceId());
}
@Test
@@ -95,11 +97,11 @@ public class ChangeManagementServiceImplTest {
ArgumentCaptor<RequestDetails> argumentCaptor = ArgumentCaptor.forClass(RequestDetails.class);
verify(msoBusinessLogicMock).updateVnfConfig(argumentCaptor.capture(),Mockito.any(),Mockito.any());
- assertEquals(argumentCaptor.getValue().getVnfInstanceId(),requestDetails.getVnfInstanceId());
+ assertEquals(argumentCaptor.getValue().getVnfInstanceId(), requestDetails.getVnfInstanceId());
}
private RequestDetails callChangeManagement(String requestType) throws Exception {
- ChangeManagementServiceImpl changeManagementService = new ChangeManagementServiceImpl(dataAccessServiceMock, msoBusinessLogicMock, schedulerRestInterface);
+ ChangeManagementServiceImpl changeManagementService = new ChangeManagementServiceImpl(dataAccessServiceMock, msoBusinessLogicMock, schedulerRestInterface, cloudOwnerService);
ChangeManagementServiceImpl changeManagementServiceSpied = Mockito.spy(changeManagementService);
ChangeManagementRequest updateRequest = new ChangeManagementRequest();
@@ -109,7 +111,7 @@ public class ChangeManagementServiceImplTest {
Mockito.doReturn("fakeId").when(changeManagementServiceSpied).extractServiceInstanceId(Mockito.any(),Mockito.any());
Mockito.doReturn(requestDetails).when(changeManagementServiceSpied).findRequestByVnfName(Matchers.any(),Mockito.any());
- changeManagementServiceSpied.doChangeManagement(updateRequest,"anyVnfName");
+ changeManagementServiceSpied.doChangeManagement(updateRequest, "anyVnfName");
return requestDetails;
}
diff --git a/vid-app-common/src/test/java/org/onap/vid/services/ChangeManagementServiceTest.java b/vid-app-common/src/test/java/org/onap/vid/services/ChangeManagementServiceTest.java
deleted file mode 100644
index f3df4c6a9..000000000
--- a/vid-app-common/src/test/java/org/onap/vid/services/ChangeManagementServiceTest.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package org.onap.vid.services;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.onap.vid.changeManagement.ChangeManagementRequest;
-import org.onap.vid.changeManagement.ChangeManagementResponse;
-import org.springframework.http.ResponseEntity;
-
-import junit.framework.Assert;
-
-import static org.junit.Assert.*;
-
-
-public class ChangeManagementServiceTest {
- @Before
- public void setUp() throws Exception {
- }
-
- @After
- public void tearDown() throws Exception {
- }
-
- @Test
- public void doChangeManagement_requestTypeIsUpdateVnfNotFound_doUpdateAndReturnNull() throws Exception {
-
- }
-
-} \ No newline at end of file
diff --git a/vid-app-common/src/test/java/org/onap/vid/services/ChangeManagementServiceUnitTest.java b/vid-app-common/src/test/java/org/onap/vid/services/ChangeManagementServiceUnitTest.java
index d849869b0..9d11ad32a 100644
--- a/vid-app-common/src/test/java/org/onap/vid/services/ChangeManagementServiceUnitTest.java
+++ b/vid-app-common/src/test/java/org/onap/vid/services/ChangeManagementServiceUnitTest.java
@@ -29,8 +29,8 @@ import org.onap.portalsdk.core.util.SystemProperties;
import org.onap.vid.changeManagement.ChangeManagementRequest;
import org.onap.vid.changeManagement.RequestDetailsWrapper;
import org.onap.vid.client.SyncRestClient;
-import org.onap.vid.controllers.MsoConfig;
-import org.onap.vid.controllers.WebConfig;
+import org.onap.vid.controller.MsoConfig;
+import org.onap.vid.controller.WebConfig;
import org.onap.vid.model.RequestReferencesContainer;
import org.onap.vid.mso.MsoBusinessLogic;
import org.onap.vid.mso.MsoInterface;
@@ -116,15 +116,14 @@ public class ChangeManagementServiceUnitTest extends AbstractTestNGSpringContext
@Configuration
public static class TestMsoConfig extends MsoConfig {
- @Override
public MsoRestClientNew getMsoClient() {
MsoRestClientNew spyClient = spy(new MsoRestClientNew(new SyncRestClient(), ""));
return spyClient;
}
@Bean
- public ChangeManagementService getChangeManagementService(DataAccessService dataAccessService, MsoBusinessLogic msoInterface, SchedulerRestInterfaceIfc schedulerRestInterface) {
- return new ChangeManagementServiceImpl(dataAccessService, msoInterface, schedulerRestInterface);
+ public ChangeManagementService getChangeManagementService(DataAccessService dataAccessService, MsoBusinessLogic msoInterface, SchedulerRestInterfaceIfc schedulerRestInterface, CloudOwnerService cloudOwnerService) {
+ return new ChangeManagementServiceImpl(dataAccessService, msoInterface, schedulerRestInterface, cloudOwnerService);
}
}
}
diff --git a/vid-app-common/src/test/java/org/onap/vid/services/CloudOwnerServiceTest.java b/vid-app-common/src/test/java/org/onap/vid/services/CloudOwnerServiceTest.java
new file mode 100644
index 000000000..d6148bf28
--- /dev/null
+++ b/vid-app-common/src/test/java/org/onap/vid/services/CloudOwnerServiceTest.java
@@ -0,0 +1,125 @@
+package org.onap.vid.services;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.onap.vid.aai.AaiClientInterface;
+import org.onap.vid.exceptions.GenericUncheckedException;
+import org.onap.vid.mso.model.CloudConfiguration;
+import org.onap.vid.mso.rest.RequestDetails;
+import org.onap.vid.properties.Features;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+import org.togglz.core.manager.FeatureManager;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.hasKey;
+import static org.hamcrest.Matchers.not;
+import static org.mockito.Mockito.when;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNull;
+
+public class CloudOwnerServiceTest {
+
+ @Mock
+ private AaiClientInterface aaiClient;
+
+ @Mock
+ private FeatureManager featureManager;
+
+ @InjectMocks
+ private CloudOwnerServiceImpl cloudOwnerService;
+
+ @BeforeClass
+ public void initMocks() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @AfterMethod
+ public void resetMocks() {
+ Mockito.reset(aaiClient);
+ Mockito.reset(featureManager);
+ }
+
+ @DataProvider
+ public static Object[][] testEnrichRequestDataProvider() {
+ return new Object[][]{{true}, {false}};
+ }
+
+ @Test(dataProvider = "testEnrichRequestDataProvider")
+ public void whenCloudConfigurationInAdditionalProperties_cloudConfigurationIsEnrichedWithCloudOwner(boolean isFeatureActive) {
+ when(featureManager.isActive(Features.FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST)).thenReturn(isFeatureActive);
+ String lcpCloudRegionId = "lcp1";
+ RequestDetails requestDetails = createRequestDetailsWithCloudConfigurationInAdditionalProperties(lcpCloudRegionId);
+ String aaiCloudOwner = "myCloudOwner";
+ when(aaiClient.getCloudOwnerByCloudRegionId(lcpCloudRegionId)).thenReturn(aaiCloudOwner);
+ cloudOwnerService.enrichRequestWithCloudOwner(requestDetails);
+ if (isFeatureActive) {
+ assertEquals(aaiCloudOwner, requestDetails.extractValueByPathUsingAdditionalProperties(
+ ImmutableList.of("requestDetails", "cloudConfiguration", "cloudOwner"), String.class));
+ }
+ else {
+ Map<String,Object> cloudConfiguration = requestDetails.extractValueByPathUsingAdditionalProperties(
+ ImmutableList.of("requestDetails", "cloudConfiguration"), Map.class);
+ assertThat(cloudConfiguration, not(hasKey("cloudOwner")));
+ }
+ }
+
+ @Test(dataProvider = "testEnrichRequestDataProvider")
+ public void whenCloudConfigurationInRequestDetailsField_cloudConfigurationIsEnrichedWithCloudOwner(boolean isFeatureActive) {
+ when(featureManager.isActive(Features.FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST)).thenReturn(isFeatureActive);
+ String lcpCloudRegionId = "lcp1";
+ RequestDetails requestDetails = createRequestDetailsWithCloudField(lcpCloudRegionId);
+ String aaiCloudOwner = "myCloudOwner";
+ when(aaiClient.getCloudOwnerByCloudRegionId(lcpCloudRegionId)).thenReturn(aaiCloudOwner);
+ cloudOwnerService.enrichRequestWithCloudOwner(requestDetails);
+ if (isFeatureActive) {
+ assertEquals(aaiCloudOwner, requestDetails.getCloudConfiguration().getCloudOwner());
+ }
+ else {
+ assertNull(requestDetails.getCloudConfiguration().getCloudOwner());
+ }
+ }
+
+ private RequestDetails createRequestDetailsWithCloudConfigurationInAdditionalProperties(String lcpCloudRegionId) {
+ RequestDetails requestDetails = new RequestDetails();
+ Map<String, Object> cloudConfiguration = new HashMap<>();
+ cloudConfiguration.put("lcpCloudRegionId", lcpCloudRegionId);
+ requestDetails.setAdditionalProperty("requestDetails",
+ ImmutableMap.of("cloudConfiguration", cloudConfiguration));
+ return requestDetails;
+ }
+
+ private RequestDetails createRequestDetailsWithCloudField(String lcpCloudRegionId) {
+ CloudConfiguration cloudConfiguration = new CloudConfiguration();
+ cloudConfiguration.setLcpCloudRegionId(lcpCloudRegionId);
+ RequestDetails requestDetails = new RequestDetails();
+ requestDetails.setCloudConfiguration(cloudConfiguration);
+ return requestDetails;
+ }
+
+ @Test(expectedExceptions= GenericUncheckedException.class)
+ public void whenAaiClientThrowException_thenExceptionIsPopulatedByEnrichMethod() {
+ when(featureManager.isActive(Features.FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST)).thenReturn(true);
+ String lcpCloudRegionId = "lcp1";
+ RequestDetails requestDetails = createRequestDetailsWithCloudConfigurationInAdditionalProperties(lcpCloudRegionId);
+ when(aaiClient.getCloudOwnerByCloudRegionId(lcpCloudRegionId)).thenThrow(new RuntimeException());
+ cloudOwnerService.enrichRequestWithCloudOwner(requestDetails);
+ }
+
+ @Test
+ public void whenThereIsNoCloudConfiguration_enrichmentMethodNotFailed() {
+ when(featureManager.isActive(Features.FLAG_1810_CR_ADD_CLOUD_OWNER_TO_MSO_REQUEST)).thenReturn(true);
+ RequestDetails requestDetails = new RequestDetails();
+ cloudOwnerService.enrichRequestWithCloudOwner(requestDetails);
+ //if no exception was thrown test success
+ }
+}
diff --git a/vid-app-common/src/test/java/org/onap/vid/services/CsvServiceTest.java b/vid-app-common/src/test/java/org/onap/vid/services/CsvServiceTest.java
index 051a1cf45..d231de8b6 100644
--- a/vid-app-common/src/test/java/org/onap/vid/services/CsvServiceTest.java
+++ b/vid-app-common/src/test/java/org/onap/vid/services/CsvServiceTest.java
@@ -1,80 +1,82 @@
-//package org.onap.vid.services;
-//import org.apache.commons.io.IOUtils;
-//import org.onap.vid.services.CsvServiceImpl;
-//import org.skyscreamer.jsonassert.JSONAssert;
-//import org.skyscreamer.jsonassert.JSONCompareMode;
-//import org.testng.Assert;
-//import org.testng.annotations.DataProvider;
-//import org.testng.annotations.Test;
-//import org.json.JSONObject;
-//
-//import javax.ws.rs.BadRequestException;
-//import java.io.IOException;
-//import java.lang.reflect.Method;
-//import java.net.URL;
-//import java.util.List;
-//
-//@Test
-//public class CsvServiceTest {
-//
-// private CsvServiceImpl csvService = new CsvServiceImpl();
-// private final static String CSV_FOLDER = "csv_files/{CSV_FILE}";
-// private final static String VALID_CSV = "csv_to_json.csv";
-// private final static String ONE_LINE_CSV = "one_line.csv";
-// private final static String EMPTY_CSV = "empty_file.csv";
-// private final static String MISSING_CONTENT_CSV = "missing_content.csv";
-// private final static String MISSING_VALUES_CSV = "missing_values.csv";
-//
-//
-///*
-// @Test
-// public void parseValidCsv() throws IllegalAccessException, IOException, InstantiationException {
-// String expectedJson = getExpectation("vnfConfigUpdatePayload.json");
-// readAndParse(VALID_CSV,16,expectedJson);
-//
-// }*/
-//
-// private String getExpectation(String modelFileName) throws IOException {
-// // load expected result
-// final URL resource = this.getClass().getResource("/" + modelFileName);
-// String expected = IOUtils.toString(resource, "UTF-8");
-// return expected;
-// }
-///*
-// @Test
-// public void parseOneLineCsv() throws IllegalAccessException, IOException, InstantiationException {
-// String expectedJson ="{\"payload\":{\"request-parameters\":{\"vnf-name\":\"ibcx0099v\"}}}";
-// readAndParse(ONE_LINE_CSV,1,expectedJson);
-// }*/
-//
-// @DataProvider
-// public static Object[][] invalidFiles(Method test) {
-// return new Object[][]{
-// {MISSING_CONTENT_CSV}, {MISSING_VALUES_CSV}
-// };
-// }
-///*
-// @Test(dataProvider = "invalidFiles", expectedExceptions = {BadRequestException.class}, expectedExceptionsMessageRegExp = "Invalid csv file")
-// public void parseMissingContentCsv(String invalidFile) throws IllegalAccessException, IOException, InstantiationException {
-// readAndParse(invalidFile, 2, null);
-// }
-//
-//
-// @Test
-// public void parseEmptyCsv() throws IllegalAccessException, IOException, InstantiationException {
-// String expectedJson ="{}";
-// readAndParse(EMPTY_CSV,0,expectedJson);
-// }
-//
-// private void readAndParse(String fileName, int expectedNumRows, String expectedJson) throws IllegalAccessException, IOException, InstantiationException {
-// final URL resource = CsvServiceTest.class.getClassLoader().getResource(CSV_FOLDER.replaceFirst("\\{CSV_FILE\\}", fileName));
-// Assert.assertNotNull(resource, "The csv file was not found");
-// List<String[]> content = csvService.readCsv(resource.getPath());
-// Assert.assertEquals(content.size(), expectedNumRows, "The number of non-empty lines in file is wrong");
-// JSONObject json = csvService.convertCsvToJson (content);
-// JSONAssert.assertEquals(expectedJson, json, JSONCompareMode.STRICT);
-//
-// }*/
-//
-//
-//}
+package org.onap.vid.services;
+
+import org.apache.commons.io.IOUtils;
+import org.json.JSONObject;
+import org.skyscreamer.jsonassert.JSONAssert;
+import org.skyscreamer.jsonassert.JSONCompareMode;
+import org.testng.Assert;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import javax.ws.rs.BadRequestException;
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.util.List;
+
+public class CsvServiceTest {
+
+ private CsvServiceImpl csvService = new CsvServiceImpl();
+ private final static String CSV_FOLDER = "csv_files/{CSV_FILE}";
+ private final static String VALID_CSV = "csv_to_json.csv";
+ private final static String ONE_LINE_CSV = "one_line.csv";
+ private final static String EMPTY_CSV = "empty_file.csv";
+ private final static String MISSING_CONTENT_CSV = "missing_content.csv";
+ private final static String MISSING_VALUES_CSV = "missing_values.csv";
+
+
+
+ @Test
+ public void parseValidCsv() throws IllegalAccessException, IOException, InstantiationException {
+ String expectedJson = getExpectation("vnfConfigUpdatePayload.json");
+ readAndParse(VALID_CSV,16,expectedJson);
+
+ }
+
+ private String getExpectation(String modelFileName) throws IOException {
+ // load expected result
+ final URL resource = this.getClass().getResource("/" + modelFileName);
+ String expected = IOUtils.toString(resource, "UTF-8");
+ return expected;
+ }
+
+ @Test
+ public void parseOneLineCsv() throws IllegalAccessException, IOException, InstantiationException {
+ String expectedJson ="{\"payload\":{\"request-parameters\":{\"vnf-name\":\"ibcx0099v\"}}}";
+ readAndParse(ONE_LINE_CSV,1,expectedJson);
+ }
+
+ @DataProvider
+ public static Object[][] invalidFiles(Method test) {
+ return new Object[][]{
+ {MISSING_CONTENT_CSV}, {MISSING_VALUES_CSV}
+ };
+ }
+
+ @Test(dataProvider = "invalidFiles", expectedExceptions = {BadRequestException.class}, expectedExceptionsMessageRegExp = "Invalid csv file")
+ public void parseMissingContentCsv(String invalidFile) throws IllegalAccessException, IOException, InstantiationException {
+ readAndParse(invalidFile, 2, null);
+ }
+
+
+ @Test
+ public void parseEmptyCsv() throws IllegalAccessException, IOException, InstantiationException {
+ String expectedJson ="{}";
+ readAndParse(EMPTY_CSV,0,expectedJson);
+ }
+
+ private void readAndParse(String fileName, int expectedNumRows, String expectedJson) throws IllegalAccessException, IOException, InstantiationException {
+ final URL resource = CsvServiceTest.class.getClassLoader().getResource(CSV_FOLDER.replaceFirst("\\{CSV_FILE\\}", fileName));
+ Assert.assertNotNull(resource, "The csv file was not found");
+ //using URLDecoder.decode to convert special characters from %XX to real character
+ //see https://stackoverflow.com/questions/32251251/java-classloader-getresource-with-special-characters-in-path
+ List<String[]> content = csvService.readCsv(URLDecoder.decode(resource.getPath(), "UTF-8"));
+ Assert.assertEquals(content.size(), expectedNumRows, "The number of non-empty lines in file is wrong");
+ JSONObject json = csvService.convertCsvToJson (content);
+ JSONAssert.assertEquals(expectedJson, json, JSONCompareMode.STRICT);
+
+ }
+
+
+}
diff --git a/vid-app-common/src/test/java/org/onap/vid/services/JobsBrokerServiceTest.java b/vid-app-common/src/test/java/org/onap/vid/services/JobsBrokerServiceTest.java
index ff4b34f5f..3686dc26e 100644
--- a/vid-app-common/src/test/java/org/onap/vid/services/JobsBrokerServiceTest.java
+++ b/vid-app-common/src/test/java/org/onap/vid/services/JobsBrokerServiceTest.java
@@ -1,616 +1,675 @@
package org.onap.vid.services;
-//
-//import com.google.common.collect.ImmutableList;
-//import com.google.common.collect.ImmutableMap;
-//import org.apache.commons.lang.RandomStringUtils;
-//import org.apache.commons.lang3.RandomUtils;
-//import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
-//import org.apache.commons.lang3.builder.ToStringStyle;
-//import org.hibernate.SessionFactory;
-//import org.onap.vid.exceptions.GenericUncheckedException;
-//import org.onap.vid.exceptions.OperationNotAllowedException;
-//import org.onap.vid.job.Job;
-//import org.onap.vid.job.JobAdapter;
-//import org.onap.vid.job.JobType;
-//import org.onap.vid.job.JobsBrokerService;
-//import org.onap.vid.job.impl.JobDaoImpl;
-//import org.onap.vid.job.impl.JobsBrokerServiceInDatabaseImpl;
-//import org.onap.vid.utils.DaoUtils;
-//import org.onap.vid.config.DataSourceConfig;
-//import org.onap.vid.config.JobAdapterConfig;
-//import org.onap.portalsdk.core.domain.support.DomainVo;
-//import org.onap.portalsdk.core.service.DataAccessService;
-//import org.onap.portalsdk.core.util.SystemProperties;
-//import org.springframework.test.context.ContextConfiguration;
-//import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
-//import org.testng.Assert;
-//import org.testng.annotations.AfterMethod;
-//import org.testng.annotations.BeforeMethod;
-//import org.testng.annotations.DataProvider;
-//import org.testng.annotations.Test;
-//
-//import javax.inject.Inject;
-//import java.lang.reflect.Method;
-//import java.time.LocalDateTime;
-//import java.time.ZoneId;
-//import java.util.*;
-//import java.util.concurrent.*;
-//import java.util.stream.Collectors;
-//import java.util.stream.IntStream;
-//import java.util.stream.Stream;
-//
-//import static java.util.concurrent.TimeUnit.MILLISECONDS;
-//import static org.hamcrest.CoreMatchers.equalTo;
-//import static org.hamcrest.CoreMatchers.is;
-//import static org.hamcrest.MatcherAssert.assertThat;
-//import static org.hamcrest.Matchers.both;
-//import static org.hamcrest.Matchers.containsInAnyOrder;
-//import static org.onap.vid.job.Job.JobStatus.*;
-//import static org.onap.vid.utils.Streams.not;
-//import static org.testng.Assert.assertNotNull;
-//import static org.testng.AssertJUnit.assertEquals;
-//
-//@ContextConfiguration(classes = {DataSourceConfig.class, SystemProperties.class, JobAdapterConfig.class})
-//public class JobsBrokerServiceTest extends AbstractTestNGSpringContextTests {
-//
-// private static final int JOBS_COUNT = 127;
-// private static final boolean DELETED = true;
-// private final ExecutorService executor = Executors.newFixedThreadPool(90);
-//
-// private final Set<Long> threadsIds = new ConcurrentSkipListSet<>();
-//
-// private final long FEW = 500;
-//
-// private final String JOBS_SHOULD_MATCH = "the jobs that added and those that pulled must be the same";
-// private final String JOBS_PEEKED_SHOULD_MATCH = "the jobs that added and those that peeked must be the same";
-// private static final String DELETE_SERVICE_INFO_STATUS_EXCEPTION_MESSAGE = "Service status does not allow deletion from the queue";
-// private static final String DELETE_SERVICE_NOT_EXIST_EXCEPTION_MESSAGE = "Service does not exist";
-// private JobsBrokerService broker;
-//
-// @Inject
-// JobAdapter jobAdapter;
-// @Inject
-// private DataAccessService dataAccessService;
-// @Inject
-// private SessionFactory sessionFactory;
-//
-// /*
-// - pulling jobs is limited to inserted ones
-// - putting back allows getting the job again
-// - multi threads safety
-// - any added job should be visible with view
-//
-// - edges:
-// - pulling with empty repo should return empty optional
-// - pulling more than expected should return empty optional
-// - putting one, over-pulling from a different thread
-// - take before inserting, then insert while waiting
-//
-// */
-//
-// private class NoJobException extends RuntimeException {
-// }
-//
-// private Future<Job> newJobAsync(JobsBrokerService b) {
-// return newJobAsync(b, createMockJob("user id"));
-// }
-//
-// private Future<Job> newJobAsync(JobsBrokerService b, Job.JobStatus status) {
-// return newJobAsync(b, createMockJob("user id", status));
-// }
-//
-// private Job createMockJob(String userId) {
-// return jobAdapter.createJob(
-// JobType.NoOp,
-// new JobAdapter.AsyncJobRequest() {
-// public int nothing = 42;
-// },
-// UUID.randomUUID(),
-// userId,
-// RandomUtils.nextInt());
-// }
-//
-// private Job createMockJob(String userId, Job.JobStatus jobStatus) {
-// Job job = createMockJob(userId);
-// job.setStatus(jobStatus);
-// return job;
-// }
-//
-// private Future<Job> newJobAsync(JobsBrokerService b, Job job) {
-// final Future<Job> jobFuture = executor.submit(() -> {
-// accountThreadId();
-//
-// b.add(job);
-//
-// return job;
-// });
-// return jobFuture;
-// }
-//
-// private void pushBackJobAsync(JobsBrokerService b, Job job) {
-// executor.submit(() -> {
-// accountThreadId();
-// b.pushBack(job);
-// return job;
-// });
-// }
-//
-// private Future<Optional<Job>> pullJobAsync(JobsBrokerService broker) {
-// final Future<Optional<Job>> job = executor.submit(() -> {
-// accountThreadId();
-// // Pull only pending jobs, as H2 database does not support our SQL for in-progress jobs
-// return broker.pull(Job.JobStatus.PENDING, UUID.randomUUID().toString());
-// });
-// return job;
-// }
-//
-// private Job waitForFutureOptionalJob(Future<Optional<Job>> retrievedOptionalJobFuture) {
-// try {
-// return retrievedOptionalJobFuture.get(FEW, MILLISECONDS).orElseThrow(NoJobException::new);
-// } catch (TimeoutException | InterruptedException | ExecutionException e) {
-// throw new RuntimeException(e);
-// }
-// }
-//
-// private Job waitForFutureJob(Future<Job> retrievedJobFuture) {
-// try {
-// return retrievedJobFuture.get(FEW, MILLISECONDS);
-// } catch (TimeoutException | InterruptedException | ExecutionException e) {
-// throw new RuntimeException(e);
-// }
-// }
-//
-// private List<Job> putAndGetALotOfJobs(JobsBrokerService broker) {
-// final List<Job> originalJobs = putALotOfJobs(broker);
-// final List<Job> retrievedJobs = getAlotOfJobs(broker);
-//
-// assertThat(JOBS_SHOULD_MATCH, retrievedJobs, containsInAnyOrder(originalJobs.toArray()));
-//
-// return retrievedJobs;
-// }
-//
-// private List<Job> putALotOfJobs(JobsBrokerService broker) {
-// int n = JOBS_COUNT;
-// return IntStream.range(0, n)
-// .mapToObj(i -> newJobAsync(broker))
-// .map(this::waitForFutureJob)
-// .collect(Collectors.toList());
-// }
-//
-// private List<Job> getAlotOfJobs(JobsBrokerService broker) {
-// int n = JOBS_COUNT;
-// return IntStream.range(0, n)
-// .mapToObj(i -> pullJobAsync(broker))
-// .map(this::waitForFutureOptionalJob)
-// .collect(Collectors.toList());
-// }
-//
-// private void pushBackJobs(List<Job> jobs, JobsBrokerService broker) {
-// jobs.forEach(job -> pushBackJobAsync(broker, job));
-// }
-//
-// private void accountThreadId() {
-// threadsIds.add(Thread.currentThread().getId());
-// }
-//
-// @AfterMethod
-// public void threadsCounter() {
-// System.out.println("participating threads count: " + threadsIds.size());
-// threadsIds.clear();
-// }
-//
-// @BeforeMethod
-// public void initializeBroker() {
-// broker = new JobsBrokerServiceInDatabaseImpl(dataAccessService, sessionFactory, 200, 0);
-// ((JobsBrokerServiceInDatabaseImpl) broker).deleteAll();
-// }
-//
-// @Test
-// public void givenSingleJob_getIt_verifySameJob() {
-// final Job originalJob = waitForFutureJob(newJobAsync(broker));
-//
-// final Job retrievedJob = waitForFutureOptionalJob(pullJobAsync(broker));
-// assertThat(JOBS_SHOULD_MATCH, retrievedJob, is(originalJob));
-// }
-//
-// @Test
-// public void givenManyJobs_getJobsAndPushThemBack_alwaysSeeAllOfThemWithPeek() throws InterruptedException {
-// final List<Job> originalJobs = putALotOfJobs(broker);
-//
-// MILLISECONDS.sleep(FEW);
-// assertThat(JOBS_PEEKED_SHOULD_MATCH, broker.peek(), containsInAnyOrder(originalJobs.toArray()));
-//
-// final Job retrievedJob = waitForFutureOptionalJob(pullJobAsync(broker));
-//
-// MILLISECONDS.sleep(FEW);
-// assertThat(JOBS_PEEKED_SHOULD_MATCH, broker.peek(), containsInAnyOrder(originalJobs.toArray()));
-//
-// pushBackJobAsync(broker, retrievedJob);
-//
-// MILLISECONDS.sleep(FEW);
-// assertThat(JOBS_PEEKED_SHOULD_MATCH, broker.peek(), containsInAnyOrder(originalJobs.toArray()));
-// }
-//
-// @Test
-// public void givenManyJobs_getThemAll_verifySameJobs() {
-// putAndGetALotOfJobs(broker);
-// }
-//
-// @Test
-// public void givenManyJobs_getThemAllThenPushBackandGet_verifySameJobs() {
-// final List<Job> retrievedJobs1 = putAndGetALotOfJobs(broker);
-//
-// pushBackJobs(retrievedJobs1, broker);
-// final List<Job> retrievedJobs2 = getAlotOfJobs(broker);
-//
-// assertThat(JOBS_SHOULD_MATCH, retrievedJobs2, containsInAnyOrder(retrievedJobs1.toArray()));
-// }
-//
-// private static Date toDate(LocalDateTime localDateTime) {
-// return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
-// }
-//
-// private void setModifiedDateToJob(UUID jobUuid, Date date) {
-// DomainVo job = dataAccessService.getDomainObject(JobDaoImpl.class, jobUuid, DaoUtils.getPropsMap());
-// job.setModified(date);
-// DaoUtils.tryWithSessionAndTransaction(sessionFactory, session -> {
-// session.saveOrUpdate(job);
-// return 1;
-// });
-// }
-//
-//
-// public static JobDaoImpl createNewJob(Integer indexInBulk, UUID templateId, String userId, Job.JobStatus status, String takenBy, LocalDateTime date) {
-// return createNewJob(indexInBulk, templateId, userId, status, takenBy, date, false);
-// }
-//
-// public static JobDaoImpl createNewJob(Integer indexInBulk, UUID templateId, String userId, Job.JobStatus status, String takenBy, LocalDateTime date, boolean deleted){
-// JobDaoImpl job = new JobDaoImpl();
-// job.setTypeAndData(JobType.NoOp, ImmutableMap.of("x", RandomStringUtils.randomAlphanumeric(15)));
-// job.setIndexInBulk(indexInBulk);
-// job.setTemplateId(templateId);
-// job.setType(JobType.NoOp);
-// job.setStatus(status);
-// job.setTakenBy(takenBy);
-// job.setCreated(toDate(date));
-// job.setModified(toDate(date));
-// job.setUserId(userId);
-// if (deleted) {
-// job.setDeletedAt(new Date());
-// }
-// return job;
-// }
-//
-// @DataProvider
-// public static Object[][] jobs(Method test) {
-// LocalDateTime oldestDate = LocalDateTime.now().minusHours(30);
-// UUID sameTemplate = UUID.randomUUID();
-// return new Object[][]{
-// {ImmutableList.of(
-// createNewJob(11, UUID.randomUUID(), "userId", PENDING, null, oldestDate),
-// createNewJob(22, UUID.randomUUID(), "userId", PENDING, null, oldestDate),
-// createNewJob(11, UUID.randomUUID(), "userId", PENDING, null, LocalDateTime.now().minusHours(2)),
-// createNewJob(44, UUID.randomUUID(), "userId", PENDING, null, LocalDateTime.now().minusHours(5))),
-// 4,
-// 0,
-// PENDING,
-// "Broker should pull the first pending job by oldest date then by job index"
-// },
-// { ImmutableList.of(
-// createNewJob(11, UUID.randomUUID(), "userId", COMPLETED,null, oldestDate),
-// createNewJob(11, UUID.randomUUID(), "userId", PENDING,null, oldestDate, DELETED),createNewJob(12, UUID.randomUUID(), "userId", FAILED,null, oldestDate),
-// createNewJob(13, UUID.randomUUID(), "userId", IN_PROGRESS,null, oldestDate),
-// createNewJob(14, UUID.randomUUID(), "userId", STOPPED,null, oldestDate),
-// createNewJob(22, UUID.randomUUID(), "userId", PENDING,null, oldestDate),
-// createNewJob(33, UUID.randomUUID(), "userId", PENDING,null, LocalDateTime.now().minusHours(2))),
-// 6,
-// 5,
-// PENDING,
-// "Broker should pull the only pending - first pending job by oldest job - ignore deleted,completed, failed, in-progress and stopped statuses"
-// },
-// {ImmutableList.of(
-// createNewJob(11, UUID.randomUUID(), "userId", IN_PROGRESS, UUID.randomUUID().toString(), oldestDate),
-// createNewJob(22, UUID.randomUUID(), "userId", IN_PROGRESS, UUID.randomUUID().toString(), oldestDate),
-// createNewJob(33, UUID.randomUUID(), "userId", PENDING, null, LocalDateTime.now().minusHours(2))),
-// 2,
-// -1,
-// PENDING,
-// "Broker should not pull any job when it exceeded mso limit with count (in-progress) statuses"
-// },
-// {ImmutableList.of(
-// createNewJob(11, UUID.randomUUID(), "userId", IN_PROGRESS, UUID.randomUUID().toString(), oldestDate),
-// createNewJob(22, UUID.randomUUID(), "userId", PENDING, UUID.randomUUID().toString(), oldestDate),
-// createNewJob(33, UUID.randomUUID(), "userId", PENDING, null, LocalDateTime.now().minusHours(2))),
-// 2,
-// -1,
-// PENDING,
-// "Broker should not pull any job when it exceeded mso limit with count(in-progress or pending && taken) statuses"
-// },
-// {ImmutableList.of(
-// createNewJob(11, UUID.randomUUID(), "userId", IN_PROGRESS, UUID.randomUUID().toString(), oldestDate),
-// createNewJob(22, UUID.randomUUID(), "userId", PENDING, UUID.randomUUID().toString(), oldestDate),
-// createNewJob(33, UUID.randomUUID(), "userId", PENDING, null, LocalDateTime.now().minusHours(2))),
-// 3,
-// 2,
-// PENDING,
-// "Broker should pull first job when it doesn't exceeded mso limit with count(in-progress or pending && taken) statuses"
-// },
-// {ImmutableList.of(
-// createNewJob(11, sameTemplate, "userId", PENDING, UUID.randomUUID().toString(), oldestDate),
-// createNewJob(22, sameTemplate, "userId", PENDING, null, oldestDate),
-// createNewJob(33, sameTemplate, "userId", PENDING, null, LocalDateTime.now().minusHours(2))),
-// 3,
-// -1,
-// PENDING,
-// "Broker should not pull any job when there is another job from this template that was taken"
-// },
-// {ImmutableList.of(
-// createNewJob(11, sameTemplate, "userId", IN_PROGRESS, null, oldestDate),
-// createNewJob(22, sameTemplate, "userId", PENDING, null, oldestDate),
-// createNewJob(33, sameTemplate, "userId", PENDING, null, LocalDateTime.now().minusHours(2))),
-// 3,
-// -1,
-// PENDING,
-// "Broker should not pull any job when there is another job from this template that in progress"
-// },
-// {ImmutableList.of(
-// createNewJob(11, sameTemplate, "userId", FAILED, null, oldestDate),
-// createNewJob(22, sameTemplate, "userId", STOPPED, null, oldestDate),
-// createNewJob(33, sameTemplate, "userId", PENDING, null, LocalDateTime.now().minusHours(2))),
-// 3,
-// -1,
-// PENDING,
-// "Broker should not pull any job when there is another job from this template that was failed"
-// },
-// {ImmutableList.of(
-// createNewJob(11, sameTemplate, "userId", FAILED, null, oldestDate, DELETED),
-// createNewJob(22, sameTemplate, "userId", STOPPED,null, oldestDate),
-// createNewJob(33, sameTemplate, "userId", PENDING,null, LocalDateTime.now().minusHours(2))),
-// 3,
-// 2,
-// PENDING,
-// "Broker should pull pending job when there is another job from this template that was deleted, although failed"
-// },
-// { ImmutableList.of(
-// createNewJob(11, UUID.randomUUID(), "userA", IN_PROGRESS, null, oldestDate),
-// createNewJob(22, UUID.randomUUID(), "userA", PENDING, null, oldestDate),
-// createNewJob(33, UUID.randomUUID(), "userB", PENDING, null, LocalDateTime.now().minusHours(2))),
-// 3,
-// 2,
-// PENDING,
-// "Broker should prioritize jobs of user that has no in-progress jobs"
-// },
-// {ImmutableList.of(
-// createNewJob(11, UUID.randomUUID(), "userA", PENDING, UUID.randomUUID().toString(), oldestDate),
-// createNewJob(22, UUID.randomUUID(), "userA", PENDING, null, oldestDate),
-// createNewJob(33, UUID.randomUUID(), "userB", PENDING, null, LocalDateTime.now().minusHours(2))),
-// 3,
-// 2,
-// PENDING,
-// "Broker should prioritize jobs of user that has no taken jobs"
-// },
-// {ImmutableList.of(
-// createNewJob(11, UUID.randomUUID(), "userA", IN_PROGRESS, UUID.randomUUID().toString(), oldestDate),
-// createNewJob(22, UUID.randomUUID(), "userA", PENDING, null, LocalDateTime.now().minusHours(2)),
-// createNewJob(31, UUID.randomUUID(), "userB", IN_PROGRESS, null, LocalDateTime.now().minusHours(2)),
-// createNewJob(32, UUID.randomUUID(), "userB", IN_PROGRESS, null, LocalDateTime.now().minusHours(2)),
-// createNewJob(33, UUID.randomUUID(), "userB", PENDING, null, oldestDate)),
-// 5,
-// 4,
-// PENDING,
-// "Broker should take oldest job when there is one in-progress job to each user"
-// },
-// {ImmutableList.of(
-// createNewJob(11, UUID.randomUUID(), UUID.randomUUID().toString(), IN_PROGRESS, null, oldestDate),
-// createNewJob(22, UUID.randomUUID(), UUID.randomUUID().toString(), IN_PROGRESS, null, oldestDate),
-// createNewJob(33, UUID.randomUUID(), UUID.randomUUID().toString(), PENDING, null, LocalDateTime.now().minusHours(2))),
-// 2,
-// -1,
-// PENDING,
-// "Broker should not pull any job when it exceeded mso limit with count(in-progress or pending && taken) statuses"
-// },
-// {ImmutableList.of(
-// createNewJob(11, UUID.randomUUID(), "userId", IN_PROGRESS, UUID.randomUUID().toString(), oldestDate),
-// createNewJob(22, UUID.randomUUID(), "userId", IN_PROGRESS, null, oldestDate),
-// createNewJob(11, UUID.randomUUID(), "userId", IN_PROGRESS, null, LocalDateTime.now().minusHours(2)),
-// createNewJob(44, UUID.randomUUID(), "userId", IN_PROGRESS, null, LocalDateTime.now().minusHours(5))),
-// 20,
-// 1,
-// IN_PROGRESS,
-// "Broker with in progress topic should pull the first in progress and not taken job by oldest date"
-// },
-// {ImmutableList.of(
-// createNewJob(11, UUID.randomUUID(), "userId", COMPLETED, null, oldestDate),
-// createNewJob(12, UUID.randomUUID(), "userId", FAILED, null, oldestDate),
-// createNewJob(13, UUID.randomUUID(), "userId", PENDING,null, oldestDate),
-// createNewJob(14, UUID.randomUUID(), "userId", STOPPED,null, oldestDate),
-// createNewJob(11, UUID.randomUUID(), "userId", IN_PROGRESS,null, oldestDate, DELETED),createNewJob(22, UUID.randomUUID(), "userId", IN_PROGRESS,null, oldestDate),
-// createNewJob(33, UUID.randomUUID(), "userId", IN_PROGRESS,null, LocalDateTime.now().minusHours(2))),
-// 20,
-// 5,
-// IN_PROGRESS,
-// "Broker with in progress topic should pull only in-progress jobs - first in-progress job by oldest date - ignore deleted,completed, failed, pending and stopped statuses"
-// },
-// {ImmutableList.of(
-// createNewJob(11, UUID.randomUUID(), "userId", IN_PROGRESS, null, LocalDateTime.now()),
-// createNewJob(22, UUID.randomUUID(), "userId", IN_PROGRESS, null, LocalDateTime.now().minusSeconds(1)),
-// createNewJob(33, UUID.randomUUID(), "userId", IN_PROGRESS, null, LocalDateTime.now().minusSeconds(2))),
-// 20,
-// -1,
-// IN_PROGRESS,
-// "Broker with in progress topic should not pull any job if its modified date is smaller than now-interval (20 seconds)"
-// }
-//
-// };
-// }
-//
-//
-// @Test(dataProvider = "jobs")
-// public void givenSomeJobs_pullNextJob_returnNextOrNothingAsExpected(List<JobDaoImpl> jobs, int msoLimit, int expectedIndexSelected, Job.JobStatus topic, String assertionReason) {
-// JobsBrokerServiceInDatabaseImpl broker = new JobsBrokerServiceInDatabaseImpl(dataAccessService, sessionFactory, msoLimit, 20);
-// for (JobDaoImpl job : jobs) {
-// Date modifiedDate = job.getModified();
-// broker.add(job);
-// setModifiedDateToJob(job.getUuid(), modifiedDate);
-// }
-// Optional<Job> nextJob = broker.pull(topic, UUID.randomUUID().toString());
-// boolean shouldAnyBeSelected = expectedIndexSelected >= 0;
-// Assert.assertEquals(nextJob.isPresent(), shouldAnyBeSelected, assertionReason);
-// if (shouldAnyBeSelected) {
-// Assert.assertEquals(jobs.get(expectedIndexSelected), nextJob.get(), assertionReason);
-// }
-// }
-//
-// @DataProvider
-// public Object[][] topics() {
-// return Arrays.stream(Job.JobStatus.values())
-// .filter(not(t -> ImmutableList.of(PENDING, IN_PROGRESS).contains(t)))
-// .map(v -> new Object[]{v}).collect(Collectors.toList()).toArray(new Object[][]{});
-// }
-//
-// @Test(dataProvider = "topics", expectedExceptions = GenericUncheckedException.class, expectedExceptionsMessageRegExp = "Unsupported topic.*")
-// public void pullUnexpectedTopic_exceptionIsThrown(Job.JobStatus topic) {
-// broker.pull(topic, UUID.randomUUID().toString());
-// }
-//
-// @Test(expectedExceptions = NoJobException.class)
-// public void givenNonPendingJobs_getJobAsPendingTopic_verifyNothingRetrieved() {
-// Stream.of(Job.JobStatus.values())
-// .filter(not(s -> s.equals(PENDING)))
-// .map(s -> createMockJob("some user id", s))
-// .map(job -> newJobAsync(broker, job))
-// .map(this::waitForFutureJob)
-// .collect(Collectors.toList());
-//
-// waitForFutureOptionalJob(pullJobAsync(broker));
-// }
-//
-// @Test
-// public void givenPendingAndNonPendingJobs_getJobAsPendingTopic_verifyAJobRetrieved() {
-// newJobAsync(broker); // this negated the expected result of the call below
-// givenNonPendingJobs_getJobAsPendingTopic_verifyNothingRetrieved();
-// }
-//
-// @Test(expectedExceptions = NoJobException.class)
-// public void givenManyJobs_pullThemAllAndAskOneMore_verifyFinallyNothingRetrieved() {
-// putAndGetALotOfJobs(broker);
-// waitForFutureOptionalJob(pullJobAsync(broker));
-// }
-//
-// @Test(expectedExceptions = NoJobException.class)
-// public void givenNoJob_requestJob_verifyNothingRetrieved() throws InterruptedException, ExecutionException, TimeoutException {
-// final Future<Optional<Job>> futureOptionalJob = pullJobAsync(broker);
-// assertThat("job should not be waiting yet", futureOptionalJob.get(FEW, MILLISECONDS).isPresent(), is(false));
-// waitForFutureOptionalJob(futureOptionalJob);
-// }
-//
-// @Test(expectedExceptions = IllegalStateException.class)
-// public void givenSinglePulledJob_pushBackDifferentJob_verifyPushingRejected() {
-// waitForFutureJob(newJobAsync(broker));
-// waitForFutureJob(newJobAsync(broker));
-// waitForFutureOptionalJob(pullJobAsync(broker));
-//
-// Job myJob = createMockJob("user id");
-// myJob.setUuid(UUID.randomUUID());
-//
-// broker.pushBack(myJob); //Should fail
-// }
-//
-// @Test
-// public void givenSingleJob_pushBackModifiedJob_verifyPulledIsVeryVeryTheSame() {
-// final ImmutableMap<String, Object> randomDataForMostRecentJobType =
-// ImmutableMap.of("42", 42, "complex", ImmutableList.of("a", "b", "c"));
-//
-// waitForFutureJob(newJobAsync(broker));
-// final Job job = waitForFutureOptionalJob(pullJobAsync(broker));
-//
-// job.setStatus(Job.JobStatus.PENDING);
-// job.setTypeAndData(JobType.NoOp, ImmutableMap.of("good", "morning"));
-// job.setTypeAndData(JobType.HttpCall, ImmutableMap.of());
-// job.setTypeAndData(JobType.ServiceInstantiation, randomDataForMostRecentJobType);
-//
-// broker.pushBack(job);
-// final Job retrievedJob = waitForFutureOptionalJob(pullJobAsync(broker));
-//
-// assertThat(JOBS_SHOULD_MATCH, retrievedJob, is(job));
-// assertThat(JOBS_SHOULD_MATCH, retrievedJob.getData(), both(equalTo(job.getData())).and(equalTo(randomDataForMostRecentJobType)));
-// assertThat(JOBS_SHOULD_MATCH, jobDataReflected(retrievedJob), is(jobDataReflected(job)));
-// }
-//
-// private static String jobDataReflected(Job job) {
-// return new ReflectionToStringBuilder(job, ToStringStyle.SHORT_PREFIX_STYLE)
-// .setExcludeFieldNames("created", "modified", "takenBy")
-// .toString();
-// }
-//
-// @Test(expectedExceptions = IllegalStateException.class)
-// public void givenSingleJob_pushBackTwice_verifyPushingRejected() {
-// waitForFutureJob(newJobAsync(broker));
-// final Job job = waitForFutureOptionalJob(pullJobAsync(broker));
-//
-// broker.pushBack(job);
-// broker.pushBack(job); //Should fail
-// }
-//
-// @Test
-// public void addJob_PeekItById_verifySameJobWasPeeked() {
-// String userId = UUID.randomUUID().toString();
-// Job myJob = createMockJob(userId);
-// UUID uuid = broker.add(myJob);
-// Job peekedJob = broker.peek(uuid);
-// assertEquals("added testId is not the same as peeked TestsId",
-// userId,
-// peekedJob.getData().get("userId"));
-// }
-//
-// @Test(dataProvider = "jobStatusesForSuccessDelete", expectedExceptions = NoJobException.class)
-// public void givenOneJob_deleteIt_canPeekOnItButCantPull(Job.JobStatus status) {
-// final Job job = waitForFutureJob(newJobAsync(broker, status));
-// broker.delete(job.getUuid());
-// assertNotNull(((JobDaoImpl) broker.peek(job.getUuid())).getDeletedAt(), "job should be deleted");
-// waitForFutureOptionalJob(pullJobAsync(broker));
-// }
-//
-// @DataProvider
-// public static Object[][] jobStatusesForSuccessDelete() {
-// return new Object[][]{
-// {PENDING},
-// {STOPPED}
-// };
-// }
-//
-// @Test(
-// dataProvider = "jobStatusesForFailedDelete",
-// expectedExceptions = OperationNotAllowedException.class,
-// expectedExceptionsMessageRegExp=DELETE_SERVICE_INFO_STATUS_EXCEPTION_MESSAGE
-// )
-// public void deleteJob_notAllowedStatus_exceptionIsThrown(Job.JobStatus status, boolean taken) {
-// final Job job = waitForFutureJob(newJobAsync(broker, createMockJob("some user id", status)));
-//
-// if (taken) {
-// waitForFutureOptionalJob(pullJobAsync(broker));
-// }
-//
-//
-// broker.delete(job.getUuid());
-// }
-//
-// @DataProvider
-// public static Object[][] jobStatusesForFailedDelete() {
-// return new Object[][]{
-// {PENDING, true},
-// {IN_PROGRESS, false},
-// {COMPLETED, false},
-// {PAUSE, false},
-// {FAILED, false},
-// };
-// }
-//
-// @Test(expectedExceptions = OperationNotAllowedException.class, expectedExceptionsMessageRegExp = DELETE_SERVICE_NOT_EXIST_EXCEPTION_MESSAGE)
-// public void deleteJob_notExist_exceptionIsThrown() {
-// waitForFutureJob(newJobAsync(broker, createMockJob("some user id", PENDING)));
-// broker.delete(new UUID(111, 111));
-// }
-//
-//}
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.commons.lang3.RandomUtils;
+import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import org.apache.log4j.LogManager;
+import org.apache.log4j.Logger;
+import org.hibernate.SessionFactory;
+import org.onap.portalsdk.core.domain.support.DomainVo;
+import org.onap.portalsdk.core.service.DataAccessService;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.onap.vid.config.DataSourceConfig;
+import org.onap.vid.config.JobAdapterConfig;
+import org.onap.vid.exceptions.GenericUncheckedException;
+import org.onap.vid.exceptions.OperationNotAllowedException;
+import org.onap.vid.job.Job;
+import org.onap.vid.job.JobAdapter;
+import org.onap.vid.job.JobType;
+import org.onap.vid.job.JobsBrokerService;
+import org.onap.vid.job.command.JobCommandFactoryTest;
+import org.onap.vid.job.impl.JobDaoImpl;
+import org.onap.vid.job.impl.JobsBrokerServiceInDatabaseImpl;
+import org.onap.vid.utils.DaoUtils;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
+import org.testng.Assert;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import javax.inject.Inject;
+import java.lang.reflect.Method;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.*;
+import java.util.concurrent.*;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.stream.Collectors.toList;
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.both;
+import static org.hamcrest.Matchers.containsInAnyOrder;
+import static org.onap.vid.job.Job.JobStatus.*;
+import static org.onap.vid.utils.Streams.not;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.AssertJUnit.assertEquals;
+
+@ContextConfiguration(classes = {DataSourceConfig.class, SystemProperties.class, JobAdapterConfig.class})
+public class JobsBrokerServiceTest extends AbstractTestNGSpringContextTests {
+
+ private static final Logger logger = LogManager.getLogger(JobsBrokerServiceTest.class);
+
+ private static final int JOBS_COUNT = 127;
+ private static final boolean DELETED = true;
+ private final ExecutorService executor = Executors.newFixedThreadPool(90);
+
+ private final Set<Long> threadsIds = new ConcurrentSkipListSet<>();
+
+ private final long FEW = 500;
+
+ private final String JOBS_SHOULD_MATCH = "the jobs that added and those that pulled must be the same";
+ private final String JOBS_PEEKED_SHOULD_MATCH = "the jobs that added and those that peeked must be the same";
+ private static final String DELETE_SERVICE_INFO_STATUS_EXCEPTION_MESSAGE = "Service status does not allow deletion from the queue";
+ private static final String DELETE_SERVICE_NOT_EXIST_EXCEPTION_MESSAGE = "Service does not exist";
+ private JobsBrokerService broker;
+
+ @Inject
+ JobAdapter jobAdapter;
+ @Inject
+ private DataAccessService dataAccessService;
+ @Inject
+ private SessionFactory sessionFactory;
+
+ /*
+ - pulling jobs is limited to inserted ones
+ - putting back allows getting the job again
+ - multi threads safety
+ - any added job should be visible with view
+
+ - edges:
+ - pulling with empty repo should return empty optional
+ - pulling more than expected should return empty optional
+ - putting one, over-pulling from a different thread
+ - take before inserting, then insert while waiting
+
+ */
+
+ private class NoJobException extends RuntimeException {
+ }
+
+ private Future<Job> newJobAsync(JobsBrokerService b) {
+ return newJobAsync(b, createMockJob("user id"));
+ }
+
+ private Future<Job> newJobAsync(JobsBrokerService b, Job.JobStatus status) {
+ return newJobAsync(b, createMockJob("user id", status));
+ }
+
+ private Job createMockJob(String userId) {
+ return jobAdapter.createServiceInstantiationJob(
+ JobType.NoOp,
+ new JobCommandFactoryTest.MockedRequest(42,"nothing") ,
+ UUID.randomUUID(),
+ userId,
+ "optimisticUniqueServiceInstanceName",
+ RandomUtils.nextInt());
+ }
+
+ private Job createMockJob(String userId, Job.JobStatus jobStatus) {
+ Job job = createMockJob(userId);
+ job.setStatus(jobStatus);
+ return job;
+ }
+
+ private Future<Job> newJobAsync(JobsBrokerService b, Job job) {
+ final Future<Job> jobFuture = executor.submit(() -> {
+ accountThreadId();
+
+ b.add(job);
+
+ return job;
+ });
+ return jobFuture;
+ }
+
+ private void pushBackJobAsync(JobsBrokerService b, Job job) {
+ executor.submit(() -> {
+ accountThreadId();
+ b.pushBack(job);
+ return job;
+ });
+ }
+
+ private Future<Optional<Job>> pullJobAsync(JobsBrokerService broker) {
+ final Future<Optional<Job>> job = executor.submit(() -> {
+ accountThreadId();
+ // Pull only pending jobs, as H2 database does not support our SQL for in-progress jobs
+ return broker.pull(Job.JobStatus.PENDING, UUID.randomUUID().toString());
+ });
+ return job;
+ }
+
+ private Job waitForFutureOptionalJob(Future<Optional<Job>> retrievedOptionalJobFuture) {
+ try {
+ return retrievedOptionalJobFuture.get(FEW, MILLISECONDS).orElseThrow(NoJobException::new);
+ } catch (TimeoutException | InterruptedException | ExecutionException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private Job waitForFutureJob(Future<Job> retrievedJobFuture) {
+ try {
+ return retrievedJobFuture.get(FEW, MILLISECONDS);
+ } catch (TimeoutException | InterruptedException | ExecutionException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ private List<Job> putAndGetALotOfJobs(JobsBrokerService broker) {
+ final List<Job> originalJobs = putALotOfJobs(broker);
+ final List<Job> retrievedJobs = getAlotOfJobs(broker);
+
+ assertThat(JOBS_SHOULD_MATCH, retrievedJobs, containsInAnyOrder(originalJobs.toArray()));
+
+ return retrievedJobs;
+ }
+
+ private List<Job> putALotOfJobs(JobsBrokerService broker) {
+ int n = JOBS_COUNT;
+ return IntStream.range(0, n)
+ .mapToObj(i -> newJobAsync(broker))
+ .map(this::waitForFutureJob)
+ .collect(toList());
+ }
+
+ private List<Job> getAlotOfJobs(JobsBrokerService broker) {
+ int n = JOBS_COUNT;
+ return IntStream.range(0, n)
+ .mapToObj(i -> pullJobAsync(broker))
+ .map(this::waitForFutureOptionalJob)
+ .collect(toList());
+ }
+
+ private void pushBackJobs(List<Job> jobs, JobsBrokerService broker) {
+ jobs.forEach(job -> pushBackJobAsync(broker, job));
+ }
+
+ private void accountThreadId() {
+ threadsIds.add(Thread.currentThread().getId());
+ }
+
+ @AfterMethod
+ public void threadsCounter() {
+ logger.info("participating threads count: " + threadsIds.size());
+ threadsIds.clear();
+ }
+
+ @BeforeMethod
+ public void initializeBroker() {
+ broker = new JobsBrokerServiceInDatabaseImpl(dataAccessService, sessionFactory, 200, 0);
+ ((JobsBrokerServiceInDatabaseImpl) broker).deleteAll();
+ }
+
+ @Test(enabled = false)
+ public void givenSingleJob_getIt_verifySameJob() {
+ final Job originalJob = waitForFutureJob(newJobAsync(broker));
+
+ final Job retrievedJob = waitForFutureOptionalJob(pullJobAsync(broker));
+ assertThat(JOBS_SHOULD_MATCH, retrievedJob, is(originalJob));
+ }
+
+ @Test(enabled = false)
+ public void givenManyJobs_getJobsAndPushThemBack_alwaysSeeAllOfThemWithPeek() throws InterruptedException {
+ final List<Job> originalJobs = putALotOfJobs(broker);
+
+ MILLISECONDS.sleep(FEW);
+ assertThat(JOBS_PEEKED_SHOULD_MATCH, broker.peek(), containsInAnyOrder(originalJobs.toArray()));
+
+ final Job retrievedJob = waitForFutureOptionalJob(pullJobAsync(broker));
+
+ MILLISECONDS.sleep(FEW);
+ assertThat(JOBS_PEEKED_SHOULD_MATCH, broker.peek(), containsInAnyOrder(originalJobs.toArray()));
+
+ pushBackJobAsync(broker, retrievedJob);
+
+ MILLISECONDS.sleep(FEW);
+ assertThat(JOBS_PEEKED_SHOULD_MATCH, broker.peek(), containsInAnyOrder(originalJobs.toArray()));
+ }
+
+ @Test(enabled = false)
+ public void givenManyJobs_getThemAll_verifySameJobs() {
+ putAndGetALotOfJobs(broker);
+ }
+
+ @Test(enabled = false)
+ public void givenManyJobs_getThemAllThenPushBackandGet_verifySameJobs() {
+ final List<Job> retrievedJobs1 = putAndGetALotOfJobs(broker);
+
+ pushBackJobs(retrievedJobs1, broker);
+ final List<Job> retrievedJobs2 = getAlotOfJobs(broker);
+
+ assertThat(JOBS_SHOULD_MATCH, retrievedJobs2, containsInAnyOrder(retrievedJobs1.toArray()));
+ }
+
+ private static Date toDate(LocalDateTime localDateTime) {
+ return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
+ }
+
+ private void setModifiedDateToJob(UUID jobUuid, Date date) {
+ DomainVo job = dataAccessService.getDomainObject(JobDaoImpl.class, jobUuid, DaoUtils.getPropsMap());
+ job.setModified(date);
+ DaoUtils.tryWithSessionAndTransaction(sessionFactory, session -> {
+ session.saveOrUpdate(job);
+ return 1;
+ });
+ }
+
+
+ public static JobDaoImpl createNewJob(Integer indexInBulk, UUID templateId, String userId, Job.JobStatus status, String takenBy, LocalDateTime date) {
+ return createNewJob(indexInBulk, templateId, userId, status, takenBy, date, false);
+ }
+
+ public static JobDaoImpl createNewJob(Integer indexInBulk, UUID templateId, String userId, Job.JobStatus status, String takenBy, LocalDateTime date, boolean deleted){
+ JobDaoImpl job = new JobDaoImpl();
+ job.setUuid(UUID.randomUUID());
+ job.setTypeAndData(JobType.NoOp, ImmutableMap.of("x", RandomStringUtils.randomAlphanumeric(15)));
+ job.setIndexInBulk(indexInBulk);
+ job.setTemplateId(templateId);
+ job.setType(JobType.NoOp);
+ job.setStatus(status);
+ job.setTakenBy(takenBy);
+ job.setCreated(toDate(date));
+ job.setModified(toDate(date));
+ job.setUserId(userId);
+ if (deleted) {
+ job.setDeletedAt(new Date());
+ }
+ return job;
+ }
+
+ @DataProvider
+ public static Object[][] jobs(Method test) {
+ LocalDateTime oldestDate = LocalDateTime.now().minusHours(30);
+ UUID sameTemplate = UUID.randomUUID();
+ return new Object[][]{
+ {ImmutableList.of(
+ (Jobber)() -> createNewJob(11, UUID.randomUUID(), "userId", PENDING, null, oldestDate),
+ () -> createNewJob(22, UUID.randomUUID(), "userId", PENDING, null, oldestDate),
+ () -> createNewJob(11, UUID.randomUUID(), "userId", PENDING, null, LocalDateTime.now().minusHours(2)),
+ () -> createNewJob(44, UUID.randomUUID(), "userId", PENDING, null, LocalDateTime.now().minusHours(5))),
+ 4,
+ 0,
+ PENDING,
+ "Broker should pull the first pending job by oldest date then by job index"
+ },
+ { ImmutableList.of(
+ (Jobber)() -> createNewJob(11, UUID.randomUUID(), "userId", COMPLETED,null, oldestDate),
+ () -> createNewJob(11, UUID.randomUUID(), "userId", PENDING,null, oldestDate, DELETED),
+ () -> createNewJob(12, UUID.randomUUID(), "userId", FAILED,null, oldestDate),
+ () -> createNewJob(13, UUID.randomUUID(), "userId", IN_PROGRESS,null, oldestDate),
+ () -> createNewJob(14, UUID.randomUUID(), "userId", STOPPED,null, oldestDate),
+ () -> createNewJob(22, UUID.randomUUID(), "userId", PENDING,null, oldestDate),
+ () -> createNewJob(33, UUID.randomUUID(), "userId", PENDING,null, LocalDateTime.now().minusHours(2))),
+ 6,
+ 5,
+ PENDING,
+ "Broker should pull the only pending - first pending job by oldest job - ignore deleted,completed, failed, in-progress and stopped statuses"
+ },
+ {ImmutableList.of(
+ (Jobber)() -> createNewJob(11, UUID.randomUUID(), "userId", IN_PROGRESS, UUID.randomUUID().toString(), oldestDate),
+ () -> createNewJob(22, UUID.randomUUID(), "userId", IN_PROGRESS, UUID.randomUUID().toString(), oldestDate),
+ () -> createNewJob(33, UUID.randomUUID(), "userId", PENDING, null, LocalDateTime.now().minusHours(2))),
+ 2,
+ -1,
+ PENDING,
+ "Broker should not pull any job when it exceeded mso limit with count (in-progress) statuses"
+ },
+ {ImmutableList.of(
+ (Jobber)() -> createNewJob(11, UUID.randomUUID(), "userId", IN_PROGRESS, UUID.randomUUID().toString(), oldestDate),
+ () -> createNewJob(22, UUID.randomUUID(), "userId", PENDING, UUID.randomUUID().toString(), oldestDate),
+ () -> createNewJob(33, UUID.randomUUID(), "userId", PENDING, null, LocalDateTime.now().minusHours(2))),
+ 2,
+ -1,
+ PENDING,
+ "Broker should not pull any job when it exceeded mso limit with count(in-progress or pending && taken) statuses"
+ },
+ {ImmutableList.of(
+ (Jobber)() -> createNewJob(11, UUID.randomUUID(), "userId", IN_PROGRESS, UUID.randomUUID().toString(), oldestDate),
+ () -> createNewJob(22, UUID.randomUUID(), "userId", PENDING, UUID.randomUUID().toString(), oldestDate),
+ () -> createNewJob(33, UUID.randomUUID(), "userId", PENDING, null, LocalDateTime.now().minusHours(2)),
+ () -> createNewJob(12, UUID.randomUUID(), "userId", RESOURCE_IN_PROGRESS, UUID.randomUUID().toString(), oldestDate)
+ ),
+ 3,
+ 2,
+ PENDING,
+ "Broker should pull first job when it doesn't exceeded mso limit with count(in-progress or pending && taken) statuses"
+ },
+ {ImmutableList.of(
+ (Jobber)() -> createNewJob(11, sameTemplate, "userId", PENDING, UUID.randomUUID().toString(), oldestDate),
+ () -> createNewJob(22, sameTemplate, "userId", PENDING, null, oldestDate),
+ () -> createNewJob(33, sameTemplate, "userId", PENDING, null, LocalDateTime.now().minusHours(2))),
+ 3,
+ -1,
+ PENDING,
+ "Broker should not pull any job when there is another job from this template that was taken"
+ },
+ {ImmutableList.of(
+ (Jobber)() -> createNewJob(11, sameTemplate, "userId", IN_PROGRESS, null, oldestDate),
+ () -> createNewJob(22, sameTemplate, "userId", PENDING, null, oldestDate),
+ () -> createNewJob(33, sameTemplate, "userId", PENDING, null, LocalDateTime.now().minusHours(2))),
+ 3,
+ -1,
+ PENDING,
+ "Broker should not pull any job when there is another job from this template that in progress"
+ },
+ {ImmutableList.of(
+ (Jobber)() -> createNewJob(11, sameTemplate, "userId", FAILED, null, oldestDate),
+ () -> createNewJob(22, sameTemplate, "userId", STOPPED, null, oldestDate),
+ () -> createNewJob(33, sameTemplate, "userId", PENDING, null, LocalDateTime.now().minusHours(2))),
+ 3,
+ -1,
+ PENDING,
+ "Broker should not pull any job when there is another job from this template that was failed"
+ },
+ {ImmutableList.of(
+ (Jobber)() -> createNewJob(11, sameTemplate, "userId", FAILED, null, oldestDate, DELETED),
+ () -> createNewJob(22, sameTemplate, "userId", STOPPED,null, oldestDate),
+ () -> createNewJob(33, sameTemplate, "userId", PENDING,null, LocalDateTime.now().minusHours(2))),
+ 3,
+ 2,
+ PENDING,
+ "Broker should pull pending job when there is another job from this template that was deleted, although failed"
+ },
+ { ImmutableList.of(
+ (Jobber)() -> createNewJob(11, UUID.randomUUID(), "userA", IN_PROGRESS, null, oldestDate),
+ () -> createNewJob(22, UUID.randomUUID(), "userA", PENDING, null, oldestDate),
+ () -> createNewJob(33, UUID.randomUUID(), "userB", PENDING, null, LocalDateTime.now().minusHours(2))),
+ 3,
+ 2,
+ PENDING,
+ "Broker should prioritize jobs of user that has no in-progress jobs"
+ },
+ {ImmutableList.of(
+ (Jobber)() -> createNewJob(11, UUID.randomUUID(), "userA", PENDING, UUID.randomUUID().toString(), oldestDate),
+ () -> createNewJob(22, UUID.randomUUID(), "userA", PENDING, null, oldestDate),
+ () -> createNewJob(33, UUID.randomUUID(), "userB", PENDING, null, LocalDateTime.now().minusHours(2))),
+ 3,
+ 2,
+ PENDING,
+ "Broker should prioritize jobs of user that has no taken jobs"
+ },
+ {ImmutableList.of(
+ (Jobber)() -> createNewJob(11, UUID.randomUUID(), "userA", IN_PROGRESS, UUID.randomUUID().toString(), oldestDate),
+ () -> createNewJob(22, UUID.randomUUID(), "userA", PENDING, null, LocalDateTime.now().minusHours(2)),
+ () -> createNewJob(31, UUID.randomUUID(), "userB", IN_PROGRESS, null, LocalDateTime.now().minusHours(2)),
+ () -> createNewJob(32, UUID.randomUUID(), "userB", IN_PROGRESS, null, LocalDateTime.now().minusHours(2)),
+ () -> createNewJob(33, UUID.randomUUID(), "userB", PENDING, null, oldestDate)),
+ 5,
+ 4,
+ PENDING,
+ "Broker should take oldest job when there is one in-progress job to each user"
+ },
+ {ImmutableList.of(
+ (Jobber)() -> createNewJob(11, UUID.randomUUID(), UUID.randomUUID().toString(), IN_PROGRESS, null, oldestDate),
+ () -> createNewJob(22, UUID.randomUUID(), UUID.randomUUID().toString(), IN_PROGRESS, null, oldestDate),
+ () -> createNewJob(33, UUID.randomUUID(), UUID.randomUUID().toString(), PENDING, null, LocalDateTime.now().minusHours(2))),
+ 2,
+ -1,
+ PENDING,
+ "Broker should not pull any job when it exceeded mso limit with count(in-progress or pending && taken) statuses"
+ },
+ {ImmutableList.of(
+ (Jobber)() -> createNewJob(11, UUID.randomUUID(), "userId", IN_PROGRESS, UUID.randomUUID().toString(), oldestDate),
+ () -> createNewJob(22, UUID.randomUUID(), "userId", IN_PROGRESS, null, oldestDate),
+ () -> createNewJob(11, UUID.randomUUID(), "userId", IN_PROGRESS, null, LocalDateTime.now().minusHours(2)),
+ () -> createNewJob(44, UUID.randomUUID(), "userId", IN_PROGRESS, null, LocalDateTime.now().minusHours(5))),
+ 20,
+ 1,
+ IN_PROGRESS,
+ "Broker with in progress topic should pull the first in progress and not taken job by oldest date"
+ },
+ {ImmutableList.of(
+ (Jobber)() -> createNewJob(11, UUID.randomUUID(), "userId", COMPLETED, null, oldestDate),
+ () -> createNewJob(12, UUID.randomUUID(), "userId", FAILED, null, oldestDate),
+ () -> createNewJob(13, UUID.randomUUID(), "userId", PENDING, null, oldestDate),
+ () -> createNewJob(14, UUID.randomUUID(), "userId", STOPPED, null, oldestDate),
+ () -> createNewJob(15, UUID.randomUUID(), "userId", CREATING, null, oldestDate),
+ () -> createNewJob(11, UUID.randomUUID(), "userId", IN_PROGRESS, null, oldestDate, DELETED),
+ () -> createNewJob(22, UUID.randomUUID(), "userId", IN_PROGRESS, null, oldestDate),
+ () -> createNewJob(33, UUID.randomUUID(), "userId", IN_PROGRESS, null, LocalDateTime.now().minusHours(2)),
+ () -> createNewJob(16, UUID.randomUUID(), "userId", RESOURCE_IN_PROGRESS, null, oldestDate)
+ ),
+ 20,
+ 6,
+ IN_PROGRESS,
+ "Broker with in progress topic should pull only in-progress jobs - first in-progress job by oldest date - ignore all other statuses"
+ },
+ {ImmutableList.of(
+ (Jobber)() -> createNewJob(11, UUID.randomUUID(), "userId", COMPLETED, null, oldestDate),
+ () -> createNewJob(12, UUID.randomUUID(), "userId", FAILED, null, oldestDate),
+ () -> createNewJob(13, UUID.randomUUID(), "userId", PENDING, null, oldestDate),
+ () -> createNewJob(14, UUID.randomUUID(), "userId", STOPPED, null, oldestDate),
+ () -> createNewJob(15, UUID.randomUUID(), "userId", CREATING, null, oldestDate),
+ () -> createNewJob(11, UUID.randomUUID(), "userId", RESOURCE_IN_PROGRESS, null, oldestDate, DELETED),
+ () -> createNewJob(22, UUID.randomUUID(), "userId", RESOURCE_IN_PROGRESS, null, oldestDate),
+ () -> createNewJob(33, UUID.randomUUID(), "userId", RESOURCE_IN_PROGRESS, null, LocalDateTime.now().minusHours(2)),
+ () -> createNewJob(16, UUID.randomUUID(), "userId", IN_PROGRESS, null, oldestDate)
+ ),
+ 20,
+ 6,
+ RESOURCE_IN_PROGRESS,
+ "Broker with RESOURCE_IN_PROGRESS topic should pull only RESOURCE_IN_PROGRESS jobs - first RESOURCE_IN_PROGRESS job by oldest date - ignore all other statuses"
+ },
+ {ImmutableList.of(
+ (Jobber)() -> createNewJob(11, UUID.randomUUID(), "userId", IN_PROGRESS, null, LocalDateTime.now()),
+ () -> createNewJob(22, UUID.randomUUID(), "userId", IN_PROGRESS, null, LocalDateTime.now().minusSeconds(1)),
+ () -> createNewJob(33, UUID.randomUUID(), "userId", IN_PROGRESS, null, LocalDateTime.now().minusSeconds(2))),
+ 20,
+ -1,
+ IN_PROGRESS,
+ "Broker with in progress topic should not pull any job if its modified date is smaller than now-interval (20 seconds)"
+ },
+ {ImmutableList.of(
+ (Jobber)() -> createNewJob(11, UUID.randomUUID(), "userId", RESOURCE_IN_PROGRESS, null, LocalDateTime.now()),
+ () -> createNewJob(22, UUID.randomUUID(), "userId", RESOURCE_IN_PROGRESS, null, LocalDateTime.now().minusSeconds(1)),
+ () -> createNewJob(33, UUID.randomUUID(), "userId", RESOURCE_IN_PROGRESS, null, LocalDateTime.now().minusSeconds(2))),
+ 20,
+ -1,
+ RESOURCE_IN_PROGRESS,
+ "Broker with RESOURCE_IN_PROGRESS topic should not pull any job if its modified date is smaller than now-interval (20 seconds)"
+ },
+ {ImmutableList.of(
+ (Jobber)() -> createNewJob(11, UUID.randomUUID(), "userId", PENDING, null, LocalDateTime.now()),
+ () -> createNewJob(22, UUID.randomUUID(), "userId", CREATING, null, LocalDateTime.now().minusSeconds(1)),
+ () -> createNewJob(33, UUID.randomUUID(), "userId", CREATING, null, LocalDateTime.now().minusHours(2))),
+ 1,
+ 2,
+ CREATING,
+ "Broker with creating topic should pull oldest creating job and ignore mso limit"
+ },
+ {ImmutableList.of(
+ (Jobber)() -> createNewJob(33, UUID.randomUUID(), "userId", CREATING, null, LocalDateTime.now())),
+ 1,
+ 0,
+ CREATING,
+ "Broker with CREATING topic should pull CREATING job that was just modified"
+ }
+
+ };
+ }
+
+ public interface Jobber {
+ // Will defer LocalDateTime.now() to test's "real-time"
+ JobDaoImpl toJob();
+ }
+
+ @Test(enabled = false, dataProvider = "jobs")
+ public void givenSomeJobs_pullNextJob_returnNextOrNothingAsExpected(List<Jobber> jobbers, int msoLimit, int expectedIndexSelected, Job.JobStatus topic, String assertionReason) {
+ JobsBrokerServiceInDatabaseImpl broker = new JobsBrokerServiceInDatabaseImpl(dataAccessService, sessionFactory, msoLimit, 20);
+ final List<JobDaoImpl> jobs = jobbers.stream().map(Jobber::toJob).collect(toList());
+ for (JobDaoImpl job : jobs) {
+ Date modifiedDate = job.getModified();
+ broker.add(job);
+ setModifiedDateToJob(job.getUuid(), modifiedDate);
+ }
+ Optional<Job> nextJob = broker.pull(topic, UUID.randomUUID().toString());
+ boolean shouldAnyBeSelected = expectedIndexSelected >= 0;
+ String pulledJobDesc = nextJob.map(job -> ". pulled job: " + job.toString()).orElse(". no job pulled");
+ Assert.assertEquals(nextJob.isPresent(), shouldAnyBeSelected, assertionReason+pulledJobDesc);
+ if (shouldAnyBeSelected) {
+ Assert.assertEquals(jobs.get(expectedIndexSelected), nextJob.get(), assertionReason);
+ }
+ }
+
+ @DataProvider
+ public Object[][] topics() {
+ return Arrays.stream(Job.JobStatus.values())
+ .filter(not(t -> ImmutableList.of(PENDING, IN_PROGRESS, CREATING, RESOURCE_IN_PROGRESS).contains(t)))
+ .map(v -> new Object[]{v}).collect(toList()).toArray(new Object[][]{});
+ }
+
+ @Test(enabled = false, dataProvider = "topics", expectedExceptions = GenericUncheckedException.class, expectedExceptionsMessageRegExp = "Unsupported topic.*")
+ public void pullUnexpectedTopic_exceptionIsThrown(Job.JobStatus topic) {
+ broker.pull(topic, UUID.randomUUID().toString());
+ }
+
+ @Test(enabled = false, expectedExceptions = NoJobException.class)
+ public void givenNonPendingJobs_getJobAsPendingTopic_verifyNothingRetrieved() {
+ Stream.of(Job.JobStatus.values())
+ .filter(not(s -> s.equals(PENDING)))
+ .map(s -> createMockJob("some user id", s))
+ .map(job -> newJobAsync(broker, job))
+ .map(this::waitForFutureJob)
+ .collect(toList());
+
+ waitForFutureOptionalJob(pullJobAsync(broker));
+ }
+
+ @Test(enabled = false)
+ public void givenPendingAndNonPendingJobs_getJobAsPendingTopic_verifyAJobRetrieved() {
+ newJobAsync(broker); // this negated the expected result of the call below
+ givenNonPendingJobs_getJobAsPendingTopic_verifyNothingRetrieved();
+ }
+
+ @Test(enabled = false, expectedExceptions = NoJobException.class)
+ public void givenManyJobs_pullThemAllAndAskOneMore_verifyFinallyNothingRetrieved() {
+ putAndGetALotOfJobs(broker);
+ waitForFutureOptionalJob(pullJobAsync(broker));
+ }
+
+ @Test(enabled = false, expectedExceptions = NoJobException.class)
+ public void givenNoJob_requestJob_verifyNothingRetrieved() throws InterruptedException, ExecutionException, TimeoutException {
+ final Future<Optional<Job>> futureOptionalJob = pullJobAsync(broker);
+ assertThat("job should not be waiting yet", futureOptionalJob.get(FEW, MILLISECONDS).isPresent(), is(false));
+ waitForFutureOptionalJob(futureOptionalJob);
+ }
+
+ @Test(enabled = false, expectedExceptions = IllegalStateException.class)
+ public void givenSinglePulledJob_pushBackDifferentJob_verifyPushingRejected() {
+ waitForFutureJob(newJobAsync(broker));
+ waitForFutureJob(newJobAsync(broker));
+ waitForFutureOptionalJob(pullJobAsync(broker));
+
+ Job myJob = createMockJob("user id");
+ myJob.setUuid(UUID.randomUUID());
+
+ broker.pushBack(myJob); //Should fail
+ }
+
+ @Test(enabled = false)
+ public void givenSingleJob_pushBackModifiedJob_verifyPulledIsVeryVeryTheSame() {
+ final ImmutableMap<String, Object> randomDataForMostRecentJobType =
+ ImmutableMap.of("42", 42, "complex", ImmutableList.of("a", "b", "c"));
+
+ waitForFutureJob(newJobAsync(broker));
+ final Job job = waitForFutureOptionalJob(pullJobAsync(broker));
+
+ job.setStatus(Job.JobStatus.PENDING);
+ job.setTypeAndData(JobType.NoOp, ImmutableMap.of("good", "morning"));
+ job.setTypeAndData(JobType.HttpCall, ImmutableMap.of());
+ job.setTypeAndData(JobType.MacroServiceInstantiation, randomDataForMostRecentJobType);
+
+ broker.pushBack(job);
+ final Job retrievedJob = waitForFutureOptionalJob(pullJobAsync(broker));
+
+ assertThat(JOBS_SHOULD_MATCH, retrievedJob, is(job));
+ assertThat(JOBS_SHOULD_MATCH, retrievedJob.getData(), both(equalTo(job.getData())).and(equalTo(randomDataForMostRecentJobType)));
+ assertThat(JOBS_SHOULD_MATCH, jobDataReflected(retrievedJob), is(jobDataReflected(job)));
+ }
+
+ private static String jobDataReflected(Job job) {
+ return new ReflectionToStringBuilder(job, ToStringStyle.SHORT_PREFIX_STYLE)
+ .setExcludeFieldNames("created", "modified", "takenBy")
+ .toString();
+ }
+
+ @Test(enabled = false, expectedExceptions = IllegalStateException.class)
+ public void givenSingleJob_pushBackTwice_verifyPushingRejected() {
+ waitForFutureJob(newJobAsync(broker));
+ final Job job = waitForFutureOptionalJob(pullJobAsync(broker));
+
+ broker.pushBack(job);
+ broker.pushBack(job); //Should fail
+ }
+
+ @Test(enabled = false)
+ public void addJob_PeekItById_verifySameJobWasPeeked() {
+ String userId = UUID.randomUUID().toString();
+ Job myJob = createMockJob(userId);
+ UUID uuid = broker.add(myJob);
+ Job peekedJob = broker.peek(uuid);
+ assertEquals("added testId is not the same as peeked TestsId",
+ userId,
+ peekedJob.getSharedData().getUserId());
+ }
+
+ @Test(enabled = false, dataProvider = "jobStatusesForSuccessDelete", expectedExceptions = NoJobException.class)
+ public void givenOneJob_deleteIt_canPeekOnItButCantPull(Job.JobStatus status) {
+ final Job job = waitForFutureJob(newJobAsync(broker, status));
+ broker.delete(job.getUuid());
+ assertNotNull(((JobDaoImpl) broker.peek(job.getUuid())).getDeletedAt(), "job should be deleted");
+ waitForFutureOptionalJob(pullJobAsync(broker));
+ }
+
+ @DataProvider
+ public static Object[][] jobStatusesForSuccessDelete() {
+ return new Object[][]{
+ {PENDING},
+ {STOPPED}
+ };
+ }
+
+ @Test(enabled = false,
+ dataProvider = "jobStatusesForFailedDelete",
+ expectedExceptions = OperationNotAllowedException.class,
+ expectedExceptionsMessageRegExp=DELETE_SERVICE_INFO_STATUS_EXCEPTION_MESSAGE
+ )
+ public void deleteJob_notAllowedStatus_exceptionIsThrown(Job.JobStatus status, boolean taken) {
+ final Job job = waitForFutureJob(newJobAsync(broker, createMockJob("some user id", status)));
+
+ if (taken) {
+ waitForFutureOptionalJob(pullJobAsync(broker));
+ }
+
+
+ broker.delete(job.getUuid());
+ }
+
+ @DataProvider
+ public static Object[][] jobStatusesForFailedDelete() {
+ return new Object[][]{
+ {PENDING, true},
+ {IN_PROGRESS, false},
+ {COMPLETED, false},
+ {PAUSE, false},
+ {FAILED, false},
+ };
+ }
+
+ @Test(enabled = false, expectedExceptions = OperationNotAllowedException.class, expectedExceptionsMessageRegExp = DELETE_SERVICE_NOT_EXIST_EXCEPTION_MESSAGE)
+ public void deleteJob_notExist_exceptionIsThrown() {
+ waitForFutureJob(newJobAsync(broker, createMockJob("some user id", PENDING)));
+ broker.delete(new UUID(111, 111));
+ }
+
+}
diff --git a/vid-app-common/src/test/java/org/onap/vid/services/PortDetailsTranslatorTest.java b/vid-app-common/src/test/java/org/onap/vid/services/PortDetailsTranslatorTest.java
index cb9eb93d0..004977347 100644
--- a/vid-app-common/src/test/java/org/onap/vid/services/PortDetailsTranslatorTest.java
+++ b/vid-app-common/src/test/java/org/onap/vid/services/PortDetailsTranslatorTest.java
@@ -1,19 +1,12 @@
package org.onap.vid.services;
+import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.ImmutableList;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.onap.vid.aai.model.AaiGetPortMirroringSourcePorts;
+import org.onap.vid.aai.model.CustomQuerySimpleResult;
import org.onap.vid.aai.model.PortDetailsTranslator;
import org.onap.vid.aai.model.RelatedTo;
import org.onap.vid.aai.model.SimpleResult;
-import org.onap.vid.properties.Features;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
-import org.togglz.core.manager.FeatureManager;
import java.io.IOException;
import java.util.List;
@@ -25,49 +18,38 @@ import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.collection.IsEmptyCollection.empty;
-import static org.mockito.Mockito.when;
public class PortDetailsTranslatorTest {
private static final ObjectMapper om = new ObjectMapper();
- @InjectMocks
private PortDetailsTranslator portDetailsTranslator = new PortDetailsTranslator();
- @Mock
- private FeatureManager featureManager;
-
- @BeforeMethod
- public void initMocks() throws Exception {
- MockitoAnnotations.initMocks(this);
- when(featureManager.isActive(Features.FLAG_ADVANCED_PORTS_FILTER)).thenReturn(true);
- }
-
@Test
public void extractPortDetailsFromProperties_givenValidAaiResponse() throws IOException {
- final String aaiResponse = "{\n" +
- " \"results\": [\n" +
- " {\n" +
- " \"id\": \"4876980240\",\n" +
- " \"node-type\": \"l-interface\",\n" +
- " \"url\": \"/aai/v12/cloud-infrastructure/cloud-regions/cloud-region/att-aic/rdm5b/tenants/tenant/460f35aeb53542dc9f77105066483e83/vservers/vserver/15e46e2f-4b98-4e06-9644-f0e6e35cc79a/l-interfaces/l-interface/zrdm5bfprbVLBA005-vlbagent_aff_int_pktmirror_1_port-dr5jhyxva5ib\",\n" +
- " \"properties\": {\n" +
- " \"interface-name\": \"zrdm5bfprbVLBA005-vlbagent_aff_int_pktmirror_1_port-dr5jhyxva5ib\",\n" +
- " \"selflink\": \"https://network-aic.rdm5b.cci.att.com:9696/v2.0/ports/6de7bf87-6faa-4984-9492-18d1188b3d4a\",\n" +
- " \"interface-id\": \"6de7bf87-6faa-4984-9492-18d1188b3d4a\",\n" +
- " \"macaddr\": \"02:6d:e7:bf:87:6f\",\n" +
- " \"network-name\": \"APP-C-24595-D-T001-vprobe_int_pktmirror_net_1\",\n" +
- " \"is-port-mirrored\": false,\n" +
- " \"resource-version\": \"1519383879190\",\n" +
- " \"in-maint\": false,\n" +
- " \"is-ip-unnumbered\": false\n" +
- " }\n" +
- " }\n" +
- " ]\n" +
+ final String aaiResponse = "{" +
+ " \"results\": [" +
+ " {" +
+ " \"id\": \"4876980240\"," +
+ " \"node-type\": \"l-interface\"," +
+ " \"url\": \"/aai/v12/cloud-infrastructure/cloud-regions/cloud-region/att-aic/rdm5b/tenants/tenant/460f35aeb53542dc9f77105066483e83/vservers/vserver/15e46e2f-4b98-4e06-9644-f0e6e35cc79a/l-interfaces/l-interface/zrdm5bfprbVLBA005-vlbagent_aff_int_pktmirror_1_port-dr5jhyxva5ib\"," +
+ " \"properties\": {" +
+ " \"interface-name\": \"zrdm5bfprbVLBA005-vlbagent_aff_int_pktmirror_1_port-dr5jhyxva5ib\"," +
+ " \"selflink\": \"https://network-aic.rdm5b.cci.att.com:9696/v2.0/ports/6de7bf87-6faa-4984-9492-18d1188b3d4a\"," +
+ " \"interface-id\": \"6de7bf87-6faa-4984-9492-18d1188b3d4a\"," +
+ " \"macaddr\": \"02:6d:e7:bf:87:6f\"," +
+ " \"network-name\": \"APP-C-24595-D-T001-vprobe_int_pktmirror_net_1\"," +
+ " \"is-port-mirrored\": false," +
+ " \"resource-version\": \"1519383879190\"," +
+ " \"in-maint\": false," +
+ " \"is-ip-unnumbered\": false" +
+ " }" +
+ " }" +
+ " ]" +
"}";
- AaiGetPortMirroringSourcePorts aaiGetPortMirroringSourcePorts = om.readValue(aaiResponse, AaiGetPortMirroringSourcePorts.class);
+ CustomQuerySimpleResult aaiGetPortMirroringSourcePorts = om.readValue(aaiResponse, CustomQuerySimpleResult.class);
PortDetailsTranslator.PortDetails portDetails = PortDetailsTranslator.extractPortDetailsFromProperties(aaiGetPortMirroringSourcePorts.getResults().get(0).getProperties(), aaiResponse);
@@ -82,29 +64,29 @@ public class PortDetailsTranslatorTest {
@Test
public void extractPortDetailsFromProperties_givenAaiResponseWithInstanceNameNull_yieldException() throws IOException {
- final String aaiResponse = "{\n" +
- " \"results\": [\n" +
- " {\n" +
- " \"id\": \"4876980240\",\n" +
- " \"node-type\": \"l-interface\",\n" +
- " \"url\": \"/aai/v12/cloud-infrastructure/cloud-regions/cloud-region/att-aic/rdm5b/tenants/tenant/460f35aeb53542dc9f77105066483e83/vservers/vserver/15e46e2f-4b98-4e06-9644-f0e6e35cc79a/l-interfaces/l-interface/zrdm5bfprbVLBA005-vlbagent_aff_int_pktmirror_1_port-dr5jhyxva5ib\",\n" +
- " \"properties\": {\n" +
- " \"interface-name\": null,\n" +
- " \"selflink\": \"https://network-aic.rdm5b.cci.att.com:9696/v2.0/ports/6de7bf87-6faa-4984-9492-18d1188b3d4a\",\n" +
- " \"interface-id\": \"6de7bf87-6faa-4984-9492-18d1188b3d4a\",\n" +
- " \"macaddr\": \"02:6d:e7:bf:87:6f\",\n" +
- " \"network-name\": \"APP-C-24595-D-T001-vprobe_int_pktmirror_net_1\",\n" +
- " \"is-port-mirrored\": false,\n" +
- " \"resource-version\": \"1519383879190\",\n" +
- " \"in-maint\": false,\n" +
- " \"is-ip-unnumbered\": false\n" +
- " }\n" +
- " }\n" +
- " ]\n" +
+ final String aaiResponse = "{" +
+ " \"results\": [" +
+ " {" +
+ " \"id\": \"4876980240\"," +
+ " \"node-type\": \"l-interface\"," +
+ " \"url\": \"/aai/v12/cloud-infrastructure/cloud-regions/cloud-region/att-aic/rdm5b/tenants/tenant/460f35aeb53542dc9f77105066483e83/vservers/vserver/15e46e2f-4b98-4e06-9644-f0e6e35cc79a/l-interfaces/l-interface/zrdm5bfprbVLBA005-vlbagent_aff_int_pktmirror_1_port-dr5jhyxva5ib\"," +
+ " \"properties\": {" +
+ " \"interface-name\": null," +
+ " \"selflink\": \"https://network-aic.rdm5b.cci.att.com:9696/v2.0/ports/6de7bf87-6faa-4984-9492-18d1188b3d4a\"," +
+ " \"interface-id\": \"6de7bf87-6faa-4984-9492-18d1188b3d4a\"," +
+ " \"macaddr\": \"02:6d:e7:bf:87:6f\"," +
+ " \"network-name\": \"APP-C-24595-D-T001-vprobe_int_pktmirror_net_1\"," +
+ " \"is-port-mirrored\": false," +
+ " \"resource-version\": \"1519383879190\"," +
+ " \"in-maint\": false," +
+ " \"is-ip-unnumbered\": false" +
+ " }" +
+ " }" +
+ " ]" +
"}";
- AaiGetPortMirroringSourcePorts aaiGetPortMirroringSourcePorts = om.readValue(aaiResponse, AaiGetPortMirroringSourcePorts.class);
- PortDetailsTranslator.PortDetails portDetails = PortDetailsTranslator.extractPortDetailsFromProperties(aaiGetPortMirroringSourcePorts.getResults().get(0).getProperties(),aaiResponse);
+ CustomQuerySimpleResult aaiGetPortMirroringSourcePorts = om.readValue(aaiResponse, CustomQuerySimpleResult.class);
+ PortDetailsTranslator.PortDetails portDetails = PortDetailsTranslator.extractPortDetailsFromProperties(aaiGetPortMirroringSourcePorts.getResults().get(0).getProperties(), aaiResponse);
assertThat(portDetails, is(instanceOf(PortDetailsTranslator.PortDetailsError.class)));
@@ -115,29 +97,29 @@ public class PortDetailsTranslatorTest {
@Test
public void extractPortDetailsFromProperties_givenAaiResponseWithInstanceIdNull_yieldException() throws IOException {
- final String aaiResponse = "{\n" +
- " \"results\": [\n" +
- " {\n" +
- " \"id\": \"4876980240\",\n" +
- " \"node-type\": \"l-interface\",\n" +
- " \"url\": \"/aai/v12/cloud-infrastructure/cloud-regions/cloud-region/att-aic/rdm5b/tenants/tenant/460f35aeb53542dc9f77105066483e83/vservers/vserver/15e46e2f-4b98-4e06-9644-f0e6e35cc79a/l-interfaces/l-interface/zrdm5bfprbVLBA005-vlbagent_aff_int_pktmirror_1_port-dr5jhyxva5ib\",\n" +
- " \"properties\": {\n" +
- " \"interface-name\": \"zrdm5bfprbVLBA005-vlbagent_aff_int_pktmirror_1_port-dr5jhyxva5ib\",\n" +
- " \"selflink\": \"https://network-aic.rdm5b.cci.att.com:9696/v2.0/ports/6de7bf87-6faa-4984-9492-18d1188b3d4a\",\n" +
- " \"interface-id\": null,\n" +
- " \"macaddr\": \"02:6d:e7:bf:87:6f\",\n" +
- " \"network-name\": \"APP-C-24595-D-T001-vprobe_int_pktmirror_net_1\",\n" +
- " \"is-port-mirrored\": false,\n" +
- " \"resource-version\": \"1519383879190\",\n" +
- " \"in-maint\": false,\n" +
- " \"is-ip-unnumbered\": false\n" +
- " }\n" +
- " }\n" +
- " ]\n" +
+ final String aaiResponse = "{" +
+ " \"results\": [" +
+ " {" +
+ " \"id\": \"4876980240\"," +
+ " \"node-type\": \"l-interface\"," +
+ " \"url\": \"/aai/v12/cloud-infrastructure/cloud-regions/cloud-region/att-aic/rdm5b/tenants/tenant/460f35aeb53542dc9f77105066483e83/vservers/vserver/15e46e2f-4b98-4e06-9644-f0e6e35cc79a/l-interfaces/l-interface/zrdm5bfprbVLBA005-vlbagent_aff_int_pktmirror_1_port-dr5jhyxva5ib\"," +
+ " \"properties\": {" +
+ " \"interface-name\": \"zrdm5bfprbVLBA005-vlbagent_aff_int_pktmirror_1_port-dr5jhyxva5ib\"," +
+ " \"selflink\": \"https://network-aic.rdm5b.cci.att.com:9696/v2.0/ports/6de7bf87-6faa-4984-9492-18d1188b3d4a\"," +
+ " \"interface-id\": null," +
+ " \"macaddr\": \"02:6d:e7:bf:87:6f\"," +
+ " \"network-name\": \"APP-C-24595-D-T001-vprobe_int_pktmirror_net_1\"," +
+ " \"is-port-mirrored\": false," +
+ " \"resource-version\": \"1519383879190\"," +
+ " \"in-maint\": false," +
+ " \"is-ip-unnumbered\": false" +
+ " }" +
+ " }" +
+ " ]" +
"}";
- AaiGetPortMirroringSourcePorts aaiGetPortMirroringSourcePorts = om.readValue(aaiResponse, AaiGetPortMirroringSourcePorts.class);
- PortDetailsTranslator.PortDetails portDetails = PortDetailsTranslator.extractPortDetailsFromProperties(aaiGetPortMirroringSourcePorts.getResults().get(0).getProperties(),aaiResponse);
+ CustomQuerySimpleResult aaiGetPortMirroringSourcePorts = om.readValue(aaiResponse, CustomQuerySimpleResult.class);
+ PortDetailsTranslator.PortDetails portDetails = PortDetailsTranslator.extractPortDetailsFromProperties(aaiGetPortMirroringSourcePorts.getResults().get(0).getProperties(), aaiResponse);
assertThat(portDetails, is(instanceOf(PortDetailsTranslator.PortDetailsError.class)));
@@ -148,29 +130,29 @@ public class PortDetailsTranslatorTest {
@Test
public void extractPortDetailsFromProperties_givenAaiResponseWithEmptyInstanceId_yieldException() throws IOException {
- final String aaiResponse = "{\n" +
- " \"results\": [\n" +
- " {\n" +
- " \"id\": \"4876980240\",\n" +
- " \"node-type\": \"l-interface\",\n" +
- " \"url\": \"/aai/v12/cloud-infrastructure/cloud-regions/cloud-region/att-aic/rdm5b/tenants/tenant/460f35aeb53542dc9f77105066483e83/vservers/vserver/15e46e2f-4b98-4e06-9644-f0e6e35cc79a/l-interfaces/l-interface/zrdm5bfprbVLBA005-vlbagent_aff_int_pktmirror_1_port-dr5jhyxva5ib\",\n" +
- " \"properties\": {\n" +
- " \"interface-name\": \"\",\n" +
- " \"selflink\": \"https://network-aic.rdm5b.cci.att.com:9696/v2.0/ports/6de7bf87-6faa-4984-9492-18d1188b3d4a\",\n" +
- " \"interface-id\": \"6de7bf87-6faa-4984-9492-18d1188b3d4a\",\n" +
- " \"macaddr\": \"02:6d:e7:bf:87:6f\",\n" +
- " \"network-name\": \"APP-C-24595-D-T001-vprobe_int_pktmirror_net_1\",\n" +
- " \"is-port-mirrored\": false,\n" +
- " \"resource-version\": \"1519383879190\",\n" +
- " \"in-maint\": false,\n" +
- " \"is-ip-unnumbered\": false\n" +
- " }\n" +
- " }\n" +
- " ]\n" +
+ final String aaiResponse = "{" +
+ " \"results\": [" +
+ " {" +
+ " \"id\": \"4876980240\"," +
+ " \"node-type\": \"l-interface\"," +
+ " \"url\": \"/aai/v12/cloud-infrastructure/cloud-regions/cloud-region/att-aic/rdm5b/tenants/tenant/460f35aeb53542dc9f77105066483e83/vservers/vserver/15e46e2f-4b98-4e06-9644-f0e6e35cc79a/l-interfaces/l-interface/zrdm5bfprbVLBA005-vlbagent_aff_int_pktmirror_1_port-dr5jhyxva5ib\"," +
+ " \"properties\": {" +
+ " \"interface-name\": \"\"," +
+ " \"selflink\": \"https://network-aic.rdm5b.cci.att.com:9696/v2.0/ports/6de7bf87-6faa-4984-9492-18d1188b3d4a\"," +
+ " \"interface-id\": \"6de7bf87-6faa-4984-9492-18d1188b3d4a\"," +
+ " \"macaddr\": \"02:6d:e7:bf:87:6f\"," +
+ " \"network-name\": \"APP-C-24595-D-T001-vprobe_int_pktmirror_net_1\"," +
+ " \"is-port-mirrored\": false," +
+ " \"resource-version\": \"1519383879190\"," +
+ " \"in-maint\": false," +
+ " \"is-ip-unnumbered\": false" +
+ " }" +
+ " }" +
+ " ]" +
"}";
- AaiGetPortMirroringSourcePorts aaiGetPortMirroringSourcePorts = om.readValue(aaiResponse, AaiGetPortMirroringSourcePorts.class);
- PortDetailsTranslator.PortDetails portDetails = PortDetailsTranslator.extractPortDetailsFromProperties(aaiGetPortMirroringSourcePorts.getResults().get(0).getProperties(),aaiResponse);
+ CustomQuerySimpleResult aaiGetPortMirroringSourcePorts = om.readValue(aaiResponse, CustomQuerySimpleResult.class);
+ PortDetailsTranslator.PortDetails portDetails = PortDetailsTranslator.extractPortDetailsFromProperties(aaiGetPortMirroringSourcePorts.getResults().get(0).getProperties(), aaiResponse);
assertThat(portDetails, is(instanceOf(PortDetailsTranslator.PortDetailsError.class)));
@@ -181,29 +163,29 @@ public class PortDetailsTranslatorTest {
@Test
public void extractPortDetailsFromProperties_givenAaiResponseWithIsPortMirroredNull_yieldException() throws IOException {
- final String aaiResponse = "{\n" +
- " \"results\": [\n" +
- " {\n" +
- " \"id\": \"4876980240\",\n" +
- " \"node-type\": \"l-interface\",\n" +
- " \"url\": \"/aai/v12/cloud-infrastructure/cloud-regions/cloud-region/att-aic/rdm5b/tenants/tenant/460f35aeb53542dc9f77105066483e83/vservers/vserver/15e46e2f-4b98-4e06-9644-f0e6e35cc79a/l-interfaces/l-interface/zrdm5bfprbVLBA005-vlbagent_aff_int_pktmirror_1_port-dr5jhyxva5ib\",\n" +
- " \"properties\": {\n" +
- " \"interface-name\": \"zrdm5bfprbVLBA005-vlbagent_aff_int_pktmirror_1_port-dr5jhyxva5ib\",\n" +
- " \"selflink\": \"https://network-aic.rdm5b.cci.att.com:9696/v2.0/ports/6de7bf87-6faa-4984-9492-18d1188b3d4a\",\n" +
- " \"interface-id\": \"6de7bf87-6faa-4984-9492-18d1188b3d4a\",\n" +
- " \"macaddr\": \"02:6d:e7:bf:87:6f\",\n" +
- " \"network-name\": \"APP-C-24595-D-T001-vprobe_int_pktmirror_net_1\",\n" +
- " \"is-port-mirrored\": null,\n" +
- " \"resource-version\": \"1519383879190\",\n" +
- " \"in-maint\": false,\n" +
- " \"is-ip-unnumbered\": false\n" +
- " }\n" +
- " }\n" +
- " ]\n" +
+ final String aaiResponse = "{" +
+ " \"results\": [" +
+ " {" +
+ " \"id\": \"4876980240\"," +
+ " \"node-type\": \"l-interface\"," +
+ " \"url\": \"/aai/v12/cloud-infrastructure/cloud-regions/cloud-region/att-aic/rdm5b/tenants/tenant/460f35aeb53542dc9f77105066483e83/vservers/vserver/15e46e2f-4b98-4e06-9644-f0e6e35cc79a/l-interfaces/l-interface/zrdm5bfprbVLBA005-vlbagent_aff_int_pktmirror_1_port-dr5jhyxva5ib\"," +
+ " \"properties\": {" +
+ " \"interface-name\": \"zrdm5bfprbVLBA005-vlbagent_aff_int_pktmirror_1_port-dr5jhyxva5ib\"," +
+ " \"selflink\": \"https://network-aic.rdm5b.cci.att.com:9696/v2.0/ports/6de7bf87-6faa-4984-9492-18d1188b3d4a\"," +
+ " \"interface-id\": \"6de7bf87-6faa-4984-9492-18d1188b3d4a\"," +
+ " \"macaddr\": \"02:6d:e7:bf:87:6f\"," +
+ " \"network-name\": \"APP-C-24595-D-T001-vprobe_int_pktmirror_net_1\"," +
+ " \"is-port-mirrored\": null," +
+ " \"resource-version\": \"1519383879190\"," +
+ " \"in-maint\": false," +
+ " \"is-ip-unnumbered\": false" +
+ " }" +
+ " }" +
+ " ]" +
"}";
- AaiGetPortMirroringSourcePorts aaiGetPortMirroringSourcePorts = om.readValue(aaiResponse, AaiGetPortMirroringSourcePorts.class);
- PortDetailsTranslator.PortDetails portDetails = PortDetailsTranslator.extractPortDetailsFromProperties(aaiGetPortMirroringSourcePorts.getResults().get(0).getProperties(),aaiResponse);
+ CustomQuerySimpleResult aaiGetPortMirroringSourcePorts = om.readValue(aaiResponse, CustomQuerySimpleResult.class);
+ PortDetailsTranslator.PortDetails portDetails = PortDetailsTranslator.extractPortDetailsFromProperties(aaiGetPortMirroringSourcePorts.getResults().get(0).getProperties(), aaiResponse);
assertThat(portDetails, is(instanceOf(PortDetailsTranslator.PortDetailsError.class)));
@@ -221,17 +203,8 @@ public class PortDetailsTranslatorTest {
assertThat("List size if different than expected", result, is(empty()));
}
- @DataProvider
- public static Object[][] trueAndFalse() {
- return new Object[][]{
- { Boolean.TRUE }, { Boolean.FALSE }
- };
- }
-
- @Test(dataProvider = "trueAndFalse")
- public void getFilteredPortList_givenFeatureFlagIsOff_returnAllLInterfaces(Boolean advancedPortsFilterFlag) throws IOException {
- when(featureManager.isActive(Features.FLAG_ADVANCED_PORTS_FILTER)).thenReturn(advancedPortsFilterFlag);
-
+ @Test
+ public void getFilteredPortList_givenFeatureFlagIsOff_returnAllLInterfaces() {
final String relationshipLabelSource = "org.onap.relationships.inventory.Source";
final String nodeTypeLInterface = "l-interface";
@@ -258,22 +231,16 @@ public class PortDetailsTranslatorTest {
List<SimpleResult> result = portDetailsTranslator.getFilteredPortList(input);
- if (advancedPortsFilterFlag) {
- assertThat("List should contain all l-interfaces with a related source", result, containsInAnyOrder(
- lInterfaceWithSource, lInterfaceWithSourceAndMore,
- lInterfaceWithTwoSources));
- } else {
- assertThat("List should contain all l-interfaces", result, containsInAnyOrder(
- lInterfaceWithSource, lInterfaceWithoutSource,
- lInterfaceWithoutRelations, lInterfaceWithSourceAndMore,
- lInterfaceWithTwoSources));
- }
+ assertThat("List should contain all l-interfaces with a related source", result, containsInAnyOrder(
+ lInterfaceWithSource, lInterfaceWithSourceAndMore,
+ lInterfaceWithTwoSources));
+
}
private SimpleResult buildSimpleResult(String nodeType, String... relationshipLabels) {
SimpleResult simpleResult = new SimpleResult();
- simpleResult.setNodeType(nodeType);
- simpleResult.setRelatedTo(Stream.of(relationshipLabels).map(label ->
+ simpleResult.setJsonNodeType(nodeType);
+ simpleResult.setJsonRelatedTo(Stream.of(relationshipLabels).map(label ->
new RelatedTo("my foo id", label, "logical-link", "foo url"))
.collect(Collectors.toList())
);
diff --git a/vid-app-common/src/test/java/org/onap/vid/services/SchedulerServiceImplTest.java b/vid-app-common/src/test/java/org/onap/vid/services/SchedulerServiceImplTest.java
new file mode 100644
index 000000000..c4f77e3e1
--- /dev/null
+++ b/vid-app-common/src/test/java/org/onap/vid/services/SchedulerServiceImplTest.java
@@ -0,0 +1,179 @@
+package org.onap.vid.services;
+
+import com.fasterxml.jackson.core.JsonParseException;
+import org.apache.xmlbeans.SystemProperties;
+import org.hamcrest.Matcher;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.onap.vid.aai.ExceptionWithRequestInfo;
+import org.onap.vid.exceptions.GenericUncheckedException;
+import org.onap.vid.exceptions.NotFoundException;
+import org.onap.vid.model.probes.ErrorMetadata;
+import org.onap.vid.model.probes.ExternalComponentStatus;
+import org.onap.vid.model.probes.HttpRequestMetadata;
+import org.onap.vid.mso.RestObject;
+import org.onap.vid.mso.RestObjectWithRequestInfo;
+import org.onap.vid.scheduler.SchedulerServiceImpl;
+import org.springframework.http.HttpMethod;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.*;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.onap.vid.model.probes.ExternalComponentStatus.Component.SCHEDULER;
+
+@ContextConfiguration(classes = {SystemProperties.class})
+@WebAppConfiguration
+public class SchedulerServiceImplTest extends AbstractTestNGSpringContextTests {
+
+ @InjectMocks
+ private SchedulerServiceImpl schedulerService;
+
+ @Mock
+ private ChangeManagementService changeManagementService;
+
+
+ @BeforeTest
+ public void initMocks() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @AfterMethod
+ public void reset() {
+ Mockito.reset(changeManagementService);
+ }
+
+ @Test
+ public void probeGetSchedulerChangeManegements_verifyGoodRequest(){
+ String responseString = "[" +
+ " {" +
+ " \"vnfName\": \"dbox0001v\"," +
+ " \"status\": \"Triggered\"," +
+ " \"aotsChangeId\": \"CHG000000000001\"," +
+ " \"aotsApprovalStatus\": \"Approved\"," +
+ " \"groupId\": \"groupId\"," +
+ " \"dispatchTime\": \"2018-05-09T14:05:43Z\"," +
+ " \"msoRequestId\": \"2fb4edd1-01c4-4fee-bd4a-4ae6282aa213\"," +
+ " \"scheduleRequest\": {" +
+ " \"id\": 1," +
+ " \"createDateTime\": \"2018-05-09T14:05:34Z\"," +
+ " \"optimizerAttemptsToSchedule\": 0," +
+ " \"optimizerTransactionId\": \"70f05563-6705-4be0-802a-8b6b78a69d63\"," +
+ " \"scheduleId\": \"70f05563-6705-4be0-802a-8b6b78a69d63\"," +
+ " \"scheduleName\": \"70f05563-6705-4be0-802a-8b6b78a69d63\"," +
+ " \"status\": \"Notifications Initiated\"," +
+ " \"userId\": \"wl849v\"," +
+ " \"domain\": \"ChangeManagement\"," +
+ " \"domainData\": [" +
+ " {" +
+ " \"id\": 1," +
+ " \"name\": \"WorkflowName\"," +
+ " \"value\": \"VNF In Place Software Update\"" +
+ " }," +
+ " {" +
+ " \"id\": 2," +
+ " \"name\": \"CallbackUrl\"," +
+ " \"value\": \"https://vid-web-ete-new.ecomp.cci.att.com:8000/vid/change-management/workflow/\"" +
+ " }," +
+ " {" +
+ " \"id\": 3," +
+ " \"name\": \"CallbackData\"," +
+ " \"value\": \"{\\\"requestType\\\":\\\"VNF In Place Software Update\\\",\\\"requestDetails\\\":[{\\\"vnfName\\\":\\\"dbox0001v\\\",\\\"vnfInstanceId\\\":\\\"815d38c0-b686-491c-9a74-0b49add524ca\\\",\\\"modelInfo\\\":{\\\"modelType\\\":\\\"vnf\\\",\\\"modelInvariantId\\\":\\\"59f4e0b2-e1b0-4e3b-bae3-e7b8c5d32985\\\",\\\"modelVersionId\\\":\\\"345643c1-3a51-423f-aac1-502e027d8dab\\\",\\\"modelName\\\":\\\"dbox0001v\\\",\\\"modelCustomizationId\\\":\\\"01ce23cb-d276-4d71-a5f1-f9d42d0df543\\\"},\\\"cloudConfiguration\\\":{\\\"lcpCloudRegionId\\\":\\\"dpa2b\\\",\\\"tenantId\\\":\\\"b60da4f71c1d4b35b8113d4eca6deaa1\\\"},\\\"requestInfo\\\":{\\\"source\\\":\\\"VID\\\",\\\"suppressRollback\\\":false,\\\"requestorId\\\":\\\"wl849v\\\"},\\\"relatedInstanceList\\\":[{\\\"relatedInstance\\\":{\\\"instanceId\\\":\\\"eb774932-e9fa-4c7f-bbc1-229b6b2b11e2\\\",\\\"modelInfo\\\":{\\\"modelType\\\":\\\"service\\\",\\\"modelInvariantId\\\":\\\"57dd617b-d64e-4441-a287-4d158b24ba65\\\",\\\"modelVersionId\\\":\\\"345643c1-3a51-423f-aac1-502e027d8dab\\\",\\\"modelName\\\":\\\"control_loop_dbe_svc\\\",\\\"modelVersion\\\":\\\"2.0\\\"}}}],\\\"requestParameters\\\":{\\\"payload\\\":\\\"{\\\\\\\"existing_software_version\\\\\\\":\\\\\\\"2\\\\\\\",\\\\\\\"new_software_version\\\\\\\":\\\\\\\"1\\\\\\\",\\\\\\\"operations_timeout\\\\\\\":\\\\\\\"3\\\\\\\"}\\\",\\\"testApi\\\":\\\"GR_API\\\"}}]}\"" +
+ " }" +
+ " ]," +
+ " \"scheduleApprovals\": []" +
+ " }," +
+ " \"schedulesId\": 0" +
+ " }" +
+ "]";;
+
+ final RestObject mockedRestObject = mock(RestObject.class);
+
+ final RestObjectWithRequestInfo restObjectWithRequestInfo = new RestObjectWithRequestInfo(HttpMethod.GET, "my pretty url", mockedRestObject, 200, responseString);
+
+ when(changeManagementService.getSchedulerChangeManagementsWithRequestInfo()).thenReturn(
+ restObjectWithRequestInfo
+ );
+
+ final ExternalComponentStatus schedulerStatus = schedulerService.probeGetSchedulerChangeManagements();
+
+ assertSchedulerStatus(schedulerStatus, true);
+ assertMetadata(schedulerStatus, 200, startsWith(responseString.substring(0, 400)), "my pretty url", equalTo("OK"));
+ }
+
+ @Test
+ public void probeGetSchedulerChangeManegements_response200OkButEmptyPayload_shouldDescribeCorrectly() {
+ String responseString = "" +
+ "[]";
+
+ final RestObject mockedRestObject = mock(RestObject.class);
+
+ final RestObjectWithRequestInfo restObjectWithRequestInfo = new RestObjectWithRequestInfo(HttpMethod.GET, "my pretty url", mockedRestObject, 200, responseString);
+
+ when(changeManagementService.getSchedulerChangeManagementsWithRequestInfo()).thenReturn(
+ restObjectWithRequestInfo
+ );
+
+ final ExternalComponentStatus schedulerStatus = schedulerService.probeGetSchedulerChangeManagements();
+
+ assertSchedulerStatus(schedulerStatus, true);
+
+ assertMetadata(schedulerStatus, 200, equalTo(responseString), "my pretty url", containsString("OK"));
+ }
+
+ @Test
+ public void probeGetSchedulerChangeManegements_response200OkButInvalidPayload_shouldDescribeCorrectly() {
+ String responseString = "this payload is an invalid json";
+
+ final RestObject mockedRestObject = mock(RestObject.class);
+
+ final RestObjectWithRequestInfo restObjectWithRequestInfo = new RestObjectWithRequestInfo(HttpMethod.GET, "my pretty url", mockedRestObject, 200, responseString);
+
+ when(changeManagementService.getSchedulerChangeManagementsWithRequestInfo()).thenThrow(new ExceptionWithRequestInfo(HttpMethod.GET,
+ "my pretty url", responseString, 200, new JsonParseException(null, "Unrecognized token")));
+
+ final ExternalComponentStatus schedulerStatus = schedulerService.probeGetSchedulerChangeManagements();
+
+ assertSchedulerStatus(schedulerStatus, false);
+
+ assertMetadata(schedulerStatus, 200, equalTo(responseString), "my pretty url", containsString("JsonParseException: Unrecognized token"));
+ }
+
+ @Test
+ public void probeGetSchedulerChangeManegements_throwNotFoundException_resultIsWithErrorMetadata() {
+ when(changeManagementService.getSchedulerChangeManagementsWithRequestInfo()).thenThrow(
+ new GenericUncheckedException(new NotFoundException("Get with status = 400")));
+
+ final ExternalComponentStatus schedulerStatus = schedulerService.probeGetSchedulerChangeManagements();
+
+ assertThat(schedulerStatus.isAvailable(), is(false));
+ assertThat(schedulerStatus.getComponent(), is(SCHEDULER));
+ assertThat(schedulerStatus.getMetadata(), instanceOf(ErrorMetadata.class));
+
+ final ErrorMetadata metadata = ((ErrorMetadata) schedulerStatus.getMetadata());
+ org.junit.Assert.assertThat(metadata.getDescription(), containsString("NotFoundException: Get with status = 400"));
+ }
+
+ private void assertSchedulerStatus(ExternalComponentStatus schedulerStatus, boolean isAvailable) {
+ assertThat(schedulerStatus.isAvailable(), is(isAvailable));
+ assertThat(schedulerStatus.getComponent(), is(SCHEDULER));
+ assertThat(schedulerStatus.getMetadata(), instanceOf(HttpRequestMetadata.class));
+ }
+
+ private void assertMetadata(ExternalComponentStatus schedulerStatus, int httpCode, Matcher<String> rawData, String url, Matcher<String> descriptionMatcher) {
+ final HttpRequestMetadata metadata = ((HttpRequestMetadata) schedulerStatus.getMetadata());
+ org.junit.Assert.assertThat(metadata.getHttpMethod(), equalTo(HttpMethod.GET));
+ org.junit.Assert.assertThat(metadata.getHttpCode(), equalTo(httpCode));
+ org.junit.Assert.assertThat(metadata.getUrl(), equalTo(url));
+ org.junit.Assert.assertThat(metadata.getRawData(), rawData);
+ org.junit.Assert.assertThat(metadata.getDescription(), descriptionMatcher);
+ }
+}