Merge "add missing test annotation"
[vid.git] / vid-app-common / src / test / java / org / onap / vid / services / AuditServiceIntegrativeTest.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * VID
4  * ================================================================================
5  * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.vid.services;
22
23 import static java.util.stream.Collectors.toList;
24 import static org.hamcrest.MatcherAssert.assertThat;
25 import static org.hamcrest.Matchers.contains;
26 import static org.hamcrest.Matchers.containsInAnyOrder;
27 import static org.hamcrest.Matchers.hasProperty;
28 import static org.hamcrest.Matchers.is;
29 import static org.hamcrest.Matchers.notNullValue;
30 import static org.hamcrest.Matchers.nullValue;
31 import static org.hamcrest.core.Every.everyItem;
32 import static org.onap.vid.job.Job.JobStatus.COMPLETED;
33 import static org.onap.vid.job.Job.JobStatus.IN_PROGRESS;
34 import static org.onap.vid.job.Job.JobStatus.PAUSE;
35 import static org.onap.vid.job.Job.JobStatus.PENDING;
36 import static org.onap.vid.utils.DaoUtils.getPropsMap;
37 import static org.testng.Assert.assertTrue;
38
39 import com.google.common.collect.ImmutableList;
40 import com.google.common.collect.Streams;
41 import java.io.IOException;
42 import java.lang.reflect.Method;
43 import java.time.LocalDateTime;
44 import java.time.ZoneId;
45 import java.util.Date;
46 import java.util.List;
47 import java.util.Objects;
48 import java.util.UUID;
49 import java.util.stream.IntStream;
50 import java.util.stream.Stream;
51 import javax.inject.Inject;
52 import org.apache.commons.lang3.tuple.Pair;
53 import org.hibernate.SessionFactory;
54 import org.mockito.MockitoAnnotations;
55 import org.onap.portalsdk.core.service.DataAccessService;
56 import org.onap.portalsdk.core.util.SystemProperties;
57 import org.onap.vid.config.DataSourceConfig;
58 import org.onap.vid.config.JobCommandsConfigWithMockedMso;
59 import org.onap.vid.config.MockedAaiClientAndFeatureManagerConfig;
60 import org.onap.vid.job.Job;
61 import org.onap.vid.job.Job.JobStatus;
62 import org.onap.vid.job.impl.JobDaoImpl;
63 import org.onap.vid.model.JobAuditStatus;
64 import org.onap.vid.model.JobAuditStatus.SourceStatus;
65 import org.onap.vid.model.NameCounter;
66 import org.onap.vid.model.ServiceInfo;
67 import org.onap.vid.mso.rest.AsyncRequestStatusList;
68 import org.onap.vid.testUtils.TestUtils;
69 import org.onap.vid.utils.DaoUtils;
70 import org.springframework.beans.factory.annotation.Autowired;
71 import org.springframework.test.context.ContextConfiguration;
72 import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
73 import org.testng.Assert;
74 import org.testng.annotations.AfterMethod;
75 import org.testng.annotations.BeforeClass;
76 import org.testng.annotations.DataProvider;
77 import org.testng.annotations.Test;
78
79 @ContextConfiguration(classes = {DataSourceConfig.class, SystemProperties.class, MockedAaiClientAndFeatureManagerConfig.class, JobCommandsConfigWithMockedMso.class})
80 public class AuditServiceIntegrativeTest extends AbstractTestNGSpringContextTests {
81
82     @Inject
83     private DataAccessService dataAccessService;
84
85     @Inject
86     private AuditService auditService;
87
88     @Autowired
89     private SessionFactory sessionFactory;
90
91     @BeforeClass
92     void setup() {
93         MockitoAnnotations.initMocks(this);
94     }
95
96     @AfterMethod
97     void clearDb() {
98         dataAccessService.deleteDomainObjects(JobDaoImpl.class, "1=1", getPropsMap());
99         dataAccessService.deleteDomainObjects(ServiceInfo.class, "1=1", getPropsMap());
100         dataAccessService.deleteDomainObjects(JobAuditStatus.class, "1=1", getPropsMap());
101         dataAccessService.deleteDomainObjects(NameCounter.class, "1=1", getPropsMap());
102     }
103
104
105     @Test
106     public void testConvertMsoResponseStatusToJobAuditStatus_missingDateFromMso_shouldNoError() throws IOException {
107         final AsyncRequestStatusList asyncRequestStatusList = TestUtils.readJsonResourceFileAsObject("/orchestrationRequestsByServiceInstanceId.json", AsyncRequestStatusList.class);
108
109         AuditServiceImpl auditService = new AuditServiceImpl(null, null);
110         final List<JobAuditStatus> jobAuditStatuses = auditService.convertMsoResponseStatusToJobAuditStatus(asyncRequestStatusList.getRequestList(), "foo");
111
112         final List<Date> dates = jobAuditStatuses.stream().map(JobAuditStatus::getCreatedDate).collect(toList());
113         final List<String> statuses = jobAuditStatuses.stream().map(JobAuditStatus::getJobStatus).collect(toList());
114
115         assertThat(dates, containsInAnyOrder(notNullValue(), notNullValue(), nullValue()));
116         assertThat(statuses, containsInAnyOrder("COMPLETE", "COMPLETE", "IN_PROGRESS"));
117     }
118
119
120     @DataProvider
121     public static Object[][] resourceTypeFilter() {
122
123         return new Object[][]{
124                 {JobAuditStatus.ResourceTypeFilter.SERVICE, "serviceInstanceId"},
125                 {JobAuditStatus.ResourceTypeFilter.VNF,"vnfInstanceId"},
126                 {JobAuditStatus.ResourceTypeFilter.VFMODULE,"vfModuleInstanceId"},
127                 {JobAuditStatus.ResourceTypeFilter.NETWORK,"networkInstanceId"},
128                 {JobAuditStatus.ResourceTypeFilter.VNFGROUP,"instanceGroupId"},
129         };
130
131     }
132
133
134     //In case any of ResourceTypeFilter are accidentally changed or removed
135     @Test(dataProvider = "resourceTypeFilter")
136     public void testAllInstanceTypesForAuditInfoExist(JobAuditStatus.ResourceTypeFilter resourceTypeFilter, String value){
137         assertThat("ResourceTypeFilter value changed! Check the relevant usage vs MSO before changing it.", resourceTypeFilter.getFilterBy().equals(value));
138     }
139
140     private static final String MSO_ARBITRARY_STATUS = "completed mso status";
141
142     @DataProvider
143     public static Object[][] auditStatuses(Method test) {
144         return new Object[][]{
145                 {
146                         SourceStatus.VID,
147                         new String[]{ PENDING.toString(), IN_PROGRESS.toString(), COMPLETED.toString()}
148                 },
149                 {       SourceStatus.MSO,
150                         new String[]{ IN_PROGRESS.toString(), MSO_ARBITRARY_STATUS }
151                 }
152         };
153
154     }
155
156     @Test(dataProvider = "auditStatuses")
157     public void givenSomeAuditStatuses_getStatusesOfSpecificSourceAndJobId_getSortedResultsMatchingToParameters(
158         SourceStatus expectedSource, String [] expectedSortedStatuses){
159         UUID jobUuid = UUID.randomUUID();
160
161         final Date nowMinus3 = toDate(LocalDateTime.now().minusHours(3));
162         final Date nowMinus2 = toDate(LocalDateTime.now().minusHours(2));
163         final Date nowMinus30 = toDate(LocalDateTime.now().minusHours(30));
164
165         List<JobAuditStatus> auditStatusList = com.google.common.collect.ImmutableList.of(
166             JobAuditStatus.createForTest(jobUuid, PENDING.toString(), SourceStatus.VID, nowMinus3, 0),
167             JobAuditStatus.createForTest(jobUuid, IN_PROGRESS.toString(), SourceStatus.VID, nowMinus3, 1),
168             JobAuditStatus.createForTest(jobUuid, IN_PROGRESS.toString(), SourceStatus.MSO, UUID.randomUUID(),"", nowMinus30),
169             JobAuditStatus.createForTest(jobUuid, COMPLETED.toString(), SourceStatus.VID, nowMinus2, 2),
170             JobAuditStatus.createForTest(jobUuid, MSO_ARBITRARY_STATUS, SourceStatus.MSO, UUID.randomUUID(),"", nowMinus3),
171
172             JobAuditStatus.createForTest(UUID.randomUUID(), PENDING.toString(), SourceStatus.VID, nowMinus3, 0)
173         );
174         auditStatusList.forEach((auditStatus) -> createNewAuditStatus(auditStatus));
175
176         List<JobAuditStatus> statuses = auditService.getAuditStatuses(jobUuid, expectedSource);
177         List<String> statusesList = statuses.stream().map(status -> status.getJobStatus()).collect(toList());
178
179         assertTrue(statuses.stream().allMatch(status -> (status.getSource().equals(expectedSource)&& status.getJobId().equals(jobUuid))),"Only statuses of " + expectedSource + " for " + jobUuid + " should be returned. Returned statuses: " + String.join(",", statusesList ));
180         assertThat(statusesList + " is not ok", statusesList, contains(expectedSortedStatuses));
181     }
182
183     private static Date toDate(LocalDateTime localDateTime) {
184         return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
185     }
186
187     private void createNewAuditStatus(JobAuditStatus auditStatus)
188     {
189         Date createdDate= auditStatus.getCreated();
190         dataAccessService.saveDomainObject(auditStatus, getPropsMap());
191         setDateToStatus(auditStatus.getSource(), auditStatus.getJobStatus(), createdDate);
192     }
193
194     private void setDateToStatus(SourceStatus source, String status, Date date) {
195         List<JobAuditStatus> jobAuditStatusList = dataAccessService.getList(JobAuditStatus.class, getPropsMap());
196         DaoUtils.tryWithSessionAndTransaction(sessionFactory, session -> {
197             jobAuditStatusList.stream()
198                     .filter(auditStatus -> source.equals(auditStatus.getSource()) && status.equals(auditStatus.getJobStatus()))
199                     .forEach(auditStatus -> {
200                         auditStatus.setCreated(date);
201                         session.saveOrUpdate(auditStatus);
202                     });
203             return 1;
204         });
205     }
206
207     @Test
208     public void addSomeVidStatuses_getThem_verifyGetIsWithoutDuplicates(){
209         final Stream<JobStatus> statusesToPush = Stream.of(PENDING, IN_PROGRESS, IN_PROGRESS, PAUSE, PAUSE, IN_PROGRESS, COMPLETED);
210         final Stream<JobStatus> statusesToExpect = Stream.of(PENDING, IN_PROGRESS, PAUSE, IN_PROGRESS, COMPLETED);
211         final UUID jobUuid = UUID.randomUUID();
212
213         // Set up
214         statusesToPush.forEach(status-> auditService.auditVidStatus(jobUuid, status));
215
216         // Given
217         List<JobAuditStatus> auditStatusesFromDB = auditService.getAuditStatuses(jobUuid, SourceStatus.VID);
218         List<Pair<String, Integer>> statusesAndOrdinalsFromDB =
219             auditStatusesFromDB.stream()
220                 .map(status -> Pair.of(status.getJobStatus(), status.getOrdinal()))
221                 .collect(toList());
222
223         // Assert that
224         List<Pair<String, Integer>> expectedStatusesAndOrdinals =
225             Streams.zip(
226                 statusesToExpect.map(Objects::toString),
227                 IntStream.range(0, 100).boxed(), // max=100 will be truncated
228                 Pair::of
229             ).collect(toList());
230
231         assertThat(statusesAndOrdinalsFromDB, is(expectedStatusesAndOrdinals));
232     }
233
234     @Test
235     public void addSameStatusOfVidAndMso_verifyThatBothWereAdded(){
236         UUID jobUuid = UUID.randomUUID();
237         Job.JobStatus sameStatus = IN_PROGRESS;
238         auditService.auditMsoStatus(jobUuid, sameStatus.toString(),null,null);
239         auditService.auditVidStatus(jobUuid, sameStatus);
240         List<JobAuditStatus> list = dataAccessService.getList(
241                 JobAuditStatus.class,
242                 String.format(" where JOB_ID = '%s'", jobUuid),
243                 null, null);
244         Assert.assertEquals(list.size(),2);
245         assertThat(list,everyItem(hasProperty("jobStatus", is(sameStatus.toString()))));
246     }
247
248     @DataProvider
249     public static Object[][] msoAuditStatuses(Method test) {
250         UUID jobUuid = UUID.randomUUID();
251         UUID requestId = UUID.randomUUID();
252         return new Object[][]{
253                 {
254                         jobUuid,
255                         ImmutableList.of(
256                                 new JobAuditStatus(jobUuid, PENDING.toString(), SourceStatus.MSO, null, null),
257                                 new JobAuditStatus(jobUuid, IN_PROGRESS.toString(), SourceStatus.MSO, requestId, null),
258                                 new JobAuditStatus(jobUuid, IN_PROGRESS.toString(), SourceStatus.MSO, requestId, null),
259                                 new JobAuditStatus(jobUuid, IN_PROGRESS.toString(), SourceStatus.MSO, requestId, null),
260                                 new JobAuditStatus(jobUuid, COMPLETED.toString(), SourceStatus.MSO, requestId, null)),
261                         ImmutableList.of(PENDING.toString(), IN_PROGRESS.toString(), COMPLETED.toString()),
262                         "All distinct statuses should be without duplicates"
263                 },
264                 {
265                         jobUuid,
266                         ImmutableList.of(
267                                 new JobAuditStatus(jobUuid, PENDING.toString(), SourceStatus.MSO, null, null),
268                                 new JobAuditStatus(jobUuid, IN_PROGRESS.toString(), SourceStatus.MSO, requestId, null),
269                                 new JobAuditStatus(jobUuid, IN_PROGRESS.toString(), SourceStatus.MSO, requestId, "aa"),
270                                 new JobAuditStatus(jobUuid, IN_PROGRESS.toString(), SourceStatus.MSO, requestId, "aa"),
271                                 new JobAuditStatus(jobUuid, IN_PROGRESS.toString(), SourceStatus.MSO, UUID.randomUUID(), "aa"),
272                                 new JobAuditStatus(jobUuid, COMPLETED.toString(), SourceStatus.MSO, requestId, null)),
273                         ImmutableList.of(PENDING.toString(), IN_PROGRESS.toString(), IN_PROGRESS.toString(),IN_PROGRESS.toString(), COMPLETED.toString()),
274                         "Statuses should be without duplicates only with same requestId and additionalInfo"
275                 }
276         };
277     }
278
279     @Test(dataProvider = "msoAuditStatuses")
280     public void addSomeMsoStatuses_getThem_verifyGetInsertedWithoutDuplicates(UUID jobUuid, ImmutableList<JobAuditStatus> msoStatuses, ImmutableList<String> expectedStatuses, String assertionReason) {
281         msoStatuses.forEach(status -> {
282             auditService.auditMsoStatus(status.getJobId(), status.getJobStatus(), status.getRequestId() != null ? status.getRequestId().toString() : null, status.getAdditionalInfo());
283         });
284         List<String> statusesFromDB = auditService.getAuditStatuses(jobUuid, SourceStatus.MSO).stream().map(auditStatus -> auditStatus.getJobStatus()).collect(
285             toList());
286         assertThat( assertionReason, statusesFromDB, is(expectedStatuses));
287     }
288 }