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