8fb8c36478c0b77054f3e7efbd636f766401fd4d
[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.Mono;
50 import reactor.test.StepVerifier;
51
52 /**
53  * Tests the JsonMessageParser.
54  *
55  * @author <a href="mailto:przemyslaw.wasala@nokia.com">Przemysław Wąsala</a> on 5/8/18
56  * @author <a href="mailto:henrik.b.andersson@est.tech">Henrik Andersson</a>
57  */
58 class JsonMessageParserTest {
59     private static final String ERROR_LOG_TAG = "[ERROR] ";
60
61     private static final String NR_RADIO_ERICSSON_EVENT_NAME = "Noti_NrRadio-Ericsson_FileReady";
62     private static final String PRODUCT_NAME = "NrRadio";
63     private static final String VENDOR_NAME = "Ericsson";
64     private static final String LAST_EPOCH_MICROSEC = "1519837825682";
65     private static final String SOURCE_NAME = "5GRAN_DU";
66     private static final String START_EPOCH_MICROSEC = "1519837825682";
67     private static final String TIME_ZONE_OFFSET = "UTC+05:00";
68     private static final String PM_FILE_NAME = "A20161224.1030-1045.bin.gz";
69     private static final String LOCATION = "ftpes://192.168.0.101:22/ftp/rop/" + PM_FILE_NAME;
70     private static final String GZIP_COMPRESSION = "gzip";
71     private static final String FILE_FORMAT_TYPE = "org.3GPP.32.435#measCollec";
72     private static final String FILE_FORMAT_VERSION = "V10";
73     private static final String CHANGE_IDENTIFIER = "PM_MEAS_FILES";
74     private static final String INCORRECT_CHANGE_IDENTIFIER = "INCORRECT_PM_MEAS_FILES";
75     private static final String CHANGE_TYPE = "FileReady";
76     private static final String INCORRECT_CHANGE_TYPE = "IncorrectFileReady";
77     private static final String NOTIFICATION_FIELDS_VERSION = "1.0";
78
79     @Test
80     void whenPassingCorrectJson_oneFileReadyMessage() throws URISyntaxException {
81         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
82             .name(PM_FILE_NAME) //
83             .location(LOCATION) //
84             .compression(GZIP_COMPRESSION) //
85             .fileFormatType(FILE_FORMAT_TYPE) //
86             .fileFormatVersion(FILE_FORMAT_VERSION) //
87             .build();
88         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
89             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
90             .changeIdentifier(CHANGE_IDENTIFIER) //
91             .changeType(CHANGE_TYPE) //
92             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
93             .addAdditionalField(additionalField) //
94             .build();
95
96         MessageMetaData messageMetaData = ImmutableMessageMetaData.builder() //
97             .productName(PRODUCT_NAME) //
98             .vendorName(VENDOR_NAME) //
99             .lastEpochMicrosec(LAST_EPOCH_MICROSEC) //
100             .sourceName(SOURCE_NAME) //
101             .startEpochMicrosec(START_EPOCH_MICROSEC) //
102             .timeZoneOffset(TIME_ZONE_OFFSET) //
103             .changeIdentifier(CHANGE_IDENTIFIER) //
104             .changeType(CHANGE_TYPE) //
105             .build();
106         FileData expectedFileData = ImmutableFileData.builder() //
107             .name(PM_FILE_NAME) //
108             .location(LOCATION) //
109             .scheme(Scheme.FTPES) //
110             .compression(GZIP_COMPRESSION) //
111             .fileFormatType(FILE_FORMAT_TYPE) //
112             .fileFormatVersion(FILE_FORMAT_VERSION) //
113             .messageMetaData(messageMetaData) //
114             .build();
115         List<FileData> files = new ArrayList<>();
116         files.add(expectedFileData);
117         FileReadyMessage expectedMessage = ImmutableFileReadyMessage.builder() //
118             .files(files) //
119             .build();
120
121         String parsedString = message.getParsed();
122         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
123         JsonElement jsonElement = new JsonParser().parse(parsedString);
124         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
125             .getJsonObjectFromAnArray(jsonElement);
126
127         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
128             .expectNext(expectedMessage).verifyComplete();
129     }
130
131     @Test
132     void whenPassingCorrectJsonWithTwoEvents_twoMessages() {
133         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
134             .name(PM_FILE_NAME) //
135             .location(LOCATION) //
136             .compression(GZIP_COMPRESSION) //
137             .fileFormatType(FILE_FORMAT_TYPE) //
138             .fileFormatVersion(FILE_FORMAT_VERSION) //
139             .build();
140         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
141             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
142             .changeIdentifier(CHANGE_IDENTIFIER) //
143             .changeType(CHANGE_TYPE) //
144             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
145             .addAdditionalField(additionalField) //
146             .build();
147
148         MessageMetaData messageMetaData = ImmutableMessageMetaData.builder() //
149             .productName(PRODUCT_NAME) //
150             .vendorName(VENDOR_NAME) //
151             .lastEpochMicrosec(LAST_EPOCH_MICROSEC) //
152             .sourceName(SOURCE_NAME) //
153             .startEpochMicrosec(START_EPOCH_MICROSEC) //
154             .timeZoneOffset(TIME_ZONE_OFFSET) //
155             .changeIdentifier(CHANGE_IDENTIFIER) //
156             .changeType(CHANGE_TYPE) //
157             .build();
158         FileData expectedFileData = ImmutableFileData.builder() //
159             .name(PM_FILE_NAME) //
160             .location(LOCATION) //
161             .scheme(Scheme.FTPES) //
162             .compression(GZIP_COMPRESSION) //
163             .fileFormatType(FILE_FORMAT_TYPE) //
164             .fileFormatVersion(FILE_FORMAT_VERSION) //
165             .messageMetaData(messageMetaData) //
166             .build();
167         List<FileData> files = new ArrayList<>();
168         files.add(expectedFileData);
169         FileReadyMessage expectedMessage = ImmutableFileReadyMessage.builder() //
170             .files(files) //
171             .build();
172
173         String parsedString = message.getParsed();
174         String messageString = "[" + parsedString + "," + parsedString + "]";
175         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
176         JsonElement jsonElement = new JsonParser().parse(parsedString);
177         JsonElement jsonElement1 = new JsonParser().parse(messageString);
178         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
179             .getJsonObjectFromAnArray(jsonElement);
180
181         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement1)))
182             .expectSubscription().expectNext(expectedMessage).expectNext(expectedMessage).verifyComplete();
183     }
184
185     @Test
186     void whenPassingCorrectJsonWithoutLocation_noMessage() {
187         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
188             .name(PM_FILE_NAME) //
189             .compression(GZIP_COMPRESSION) //
190             .fileFormatType(FILE_FORMAT_TYPE) //
191             .fileFormatVersion(FILE_FORMAT_VERSION) //
192             .build();
193         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
194             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
195             .changeIdentifier(CHANGE_IDENTIFIER) //
196             .changeType(CHANGE_TYPE) //
197             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
198             .addAdditionalField(additionalField) //
199             .build();
200
201         String parsedString = message.getParsed();
202         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
203         JsonElement jsonElement = new JsonParser().parse(parsedString);
204         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
205             .getJsonObjectFromAnArray(jsonElement);
206
207         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
208         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
209             .expectNextCount(0).verifyComplete();
210
211         assertTrue(logAppender.list.toString()
212             .contains("[ERROR] VES event parsing. File information wrong. " + "Missing location."));
213         assertTrue(logAppender.list.get(0).toString().contains("sourceName=5GRAN_DU"));
214     }
215
216     @Test
217     void whenPassingCorrectJsonWrongScheme_noMessage() {
218         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
219             .name(PM_FILE_NAME) //
220             .location("http://location.xml") //
221             .compression(GZIP_COMPRESSION) //
222             .fileFormatType(FILE_FORMAT_TYPE) //
223             .fileFormatVersion(FILE_FORMAT_VERSION) //
224             .build();
225         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
226             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
227             .changeIdentifier(CHANGE_IDENTIFIER) //
228             .changeType(CHANGE_TYPE) //
229             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
230             .addAdditionalField(additionalField) //
231             .build();
232
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         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
240         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
241             .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.FTPES) //
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         JsonElement jsonElement = new JsonParser().parse(messageString);
297
298         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
299             .expectNext(expectedMessage).verifyComplete();
300     }
301
302     @Test
303     void whenPassingCorrectJsonWithFaultyEventName_noFileData() {
304         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
305             .location(LOCATION) //
306             .compression(GZIP_COMPRESSION) //
307             .fileFormatType(FILE_FORMAT_TYPE) //
308             .fileFormatVersion(FILE_FORMAT_VERSION) //
309             .build();
310         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
311             .eventName("Faulty event name") //
312             .changeIdentifier(CHANGE_IDENTIFIER) //
313             .changeType(CHANGE_TYPE) //
314             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
315             .addAdditionalField(additionalField) //
316             .build();
317
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         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
325         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
326             .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 parsedString = message.getParsed();
350         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
351         JsonElement jsonElement = new JsonParser().parse(parsedString);
352         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
353             .getJsonObjectFromAnArray(jsonElement);
354
355         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
356         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
357             .expectNextCount(0).verifyComplete();
358
359         assertTrue("Error missing in log",
360             logAppender.list.toString()
361                 .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
362                     + "File information wrong. Missing data: [name] Data: "
363                     + message.getAdditionalFields().get(0).toString()));
364     }
365
366     @Test
367     void whenPassingCorrectJsonWithoutAdditionalFields_noFileData() {
368         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
369             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
370             .changeIdentifier(CHANGE_IDENTIFIER) //
371             .changeType(CHANGE_TYPE) //
372             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
373             .build();
374
375         String parsedString = message.getParsed();
376         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
377         JsonElement jsonElement = new JsonParser().parse(parsedString);
378         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
379             .getJsonObjectFromAnArray(jsonElement);
380
381         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
382         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
383             .expectNextCount(0).verifyComplete();
384
385         assertTrue("Error missing in log",
386             logAppender.list.toString().contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
387                 + "Missing arrayOfNamedHashMap in message. " + message.getParsed()));
388     }
389
390     @Test
391     void whenPassingCorrectJsonWithoutCompression_noFileData() {
392         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
393             .name(PM_FILE_NAME) //
394             .location(LOCATION) //
395             .fileFormatType(FILE_FORMAT_TYPE) //
396             .fileFormatVersion(FILE_FORMAT_VERSION) //
397             .build();
398         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
399             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
400             .changeIdentifier(CHANGE_IDENTIFIER) //
401             .changeType(CHANGE_TYPE) //
402             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
403             .addAdditionalField(additionalField) //
404             .build();
405
406         String parsedString = message.getParsed();
407         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
408         JsonElement jsonElement = new JsonParser().parse(parsedString);
409         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
410             .getJsonObjectFromAnArray(jsonElement);
411
412         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
413         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
414             .expectNextCount(0).verifyComplete();
415
416         assertTrue("Error missing in log",
417             logAppender.list.toString()
418                 .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
419                     + "File information wrong. Missing data: [compression] Data: "
420                     + message.getAdditionalFields().get(0).toString()));
421     }
422
423     @Test
424     void whenPassingCorrectJsonWithoutFileFormatType_noFileData() {
425         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
426             .name(PM_FILE_NAME) //
427             .location(LOCATION) //
428             .compression(GZIP_COMPRESSION) //
429             .fileFormatVersion(FILE_FORMAT_VERSION) //
430             .build();
431         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
432             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
433             .changeIdentifier(CHANGE_IDENTIFIER) //
434             .changeType(CHANGE_TYPE) //
435             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
436             .addAdditionalField(additionalField) //
437             .build();
438
439         String parsedString = message.getParsed();
440         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
441         JsonElement jsonElement = new JsonParser().parse(parsedString);
442         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
443             .getJsonObjectFromAnArray(jsonElement);
444
445         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
446         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
447             .expectNextCount(0).verifyComplete();
448
449         assertTrue("Error missing in log",
450             logAppender.list.toString()
451                 .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
452                     + "File information wrong. Missing data: [fileFormatType] Data: "
453                     + message.getAdditionalFields().get(0).toString()));
454     }
455
456     @Test
457     void whenPassingOneCorrectJsonWithoutFileFormatVersionAndOneCorrect_oneFileData() {
458         AdditionalField additionalFaultyField = new JsonMessage.AdditionalFieldBuilder() //
459             .name(PM_FILE_NAME) //
460             .location(LOCATION) //
461             .compression(GZIP_COMPRESSION) //
462             .fileFormatType(FILE_FORMAT_TYPE) //
463             .build();
464         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
465             .name(PM_FILE_NAME) //
466             .location(LOCATION) //
467             .compression(GZIP_COMPRESSION) //
468             .fileFormatType(FILE_FORMAT_TYPE) //
469             .fileFormatVersion(FILE_FORMAT_VERSION) //
470             .build();
471         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
472             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
473             .changeIdentifier(CHANGE_IDENTIFIER) //
474             .changeType(CHANGE_TYPE) //
475             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
476             .addAdditionalField(additionalFaultyField) //
477             .addAdditionalField(additionalField) //
478             .build();
479
480         MessageMetaData messageMetaData = ImmutableMessageMetaData.builder() //
481             .productName(PRODUCT_NAME) //
482             .vendorName(VENDOR_NAME) //
483             .lastEpochMicrosec(LAST_EPOCH_MICROSEC) //
484             .sourceName(SOURCE_NAME) //
485             .startEpochMicrosec(START_EPOCH_MICROSEC) //
486             .timeZoneOffset(TIME_ZONE_OFFSET) //
487             .changeIdentifier(CHANGE_IDENTIFIER) //
488             .changeType(CHANGE_TYPE) //
489             .build();
490         FileData expectedFileData = ImmutableFileData.builder() //
491             .name(PM_FILE_NAME) //
492             .location(LOCATION) //
493             .scheme(Scheme.FTPES) //
494             .compression(GZIP_COMPRESSION) //
495             .fileFormatType(FILE_FORMAT_TYPE) //
496             .fileFormatVersion(FILE_FORMAT_VERSION) //
497             .messageMetaData(messageMetaData) //
498             .build();
499         List<FileData> files = new ArrayList<>();
500         files.add(expectedFileData);
501         FileReadyMessage expectedMessage = ImmutableFileReadyMessage.builder() //
502             .files(files) //
503             .build();
504
505         String parsedString = message.getParsed();
506         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
507         JsonElement jsonElement = new JsonParser().parse(parsedString);
508         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
509             .getJsonObjectFromAnArray(jsonElement);
510
511         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
512             .expectNext(expectedMessage).verifyComplete();
513     }
514
515     @Test
516     void whenPassingJsonWithoutMandatoryHeaderInformation_noFileData() {
517         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
518             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
519             .build();
520
521         String parsedString = message.getParsed();
522         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
523         JsonElement jsonElement = new JsonParser().parse(parsedString);
524         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
525             .getJsonObjectFromAnArray(jsonElement);
526
527         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
528         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
529             .expectComplete().verify();
530
531         assertTrue("Error missing in log",
532             logAppender.list.toString()
533                 .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
534                     + "Missing data: [changeIdentifier, changeType, notificationFieldsVersion]. "
535                     + "Change type is wrong:  Expected: FileReady Message: " + message.getParsed()));
536     }
537
538     @Test
539     void whenPassingJsonWithNullJsonElement_noFileData() {
540         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
541         JsonElement jsonElement = new JsonParser().parse("{}");
542
543         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
544             .getJsonObjectFromAnArray(jsonElement);
545
546         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
547         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
548             .expectComplete().verify();
549
550         assertTrue("Error missing in log",
551             logAppender.list.toString().contains(ERROR_LOG_TAG + "Incorrect JsonObject - missing header. "));
552     }
553
554     @Test
555     void whenPassingCorrectJsonWithIncorrectChangeType_noFileData() {
556         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
557             .name(PM_FILE_NAME) //
558             .location(LOCATION) //
559             .compression(GZIP_COMPRESSION) //
560             .fileFormatVersion(FILE_FORMAT_VERSION) //
561             .build();
562         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
563             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
564             .changeIdentifier(CHANGE_IDENTIFIER) //
565             .changeType(INCORRECT_CHANGE_TYPE) //
566             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
567             .addAdditionalField(additionalField) //
568             .build();
569
570         String parsedString = message.getParsed();
571         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
572         JsonElement jsonElement = new JsonParser().parse(parsedString);
573         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
574             .getJsonObjectFromAnArray(jsonElement);
575
576         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
577         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
578             .expectNextCount(0).expectComplete().verify();
579
580         assertTrue("Error missing in log",
581             logAppender.list.toString()
582                 .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING + " Change type is wrong: "
583                     + INCORRECT_CHANGE_TYPE + " Expected: FileReady Message: " + message.getParsed()));
584     }
585
586     @Test
587     void whenPassingCorrectJsonWithIncorrectChangeIdentifier_noFileData() {
588         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
589             .name(PM_FILE_NAME) //
590             .location(LOCATION) //
591             .compression(GZIP_COMPRESSION) //
592             .fileFormatVersion(FILE_FORMAT_VERSION) //
593             .build();
594         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
595             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
596             .changeIdentifier(INCORRECT_CHANGE_IDENTIFIER) //
597             .changeType(CHANGE_TYPE) //
598             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
599             .addAdditionalField(additionalField) //
600             .build();
601
602         String parsedString = message.getParsed();
603         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
604         JsonElement jsonElement = new JsonParser().parse(parsedString);
605         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
606             .getJsonObjectFromAnArray(jsonElement);
607
608         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(jsonElement))).expectSubscription()
609             .expectComplete().verify();
610     }
611 }