2  * ============LICENSE_START=======================================================
 
   3  * dcaegen2-collectors-veshv
 
   4  * ================================================================================
 
   5  * Copyright (C) 2018 NOKIA
 
   6  * ================================================================================
 
   7  * Licensed under the Apache License, Version 2.0 (the "License");
 
   8  * you may not use this file except in compliance with the License.
 
   9  * You may obtain a copy of the License at
 
  11  *      http://www.apache.org/licenses/LICENSE-2.0
 
  13  * Unless required by applicable law or agreed to in writing, software
 
  14  * distributed under the License is distributed on an "AS IS" BASIS,
 
  15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  16  * See the License for the specific language governing permissions and
 
  17  * limitations under the License.
 
  18  * ============LICENSE_END=========================================================
 
  20 package org.onap.dcae.collectors.veshv.ves.message.generator.impl
 
  22 import com.google.protobuf.ByteString
 
  23 import com.google.protobuf.InvalidProtocolBufferException
 
  24 import org.assertj.core.api.Assertions.assertThat
 
  25 import org.assertj.core.api.Assertions.assertThatExceptionOfType
 
  26 import org.jetbrains.spek.api.Spek
 
  27 import org.jetbrains.spek.api.dsl.describe
 
  28 import org.jetbrains.spek.api.dsl.given
 
  29 import org.jetbrains.spek.api.dsl.it
 
  30 import org.jetbrains.spek.api.dsl.on
 
  31 import org.onap.dcae.collectors.veshv.domain.ByteData
 
  32 import org.onap.dcae.collectors.veshv.domain.WireFrameMessage
 
  33 import org.onap.dcae.collectors.veshv.domain.VesEventDomain.PERF3GPP
 
  34 import org.onap.dcae.collectors.veshv.domain.VesEventDomain.FAULT
 
  35 import org.onap.dcae.collectors.veshv.domain.VesEventDomain.HEARTBEAT
 
  36 import org.onap.dcae.collectors.veshv.tests.utils.commonHeader
 
  37 import org.onap.dcae.collectors.veshv.ves.message.generator.api.MessageGenerator
 
  38 import org.onap.dcae.collectors.veshv.ves.message.generator.api.MessageParameters
 
  39 import org.onap.dcae.collectors.veshv.ves.message.generator.api.MessageType
 
  40 import org.onap.ves.VesEventOuterClass.CommonEventHeader
 
  41 import org.onap.ves.VesEventOuterClass.VesEvent
 
  42 import reactor.test.test
 
  43 import kotlin.test.assertTrue
 
  46  * @author Jakub Dudycz <jakub.dudycz@nokia.com>
 
  49 object MessageGeneratorImplTest : Spek({
 
  50     describe("message factory") {
 
  51         val maxPayloadSizeBytes = 1024
 
  52         val generator = MessageGeneratorImpl(PayloadGenerator(), maxPayloadSizeBytes)
 
  53         given("single message parameters") {
 
  55             on("messages amount not specified in parameters") {
 
  56                 it("should create infinite flux") {
 
  59                             .createMessageFlux(listOf(MessageParameters(
 
  60                                     commonHeader(PERF3GPP),
 
  65                             .expectNextCount(limit)
 
  70             on("messages amount = 0 specified in parameters") {
 
  71                 it("should create empty message flux") {
 
  73                             .createMessageFlux(listOf(MessageParameters(
 
  74                                     commonHeader(PERF3GPP),
 
  83             on("messages amount specified in parameters") {
 
  84                 it("should create message flux of specified size") {
 
  86                             .createMessageFlux(listOf(MessageParameters(
 
  87                                     commonHeader(PERF3GPP),
 
  97             on("message type requesting valid message") {
 
  98                 it("should create flux of valid messages with given domain") {
 
 100                             .createMessageFlux(listOf(MessageParameters(
 
 107                                 assertTrue(it.validate().isRight())
 
 108                                 assertThat(it.payloadSize).isLessThan(maxPayloadSizeBytes)
 
 109                                 assertThat(extractCommonEventHeader(it.payload).domain).isEqualTo(FAULT.domainName)
 
 115             on("message type requesting too big payload") {
 
 116                 it("should create flux of messages with given domain and payload exceeding threshold") {
 
 119                             .createMessageFlux(listOf(MessageParameters(
 
 120                                     commonHeader(PERF3GPP),
 
 121                                     MessageType.TOO_BIG_PAYLOAD,
 
 126                                 assertTrue(it.validate().isRight())
 
 127                                 assertThat(it.payloadSize).isGreaterThan(maxPayloadSizeBytes)
 
 128                                 assertThat(extractCommonEventHeader(it.payload).domain).isEqualTo(PERF3GPP.domainName)
 
 134             on("message type requesting invalid GPB data ") {
 
 135                 it("should create flux of messages with invalid payload") {
 
 137                             .createMessageFlux(listOf(MessageParameters(
 
 138                                     commonHeader(PERF3GPP),
 
 139                                     MessageType.INVALID_GPB_DATA,
 
 144                                 assertTrue(it.validate().isRight())
 
 145                                 assertThat(it.payloadSize).isLessThan(maxPayloadSizeBytes)
 
 146                                 assertThatExceptionOfType(InvalidProtocolBufferException::class.java)
 
 147                                         .isThrownBy { extractCommonEventHeader(it.payload) }
 
 153             on("message type requesting invalid wire frame ") {
 
 154                 it("should create flux of messages with invalid version") {
 
 156                             .createMessageFlux(listOf(MessageParameters(
 
 157                                     commonHeader(PERF3GPP),
 
 158                                     MessageType.INVALID_WIRE_FRAME,
 
 163                                 assertTrue(it.validate().isLeft())
 
 164                                 assertThat(it.payloadSize).isLessThan(maxPayloadSizeBytes)
 
 165                                 assertThat(extractCommonEventHeader(it.payload).domain).isEqualTo(PERF3GPP.domainName)
 
 166                                 assertThat(it.versionMajor).isNotEqualTo(WireFrameMessage.SUPPORTED_VERSION_MINOR)
 
 172             on("message type requesting fixed payload") {
 
 173                 it("should create flux of valid messages with fixed payload") {
 
 175                             .createMessageFlux(listOf(MessageParameters(
 
 177                                     MessageType.FIXED_PAYLOAD,
 
 182                                 assertTrue(it.validate().isRight())
 
 183                                 assertThat(it.payloadSize).isLessThan(maxPayloadSizeBytes)
 
 184                                 assertThat(extractEventFields(it.payload).size()).isEqualTo(MessageGenerator.FIXED_PAYLOAD_SIZE)
 
 185                                 assertThat(extractCommonEventHeader(it.payload).domain).isEqualTo(FAULT.domainName)
 
 191         given("list of message parameters") {
 
 192             it("should create concatenated flux of messages") {
 
 193                 val singleFluxSize = 5L
 
 194                 val messageParameters = listOf(
 
 195                         MessageParameters(commonHeader(PERF3GPP), MessageType.VALID, singleFluxSize),
 
 196                         MessageParameters(commonHeader(FAULT), MessageType.TOO_BIG_PAYLOAD, singleFluxSize),
 
 197                         MessageParameters(commonHeader(HEARTBEAT), MessageType.VALID, singleFluxSize)
 
 199                 generator.createMessageFlux(messageParameters)
 
 202                             assertThat(it.payloadSize).isLessThan(maxPayloadSizeBytes)
 
 203                             assertThat(extractCommonEventHeader(it.payload).domain).isEqualTo(PERF3GPP.domainName)
 
 205                         .expectNextCount(singleFluxSize - 1)
 
 207                             assertThat(it.payloadSize).isGreaterThan(maxPayloadSizeBytes)
 
 208                             assertThat(extractCommonEventHeader(it.payload).domain).isEqualTo(FAULT.domainName)
 
 210                         .expectNextCount(singleFluxSize - 1)
 
 212                             assertThat(it.payloadSize).isLessThan(maxPayloadSizeBytes)
 
 213                             assertThat(extractCommonEventHeader(it.payload).domain).isEqualTo(HEARTBEAT.domainName)
 
 215                         .expectNextCount(singleFluxSize - 1)
 
 222 fun extractCommonEventHeader(bytes: ByteData): CommonEventHeader =
 
 223         VesEvent.parseFrom(bytes.unsafeAsArray()).commonEventHeader
 
 226 fun extractEventFields(bytes: ByteData): ByteString =
 
 227         VesEvent.parseFrom(bytes.unsafeAsArray()).eventFields