bfb9b13e8929d551276460d8ad3900ae3f4c81e9
[dcaegen2/collectors/datafile.git] /
1 /*-
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
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
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=========================================================
18  */
19
20 package org.onap.dcaegen2.collectors.datafile.service;
21
22 import static org.junit.Assert.assertTrue;
23 import static org.mockito.Mockito.spy;
24
25 import ch.qos.logback.classic.spi.ILoggingEvent;
26 import ch.qos.logback.core.read.ListAppender;
27
28 import com.google.gson.JsonElement;
29 import com.google.gson.JsonParser;
30
31 import java.net.URISyntaxException;
32 import java.util.ArrayList;
33 import java.util.List;
34 import java.util.Optional;
35
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;
48
49 import reactor.core.publisher.Flux;
50 import reactor.core.publisher.Mono;
51 import reactor.test.StepVerifier;
52
53 /**
54  * Tests the JsonMessageParser.
55  *
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>
58  */
59 class JsonMessageParserTest {
60     private static final String ERROR_LOG_TAG = "[ERROR] ";
61
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";
79
80     @Test
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) //
88             .build();
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) //
95             .build();
96
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) //
106             .build();
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) //
115             .build();
116         List<FileData> files = new ArrayList<>();
117         files.add(expectedFileData);
118         FileReadyMessage expectedMessage = ImmutableFileReadyMessage.builder() //
119             .files(files) //
120             .build();
121
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);
127
128         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
129             .expectNext(expectedMessage).verifyComplete();
130     }
131
132     @Test
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) //
140             .build();
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) //
147             .build();
148
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) //
158             .build();
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) //
167             .build();
168         List<FileData> files = new ArrayList<>();
169         files.add(expectedFileData);
170         FileReadyMessage expectedMessage = ImmutableFileReadyMessage.builder() //
171             .files(files) //
172             .build();
173
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);
181
182         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement1)))
183             .expectSubscription().expectNext(expectedMessage).expectNext(expectedMessage).verifyComplete();
184     }
185
186     @Test
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) //
193             .build();
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) //
200             .build();
201
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);
207
208         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
209         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
210             .expectNextCount(0).verifyComplete();
211
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"));
215     }
216
217     @Test
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) //
225             .build();
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) //
232             .build();
233
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);
239
240         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
241         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
242             .expectNextCount(0).verifyComplete();
243
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"));
250     }
251
252     @Test
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) //
260             .build();
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) //
267             .build();
268
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) //
278             .build();
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) //
287             .build();
288         List<FileData> files = new ArrayList<>();
289         files.add(expectedFileData);
290         FileReadyMessage expectedMessage = ImmutableFileReadyMessage.builder() //
291             .files(files) //
292             .build();
293
294         String parsedString = message.getParsed();
295         String messageString = "[{\"event\":{}}," + parsedString + "]";
296         JsonMessageParser jsonMessageParserUnderTest = new JsonMessageParser();
297         JsonElement jsonElement = JsonParser.parseString(messageString);
298
299         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
300             .expectNext(expectedMessage).verifyComplete();
301     }
302
303     @Test
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) //
310             .build();
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) //
317             .build();
318
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);
324
325         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
326         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
327             .expectComplete().verify();
328
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"));
332     }
333
334     @Test
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) //
341             .build();
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) //
348             .build();
349
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);
355
356         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
357         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
358             .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 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);
381
382         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
383         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
384             .expectNextCount(0).verifyComplete();
385
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()));
389     }
390
391     @Test
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) //
398             .build();
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) //
405             .build();
406
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);
412
413         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
414         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
415             .expectNextCount(0).verifyComplete();
416
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()));
422     }
423
424     @Test
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) //
431             .build();
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) //
438             .build();
439
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);
445
446         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
447         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
448             .expectNextCount(0).verifyComplete();
449
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()));
455     }
456
457     @Test
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) //
464             .build();
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) //
471             .build();
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) //
479             .build();
480
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) //
490             .build();
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) //
499             .build();
500         List<FileData> files = new ArrayList<>();
501         files.add(expectedFileData);
502         FileReadyMessage expectedMessage = ImmutableFileReadyMessage.builder() //
503             .files(files) //
504             .build();
505
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);
511
512         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
513             .expectNext(expectedMessage).verifyComplete();
514     }
515
516     @Test
517     void whenPassingJsonWithoutMandatoryHeaderInformation_noFileData() {
518         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
519             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
520             .build();
521
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);
527
528         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
529         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
530             .expectComplete().verify();
531
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()));
537     }
538
539     @Test
540     void whenPassingJsonWithNullJsonElement_noFileData() {
541         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
542         JsonElement jsonElement = JsonParser.parseString("{}");
543
544         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
545             .getJsonObjectFromAnArray(jsonElement);
546
547         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
548         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
549             .expectComplete().verify();
550
551         assertTrue("Error missing in log",
552             logAppender.list.toString().contains(ERROR_LOG_TAG + "Incorrect JsonObject - missing header. "));
553     }
554
555     @Test
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) //
562             .build();
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) //
569             .build();
570
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);
576
577         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
578         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
579             .expectNextCount(0).expectComplete().verify();
580
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()));
585     }
586
587     @Test
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) //
594             .build();
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) //
601             .build();
602
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);
608
609         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
610             .expectComplete().verify();
611     }
612 }