From cec9b3deab76cc7f69ef03fc7fb538f386581f4b Mon Sep 17 00:00:00 2001 From: kurczews Date: Mon, 25 Mar 2019 09:36:25 +0100 Subject: Support for BBS logical link Issue-ID: DCAEGEN2-1362 Change-Id: I9dbe7c941d9b48e0cac16be9d3410855c51ef4b0 Signed-off-by: kurczews --- .../services/prh/tasks/BbsActionsTaskTest.java | 181 +++++++++++++++++++++ .../services/prh/tasks/ScheduleControllerSpy.java | 9 +- 2 files changed, 189 insertions(+), 1 deletion(-) create mode 100644 prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/tasks/BbsActionsTaskTest.java (limited to 'prh-app-server/src/test/java/org') diff --git a/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/tasks/BbsActionsTaskTest.java b/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/tasks/BbsActionsTaskTest.java new file mode 100644 index 00000000..197d9a8c --- /dev/null +++ b/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/tasks/BbsActionsTaskTest.java @@ -0,0 +1,181 @@ +/* + * ============LICENSE_START======================================================= + * PNF-REGISTRATION-HANDLER + * ================================================================================ + * Copyright (C) 2019 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.dcaegen2.services.prh.tasks; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.verifyZeroInteractions; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import io.netty.buffer.ByteBuf; +import io.netty.handler.codec.http.HttpResponseStatus; +import java.io.InputStreamReader; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.onap.dcaegen2.services.prh.TestAppConfiguration; +import org.onap.dcaegen2.services.prh.configuration.AppConfig; +import org.onap.dcaegen2.services.prh.exceptions.AaiFailureException; +import org.onap.dcaegen2.services.prh.model.ConsumerDmaapModel; +import org.onap.dcaegen2.services.prh.model.ImmutableConsumerDmaapModel; +import org.onap.dcaegen2.services.sdk.rest.services.aai.client.config.AaiClientConfiguration; +import org.onap.dcaegen2.services.sdk.rest.services.adapters.http.HttpRequest; +import org.onap.dcaegen2.services.sdk.rest.services.adapters.http.HttpResponse; +import org.onap.dcaegen2.services.sdk.rest.services.adapters.http.ImmutableHttpResponse; +import org.onap.dcaegen2.services.sdk.rest.services.adapters.http.RxHttpClient; +import org.reactivestreams.Publisher; +import reactor.core.publisher.Mono; + +class BbsActionsTaskTest { + + private static final String CORRECT_LOGICAL_LINK_JSON = "bbs_action/correct_logical_link.json"; + public static final String AAI_URL = "https://aai.onap.svc.cluster.local:8443/aai/v12/network/logical-links/logical-link/some-link"; + + private AaiClientConfiguration aaiClientConfiguration = TestAppConfiguration.createDefaultAaiClientConfiguration(); + private AppConfig appConfig = mock(AppConfig.class); + private RxHttpClient httpClient = mock(RxHttpClient.class); + + @Test + void whenPassedObjectDoesntHaveAdditionalFields_ReturnPayloadTransparently() { + // given + given(appConfig.getAaiClientConfiguration()).willReturn(aaiClientConfiguration); + ConsumerDmaapModel consumerDmaapModel = buildConsumerDmaapModel(null); + + // when + ConsumerDmaapModel result = new BbsActionsTask(appConfig, httpClient).execute(consumerDmaapModel).block(); + + // then + verifyZeroInteractions(httpClient); + assertThat(result).isEqualTo(consumerDmaapModel); + } + + @Test + void whenPassedObjectHasEmptyLogicalLink_ReturnPayloadTransparently() { + // given + given(appConfig.getAaiClientConfiguration()).willReturn(aaiClientConfiguration); + + JsonObject additionalFields = new JsonObject(); + additionalFields.addProperty("attachmentPoint", ""); + ConsumerDmaapModel consumerDmaapModel = buildConsumerDmaapModel(additionalFields); + + // when + ConsumerDmaapModel result = new BbsActionsTask(appConfig, httpClient).execute(consumerDmaapModel).block(); + + // then + verifyZeroInteractions(httpClient); + assertThat(result).isEqualTo(consumerDmaapModel); + } + + @Test + void whenPassedObjectHasLogicalLink_createLogicalLink_and_associateWithPnf_and_ReturnPayloadTransparently() { + // given + given(appConfig.getAaiClientConfiguration()).willReturn(aaiClientConfiguration); + + JsonObject additionalFields = new JsonObject(); + additionalFields.addProperty("attachmentPoint", "some-link"); + ConsumerDmaapModel consumerDmaapModel = buildConsumerDmaapModel(additionalFields); + + given(httpClient.call(any())).willReturn(Mono.just(buildAaiResponse(HttpResponseStatus.OK))); + + // when + Mono response = new BbsActionsTask(appConfig, httpClient).execute(consumerDmaapModel); + + // then + ArgumentCaptor captor = ArgumentCaptor.forClass(HttpRequest.class); + verify(httpClient).call(captor.capture()); + verifyNoMoreInteractions(httpClient); + + HttpRequest request = captor.getValue(); + assertThat(request.url()).isEqualTo( + "https://aai.onap.svc.cluster.local:8443/aai/v12/network/logical-links/logical-link/some-link"); + assertJsonEquals(request.body(), CORRECT_LOGICAL_LINK_JSON); + assertThat(request.headers().toJavaMap()).containsOnlyKeys("X-InvocationID", "X-RequestID"); + assertEquals(consumerDmaapModel, response.block()); + } + + @Test + void whenPassedObjectHasLogicalLink_butAaiQueryFails_returnError() { + // given + given(appConfig.getAaiClientConfiguration()).willReturn(aaiClientConfiguration); + + JsonObject additionalFields = new JsonObject(); + additionalFields.addProperty("attachmentPoint", "some-link"); + ConsumerDmaapModel consumerDmaapModel = buildConsumerDmaapModel(additionalFields); + + given(httpClient.call(any())).willReturn(Mono.just(buildAaiResponse(HttpResponseStatus.INTERNAL_SERVER_ERROR))); + + // when + Mono response = new BbsActionsTask(appConfig, httpClient).execute(consumerDmaapModel); + + // then + ArgumentCaptor captor = ArgumentCaptor.forClass(HttpRequest.class); + verify(httpClient).call(captor.capture()); + verifyNoMoreInteractions(httpClient); + + HttpRequest request = captor.getValue(); + assertThat(request.url()).isEqualTo(AAI_URL); + assertJsonEquals(request.body(), CORRECT_LOGICAL_LINK_JSON); + assertThat(request.headers().toJavaMap()).containsOnlyKeys("X-InvocationID", "X-RequestID"); + + assertThatThrownBy(response::block).hasCauseInstanceOf(AaiFailureException.class); + } + + private ConsumerDmaapModel buildConsumerDmaapModel(JsonObject additionalFields) { + return ImmutableConsumerDmaapModel.builder() + .ipv4("10.16.123.234") + .ipv6("0:0:0:0:0:FFFF:0A10:7BEA") + .correlationId("NOKQTFCOC540002E") + .serialNumber("QTFCOC540002E") + .equipVendor("nokia") + .equipModel("3310") + .equipType("type") + .nfRole("role") + .swVersion("v4.5.0.1") + .additionalFields(additionalFields) + .build(); + } + + private HttpResponse buildAaiResponse(HttpResponseStatus status) { + return ImmutableHttpResponse + .builder() + .statusCode(status.code()) + .url("") + .rawBody("".getBytes()) + .build(); + } + + private void assertJsonEquals(Publisher requestBody, String path) { + JsonParser parser = new JsonParser(); + JsonElement result = parser.parse(Mono.from(requestBody).block().toString(UTF_8)); + JsonElement expected = parser + .parse(new InputStreamReader(getClass().getClassLoader().getResourceAsStream(path))); + + assertThat(result).isEqualTo(expected); + } +} \ No newline at end of file diff --git a/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/tasks/ScheduleControllerSpy.java b/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/tasks/ScheduleControllerSpy.java index 2f7ff61c..b12b3d39 100644 --- a/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/tasks/ScheduleControllerSpy.java +++ b/prh-app-server/src/test/java/org/onap/dcaegen2/services/prh/tasks/ScheduleControllerSpy.java @@ -44,13 +44,20 @@ public class ScheduleControllerSpy { @Autowired private AaiProducerTask aaiPublisherTaskImplSpy; + @Autowired + private BbsActionsTask bbsActionsTaskImplSpy; + @Autowired private Map mdcContextMap; @Bean @Primary public ScheduledTasks registerSimpleScheduledTask() { - return spy(new ScheduledTasks(dmaapConsumerTaskImplSpy, dmaapPublisherTaskImplSpy, aaiPublisherTaskImplSpy, + return spy(new ScheduledTasks( + dmaapConsumerTaskImplSpy, + dmaapPublisherTaskImplSpy, + aaiPublisherTaskImplSpy, + bbsActionsTaskImplSpy, mdcContextMap)); } } -- cgit 1.2.3-korg