From 007480ce97edd553c093036634a2f7e6ea47ef1e Mon Sep 17 00:00:00 2001 From: Filip Krzywka Date: Tue, 12 Mar 2019 11:50:37 +0100 Subject: Extract HV-VES configuration module To avoid cyclic dependency between "modules trio" configuration-core-ssl some classes from core.model were also extracted. Change-Id: Ie11029ae3500964f67f4d72279ddd68cdb2a1f0c Issue-ID: DCAEGEN2-1332 Signed-off-by: Filip Krzywka --- .../veshv/config/api/ArgVesHvConfigurationTest.kt | 192 +++++++++++++++++++++ .../config/api/FileConfigurationReaderTest.kt | 147 ++++++++++++++++ .../src/test/resources/sampleConfig.json | 35 ++++ 3 files changed, 374 insertions(+) create mode 100644 sources/hv-collector-configuration/src/test/kotlin/org/onap/dcae/collectors/veshv/config/api/ArgVesHvConfigurationTest.kt create mode 100644 sources/hv-collector-configuration/src/test/kotlin/org/onap/dcae/collectors/veshv/config/api/FileConfigurationReaderTest.kt create mode 100644 sources/hv-collector-configuration/src/test/resources/sampleConfig.json (limited to 'sources/hv-collector-configuration/src/test') diff --git a/sources/hv-collector-configuration/src/test/kotlin/org/onap/dcae/collectors/veshv/config/api/ArgVesHvConfigurationTest.kt b/sources/hv-collector-configuration/src/test/kotlin/org/onap/dcae/collectors/veshv/config/api/ArgVesHvConfigurationTest.kt new file mode 100644 index 00000000..0f8d8d0e --- /dev/null +++ b/sources/hv-collector-configuration/src/test/kotlin/org/onap/dcae/collectors/veshv/config/api/ArgVesHvConfigurationTest.kt @@ -0,0 +1,192 @@ +/* + * ============LICENSE_START======================================================= + * dcaegen2-collectors-veshv + * ================================================================================ + * Copyright (C) 2018-2019 NOKIA + * ================================================================================ + * 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.dcae.collectors.veshv.config.api + +import org.assertj.core.api.Assertions.assertThat +import org.jetbrains.spek.api.Spek +import org.jetbrains.spek.api.dsl.describe +import org.jetbrains.spek.api.dsl.given +import org.jetbrains.spek.api.dsl.it +import org.jetbrains.spek.api.dsl.on +import org.onap.dcae.collectors.veshv.commandline.WrongArgumentError +import org.onap.dcae.collectors.veshv.config.api.model.ServerConfiguration +import org.onap.dcae.collectors.veshv.config.impl.ArgVesHvConfiguration +import org.onap.dcae.collectors.veshv.tests.utils.parseExpectingFailure +import org.onap.dcae.collectors.veshv.tests.utils.parseExpectingSuccess +import org.onap.dcae.collectors.veshv.utils.logging.LogLevel +import org.onap.dcaegen2.services.sdk.security.ssl.SecurityKeys +import java.time.Duration +import kotlin.test.assertNotNull + +/** + * @author Piotr Jaszczyk + * @since May 2018 + */ +object ArgVesHvConfigurationTest : Spek({ + lateinit var cut: ArgVesHvConfiguration + val kafkaBootstrapServers = "dmaap-mr-wro:6666,dmaap-mr-gda:6666" + val healthCheckApiPort = "6070" + val firstRequestDelay = "10" + val requestInterval = "5" + val listenPort = "6969" + val keyStorePassword = "kspass" + val trustStorePassword = "tspass" + val logLevel = LogLevel.DEBUG.name + + beforeEachTest { + cut = ArgVesHvConfiguration() + } + + describe("parsing arguments") { + given("all parameters are present in the long form") { + lateinit var result: ServerConfiguration + + beforeEachTest { + result = cut.parseExpectingSuccess( + "--kafka-bootstrap-servers", kafkaBootstrapServers, + "--health-check-api-port", healthCheckApiPort, + "--listen-port", listenPort, + "--first-request-delay", firstRequestDelay, + "--request-interval", requestInterval, + "--key-store", "/tmp/keys.p12", + "--trust-store", "/tmp/trust.p12", + "--key-store-password", keyStorePassword, + "--trust-store-password", trustStorePassword, + "--log-level", logLevel + ) + } + + it("should set proper kafka bootstrap servers") { + assertThat(result.kafkaConfiguration.bootstrapServers).isEqualTo(kafkaBootstrapServers) + } + + it("should set proper listen port") { + assertThat(result.serverListenAddress.port).isEqualTo(listenPort.toInt()) + } + + + it("should set default listen address") { + assertThat(result.serverListenAddress.address.hostAddress).isEqualTo("0.0.0.0") + } + + it("should set proper health check api port") { + assertThat(result.healthCheckApiListenAddress.port).isEqualTo(healthCheckApiPort.toInt()) + } + + it("should set default health check api address") { + assertThat(result.healthCheckApiListenAddress.address.hostAddress).isEqualTo("0.0.0.0") + } + + it("should set proper first request delay") { + assertThat(result.configurationProviderParams.firstRequestDelay) + .isEqualTo(Duration.ofSeconds(firstRequestDelay.toLong())) + } + + it("should set proper request interval") { + assertThat(result.configurationProviderParams.requestInterval) + .isEqualTo(Duration.ofSeconds(requestInterval.toLong())) + } + + it("should set proper security configuration") { + assertThat(result.securityConfiguration.keys.isEmpty()).isFalse() + + val keys = result.securityConfiguration.keys.orNull() as SecurityKeys + assertNotNull(keys.keyStore()) + assertNotNull(keys.trustStore()) + keys.keyStorePassword().useChecked { + assertThat(it).isEqualTo(keyStorePassword.toCharArray()) + + } + keys.trustStorePassword().useChecked { + assertThat(it).isEqualTo(trustStorePassword.toCharArray()) + } + } + + it("should set proper log level") { + assertThat(result.logLevel).isEqualTo(LogLevel.DEBUG) + } + } + + describe("required parameter is absent") { + on("missing listen port") { + it("should throw exception") { + assertThat( + cut.parseExpectingFailure( + "--ssl-disable", + "--first-request-delay", firstRequestDelay, + "--request-interval", requestInterval + ) + ).isInstanceOf(WrongArgumentError::class.java) + } + } + on("missing configuration url") { + it("should throw exception") { + assertThat( + cut.parseExpectingFailure( + "--listen-port", listenPort, + "--ssl-disable", + "--first-request-delay", firstRequestDelay, + "--request-interval", requestInterval + ) + ).isInstanceOf(WrongArgumentError::class.java) + } + } + } + + describe("correct log level not provided") { + on("missing log level") { + it("should set default INFO value") { + val config = cut.parseExpectingSuccess( + "--kafka-bootstrap-servers", kafkaBootstrapServers, + "--health-check-api-port", healthCheckApiPort, + "--listen-port", listenPort, + "--first-request-delay", firstRequestDelay, + "--request-interval", requestInterval, + "--key-store", "/tmp/keys.p12", + "--trust-store", "/tmp/trust.p12", + "--key-store-password", keyStorePassword, + "--trust-store-password", trustStorePassword + ) + + assertThat(config.logLevel).isEqualTo(LogLevel.INFO) + } + } + + on("incorrect log level") { + it("should set default INFO value") { + val config = cut.parseExpectingSuccess( + "--kafka-bootstrap-servers", kafkaBootstrapServers, + "--health-check-api-port", healthCheckApiPort, + "--listen-port", listenPort, + "--first-request-delay", firstRequestDelay, + "--request-interval", requestInterval, + "--key-store", "/tmp/keys.p12", + "--trust-store", "/tmp/trust.p12", + "--key-store-password", keyStorePassword, + "--trust-store-password", trustStorePassword, + "--log-level", "1" + ) + + assertThat(config.logLevel).isEqualTo(LogLevel.INFO) + } + } + } + } +}) diff --git a/sources/hv-collector-configuration/src/test/kotlin/org/onap/dcae/collectors/veshv/config/api/FileConfigurationReaderTest.kt b/sources/hv-collector-configuration/src/test/kotlin/org/onap/dcae/collectors/veshv/config/api/FileConfigurationReaderTest.kt new file mode 100644 index 00000000..55da7d02 --- /dev/null +++ b/sources/hv-collector-configuration/src/test/kotlin/org/onap/dcae/collectors/veshv/config/api/FileConfigurationReaderTest.kt @@ -0,0 +1,147 @@ +/* + * ============LICENSE_START======================================================= + * dcaegen2-collectors-veshv + * ================================================================================ + * Copyright (C) 2019 NOKIA + * ================================================================================ + * 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.dcae.collectors.veshv.config.api + +import arrow.core.Some +import org.jetbrains.spek.api.Spek +import org.assertj.core.api.Assertions.assertThat +import org.jetbrains.spek.api.dsl.describe +import org.jetbrains.spek.api.dsl.it +import org.onap.dcae.collectors.veshv.config.api.model.Routing +import org.onap.dcae.collectors.veshv.config.impl.FileConfigurationReader +import org.onap.dcae.collectors.veshv.config.impl.PartialCbsConfig +import org.onap.dcae.collectors.veshv.config.impl.PartialKafkaConfig +import org.onap.dcae.collectors.veshv.config.impl.PartialSecurityConfig +import org.onap.dcae.collectors.veshv.config.impl.PartialServerConfig +import org.onap.dcae.collectors.veshv.utils.logging.LogLevel +import java.io.InputStreamReader +import java.io.StringReader +import java.net.InetSocketAddress + +/** + * @author Pawel Biniek + * @since February 2019 + */ +internal object FileConfigurationReaderTest : Spek({ + describe("A configuration loader utility") { + + describe("partial configuration loading") { + it("parses enumerations") { + val input = """{"logLevel":"ERROR"}""" + + val config = FileConfigurationReader().loadConfig(StringReader(input)) + assertThat(config.logLevel).isEqualTo(Some(LogLevel.ERROR)) + } + + it("parses simple structure") { + val input = """{ + "server" : { + "healthCheckApiPort" : 12002, + "listenPort" : 12003 + } + } + """.trimIndent() + val config = FileConfigurationReader().loadConfig(StringReader(input)) + assertThat(config.server.nonEmpty()).isTrue() + assertThat(config.server.orNull()?.healthCheckApiPort).isEqualTo(Some(12002)) + assertThat(config.server.orNull()?.listenPort).isEqualTo(Some(12003)) + } + + it("parses ip address") { + val input = """{ "kafka" : { + "kafkaServers": [ + "192.168.255.1:5005", + "192.168.255.26:5006" + ] + } + }""" + + val config = FileConfigurationReader().loadConfig(StringReader(input)) + assertThat(config.kafka.nonEmpty()).isTrue() + val kafka = config.kafka.orNull() as PartialKafkaConfig + assertThat(kafka.kafkaServers.nonEmpty()).isTrue() + val addresses = kafka.kafkaServers.orNull() as Array + assertThat(addresses) + .isEqualTo(arrayOf( + InetSocketAddress("192.168.255.1", 5005), + InetSocketAddress("192.168.255.26", 5006) + )) + } + + it("parses routing array with RoutingAdapter") { + val input = """{ + "kafka" : { + "routing" : [ + { + "fromDomain": "perf3gpp", + "toTopic": "HV_VES_PERF3GPP" + } + ] + } + }""".trimIndent() + val config = FileConfigurationReader().loadConfig(StringReader(input)) + assertThat(config.kafka.nonEmpty()).isTrue() + val kafka = config.kafka.orNull() as PartialKafkaConfig + assertThat(kafka.routing.nonEmpty()).isTrue() + val routing = kafka.routing.orNull() as Routing + routing.run { + assertThat(routes.size).isEqualTo(1) + assertThat(routes[0].domain).isEqualTo("perf3gpp") + assertThat(routes[0].targetTopic).isEqualTo("HV_VES_PERF3GPP") + } + } + } + + describe("complete file loading") { + it("loads actual file") { + val config = FileConfigurationReader().loadConfig( + InputStreamReader( + FileConfigurationReaderTest.javaClass.getResourceAsStream("/sampleConfig.json"))) + assertThat(config).isNotNull + assertThat(config.logLevel).isEqualTo(Some(LogLevel.ERROR)) + + assertThat(config.security.nonEmpty()).isTrue() + val security = config.security.orNull() as PartialSecurityConfig + assertThat(security.sslDisable.orNull()).isFalse() + assertThat(security.keys.nonEmpty()).isTrue() + + assertThat(config.cbs.nonEmpty()).isTrue() + val cbs = config.cbs.orNull() as PartialCbsConfig + assertThat(cbs.firstRequestDelaySec).isEqualTo(Some(7)) + assertThat(cbs.requestIntervalSec).isEqualTo(Some(900)) + + assertThat(config.kafka.nonEmpty()).isTrue() + val kafka = config.kafka.orNull() as PartialKafkaConfig + assertThat(kafka.kafkaServers.nonEmpty()).isTrue() + assertThat(kafka.routing.nonEmpty()).isTrue() + + assertThat(config.server.nonEmpty()).isTrue() + val server = config.server.orNull() as PartialServerConfig + server.run { + assertThat(dummyMode).isEqualTo(Some(false)) + assertThat(healthCheckApiPort).isEqualTo(Some(5000)) + assertThat(idleTimeoutSec).isEqualTo(Some(1200)) + assertThat(listenPort).isEqualTo(Some(6000)) + assertThat(maximumPayloadSizeBytes).isEqualTo(Some(512000)) + } + } + } + } +}) \ No newline at end of file diff --git a/sources/hv-collector-configuration/src/test/resources/sampleConfig.json b/sources/hv-collector-configuration/src/test/resources/sampleConfig.json new file mode 100644 index 00000000..b64df05a --- /dev/null +++ b/sources/hv-collector-configuration/src/test/resources/sampleConfig.json @@ -0,0 +1,35 @@ +{ + "server" : { + "healthCheckApiPort" : 5000, + "listenPort" : 6000, + "idleTimeoutSec" : 1200, + "maximumPayloadSizeBytes" : 512000, + "dummyMode" : false + }, + "cbs" : { + "firstRequestDelaySec": 7, + "requestIntervalSec": 900 + }, + "security" : { + "sslDisable": false, + "keys": { + "keyStoreFile": "test.ks.pkcs12", + "keyStorePassword": "changeMe", + "trustStoreFile": "trust.ks.pkcs12", + "trustStorePassword": "changeMeToo" + } + }, + "kafka" : { + "kafkaServers": [ + "192.168.255.1:5005", + "192.168.255.1:5006" + ], + "routing": [ + { + "fromDomain": "perf3gpp", + "toTopic": "HV_VES_PERF3GPP" + } + ] + }, + "logLevel" : "ERROR" +} \ No newline at end of file -- cgit 1.2.3-korg