Bump checkstyle version
[dcaegen2/collectors/hv-ves.git] / sources / hv-collector-ves-message-generator / src / test / kotlin / org / onap / dcae / collectors / veshv / ves / message / generator / impl / MessageGeneratorImplTest.kt
1 /*
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
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
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=========================================================
19  */
20 package org.onap.dcae.collectors.veshv.ves.message.generator.impl
21
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
44 /**
45  * @author Jakub Dudycz <jakub.dudycz@nokia.com>
46  * @since June 2018
47  */
48 object MessageGeneratorImplTest : Spek({
49     describe("message factory") {
50         val maxPayloadSizeBytes = 1024
51         val generator = MessageGeneratorImpl(PayloadGenerator(), maxPayloadSizeBytes)
52         given("single message parameters") {
53
54             on("messages amount not specified in parameters") {
55                 it("should create infinite flux") {
56                     val limit = 1000L
57                     generator
58                             .createMessageFlux(listOf(MessageParameters(
59                                     commonHeader(PERF3GPP),
60                                     MessageType.VALID
61                             )))
62                             .take(limit)
63                             .test()
64                             .expectNextCount(limit)
65                             .verifyComplete()
66                 }
67             }
68
69             on("messages amount = 0 specified in parameters") {
70                 it("should create empty message flux") {
71                     generator
72                             .createMessageFlux(listOf(MessageParameters(
73                                     commonHeader(PERF3GPP),
74                                     MessageType.VALID,
75                                     0
76                             )))
77                             .test()
78                             .verifyComplete()
79                 }
80             }
81
82             on("messages amount specified in parameters") {
83                 it("should create message flux of specified size") {
84                     generator
85                             .createMessageFlux(listOf(MessageParameters(
86                                     commonHeader(PERF3GPP),
87                                     MessageType.VALID,
88                                     5
89                             )))
90                             .test()
91                             .expectNextCount(5)
92                             .verifyComplete()
93                 }
94             }
95
96             on("message type requesting valid message") {
97                 it("should create flux of valid messages with given domain") {
98                     generator
99                             .createMessageFlux(listOf(MessageParameters(
100                                     commonHeader(FAULT),
101                                     MessageType.VALID,
102                                     1
103                             )))
104                             .test()
105                             .assertNext {
106                                 assertThat(it.isValid()).isTrue()
107                                 assertThat(it.payloadSize).isLessThan(maxPayloadSizeBytes)
108                                 assertThat(extractCommonEventHeader(it.payload).domain).isEqualTo(FAULT.domainName)
109                             }
110                             .verifyComplete()
111                 }
112             }
113
114             on("message type requesting too big payload") {
115                 it("should create flux of messages with given domain and payload exceeding threshold") {
116
117                     generator
118                             .createMessageFlux(listOf(MessageParameters(
119                                     commonHeader(PERF3GPP),
120                                     MessageType.TOO_BIG_PAYLOAD,
121                                     1
122                             )))
123                             .test()
124                             .assertNext {
125                                 assertThat(it.isValid()).isTrue()
126                                 assertThat(it.payloadSize).isGreaterThan(maxPayloadSizeBytes)
127                                 assertThat(extractCommonEventHeader(it.payload).domain).isEqualTo(PERF3GPP.domainName)
128                             }
129                             .verifyComplete()
130                 }
131             }
132
133             on("message type requesting invalid GPB data ") {
134                 it("should create flux of messages with invalid payload") {
135                     generator
136                             .createMessageFlux(listOf(MessageParameters(
137                                     commonHeader(PERF3GPP),
138                                     MessageType.INVALID_GPB_DATA,
139                                     1
140                             )))
141                             .test()
142                             .assertNext {
143                                 assertThat(it.isValid()).isTrue()
144                                 assertThat(it.payloadSize).isLessThan(maxPayloadSizeBytes)
145                                 assertThatExceptionOfType(InvalidProtocolBufferException::class.java)
146                                         .isThrownBy { extractCommonEventHeader(it.payload) }
147                             }
148                             .verifyComplete()
149                 }
150             }
151
152             on("message type requesting invalid wire frame ") {
153                 it("should create flux of messages with invalid version") {
154                     generator
155                             .createMessageFlux(listOf(MessageParameters(
156                                     commonHeader(PERF3GPP),
157                                     MessageType.INVALID_WIRE_FRAME,
158                                     1
159                             )))
160                             .test()
161                             .assertNext {
162                                 assertThat(it.isValid()).isFalse()
163                                 assertThat(it.payloadSize).isLessThan(maxPayloadSizeBytes)
164                                 assertThat(extractCommonEventHeader(it.payload).domain).isEqualTo(PERF3GPP.domainName)
165                                 assertThat(it.versionMajor).isNotEqualTo(WireFrameMessage.SUPPORTED_VERSION_MINOR)
166                             }
167                             .verifyComplete()
168                 }
169             }
170
171             on("message type requesting fixed payload") {
172                 it("should create flux of valid messages with fixed payload") {
173                     generator
174                             .createMessageFlux(listOf(MessageParameters(
175                                     commonHeader(FAULT),
176                                     MessageType.FIXED_PAYLOAD,
177                                     1
178                             )))
179                             .test()
180                             .assertNext {
181                                 assertThat(it.isValid()).isTrue()
182                                 assertThat(it.payloadSize).isLessThan(maxPayloadSizeBytes)
183                                 assertThat(extractEventFields(it.payload).size()).isEqualTo(MessageGenerator.FIXED_PAYLOAD_SIZE)
184                                 assertThat(extractCommonEventHeader(it.payload).domain).isEqualTo(FAULT.domainName)
185                             }
186                             .verifyComplete()
187                 }
188             }
189         }
190         given("list of message parameters") {
191             it("should create concatenated flux of messages") {
192                 val singleFluxSize = 5L
193                 val messageParameters = listOf(
194                         MessageParameters(commonHeader(PERF3GPP), MessageType.VALID, singleFluxSize),
195                         MessageParameters(commonHeader(FAULT), MessageType.TOO_BIG_PAYLOAD, singleFluxSize),
196                         MessageParameters(commonHeader(HEARTBEAT), MessageType.VALID, singleFluxSize)
197                 )
198                 generator.createMessageFlux(messageParameters)
199                         .test()
200                         .assertNext {
201                             assertThat(it.payloadSize).isLessThan(maxPayloadSizeBytes)
202                             assertThat(extractCommonEventHeader(it.payload).domain).isEqualTo(PERF3GPP.domainName)
203                         }
204                         .expectNextCount(singleFluxSize - 1)
205                         .assertNext {
206                             assertThat(it.payloadSize).isGreaterThan(maxPayloadSizeBytes)
207                             assertThat(extractCommonEventHeader(it.payload).domain).isEqualTo(FAULT.domainName)
208                         }
209                         .expectNextCount(singleFluxSize - 1)
210                         .assertNext {
211                             assertThat(it.payloadSize).isLessThan(maxPayloadSizeBytes)
212                             assertThat(extractCommonEventHeader(it.payload).domain).isEqualTo(HEARTBEAT.domainName)
213                         }
214                         .expectNextCount(singleFluxSize - 1)
215                         .verifyComplete()
216             }
217         }
218     }
219 })
220
221 fun extractCommonEventHeader(bytes: ByteData): CommonEventHeader =
222         VesEvent.parseFrom(bytes.unsafeAsArray()).commonEventHeader
223
224
225 fun extractEventFields(bytes: ByteData): ByteString =
226         VesEvent.parseFrom(bytes.unsafeAsArray()).eventFields
227