2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2018 NOKIA Intellectual Property, 2018-2019 Nordix Foundation. All rights reserved.
4 * Copyright (C) 2020 Nokia. All rights reserved.
5 * ================================================================================
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 * ============LICENSE_END=========================================================
20 package org.onap.dcaegen2.collectors.datafile.service;
22 import static org.junit.Assert.assertTrue;
23 import static org.mockito.Mockito.spy;
25 import ch.qos.logback.classic.spi.ILoggingEvent;
26 import ch.qos.logback.core.read.ListAppender;
28 import com.google.gson.JsonElement;
29 import com.google.gson.JsonParser;
31 import java.net.URISyntaxException;
32 import java.util.ArrayList;
33 import java.util.List;
34 import java.util.Optional;
36 import org.junit.jupiter.api.Test;
37 import org.mockito.Mockito;
38 import org.onap.dcaegen2.collectors.datafile.ftp.Scheme;
39 import org.onap.dcaegen2.collectors.datafile.model.FileData;
40 import org.onap.dcaegen2.collectors.datafile.model.FileReadyMessage;
41 import org.onap.dcaegen2.collectors.datafile.model.ImmutableFileData;
42 import org.onap.dcaegen2.collectors.datafile.model.ImmutableFileReadyMessage;
43 import org.onap.dcaegen2.collectors.datafile.model.ImmutableMessageMetaData;
44 import org.onap.dcaegen2.collectors.datafile.model.MessageMetaData;
45 import org.onap.dcaegen2.collectors.datafile.utils.JsonMessage;
46 import org.onap.dcaegen2.collectors.datafile.utils.JsonMessage.AdditionalField;
47 import org.onap.dcaegen2.collectors.datafile.utils.LoggingUtils;
49 import reactor.core.publisher.Flux;
50 import reactor.core.publisher.Mono;
51 import reactor.test.StepVerifier;
54 * Tests the JsonMessageParser.
56 * @author <a href="mailto:przemyslaw.wasala@nokia.com">Przemysław Wąsala</a> on 5/8/18
57 * @author <a href="mailto:henrik.b.andersson@est.tech">Henrik Andersson</a>
59 class JsonMessageParserTest {
60 private static final String ERROR_LOG_TAG = "[ERROR] ";
62 private static final String NR_RADIO_ERICSSON_EVENT_NAME = "Noti_NrRadio-Ericsson_FileReady";
63 private static final String PRODUCT_NAME = "NrRadio";
64 private static final String VENDOR_NAME = "Ericsson";
65 private static final String LAST_EPOCH_MICROSEC = "1519837825682";
66 private static final String SOURCE_NAME = "5GRAN_DU";
67 private static final String START_EPOCH_MICROSEC = "1519837825682";
68 private static final String TIME_ZONE_OFFSET = "UTC+05:00";
69 private static final String PM_FILE_NAME = "A20161224.1030-1045.bin.gz";
70 private static final String LOCATION = "ftpes://192.168.0.101:22/ftp/rop/" + PM_FILE_NAME;
71 private static final String GZIP_COMPRESSION = "gzip";
72 private static final String FILE_FORMAT_TYPE = "org.3GPP.32.435#measCollec";
73 private static final String FILE_FORMAT_VERSION = "V10";
74 private static final String CHANGE_IDENTIFIER = "PM_MEAS_FILES";
75 private static final String INCORRECT_CHANGE_IDENTIFIER = "INCORRECT_PM_MEAS_FILES";
76 private static final String CHANGE_TYPE = "FileReady";
77 private static final String INCORRECT_CHANGE_TYPE = "IncorrectFileReady";
78 private static final String NOTIFICATION_FIELDS_VERSION = "1.0";
81 void whenPassingCorrectJson_oneFileReadyMessage() throws URISyntaxException {
82 AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
83 .name(PM_FILE_NAME) //
84 .location(LOCATION) //
85 .compression(GZIP_COMPRESSION) //
86 .fileFormatType(FILE_FORMAT_TYPE) //
87 .fileFormatVersion(FILE_FORMAT_VERSION) //
89 JsonMessage message = new JsonMessage.JsonMessageBuilder() //
90 .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
91 .changeIdentifier(CHANGE_IDENTIFIER) //
92 .changeType(CHANGE_TYPE) //
93 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
94 .addAdditionalField(additionalField) //
97 MessageMetaData messageMetaData = ImmutableMessageMetaData.builder() //
98 .productName(PRODUCT_NAME) //
99 .vendorName(VENDOR_NAME) //
100 .lastEpochMicrosec(LAST_EPOCH_MICROSEC) //
101 .sourceName(SOURCE_NAME) //
102 .startEpochMicrosec(START_EPOCH_MICROSEC) //
103 .timeZoneOffset(TIME_ZONE_OFFSET) //
104 .changeIdentifier(CHANGE_IDENTIFIER) //
105 .changeType(CHANGE_TYPE) //
107 FileData expectedFileData = ImmutableFileData.builder() //
108 .name(PM_FILE_NAME) //
109 .location(LOCATION) //
110 .scheme(Scheme.FTPES) //
111 .compression(GZIP_COMPRESSION) //
112 .fileFormatType(FILE_FORMAT_TYPE) //
113 .fileFormatVersion(FILE_FORMAT_VERSION) //
114 .messageMetaData(messageMetaData) //
116 List<FileData> files = new ArrayList<>();
117 files.add(expectedFileData);
118 FileReadyMessage expectedMessage = ImmutableFileReadyMessage.builder() //
122 String parsedString = message.getParsed();
123 JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
124 JsonElement jsonElement = JsonParser.parseString(parsedString);
125 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
126 .getJsonObjectFromAnArray(jsonElement);
128 StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
129 .expectNext(expectedMessage).verifyComplete();
133 void whenPassingCorrectJsonWithTwoEvents_twoMessages() {
134 AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
135 .name(PM_FILE_NAME) //
136 .location(LOCATION) //
137 .compression(GZIP_COMPRESSION) //
138 .fileFormatType(FILE_FORMAT_TYPE) //
139 .fileFormatVersion(FILE_FORMAT_VERSION) //
141 JsonMessage message = new JsonMessage.JsonMessageBuilder() //
142 .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
143 .changeIdentifier(CHANGE_IDENTIFIER) //
144 .changeType(CHANGE_TYPE) //
145 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
146 .addAdditionalField(additionalField) //
149 MessageMetaData messageMetaData = ImmutableMessageMetaData.builder() //
150 .productName(PRODUCT_NAME) //
151 .vendorName(VENDOR_NAME) //
152 .lastEpochMicrosec(LAST_EPOCH_MICROSEC) //
153 .sourceName(SOURCE_NAME) //
154 .startEpochMicrosec(START_EPOCH_MICROSEC) //
155 .timeZoneOffset(TIME_ZONE_OFFSET) //
156 .changeIdentifier(CHANGE_IDENTIFIER) //
157 .changeType(CHANGE_TYPE) //
159 FileData expectedFileData = ImmutableFileData.builder() //
160 .name(PM_FILE_NAME) //
161 .location(LOCATION) //
162 .scheme(Scheme.FTPES) //
163 .compression(GZIP_COMPRESSION) //
164 .fileFormatType(FILE_FORMAT_TYPE) //
165 .fileFormatVersion(FILE_FORMAT_VERSION) //
166 .messageMetaData(messageMetaData) //
168 List<FileData> files = new ArrayList<>();
169 files.add(expectedFileData);
170 FileReadyMessage expectedMessage = ImmutableFileReadyMessage.builder() //
174 String parsedString = message.getParsed();
175 String messageString = "[" + parsedString + "," + parsedString + "]";
176 JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
177 JsonElement jsonElement = JsonParser.parseString(parsedString);
178 JsonElement jsonElement1 = JsonParser.parseString(messageString);
179 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
180 .getJsonObjectFromAnArray(jsonElement);
182 StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement1)))
183 .expectSubscription().expectNext(expectedMessage).expectNext(expectedMessage).verifyComplete();
187 void whenPassingCorrectJsonWithoutLocation_noMessage() {
188 AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
189 .name(PM_FILE_NAME) //
190 .compression(GZIP_COMPRESSION) //
191 .fileFormatType(FILE_FORMAT_TYPE) //
192 .fileFormatVersion(FILE_FORMAT_VERSION) //
194 JsonMessage message = new JsonMessage.JsonMessageBuilder() //
195 .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
196 .changeIdentifier(CHANGE_IDENTIFIER) //
197 .changeType(CHANGE_TYPE) //
198 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
199 .addAdditionalField(additionalField) //
202 String parsedString = message.getParsed();
203 JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
204 JsonElement jsonElement = JsonParser.parseString(parsedString);
205 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
206 .getJsonObjectFromAnArray(jsonElement);
208 final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
209 StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
210 .expectNextCount(0).verifyComplete();
212 assertTrue(logAppender.list.toString()
213 .contains("[ERROR] VES event parsing. File information wrong. " + "Missing location."));
214 assertTrue(logAppender.list.get(0).toString().contains("sourceName=5GRAN_DU"));
218 void whenPassingCorrectJsonWrongScheme_noMessage() {
219 AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
220 .name(PM_FILE_NAME) //
221 .location("http://location.xml") //
222 .compression(GZIP_COMPRESSION) //
223 .fileFormatType(FILE_FORMAT_TYPE) //
224 .fileFormatVersion(FILE_FORMAT_VERSION) //
226 JsonMessage message = new JsonMessage.JsonMessageBuilder() //
227 .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
228 .changeIdentifier(CHANGE_IDENTIFIER) //
229 .changeType(CHANGE_TYPE) //
230 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
231 .addAdditionalField(additionalField) //
234 String parsedString = message.getParsed();
235 JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
236 JsonElement jsonElement = JsonParser.parseString(parsedString);
237 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
238 .getJsonObjectFromAnArray(jsonElement);
240 final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
241 StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
242 .expectNextCount(0).verifyComplete();
244 assertTrue("Error missing in log",
245 logAppender.list.toString()
246 .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
247 + Scheme.DFC_DOES_NOT_SUPPORT_PROTOCOL_ERROR_MSG + "http" + Scheme.SUPPORTED_PROTOCOLS_ERROR_MESSAGE
248 + ". Location: http://location.xml"));
249 assertTrue("Missing sourceName in log", logAppender.list.toString().contains("sourceName=5GRAN_DU"));
253 void whenPassingCorrectJsonWithTwoEventsFirstNoHeader_oneFileDatan() {
254 AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
255 .name(PM_FILE_NAME) //
256 .location(LOCATION) //
257 .compression(GZIP_COMPRESSION) //
258 .fileFormatType(FILE_FORMAT_TYPE) //
259 .fileFormatVersion(FILE_FORMAT_VERSION) //
261 JsonMessage message = new JsonMessage.JsonMessageBuilder() //
262 .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
263 .changeIdentifier(CHANGE_IDENTIFIER) //
264 .changeType(CHANGE_TYPE) //
265 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
266 .addAdditionalField(additionalField) //
269 MessageMetaData messageMetaData = ImmutableMessageMetaData.builder() //
270 .productName(PRODUCT_NAME) //
271 .vendorName(VENDOR_NAME) //
272 .lastEpochMicrosec(LAST_EPOCH_MICROSEC) //
273 .sourceName(SOURCE_NAME) //
274 .startEpochMicrosec(START_EPOCH_MICROSEC) //
275 .timeZoneOffset(TIME_ZONE_OFFSET) //
276 .changeIdentifier(CHANGE_IDENTIFIER) //
277 .changeType(CHANGE_TYPE) //
279 FileData expectedFileData = ImmutableFileData.builder() //
280 .name(PM_FILE_NAME) //
281 .location(LOCATION) //
282 .scheme(Scheme.FTPES) //
283 .compression(GZIP_COMPRESSION) //
284 .fileFormatType(FILE_FORMAT_TYPE) //
285 .fileFormatVersion(FILE_FORMAT_VERSION) //
286 .messageMetaData(messageMetaData) //
288 List<FileData> files = new ArrayList<>();
289 files.add(expectedFileData);
290 FileReadyMessage expectedMessage = ImmutableFileReadyMessage.builder() //
294 String parsedString = message.getParsed();
295 String messageString = "[{\"event\":{}}," + parsedString + "]";
296 JsonMessageParser jsonMessageParserUnderTest = new JsonMessageParser();
297 JsonElement jsonElement = JsonParser.parseString(messageString);
299 StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
300 .expectNext(expectedMessage).verifyComplete();
304 void whenPassingCorrectJsonWithFaultyEventName_noFileData() {
305 AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
306 .location(LOCATION) //
307 .compression(GZIP_COMPRESSION) //
308 .fileFormatType(FILE_FORMAT_TYPE) //
309 .fileFormatVersion(FILE_FORMAT_VERSION) //
311 JsonMessage message = new JsonMessage.JsonMessageBuilder() //
312 .eventName("Faulty event name") //
313 .changeIdentifier(CHANGE_IDENTIFIER) //
314 .changeType(CHANGE_TYPE) //
315 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
316 .addAdditionalField(additionalField) //
319 String parsedString = message.getParsed();
320 JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
321 JsonElement jsonElement = JsonParser.parseString(parsedString);
322 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
323 .getJsonObjectFromAnArray(jsonElement);
325 final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
326 StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
327 .expectComplete().verify();
329 assertTrue("Error missing in log",
330 logAppender.list.toString().contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
331 + "Can not get PRODUCT_NAME from eventName, eventName is not in correct format: Faulty event name"));
335 void whenPassingCorrectJsonWithoutName_noFileData() {
336 AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
337 .location(LOCATION) //
338 .compression(GZIP_COMPRESSION) //
339 .fileFormatType(FILE_FORMAT_TYPE) //
340 .fileFormatVersion(FILE_FORMAT_VERSION) //
342 JsonMessage message = new JsonMessage.JsonMessageBuilder() //
343 .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
344 .changeIdentifier(CHANGE_IDENTIFIER) //
345 .changeType(CHANGE_TYPE) //
346 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
347 .addAdditionalField(additionalField) //
350 String parsedString = message.getParsed();
351 JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
352 JsonElement jsonElement = JsonParser.parseString(parsedString);
353 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
354 .getJsonObjectFromAnArray(jsonElement);
356 final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
357 StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
358 .expectNextCount(0).verifyComplete();
360 assertTrue("Error missing in log",
361 logAppender.list.toString()
362 .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
363 + "File information wrong. Missing data: [name] Data: "
364 + message.getAdditionalFields().get(0).toString()));
368 void whenPassingCorrectJsonWithoutAdditionalFields_noFileData() {
369 JsonMessage message = new JsonMessage.JsonMessageBuilder() //
370 .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
371 .changeIdentifier(CHANGE_IDENTIFIER) //
372 .changeType(CHANGE_TYPE) //
373 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
376 String parsedString = message.getParsed();
377 JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
378 JsonElement jsonElement = JsonParser.parseString(parsedString);
379 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
380 .getJsonObjectFromAnArray(jsonElement);
382 final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
383 StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
384 .expectNextCount(0).verifyComplete();
386 assertTrue("Error missing in log",
387 logAppender.list.toString().contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
388 + "Missing arrayOfNamedHashMap in message. " + message.getParsed()));
392 void whenPassingCorrectJsonWithoutCompression_noFileData() {
393 AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
394 .name(PM_FILE_NAME) //
395 .location(LOCATION) //
396 .fileFormatType(FILE_FORMAT_TYPE) //
397 .fileFormatVersion(FILE_FORMAT_VERSION) //
399 JsonMessage message = new JsonMessage.JsonMessageBuilder() //
400 .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
401 .changeIdentifier(CHANGE_IDENTIFIER) //
402 .changeType(CHANGE_TYPE) //
403 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
404 .addAdditionalField(additionalField) //
407 String parsedString = message.getParsed();
408 JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
409 JsonElement jsonElement = JsonParser.parseString(parsedString);
410 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
411 .getJsonObjectFromAnArray(jsonElement);
413 final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
414 StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
415 .expectNextCount(0).verifyComplete();
417 assertTrue("Error missing in log",
418 logAppender.list.toString()
419 .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
420 + "File information wrong. Missing data: [compression] Data: "
421 + message.getAdditionalFields().get(0).toString()));
425 void whenPassingCorrectJsonWithoutFileFormatType_noFileData() {
426 AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
427 .name(PM_FILE_NAME) //
428 .location(LOCATION) //
429 .compression(GZIP_COMPRESSION) //
430 .fileFormatVersion(FILE_FORMAT_VERSION) //
432 JsonMessage message = new JsonMessage.JsonMessageBuilder() //
433 .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
434 .changeIdentifier(CHANGE_IDENTIFIER) //
435 .changeType(CHANGE_TYPE) //
436 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
437 .addAdditionalField(additionalField) //
440 String parsedString = message.getParsed();
441 JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
442 JsonElement jsonElement = JsonParser.parseString(parsedString);
443 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
444 .getJsonObjectFromAnArray(jsonElement);
446 final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
447 StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
448 .expectNextCount(0).verifyComplete();
450 assertTrue("Error missing in log",
451 logAppender.list.toString()
452 .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
453 + "File information wrong. Missing data: [fileFormatType] Data: "
454 + message.getAdditionalFields().get(0).toString()));
458 void whenPassingOneCorrectJsonWithoutFileFormatVersionAndOneCorrect_oneFileData() {
459 AdditionalField additionalFaultyField = new JsonMessage.AdditionalFieldBuilder() //
460 .name(PM_FILE_NAME) //
461 .location(LOCATION) //
462 .compression(GZIP_COMPRESSION) //
463 .fileFormatType(FILE_FORMAT_TYPE) //
465 AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
466 .name(PM_FILE_NAME) //
467 .location(LOCATION) //
468 .compression(GZIP_COMPRESSION) //
469 .fileFormatType(FILE_FORMAT_TYPE) //
470 .fileFormatVersion(FILE_FORMAT_VERSION) //
472 JsonMessage message = new JsonMessage.JsonMessageBuilder() //
473 .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
474 .changeIdentifier(CHANGE_IDENTIFIER) //
475 .changeType(CHANGE_TYPE) //
476 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
477 .addAdditionalField(additionalFaultyField) //
478 .addAdditionalField(additionalField) //
481 MessageMetaData messageMetaData = ImmutableMessageMetaData.builder() //
482 .productName(PRODUCT_NAME) //
483 .vendorName(VENDOR_NAME) //
484 .lastEpochMicrosec(LAST_EPOCH_MICROSEC) //
485 .sourceName(SOURCE_NAME) //
486 .startEpochMicrosec(START_EPOCH_MICROSEC) //
487 .timeZoneOffset(TIME_ZONE_OFFSET) //
488 .changeIdentifier(CHANGE_IDENTIFIER) //
489 .changeType(CHANGE_TYPE) //
491 FileData expectedFileData = ImmutableFileData.builder() //
492 .name(PM_FILE_NAME) //
493 .location(LOCATION) //
494 .scheme(Scheme.FTPES) //
495 .compression(GZIP_COMPRESSION) //
496 .fileFormatType(FILE_FORMAT_TYPE) //
497 .fileFormatVersion(FILE_FORMAT_VERSION) //
498 .messageMetaData(messageMetaData) //
500 List<FileData> files = new ArrayList<>();
501 files.add(expectedFileData);
502 FileReadyMessage expectedMessage = ImmutableFileReadyMessage.builder() //
506 String parsedString = message.getParsed();
507 JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
508 JsonElement jsonElement = JsonParser.parseString(parsedString);
509 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
510 .getJsonObjectFromAnArray(jsonElement);
512 StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
513 .expectNext(expectedMessage).verifyComplete();
517 void whenPassingJsonWithoutMandatoryHeaderInformation_noFileData() {
518 JsonMessage message = new JsonMessage.JsonMessageBuilder() //
519 .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
522 String parsedString = message.getParsed();
523 JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
524 JsonElement jsonElement = JsonParser.parseString(parsedString);
525 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
526 .getJsonObjectFromAnArray(jsonElement);
528 final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
529 StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
530 .expectComplete().verify();
532 assertTrue("Error missing in log",
533 logAppender.list.toString()
534 .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
535 + "Missing data: [changeIdentifier, changeType, notificationFieldsVersion]. "
536 + "Change type is wrong: Expected: FileReady Message: " + message.getParsed()));
540 void whenPassingJsonWithNullJsonElement_noFileData() {
541 JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
542 JsonElement jsonElement = JsonParser.parseString("{}");
544 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
545 .getJsonObjectFromAnArray(jsonElement);
547 final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
548 StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
549 .expectComplete().verify();
551 assertTrue("Error missing in log",
552 logAppender.list.toString().contains(ERROR_LOG_TAG + "Incorrect JsonObject - missing header. "));
556 void whenPassingCorrectJsonWithIncorrectChangeType_noFileData() {
557 AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
558 .name(PM_FILE_NAME) //
559 .location(LOCATION) //
560 .compression(GZIP_COMPRESSION) //
561 .fileFormatVersion(FILE_FORMAT_VERSION) //
563 JsonMessage message = new JsonMessage.JsonMessageBuilder() //
564 .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
565 .changeIdentifier(CHANGE_IDENTIFIER) //
566 .changeType(INCORRECT_CHANGE_TYPE) //
567 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
568 .addAdditionalField(additionalField) //
571 String parsedString = message.getParsed();
572 JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
573 JsonElement jsonElement = JsonParser.parseString(parsedString);
574 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
575 .getJsonObjectFromAnArray(jsonElement);
577 final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
578 StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
579 .expectNextCount(0).expectComplete().verify();
581 assertTrue("Error missing in log",
582 logAppender.list.toString()
583 .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING + " Change type is wrong: "
584 + INCORRECT_CHANGE_TYPE + " Expected: FileReady Message: " + message.getParsed()));
588 void whenPassingCorrectJsonWithIncorrectChangeIdentifier_noFileData() {
589 AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
590 .name(PM_FILE_NAME) //
591 .location(LOCATION) //
592 .compression(GZIP_COMPRESSION) //
593 .fileFormatVersion(FILE_FORMAT_VERSION) //
595 JsonMessage message = new JsonMessage.JsonMessageBuilder() //
596 .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
597 .changeIdentifier(INCORRECT_CHANGE_IDENTIFIER) //
598 .changeType(CHANGE_TYPE) //
599 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
600 .addAdditionalField(additionalField) //
603 String parsedString = message.getParsed();
604 JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
605 JsonElement jsonElement = JsonParser.parseString(parsedString);
606 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
607 .getJsonObjectFromAnArray(jsonElement);
609 StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
610 .expectComplete().verify();