From 2ddfc4e81cc399c8ffe5451e19308503a5b08a94 Mon Sep 17 00:00:00 2001 From: Wojciech Sliwka <wojciech.sliwka@nokia.com> Date: Thu, 20 Sep 2018 12:03:10 +0200 Subject: new tests for job dir Add new tests for job directory to increase code coverage in vid Issue-ID: VID-310 Change-Id: Idbdeb1e9037c2b8c7359cf34b3893e1fc2e858d2 Signed-off-by: Wojciech Sliwka <wojciech.sliwka@nokia.com> --- .../job/command/InProgressStatusCommandTest.java | 143 +++++++++++++++++++ .../command/ServiceInstantiationCommandTest.java | 157 +++++++++++++++++++++ .../org/onap/vid/job/impl/JobAdapterImplTest.java | 110 +++++++++++++++ .../vid/job/impl/JobSchedulerInitializerTest.java | 121 ++++++++++++++++ 4 files changed, 531 insertions(+) create mode 100644 vid-app-common/src/test/java/org/onap/vid/job/command/InProgressStatusCommandTest.java create mode 100644 vid-app-common/src/test/java/org/onap/vid/job/command/ServiceInstantiationCommandTest.java create mode 100644 vid-app-common/src/test/java/org/onap/vid/job/impl/JobAdapterImplTest.java create mode 100644 vid-app-common/src/test/java/org/onap/vid/job/impl/JobSchedulerInitializerTest.java (limited to 'vid-app-common/src/test/java') diff --git a/vid-app-common/src/test/java/org/onap/vid/job/command/InProgressStatusCommandTest.java b/vid-app-common/src/test/java/org/onap/vid/job/command/InProgressStatusCommandTest.java new file mode 100644 index 000000000..bc623928c --- /dev/null +++ b/vid-app-common/src/test/java/org/onap/vid/job/command/InProgressStatusCommandTest.java @@ -0,0 +1,143 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2018 Nokia Intellectual Property. 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.job.command; + + +import io.joshworks.restclient.http.HttpResponse; +import org.mockito.Mock; +import org.onap.vid.job.Job; +import org.onap.vid.job.NextCommand; +import org.onap.vid.mso.MsoInterface; +import org.onap.vid.mso.rest.AsyncRequestStatus; +import org.onap.vid.services.AsyncInstantiationBusinessLogic; +import org.onap.vid.services.AuditService; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import javax.ws.rs.ProcessingException; +import java.util.UUID; + + +import static org.assertj.core.api.Java6Assertions.assertThat; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; + +public class InProgressStatusCommandTest { + + @Mock + private AsyncInstantiationBusinessLogic asyncInstantiationBusinessLogic; + + @Mock + private MsoInterface msoInterface; + + @Mock + private AuditService auditService; + + @Mock + private HttpResponse<AsyncRequestStatus> msoResponse; + + @Mock + private AsyncRequestStatus asyncRequestStatus; + + @Mock + private AsyncRequestStatus.Request request; + + private UUID uuid = UUID.randomUUID(); + + private InProgressStatusCommand inProgressStatusCommand; + + @BeforeMethod + public void setUp() { + initMocks(this); + + inProgressStatusCommand = new InProgressStatusCommand(asyncInstantiationBusinessLogic, msoInterface, auditService, uuid, "sampleRequestId"); + + when(asyncInstantiationBusinessLogic.getOrchestrationRequestsPath()).thenReturn("http://localhost:8080/samplePath"); + when(msoInterface.get("http://localhost:8080/samplePath/sampleRequestId", AsyncRequestStatus.class)).thenReturn(msoResponse); + when(msoResponse.getBody()).thenReturn(asyncRequestStatus); + } + + + @Test + public void whenSOReturnsErrorShouldSetProperFailureStateAndReturnRetryCommand() { + when(msoResponse.getStatus()).thenReturn(500); + + NextCommand call = inProgressStatusCommand.call(); + + assertThat(call.getStatus()).isEqualTo(Job.JobStatus.IN_PROGRESS); + assertThat(call.getCommand()).isEqualTo(inProgressStatusCommand); + + verify(auditService).setFailedAuditStatusFromMso(uuid, "sampleRequestId", 500, asyncRequestStatus.toString()); + } + + @Test + public void shouldProperlyHandleFailedInstantiation() { + when(msoResponse.getStatus()).thenReturn(200); + when(asyncInstantiationBusinessLogic.calcStatus(asyncRequestStatus)).thenReturn(Job.JobStatus.FAILED); + asyncRequestStatus.request = request; + + NextCommand call = inProgressStatusCommand.call(); + + assertThat(call.getCommand()).isEqualTo(inProgressStatusCommand); + assertThat(call.getStatus()).isEqualTo(Job.JobStatus.FAILED); + + verify(asyncInstantiationBusinessLogic).handleFailedInstantiation(uuid); + verify(asyncInstantiationBusinessLogic).auditMsoStatus(uuid, request); + } + + @Test + public void shouldRetryCommandWithPausedState() { + when(msoResponse.getStatus()).thenReturn(200); + when(asyncInstantiationBusinessLogic.calcStatus(asyncRequestStatus)).thenReturn(Job.JobStatus.PAUSE); + asyncRequestStatus.request = request; + + NextCommand call = inProgressStatusCommand.call(); + + assertThat(call.getCommand()).isEqualTo(inProgressStatusCommand); + assertThat(call.getStatus()).isEqualTo(Job.JobStatus.IN_PROGRESS); + + verify(asyncInstantiationBusinessLogic).auditMsoStatus(uuid, request); + verify(asyncInstantiationBusinessLogic).updateServiceInfoAndAuditStatus(uuid, Job.JobStatus.PAUSE); + } + + @Test + public void shouldRetryCommandExitedWithProcessingException() { + when(msoResponse.getStatus()).thenReturn(200); + when(asyncInstantiationBusinessLogic.calcStatus(asyncRequestStatus)).thenThrow(new ProcessingException("")); + + NextCommand call = inProgressStatusCommand.call(); + + assertThat(call.getCommand()).isEqualTo(inProgressStatusCommand); + assertThat(call.getStatus()).isEqualTo(Job.JobStatus.IN_PROGRESS); + } + + @Test + public void shouldSetStoppedStatusWhenRuntimeExceptionOccurs() { + when(msoResponse.getStatus()).thenReturn(200); + when(asyncInstantiationBusinessLogic.calcStatus(asyncRequestStatus)).thenThrow(new RuntimeException()); + + NextCommand call = inProgressStatusCommand.call(); + + assertThat(call.getCommand()).isEqualTo(inProgressStatusCommand); + assertThat(call.getStatus()).isEqualTo(Job.JobStatus.STOPPED); + } +} \ No newline at end of file diff --git a/vid-app-common/src/test/java/org/onap/vid/job/command/ServiceInstantiationCommandTest.java b/vid-app-common/src/test/java/org/onap/vid/job/command/ServiceInstantiationCommandTest.java new file mode 100644 index 000000000..e7ab4f098 --- /dev/null +++ b/vid-app-common/src/test/java/org/onap/vid/job/command/ServiceInstantiationCommandTest.java @@ -0,0 +1,157 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2018 Nokia Intellectual Property. 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.job.command; + + +import io.joshworks.restclient.http.HttpResponse; +import org.mockito.Mock; +import org.onap.vid.aai.AaiResponse; +import org.onap.vid.aai.exceptions.InvalidAAIResponseException; +import org.onap.vid.changeManagement.RequestDetailsWrapper; +import org.onap.vid.domain.mso.RequestReferences; +import org.onap.vid.exceptions.MaxRetriesException; +import org.onap.vid.job.Job; +import org.onap.vid.job.NextCommand; +import org.onap.vid.model.RequestReferencesContainer; +import org.onap.vid.model.serviceInstantiation.ServiceInstantiation; +import org.onap.vid.mso.MsoInterface; +import org.onap.vid.mso.model.ServiceInstantiationRequestDetails; +import org.onap.vid.services.AsyncInstantiationBusinessLogic; +import org.onap.vid.services.AuditService; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import java.util.UUID; + +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.IsEqual.equalTo; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; + +public class ServiceInstantiationCommandTest { + @Mock + private AsyncInstantiationBusinessLogic asyncInstantiationBusinessLogic; + + @Mock + private MsoInterface msoInterface; + + @Mock + private AuditService auditService; + + @Mock + private ServiceInstantiation serviceInstantiation; + + @Mock + private HttpResponse<RequestReferencesContainer> msoResponse; + + @Mock + private RequestDetailsWrapper<ServiceInstantiationRequestDetails> requestDetailsWrapper; + + @Mock + private AaiResponse aaiResponse; + + @Mock + private RequestReferencesContainer requestReferencesContainer; + + + private UUID uuid = UUID.randomUUID(); + + + private ServiceInstantiationCommand serviceInstantiationCommand; + + @BeforeMethod + public void setUp() { + initMocks(this); + serviceInstantiationCommand = new ServiceInstantiationCommand(asyncInstantiationBusinessLogic, auditService, msoInterface, uuid, serviceInstantiation, "sampleUserId"); + } + + + @Test + public void shouldProperlyHandleMaxRetriesException() { + when(asyncInstantiationBusinessLogic.generateServiceInstantiationRequest(uuid, serviceInstantiation, "sampleUserId")).thenThrow(new MaxRetriesException("", 2)); + + NextCommand call = serviceInstantiationCommand.call(); + + assertThat(call.getCommand(), is(nullValue())); + assertThat(call.getStatus(), is(equalTo(Job.JobStatus.FAILED))); + + verify(asyncInstantiationBusinessLogic).handleFailedInstantiation(uuid); + } + + @Test + public void shouldProperlyHandleInvalidAAIResponseException() { + doThrow(new InvalidAAIResponseException(aaiResponse)).when(asyncInstantiationBusinessLogic).generateServiceInstantiationRequest(uuid, serviceInstantiation, "sampleUserId"); + + NextCommand call = serviceInstantiationCommand.call(); + + assertThat(call.getCommand(), is(serviceInstantiationCommand)); + assertThat(call.getStatus(), is(equalTo(Job.JobStatus.IN_PROGRESS))); + } + + + @Test + public void shouldProperlyHandleInvalidSOResponse() { + when(asyncInstantiationBusinessLogic.generateServiceInstantiationRequest(uuid, serviceInstantiation, "sampleUserId")).thenReturn(requestDetailsWrapper); + when(asyncInstantiationBusinessLogic.getServiceInstantiationPath(serviceInstantiation)).thenReturn("samplePath"); + when(msoInterface.post("samplePath", requestDetailsWrapper, RequestReferencesContainer.class)).thenReturn(msoResponse); + when(msoResponse.getStatus()).thenReturn(500); + when(msoResponse.getBody()).thenReturn(requestReferencesContainer); + + NextCommand call = serviceInstantiationCommand.call(); + + assertThat(call.getCommand(), is(nullValue())); + assertThat(call.getStatus(), is(equalTo(Job.JobStatus.FAILED))); + + verify(auditService).setFailedAuditStatusFromMso(uuid, null, 500, requestReferencesContainer.toString()); + } + + + @Test + public void shouldProperlyUpdateServiceStatusAndReturnInProgressCommand() { + RequestReferences requestReferences = createRequestReferences(); + + when(asyncInstantiationBusinessLogic.generateServiceInstantiationRequest(uuid, serviceInstantiation, "sampleUserId")).thenReturn(requestDetailsWrapper); + when(asyncInstantiationBusinessLogic.getServiceInstantiationPath(serviceInstantiation)).thenReturn("samplePath"); + when(msoInterface.post("samplePath", requestDetailsWrapper, RequestReferencesContainer.class)).thenReturn(msoResponse); + when(msoResponse.getStatus()).thenReturn(200); + when(msoResponse.getBody()).thenReturn(requestReferencesContainer); + when(requestReferencesContainer.getRequestReferences()).thenReturn(requestReferences); + + + NextCommand call = serviceInstantiationCommand.call(); + + assertThat(call.getCommand(), instanceOf(InProgressStatusCommand.class)); + assertThat(call.getStatus(), is(equalTo(Job.JobStatus.IN_PROGRESS))); + + } + + private RequestReferences createRequestReferences() { + RequestReferences requestReferences = new RequestReferences(); + requestReferences.setInstanceId("sampleInstanceId"); + requestReferences.setRequestId("sampleRequestId"); + return requestReferences; + } +} \ No newline at end of file diff --git a/vid-app-common/src/test/java/org/onap/vid/job/impl/JobAdapterImplTest.java b/vid-app-common/src/test/java/org/onap/vid/job/impl/JobAdapterImplTest.java new file mode 100644 index 000000000..dc2eafc9b --- /dev/null +++ b/vid-app-common/src/test/java/org/onap/vid/job/impl/JobAdapterImplTest.java @@ -0,0 +1,110 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2018 Nokia Intellectual Property. 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.job.impl; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import org.mockito.Mock; +import org.onap.vid.job.Job; +import org.onap.vid.job.JobAdapter; +import org.onap.vid.job.JobType; +import org.onap.vid.model.JobBulk; +import org.onap.vid.model.JobModel; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import java.util.List; +import java.util.UUID; +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; + +public class JobAdapterImplTest { + + + private static final int SAMPLE_INDEX = 10; + private static final String SAMPLE_USER_ID = "sampleUserId"; + + @Mock + private Job job; + + @Mock + private JobAdapter.AsyncJobRequest asyncJobRequest; + + private UUID sampleUuid=UUID.randomUUID(); + + private JobAdapterImpl jobAdapter = new JobAdapterImpl(); + + @BeforeMethod + public void setUp() { + initMocks(this); + + when(job.getUuid()).thenReturn(sampleUuid); + when(job.getStatus()).thenReturn(Job.JobStatus.IN_PROGRESS); + when(job.getTemplateId()).thenReturn(sampleUuid); + } + + @Test + public void shouldConvertJobToJobModel() { + + + JobModel convertedJob = jobAdapter.toModel(job); + + assertThat(convertedJob.getUuid()).isEqualByComparingTo(sampleUuid); + assertThat(convertedJob.getStatus()).isEqualByComparingTo(Job.JobStatus.IN_PROGRESS); + assertThat(convertedJob.getTemplateId()).isEqualByComparingTo(sampleUuid); + } + + + @Test + public void shouldProperlyCreateJob() { + UUID uuid = UUID.randomUUID(); + + Job createdJob = jobAdapter.createJob(JobType.ServiceInstantiation, asyncJobRequest, uuid, SAMPLE_USER_ID, SAMPLE_INDEX); + + assertThat(createdJob.getStatus()).isEqualByComparingTo(Job.JobStatus.PENDING); + assertThat(createdJob.getTemplateId()).isEqualByComparingTo(uuid); + assertThat(createdJob.getType()).isEqualByComparingTo(JobType.ServiceInstantiation); + assertThat(createdJob.getData()).isEqualTo(ImmutableMap.of("request", asyncJobRequest, "userId", SAMPLE_USER_ID)); + } + + @Test + public void shouldProperlyCreateBulkOfJobs(){ + List<Job> bulkOfJobs = jobAdapter.createBulkOfJobs(ImmutableMap.of("count", 5, "type", JobType.InProgressStatus.name())); + + + assertThat(bulkOfJobs).hasSize(5); + + Stream<Job> jobStream = bulkOfJobs.stream().filter(x -> JobType.InProgressStatus.equals(x.getType()) && Job.JobStatus.PENDING.equals(x.getStatus())); + + assertThat(jobStream).hasSize(5); + } + + + @Test + public void shouldConvertListToBulkJob(){ + JobBulk jobBulk = jobAdapter.toModelBulk(ImmutableList.of(job, job)); + + assertThat(jobBulk.getJobs()).hasSize(2); + } +} diff --git a/vid-app-common/src/test/java/org/onap/vid/job/impl/JobSchedulerInitializerTest.java b/vid-app-common/src/test/java/org/onap/vid/job/impl/JobSchedulerInitializerTest.java new file mode 100644 index 000000000..93afd1709 --- /dev/null +++ b/vid-app-common/src/test/java/org/onap/vid/job/impl/JobSchedulerInitializerTest.java @@ -0,0 +1,121 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2018 Nokia Intellectual Property. 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.job.impl; + + +import org.mockito.ArgumentCaptor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.onap.vid.job.JobsBrokerService; +import org.onap.vid.job.command.JobCommandFactory; +import org.onap.vid.properties.Features; +import org.quartz.JobDetail; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.quartz.Trigger; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; +import org.togglz.core.manager.FeatureManager; + +import java.util.List; +import java.util.stream.Collectors; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; +import static org.mockito.Mockito.when; +import static org.mockito.MockitoAnnotations.initMocks; + +public class JobSchedulerInitializerTest { + + @Mock + private JobsBrokerService brokerService; + + @Mock + private SchedulerFactoryBean schedulerFactoryBean; + + @Mock + private FeatureManager featureManager; + + @Mock + private JobCommandFactory commandFactory; + + @Mock + private Scheduler scheduler; + + @InjectMocks + private JobSchedulerInitializer jobSchedulerInitializer; + + @BeforeMethod + public void setUp() { + initMocks(this); + } + + + @Test + public void shouldNotInitializeSchedulerWhenAsyncJobsAreDisabled() { + when(featureManager.isActive(Features.FLAG_ASYNC_JOBS)).thenReturn(false); + + jobSchedulerInitializer.init(); + + verifyZeroInteractions(schedulerFactoryBean); + } + + + @Test + public void shouldInitializeSchedulerWhenAsyncJobsAreEnabled() throws SchedulerException { + ArgumentCaptor<JobDetail> jobDetailArgumentCaptor = ArgumentCaptor.forClass(JobDetail.class); + ArgumentCaptor<Trigger> triggerArgumentCaptor = ArgumentCaptor.forClass(Trigger.class); + when(featureManager.isActive(Features.FLAG_ASYNC_JOBS)).thenReturn(true); + when(schedulerFactoryBean.getScheduler()).thenReturn(scheduler); + + jobSchedulerInitializer.init(); + + verify(scheduler, times(2)).scheduleJob(jobDetailArgumentCaptor.capture(), triggerArgumentCaptor.capture()); + + List<Object> topics = extractTopics(jobDetailArgumentCaptor); + + List<String> descriptions = extractDescription(triggerArgumentCaptor); + + assertThat(topics, containsInAnyOrder(org.onap.vid.job.Job.JobStatus.IN_PROGRESS, org.onap.vid.job.Job.JobStatus.PENDING)); + assertThat(descriptions, containsInAnyOrder("Trigger to run async worker for PENDING", "Trigger to run async worker for IN_PROGRESS")); + } + + private List<Object> extractTopics(ArgumentCaptor<JobDetail> jobDetailArgumentCaptor) { + return jobDetailArgumentCaptor + .getAllValues() + .stream() + .map(JobDetail::getJobDataMap) + .map(x -> x.get("topic")) + .collect(Collectors.toList()); + } + + private List<String> extractDescription(ArgumentCaptor<Trigger> triggerArgumentCaptor) { + return triggerArgumentCaptor + .getAllValues() + .stream() + .map(Trigger::getDescription) + .collect(Collectors.toList()); + } +} \ No newline at end of file -- cgit 1.2.3-korg