From 1007a6658ae1caa365373b6de2ef4e314cd5366b Mon Sep 17 00:00:00 2001 From: Frank Kimmlingen Date: Tue, 21 Mar 2023 16:18:16 +0100 Subject: K8sPlugin: support UAT functionality K8sAbstractRestClientService and all derived classes K8sQueryRestClient K8sRbInstanceRestClient K8sDefinitionRestClient K8sUploadFileRestClientService does not support the spy / verify functionality of UatExecutor / UatServices Issue-ID: CCSDK-3872 Signed-off-by: Frank Kimmlingen Change-Id: Iee30f48e9d86efd07a2ab6dde0d5743e4657934f (cherry picked from commit 97c07491d6dfb1fca6e4aeebaf7318324c1d3eb4) --- .../blueprintsprocessor/uat/utils/UatDefinition.kt | 11 ++- .../blueprintsprocessor/uat/utils/UatExecutor.kt | 83 +++++++++++++++++----- 2 files changed, 76 insertions(+), 18 deletions(-) (limited to 'ms/blueprintsprocessor/application/src') diff --git a/ms/blueprintsprocessor/application/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/uat/utils/UatDefinition.kt b/ms/blueprintsprocessor/application/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/uat/utils/UatDefinition.kt index d5bf3f4c6..f2036fee9 100644 --- a/ms/blueprintsprocessor/application/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/uat/utils/UatDefinition.kt +++ b/ms/blueprintsprocessor/application/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/uat/utils/UatDefinition.kt @@ -25,6 +25,7 @@ import com.fasterxml.jackson.databind.JsonNode import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.databind.annotation.JsonDeserialize import com.fasterxml.jackson.module.kotlin.convertValue +import org.onap.ccsdk.cds.blueprintsprocessor.uat.utils.RequestType.EXCHANGE_RESOURCE import org.yaml.snakeyaml.DumperOptions import org.yaml.snakeyaml.Yaml import org.yaml.snakeyaml.nodes.Tag @@ -41,11 +42,17 @@ data class ProcessDefinition( data class RequestDefinition( val method: String, @JsonDeserialize(using = PathDeserializer::class) - val path: String, + val path: String = "", val headers: Map = emptyMap(), - val body: JsonNode? = null + val body: JsonNode? = null, + val requestType: RequestType = EXCHANGE_RESOURCE ) +enum class RequestType { + EXCHANGE_RESOURCE, + UPLOAD_BINARY_FILE +} + @JsonInclude(JsonInclude.Include.NON_EMPTY) data class ResponseDefinition( val status: Int = 200, diff --git a/ms/blueprintsprocessor/application/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/uat/utils/UatExecutor.kt b/ms/blueprintsprocessor/application/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/uat/utils/UatExecutor.kt index 45677fac1..357154cb1 100644 --- a/ms/blueprintsprocessor/application/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/uat/utils/UatExecutor.kt +++ b/ms/blueprintsprocessor/application/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/uat/utils/UatExecutor.kt @@ -52,14 +52,18 @@ import org.onap.ccsdk.cds.blueprintsprocessor.rest.service.BlueprintWebClientSer import org.onap.ccsdk.cds.blueprintsprocessor.uat.logging.LogColor.COLOR_MOCKITO import org.onap.ccsdk.cds.blueprintsprocessor.uat.logging.LogColor.markerOf import org.onap.ccsdk.cds.blueprintsprocessor.uat.logging.MockInvocationLogger +import org.onap.ccsdk.cds.blueprintsprocessor.uat.utils.RequestType.EXCHANGE_RESOURCE +import org.onap.ccsdk.cds.blueprintsprocessor.uat.utils.RequestType.UPLOAD_BINARY_FILE import org.skyscreamer.jsonassert.JSONAssert import org.skyscreamer.jsonassert.JSONCompareMode import org.slf4j.Logger import org.slf4j.LoggerFactory import org.springframework.core.env.ConfigurableEnvironment +import org.springframework.http.HttpMethod import org.springframework.http.MediaType import org.springframework.stereotype.Component import org.springframework.util.Base64Utils +import java.nio.file.Path import java.util.concurrent.ConcurrentHashMap /** @@ -151,12 +155,19 @@ open class UatExecutor( for ((mockClient, expectations) in expectationsPerClient) { expectations.forEach { expectation -> val request = expectation.request - verify(mockClient, evalVerificationMode(expectation.times)).exchangeResource( - eq(request.method), - eq(request.path), - any(), - argThat(RequiredMapEntriesMatcher(request.headers)) - ) + if (request.requestType == EXCHANGE_RESOURCE) { + verify(mockClient, evalVerificationMode(expectation.times)).exchangeResource( + eq(request.method), + eq(request.path), + any(), + argThat(RequiredMapEntriesMatcher(request.headers)) + ) + } else if (request.requestType == UPLOAD_BINARY_FILE) { + verify(mockClient, evalVerificationMode(expectation.times)).uploadBinaryFile( + eq(request.path), + any() + ) + } } // Don't mind the invocations to the overloaded exchangeResource(String, String, String) verify(mockClient, atLeast(0)).exchangeResource(any(), any(), any()) @@ -198,16 +209,32 @@ open class UatExecutor( restClient.exchangeResource(method, path, request, emptyMap()) } for (expectation in restExpectations) { - var stubbing = whenever( - restClient.exchangeResource( - eq(expectation.request.method), - eq(expectation.request.path), - argThat(JsonMatcher(expectation.request.body.toString())), - any() + if (expectation.request.requestType == EXCHANGE_RESOURCE) { + var stubbing = whenever( + restClient.exchangeResource( + eq(expectation.request.method), + eq(expectation.request.path), + argThat(JsonMatcher(expectation.request.body.toString())), + any() + ) ) - ) - for (response in expectation.responses) { - stubbing = stubbing.thenReturn(WebClientResponse(response.status, response.body.toString())) + for (response in expectation.responses) { + stubbing = stubbing.thenReturn(WebClientResponse(response.status, response.body.toString())) + } + } + } + + for (expectation in restExpectations) { + if (expectation.request.requestType == UPLOAD_BINARY_FILE) { + var stubbing = whenever( + restClient.uploadBinaryFile( + eq(expectation.request.path), + any() + ) + ) + for (response in expectation.responses) { + stubbing = stubbing.thenReturn(WebClientResponse(response.status, response.body.toString())) + } } } return restClient @@ -361,7 +388,7 @@ open class UatExecutor( headers: Map ): WebClientResponse { val requestDefinition = - RequestDefinition(methodType, path, headers, toJson(request)) + RequestDefinition(methodType, path, headers, toJson(request), EXCHANGE_RESOURCE) val realAnswer = realService.exchangeResource(methodType, path, request, headers) val responseBody = when { // TODO: confirm if we need to normalize the response here @@ -379,6 +406,30 @@ open class UatExecutor( return realAnswer } + override fun uploadBinaryFile(path: String, filePath: Path): + WebClientResponse { + val method = HttpMethod.POST.name + val headers = DEFAULT_HEADERS + val request = "" + val requestDefinition = + RequestDefinition(method, path, headers, toJson(request), UPLOAD_BINARY_FILE) + val realAnswer = realService.uploadBinaryFile(path, filePath) + val responseBody = when { + // TODO: confirm if we need to normalize the response here + realAnswer.status == HttpStatus.SC_OK -> toJson(realAnswer.body) + else -> null + } + val responseDefinition = + ResponseDefinition(realAnswer.status, responseBody) + expectations.add( + ExpectationDefinition( + requestDefinition, + responseDefinition + ) + ) + return realAnswer + } + override suspend fun retry(times: Int, initialDelay: Long, delay: Long, block: suspend (Int) -> T): T { return super.retry(times, initialDelay, delay, block) } -- cgit 1.2.3-korg