cd18bfa257e9644a4263055b2dac365231732663
[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 INCORRECT_CHANGE_IDENTIFIER = "INCORRECT_PM_MEAS_FILES";
74     private static final String CHANGE_TYPE = "FileReady";
75     private static final String INCORRECT_CHANGE_TYPE = "IncorrectFileReady";
76     private static final String NOTIFICATION_FIELDS_VERSION = "1.0";
77
78     @Test
79     void whenPassingCorrectJson_oneFileReadyMessage() throws URISyntaxException {
80         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
81             .name(PM_FILE_NAME) //
82             .location(LOCATION) //
83             .compression(GZIP_COMPRESSION) //
84             .fileFormatType(FILE_FORMAT_TYPE) //
85             .fileFormatVersion(FILE_FORMAT_VERSION) //
86             .build();
87         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
88             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
89             .changeIdentifier(CHANGE_IDENTIFIER) //
90             .changeType(CHANGE_TYPE) //
91             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
92             .addAdditionalField(additionalField) //
93             .build();
94
95         MessageMetaData messageMetaData = ImmutableMessageMetaData.builder() //
96             .productName(PRODUCT_NAME) //
97             .vendorName(VENDOR_NAME) //
98             .lastEpochMicrosec(LAST_EPOCH_MICROSEC) //
99             .sourceName(SOURCE_NAME) //
100             .startEpochMicrosec(START_EPOCH_MICROSEC) //
101             .timeZoneOffset(TIME_ZONE_OFFSET) //
102             .changeIdentifier(CHANGE_IDENTIFIER) //
103             .changeType(CHANGE_TYPE) //
104             .build();
105         FileData expectedFileData = ImmutableFileData.builder() //
106             .name(PM_FILE_NAME) //
107             .location(LOCATION) //
108             .scheme(Scheme.FTPS) //
109             .compression(GZIP_COMPRESSION) //
110             .fileFormatType(FILE_FORMAT_TYPE) //
111             .fileFormatVersion(FILE_FORMAT_VERSION) //
112             .messageMetaData(messageMetaData) //
113             .build();
114         List<FileData> files = new ArrayList<>();
115         files.add(expectedFileData);
116         FileReadyMessage expectedMessage = ImmutableFileReadyMessage.builder() //
117             .files(files) //
118             .build();
119
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(jsonElement))).expectSubscription()
127             .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         JsonElement jsonElement1 = new JsonParser().parse(messageString);
177         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
178             .getJsonObjectFromAnArray(jsonElement);
179
180         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement1)))
181             .expectSubscription().expectNext(expectedMessage).expectNext(expectedMessage).verifyComplete();
182     }
183
184     @Test
185     void whenPassingCorrectJsonWithoutLocation_noMessage() {
186         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
187             .name(PM_FILE_NAME) //
188             .compression(GZIP_COMPRESSION) //
189             .fileFormatType(FILE_FORMAT_TYPE) //
190             .fileFormatVersion(FILE_FORMAT_VERSION) //
191             .build();
192         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
193             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
194             .changeIdentifier(CHANGE_IDENTIFIER) //
195             .changeType(CHANGE_TYPE) //
196             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
197             .addAdditionalField(additionalField) //
198             .build();
199
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(jsonElement))).expectSubscription()
208             .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 parsedString = message.getParsed();
233         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
234         JsonElement jsonElement = new JsonParser().parse(parsedString);
235         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
236             .getJsonObjectFromAnArray(jsonElement);
237
238         ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
239         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
240             .expectNextCount(0).verifyComplete();
241
242         assertTrue("Error missing in log",
243             logAppender.list.toString()
244                 .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
245                     + Scheme.DFC_DOES_NOT_SUPPORT_PROTOCOL_ERROR_MSG + "http" + Scheme.SUPPORTED_PROTOCOLS_ERROR_MESSAGE
246                     + ". Location: http://location.xml"));
247         assertTrue("Missing sourceName in log", logAppender.list.toString().contains("sourceName=5GRAN_DU"));
248     }
249
250     @Test
251     void whenPassingCorrectJsonWithTwoEventsFirstNoHeader_oneFileDatan() {
252         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
253             .name(PM_FILE_NAME) //
254             .location(LOCATION) //
255             .compression(GZIP_COMPRESSION) //
256             .fileFormatType(FILE_FORMAT_TYPE) //
257             .fileFormatVersion(FILE_FORMAT_VERSION) //
258             .build();
259         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
260             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
261             .changeIdentifier(CHANGE_IDENTIFIER) //
262             .changeType(CHANGE_TYPE) //
263             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
264             .addAdditionalField(additionalField) //
265             .build();
266
267         MessageMetaData messageMetaData = ImmutableMessageMetaData.builder() //
268             .productName(PRODUCT_NAME) //
269             .vendorName(VENDOR_NAME) //
270             .lastEpochMicrosec(LAST_EPOCH_MICROSEC) //
271             .sourceName(SOURCE_NAME) //
272             .startEpochMicrosec(START_EPOCH_MICROSEC) //
273             .timeZoneOffset(TIME_ZONE_OFFSET) //
274             .changeIdentifier(CHANGE_IDENTIFIER) //
275             .changeType(CHANGE_TYPE) //
276             .build();
277         FileData expectedFileData = ImmutableFileData.builder() //
278             .name(PM_FILE_NAME) //
279             .location(LOCATION) //
280             .scheme(Scheme.FTPS) //
281             .compression(GZIP_COMPRESSION) //
282             .fileFormatType(FILE_FORMAT_TYPE) //
283             .fileFormatVersion(FILE_FORMAT_VERSION) //
284             .messageMetaData(messageMetaData) //
285             .build();
286         List<FileData> files = new ArrayList<>();
287         files.add(expectedFileData);
288         FileReadyMessage expectedMessage = ImmutableFileReadyMessage.builder() //
289             .files(files) //
290             .build();
291
292         String parsedString = message.getParsed();
293         String messageString = "[{\"event\":{}}," + parsedString + "]";
294         JsonMessageParser jsonMessageParserUnderTest = new JsonMessageParser();
295         JsonElement jsonElement = new JsonParser().parse(messageString);
296
297         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
298             .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 parsedString = message.getParsed();
318         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
319         JsonElement jsonElement = new JsonParser().parse(parsedString);
320         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
321             .getJsonObjectFromAnArray(jsonElement);
322
323         ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
324         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
325             .expectComplete().verify();
326
327         assertTrue("Error missing in log",
328             logAppender.list.toString().contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
329                 + "Can not get PRODUCT_NAME from eventName, eventName is not in correct format: Faulty event name"));
330     }
331
332     @Test
333     void whenPassingCorrectJsonWithoutName_noFileData() {
334         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
335             .location(LOCATION) //
336             .compression(GZIP_COMPRESSION) //
337             .fileFormatType(FILE_FORMAT_TYPE) //
338             .fileFormatVersion(FILE_FORMAT_VERSION) //
339             .build();
340         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
341             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
342             .changeIdentifier(CHANGE_IDENTIFIER) //
343             .changeType(CHANGE_TYPE) //
344             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
345             .addAdditionalField(additionalField) //
346             .build();
347
348         String parsedString = message.getParsed();
349         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
350         JsonElement jsonElement = new JsonParser().parse(parsedString);
351         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
352             .getJsonObjectFromAnArray(jsonElement);
353
354         ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
355         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
356             .expectNextCount(0).verifyComplete();
357
358         assertTrue("Error missing in log",
359             logAppender.list.toString()
360                 .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
361                     + "File information wrong. Missing data: [name] Data: "
362                     + message.getAdditionalFields().get(0).toString()));
363     }
364
365     @Test
366     void whenPassingCorrectJsonWithoutAdditionalFields_noFileData() {
367         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
368             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
369             .changeIdentifier(CHANGE_IDENTIFIER) //
370             .changeType(CHANGE_TYPE) //
371             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
372             .build();
373
374         String parsedString = message.getParsed();
375         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
376         JsonElement jsonElement = new JsonParser().parse(parsedString);
377         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
378             .getJsonObjectFromAnArray(jsonElement);
379
380         ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
381         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
382             .expectNextCount(0).verifyComplete();
383
384         assertTrue("Error missing in log",
385             logAppender.list.toString().contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
386                 + "Missing arrayOfNamedHashMap in message. " + message.getParsed()));
387     }
388
389     @Test
390     void whenPassingCorrectJsonWithoutCompression_noFileData() {
391         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
392             .name(PM_FILE_NAME) //
393             .location(LOCATION) //
394             .fileFormatType(FILE_FORMAT_TYPE) //
395             .fileFormatVersion(FILE_FORMAT_VERSION) //
396             .build();
397         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
398             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
399             .changeIdentifier(CHANGE_IDENTIFIER) //
400             .changeType(CHANGE_TYPE) //
401             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
402             .addAdditionalField(additionalField) //
403             .build();
404
405         String parsedString = message.getParsed();
406         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
407         JsonElement jsonElement = new JsonParser().parse(parsedString);
408         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
409             .getJsonObjectFromAnArray(jsonElement);
410
411         ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
412         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
413             .expectNextCount(0).verifyComplete();
414
415         assertTrue("Error missing in log",
416             logAppender.list.toString()
417                 .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
418                     + "File information wrong. Missing data: [compression] Data: "
419                     + message.getAdditionalFields().get(0).toString()));
420     }
421
422     @Test
423     void whenPassingCorrectJsonWithoutFileFormatType_noFileData() {
424         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
425             .name(PM_FILE_NAME) //
426             .location(LOCATION) //
427             .compression(GZIP_COMPRESSION) //
428             .fileFormatVersion(FILE_FORMAT_VERSION) //
429             .build();
430         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
431             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
432             .changeIdentifier(CHANGE_IDENTIFIER) //
433             .changeType(CHANGE_TYPE) //
434             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
435             .addAdditionalField(additionalField) //
436             .build();
437
438         String parsedString = message.getParsed();
439         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
440         JsonElement jsonElement = new JsonParser().parse(parsedString);
441         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
442             .getJsonObjectFromAnArray(jsonElement);
443
444         ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
445         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
446             .expectNextCount(0).verifyComplete();
447
448         assertTrue("Error missing in log",
449             logAppender.list.toString()
450                 .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
451                     + "File information wrong. Missing data: [fileFormatType] Data: "
452                     + message.getAdditionalFields().get(0).toString()));
453     }
454
455     @Test
456     void whenPassingOneCorrectJsonWithoutFileFormatVersionAndOneCorrect_oneFileData() {
457         AdditionalField additionalFaultyField = new JsonMessage.AdditionalFieldBuilder() //
458             .name(PM_FILE_NAME) //
459             .location(LOCATION) //
460             .compression(GZIP_COMPRESSION) //
461             .fileFormatType(FILE_FORMAT_TYPE) //
462             .build();
463         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
464             .name(PM_FILE_NAME) //
465             .location(LOCATION) //
466             .compression(GZIP_COMPRESSION) //
467             .fileFormatType(FILE_FORMAT_TYPE) //
468             .fileFormatVersion(FILE_FORMAT_VERSION) //
469             .build();
470         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
471             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
472             .changeIdentifier(CHANGE_IDENTIFIER) //
473             .changeType(CHANGE_TYPE) //
474             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
475             .addAdditionalField(additionalFaultyField) //
476             .addAdditionalField(additionalField) //
477             .build();
478
479         MessageMetaData messageMetaData = ImmutableMessageMetaData.builder() //
480             .productName(PRODUCT_NAME) //
481             .vendorName(VENDOR_NAME) //
482             .lastEpochMicrosec(LAST_EPOCH_MICROSEC) //
483             .sourceName(SOURCE_NAME) //
484             .startEpochMicrosec(START_EPOCH_MICROSEC) //
485             .timeZoneOffset(TIME_ZONE_OFFSET) //
486             .changeIdentifier(CHANGE_IDENTIFIER) //
487             .changeType(CHANGE_TYPE) //
488             .build();
489         FileData expectedFileData = ImmutableFileData.builder() //
490             .name(PM_FILE_NAME) //
491             .location(LOCATION) //
492             .scheme(Scheme.FTPS) //
493             .compression(GZIP_COMPRESSION) //
494             .fileFormatType(FILE_FORMAT_TYPE) //
495             .fileFormatVersion(FILE_FORMAT_VERSION) //
496             .messageMetaData(messageMetaData) //
497             .build();
498         List<FileData> files = new ArrayList<>();
499         files.add(expectedFileData);
500         FileReadyMessage expectedMessage = ImmutableFileReadyMessage.builder() //
501             .files(files) //
502             .build();
503
504         String parsedString = message.getParsed();
505         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
506         JsonElement jsonElement = new JsonParser().parse(parsedString);
507         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
508             .getJsonObjectFromAnArray(jsonElement);
509
510         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
511             .expectNext(expectedMessage).verifyComplete();
512     }
513
514     @Test
515     void whenPassingJsonWithoutMandatoryHeaderInformation_noFileData() {
516         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
517             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
518             .build();
519
520         String parsedString = message.getParsed();
521         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
522         JsonElement jsonElement = new JsonParser().parse(parsedString);
523         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
524             .getJsonObjectFromAnArray(jsonElement);
525
526         ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
527         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
528             .expectComplete().verify();
529
530         assertTrue("Error missing in log",
531             logAppender.list.toString()
532                 .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
533                     + "Missing data: [changeIdentifier, changeType, notificationFieldsVersion]. "
534                     + "Change type is wrong:  Expected: FileReady Message: " + message.getParsed()));
535     }
536
537     @Test
538     void whenPassingJsonWithNullJsonElement_noFileData() {
539         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
540         JsonElement jsonElement = new JsonParser().parse("{}");
541
542         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
543             .getJsonObjectFromAnArray(jsonElement);
544
545         ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
546         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
547             .expectComplete().verify();
548
549         assertTrue("Error missing in log",
550             logAppender.list.toString().contains(ERROR_LOG_TAG + "Incorrect JsonObject - missing header. "));
551     }
552
553     @Test
554     void whenPassingCorrectJsonWithIncorrectChangeType_noFileData() {
555         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
556             .name(PM_FILE_NAME) //
557             .location(LOCATION) //
558             .compression(GZIP_COMPRESSION) //
559             .fileFormatVersion(FILE_FORMAT_VERSION) //
560             .build();
561         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
562             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
563             .changeIdentifier(CHANGE_IDENTIFIER) //
564             .changeType(INCORRECT_CHANGE_TYPE) //
565             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
566             .addAdditionalField(additionalField) //
567             .build();
568
569         String parsedString = message.getParsed();
570         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
571         JsonElement jsonElement = new JsonParser().parse(parsedString);
572         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
573             .getJsonObjectFromAnArray(jsonElement);
574
575         ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
576         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
577             .expectNextCount(0).expectComplete().verify();
578
579         assertTrue("Error missing in log",
580             logAppender.list.toString()
581                 .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING + " Change type is wrong: "
582                     + INCORRECT_CHANGE_TYPE + " Expected: FileReady Message: " + message.getParsed()));
583     }
584
585     @Test
586     void whenPassingCorrectJsonWithIncorrectChangeIdentifier_noFileData() {
587         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
588             .name(PM_FILE_NAME) //
589             .location(LOCATION) //
590             .compression(GZIP_COMPRESSION) //
591             .fileFormatVersion(FILE_FORMAT_VERSION) //
592             .build();
593         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
594             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
595             .changeIdentifier(INCORRECT_CHANGE_IDENTIFIER) //
596             .changeType(CHANGE_TYPE) //
597             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
598             .addAdditionalField(additionalField) //
599             .build();
600
601         String parsedString = message.getParsed();
602         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
603         JsonElement jsonElement = new JsonParser().parse(parsedString);
604         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
605             .getJsonObjectFromAnArray(jsonElement);
606
607         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
608             .expectComplete().verify();
609     }
610 }