diff options
Diffstat (limited to 'cps-ncmp-service/src/test')
5 files changed, 125 insertions, 84 deletions
diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/config/OpenTelemetryCmNotificationSubscriptionConfigSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/config/OpenTelemetryCmNotificationSubscriptionConfigSpec.groovy deleted file mode 100644 index 0f6906942f..0000000000 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/config/OpenTelemetryCmNotificationSubscriptionConfigSpec.groovy +++ /dev/null @@ -1,81 +0,0 @@ -/* - * ============LICENSE_START======================================================= - * Copyright (C) 2024 Nordix Foundation - * ================================================================================ - * 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. - * - * SPDX-License-Identifier: Apache-2.0 - * ============LICENSE_END========================================================= - */ - -package org.onap.cps.ncmp.config - -import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter -import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter -import io.opentelemetry.sdk.extension.trace.jaeger.sampler.JaegerRemoteSampler -import org.spockframework.spring.SpringBean -import org.springframework.boot.actuate.autoconfigure.observation.ObservationRegistryCustomizer -import spock.lang.Shared -import spock.lang.Specification - -class OpenTelemetryConfigSpec extends Specification{ - - @Shared - @SpringBean - OpenTelemetryConfig openTelemetryConfig = new OpenTelemetryConfig() - - def setupSpec() { - openTelemetryConfig.tracingExporterEndpointUrl="http://tracingExporterEndpointUrl" - openTelemetryConfig.jaegerRemoteSamplerUrl="http://jaegerremotesamplerurl" - openTelemetryConfig.serviceId ="cps-application" - } - - def 'OpenTelemetryConfig Construction.'() { - expect: 'the system can create an instance' - new OpenTelemetryConfig() != null - } - - def 'OTLP Exporter creation with Grpc protocol'(){ - when: 'an OTLP exporter is created' - def result = openTelemetryConfig.createOtlpExporterGrpc() - then: 'an OTLP Exporter is created' - assert result instanceof OtlpGrpcSpanExporter - } - - def 'OTLP Exporter creation with HTTP protocol'(){ - when: 'an OTLP exporter is created' - def result = openTelemetryConfig.createOtlpExporterHttp() - then: 'an OTLP Exporter is created' - assert result instanceof OtlpHttpSpanExporter - and: - assert result.builder.endpoint=="http://tracingExporterEndpointUrl" - } - - def 'Jaeger Remote Sampler Creation'(){ - when: 'an OTLP exporter is created' - def result = openTelemetryConfig.createJaegerRemoteSampler() - then: 'an OTLP Exporter is created' - assert result instanceof JaegerRemoteSampler - and: - assert result.delegate.type=="remoteSampling" - and: - assert result.delegate.url.toString().startsWith("http://jaegerremotesamplerurl") - } - - def 'Skipping Acutator endpoints'(){ - when: 'an OTLP exporter is created' - def result = openTelemetryConfig.skipActuatorEndpointsFromObservation() - then: 'an OTLP Exporter is created' - assert result instanceof ObservationRegistryCustomizer - } -} diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/config/OpenTelemetryConfigSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/config/OpenTelemetryConfigSpec.groovy new file mode 100644 index 0000000000..cbff73113e --- /dev/null +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/config/OpenTelemetryConfigSpec.groovy @@ -0,0 +1,113 @@ +/* + * ============LICENSE_START======================================================= + * Copyright (C) 2024 Nordix Foundation + * ================================================================================ + * 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. + * + * SPDX-License-Identifier: Apache-2.0 + * ============LICENSE_END========================================================= + */ + +package org.onap.cps.ncmp.config + +import io.micrometer.observation.ObservationPredicate +import io.micrometer.observation.ObservationRegistry +import io.micrometer.observation.ObservationRegistry.ObservationConfig +import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter +import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter +import io.opentelemetry.sdk.extension.trace.jaeger.sampler.JaegerRemoteSampler +import org.springframework.beans.factory.annotation.Value +import org.springframework.boot.test.context.SpringBootTest +import org.springframework.http.server.observation.ServerRequestObservationContext +import org.springframework.mock.web.MockHttpServletRequest +import org.springframework.util.AntPathMatcher +import spock.lang.Specification + +@SpringBootTest(classes = [OpenTelemetryConfig]) +class OpenTelemetryConfigSpec extends Specification { + + def objectUnderTest + + @Value('${cps.tracing.exporter.endpoint}') + def tracingExporterEndpointUrl + + @Value('${cps.tracing.sampler.jaeger_remote.endpoint}') + def jaegerRemoteSamplerUrl + + def setup() { + objectUnderTest = new OpenTelemetryConfig( + serviceId: 'sample-app', + tracingExporterEndpointUrl: tracingExporterEndpointUrl, + jaegerRemoteSamplerUrl: jaegerRemoteSamplerUrl, + excludedObservationNames: ['excluded-task-name']) + } + + def 'OTLP exporter creation with Grpc protocol'() { + when: 'an OTLP exporter is created' + def result = objectUnderTest.createOtlpExporterGrpc() + then: 'expected an instance of OtlpGrpcSpanExporter' + assert result instanceof OtlpGrpcSpanExporter + } + + def 'OTLP exporter creation with HTTP protocol'() { + when: 'an OTLP exporter is created' + def result = objectUnderTest.createOtlpExporterHttp() + then: 'an OTLP Exporter is created' + assert result instanceof OtlpHttpSpanExporter + and: 'the endpoint is correctly set' + assert result.builder.endpoint == 'http://exporter-test-url' + } + + def 'Jaeger Remote Sampler Creation'() { + when: 'a Jaeger remote sampler is created' + def result = objectUnderTest.createJaegerRemoteSampler() + then: 'a Jaeger remote sampler is created' + assert result instanceof JaegerRemoteSampler + and: 'the sampler type is correct' + assert result.delegate.type == 'remoteSampling' + and: 'the sampler endpoint is correctly set' + assert result.delegate.url.toString().startsWith('http://jaeger-remote-test-url') + } + + def 'Skipping actuator endpoints'() { + given: 'a mocked observation registry and config' + def observationRegistry = Mock(ObservationRegistry.class) + def observationConfig = Mock(ObservationConfig.class) + observationRegistry.observationConfig() >> observationConfig + when: 'an observation registry customizer is created and applied' + def result = objectUnderTest.skipActuatorEndpointsFromObservation() + result.customize(observationRegistry) + then: 'the observation predicate is set correctly' + 1 * observationConfig.observationPredicate(_) >> { ObservationPredicate observationPredicate -> + def mockedHttpServletRequest = new MockHttpServletRequest(_ as String, requestUrl) + def serverRequestObservationContext = new ServerRequestObservationContext(mockedHttpServletRequest, null) + and: 'expected predicate for endpoint' + assert observationPredicate.test('some-name', serverRequestObservationContext) == expectedPredicate + } + where: 'the following parameters are used' + scenario | requestUrl || expectedPredicate + 'an actuator' | '/actuator' || false + 'a non actuator' | '/some-api' || true + } + + def 'Observation predicate is configured to filter out excluded tasks by name'() { + when: 'a path matcher and observation predicate' + def observationPredicate = objectUnderTest.observationPredicate(new AntPathMatcher('/')) + then: 'a task name is provided' + assert observationPredicate.test(taskName, null) == expectedPredicate + where: 'the following parameters are used' + taskName || expectedPredicate + 'excluded-task-name' || false + 'non-excluded-task-name' || true + } +} diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/cmnotificationsubscription/utils/CmSubscriptionPersistenceServiceSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/cmnotificationsubscription/utils/CmSubscriptionPersistenceServiceSpec.groovy index 354e2af937..2b91065592 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/cmnotificationsubscription/utils/CmSubscriptionPersistenceServiceSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/cmnotificationsubscription/utils/CmSubscriptionPersistenceServiceSpec.groovy @@ -142,7 +142,7 @@ class CmSubscriptionPersistenceServiceSpec extends Specification { 'NCMP-Admin', 'cm-data-subscriptions', parentNodeXpath.formatted(datastoreName, 'ch-1'), - objectUnderTest.getSubscriptionDetailsAsJson('/x/y', ['newSubId']), _) + objectUnderTest.getSubscriptionDetailsAsJson('/x/y', ['newSubId']), _, ContentType.JSON) where: scenario | datastoreType || datastoreName 'passthrough_running' | PASSTHROUGH_RUNNING || 'ncmp-datastore:passthrough-running' diff --git a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/InventoryPersistenceImplSpec.groovy b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/InventoryPersistenceImplSpec.groovy index e098fb81d7..e60bacbdc5 100644 --- a/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/InventoryPersistenceImplSpec.groovy +++ b/cps-ncmp-service/src/test/groovy/org/onap/cps/ncmp/impl/inventory/InventoryPersistenceImplSpec.groovy @@ -232,7 +232,7 @@ class InventoryPersistenceImplSpec extends Specification { objectUnderTest.saveCmHandle(yangModelCmHandle) then: 'the data service method to save list elements is called once' 1 * mockCpsDataService.saveListElements(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR, NCMP_DMI_REGISTRY_PARENT, - _,null) >> { + _,null, ContentType.JSON) >> { args -> { assert args[3].startsWith('{"cm-handles":[{"id":"cmhandle","additional-properties":[],"public-properties":[]}]}') } @@ -247,7 +247,7 @@ class InventoryPersistenceImplSpec extends Specification { objectUnderTest.saveCmHandleBatch([yangModelCmHandle1, yangModelCmHandle2]) then: 'CPS Data Service persists both cm handles as a batch' 1 * mockCpsDataService.saveListElements(NCMP_DATASPACE_NAME, NCMP_DMI_REGISTRY_ANCHOR, - NCMP_DMI_REGISTRY_PARENT, _,null) >> { + NCMP_DMI_REGISTRY_PARENT, _,null, ContentType.JSON) >> { args -> { def jsonData = (args[3] as String) jsonData.contains('cmhandle1') diff --git a/cps-ncmp-service/src/test/resources/application.yml b/cps-ncmp-service/src/test/resources/application.yml index f0790dda4b..759de834ab 100644 --- a/cps-ncmp-service/src/test/resources/application.yml +++ b/cps-ncmp-service/src/test/resources/application.yml @@ -16,6 +16,15 @@ # SPDX-License-Identifier: Apache-2.0 # ============LICENSE_END========================================================= +cps: + tracing: + sampler: + jaeger_remote: + endpoint: http://jaeger-Remote-test-url + exporter: + endpoint: http://exporter-test-url + enabled: true + spring: kafka: producer: |