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.impl
22 import arrow.core.Either.Companion.left
23 import arrow.core.Either.Companion.right
24 import com.nhaarman.mockitokotlin2.doReturn
25 import com.nhaarman.mockitokotlin2.mock
26 import org.assertj.core.api.Assertions.assertThat
27 import org.jetbrains.spek.api.Spek
28 import org.jetbrains.spek.api.dsl.*
29 import org.onap.dcae.collectors.veshv.domain.*
30 import org.onap.dcae.collectors.veshv.model.VesMessage
31 import org.onap.dcae.collectors.veshv.tests.utils.commonHeader
32 import org.onap.dcae.collectors.veshv.tests.utils.emptyWireProtocolFrame
33 import org.onap.dcae.collectors.veshv.tests.utils.wireProtocolFrame
34 import org.onap.ves.VesEventOuterClass.CommonEventHeader.*
35 import kotlin.test.assertTrue
36 import kotlin.test.fail
38 internal object MessageValidatorTest : Spek({
40 describe("Message validator") {
41 val cut = MessageValidator
43 on("ves hv message including header with fully initialized fields") {
44 val commonHeader = commonHeader()
46 it("should accept message with fully initialized message header") {
47 val vesMessage = VesMessage(commonHeader, wireProtocolFrame(commonHeader))
49 assertThat(validateProtobufMessage(vesMessage).isRight())
50 .describedAs("message validation result").isTrue()
54 VesEventDomain.values().forEach { domain ->
55 it("should accept message with $domain domain") {
56 val header = commonHeader(domain)
57 val vesMessage = VesMessage(header, wireProtocolFrame(header))
59 assertThat(validateProtobufMessage(vesMessage).isRight())
60 .describedAs("message validation result").isTrue()
66 on("ves hv message bytes") {
67 val vesMessage = VesMessage(getDefaultInstance(), emptyWireProtocolFrame())
68 it("should not accept message with default header") {
71 validateProtobufMessage(vesMessage).fold({
72 val failMessages = it.invoke()
74 val containsAllErrorMessages = failMessages.contains("vesEventListenerVersion mismatch")
75 && failMessages.contains("missing domain field")
76 && failMessages.contains("missing version field")
77 && failMessages.contains("missing priority field")
78 && failMessages.contains("missing eventId field")
79 && failMessages.contains("missing eventName field")
80 && failMessages.contains("missing lastEpochMicrosec field")
81 && failMessages.contains("missing startEpochMicrosec field")
82 && failMessages.contains("missing reportingEntityName field")
83 && failMessages.contains("missing sourceName field")
84 && failMessages.contains("missing vesEventListenerVersion field")
86 assertThat(containsAllErrorMessages)
87 .describedAs("message validation result").isTrue()
95 given("priority test cases") {
97 Priority.PRIORITY_NOT_PROVIDED to false,
99 Priority.MEDIUM to true,
100 Priority.HIGH to true
101 ).forEach { value, expectedResult ->
102 on("ves hv message including header with priority $value") {
103 val commonEventHeader = commonHeader(priority = value)
104 val vesMessage = VesMessage(commonEventHeader, wireProtocolFrame(commonEventHeader))
106 it("should resolve validation result") {
108 assertThat(validateProtobufMessage(vesMessage).isRight())
109 .describedAs("message validation results")
110 .isEqualTo(expectedResult)
118 on("ves hv message including header with not initialized fields") {
119 val commonHeader = newBuilder()
121 .setEventName("Sample event name")
122 .setEventId("Sample event Id")
123 .setSourceName("Sample Source")
125 val rawMessageBytes = wireProtocolFrame(commonHeader)
127 it("should not accept not fully initialized message header") {
128 val vesMessage = VesMessage(commonHeader, rawMessageBytes)
130 validateProtobufMessage(vesMessage).fold({
131 val failMessages = it.invoke()
133 val containsAllErrorMessages = failMessages.contains("vesEventListenerVersion mismatch")
134 && failMessages.contains("missing domain field")
135 && failMessages.contains("missing priority field")
136 && failMessages.contains("missing lastEpochMicrosec field")
137 && failMessages.contains("missing startEpochMicrosec field")
138 && failMessages.contains("missing reportingEntityName field")
139 && failMessages.contains("missing vesEventListenerVersion field")
141 assertThat(containsAllErrorMessages).describedAs("message validation result")
150 on("ves hv message including header.vesEventListenerVersion with non-string major part") {
151 val commonHeader = commonHeader(vesEventListenerVersion = "sample-version")
152 val rawMessageBytes = wireProtocolFrame(commonHeader)
155 it("should not accept message header") {
156 val vesMessage = VesMessage(commonHeader, rawMessageBytes)
158 validateProtobufMessage(vesMessage).fold({
159 val failMessages = it.invoke()
161 assertThat(failMessages.contains("vesEventListenerVersion mismatch"))
162 .describedAs("message validation result")
171 on("ves hv message including header.vesEventListenerVersion with major part != 7") {
172 val commonHeader = commonHeader(vesEventListenerVersion = "1.2.3")
173 val rawMessageBytes = wireProtocolFrame(commonHeader)
175 it("should not accept message header") {
176 val vesMessage = VesMessage(commonHeader, rawMessageBytes)
179 validateProtobufMessage(vesMessage).fold({
180 val failMessages = it.invoke()
182 assertThat(failMessages.contains("vesEventListenerVersion mismatch"))
183 .describedAs("message validation result")
192 on("ves hv message including header.vesEventListenerVersion with minor part not starting with a digit") {
193 val commonHeader = commonHeader(vesEventListenerVersion = "7.test")
194 val rawMessageBytes = wireProtocolFrame(commonHeader)
196 it("should not accept message header") {
197 val vesMessage = VesMessage(commonHeader, rawMessageBytes)
200 validateProtobufMessage(vesMessage).fold({
201 val failMessages = it.invoke()
203 assertThat(failMessages.contains("vesEventListenerVersion mismatch"))
204 .describedAs("message validation result")
213 describe("validating messages and converting to Either of string for validation result") {
214 given("WireFrameMessage") {
215 on("valid message as input") {
216 val wireFrameMessage = WireFrameMessage("lets pretend it's valid".toByteArray())
217 val mockedWireFrameMessage = mock<WireFrameMessage> {
218 on { validate() } doReturn right(wireFrameMessage)
221 it("should be right") {
222 assertTrue(cut.validateFrameMessage(mockedWireFrameMessage).isRight())
226 on("invalid message as input") {
227 val mockedWireFrameMessage = mock<WireFrameMessage> {
228 on { validate() } doReturn left(InvalidMajorVersion(99))
231 it("should be left") {
232 assertTrue(cut.validateFrameMessage(mockedWireFrameMessage).isLeft())
239 on("valid message as input") {
240 val commonHeader = commonHeader()
241 val rawMessageBytes = wireProtocolFrame(commonHeader)
242 val vesMessage = VesMessage(commonHeader, rawMessageBytes)
244 it("should be right") {
245 assertTrue(validateProtobufMessage(vesMessage).isRight())
249 on("invalid message as input") {
250 val commonHeader = newBuilder().build()
251 val rawMessageBytes = wireProtocolFrame(commonHeader)
252 val vesMessage = VesMessage(commonHeader, rawMessageBytes)
254 it("should be left") {
255 assertTrue(cut.validateProtobufMessage(vesMessage).isLeft())