b7eddaa70f97e3e35b758283bc41a4dafccb7840
[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 import com.google.gson.JsonElement;
27 import com.google.gson.JsonParser;
28 import java.net.URISyntaxException;
29 import java.util.ArrayList;
30 import java.util.List;
31 import java.util.Optional;
32 import org.junit.jupiter.api.Test;
33 import org.mockito.Mockito;
34 import org.onap.dcaegen2.collectors.datafile.ftp.Scheme;
35 import org.onap.dcaegen2.collectors.datafile.model.FileData;
36 import org.onap.dcaegen2.collectors.datafile.model.FileReadyMessage;
37 import org.onap.dcaegen2.collectors.datafile.model.ImmutableFileData;
38 import org.onap.dcaegen2.collectors.datafile.model.ImmutableFileReadyMessage;
39 import org.onap.dcaegen2.collectors.datafile.model.ImmutableMessageMetaData;
40 import org.onap.dcaegen2.collectors.datafile.model.MessageMetaData;
41 import org.onap.dcaegen2.collectors.datafile.utils.JsonMessage;
42 import org.onap.dcaegen2.collectors.datafile.utils.JsonMessage.AdditionalField;
43 import org.onap.dcaegen2.collectors.datafile.utils.LoggingUtils;
44 import reactor.core.publisher.Mono;
45 import reactor.test.StepVerifier;
46
47 /**
48  * Tests the JsonMessageParser.
49  *
50  * @author <a href="mailto:przemyslaw.wasala@nokia.com">Przemysław Wąsala</a> on 5/8/18
51  * @author <a href="mailto:henrik.b.andersson@est.tech">Henrik Andersson</a>
52  */
53 class JsonMessageParserTest {
54     private static final String ERROR_LOG_TAG = "[ERROR] ";
55
56     private static final String NR_RADIO_ERICSSON_EVENT_NAME = "Noti_NrRadio-Ericsson_FileReady";
57     private static final String PRODUCT_NAME = "NrRadio";
58     private static final String VENDOR_NAME = "Ericsson";
59     private static final String LAST_EPOCH_MICROSEC = "1519837825682";
60     private static final String SOURCE_NAME = "5GRAN_DU";
61     private static final String START_EPOCH_MICROSEC = "1519837825682";
62     private static final String TIME_ZONE_OFFSET = "UTC+05:00";
63     private static final String PM_FILE_NAME = "A20161224.1030-1045.bin.gz";
64     private static final String LOCATION = "ftpes://192.168.0.101:22/ftp/rop/" + PM_FILE_NAME;
65     private static final String GZIP_COMPRESSION = "gzip";
66     private static final String FILE_FORMAT_TYPE = "org.3GPP.32.435#measCollec";
67     private static final String FILE_FORMAT_VERSION = "V10";
68     private static final String CHANGE_IDENTIFIER = "PM_MEAS_FILES";
69     private static final String CHANGE_TYPE = "FileReady";
70     private static final String INCORRECT_CHANGE_TYPE = "IncorrectFileReady";
71     private static final String NOTIFICATION_FIELDS_VERSION = "1.0";
72
73     @Test
74     void whenPassingCorrectJson_oneFileReadyMessage() throws URISyntaxException {
75         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
76                 .name(PM_FILE_NAME) //
77                 .location(LOCATION) //
78                 .compression(GZIP_COMPRESSION) //
79                 .fileFormatType(FILE_FORMAT_TYPE) //
80                 .fileFormatVersion(FILE_FORMAT_VERSION) //
81                 .build();
82         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
83                 .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
84                 .changeIdentifier(CHANGE_IDENTIFIER) //
85                 .changeType(CHANGE_TYPE) //
86                 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
87                 .addAdditionalField(additionalField) //
88                 .build();
89
90         MessageMetaData messageMetaData = ImmutableMessageMetaData.builder() //
91                 .productName(PRODUCT_NAME) //
92                 .vendorName(VENDOR_NAME) //
93                 .lastEpochMicrosec(LAST_EPOCH_MICROSEC) //
94                 .sourceName(SOURCE_NAME) //
95                 .startEpochMicrosec(START_EPOCH_MICROSEC) //
96                 .timeZoneOffset(TIME_ZONE_OFFSET) //
97                 .changeIdentifier(CHANGE_IDENTIFIER) //
98                 .changeType(CHANGE_TYPE) //
99                 .build();
100         FileData expectedFileData = ImmutableFileData.builder() //
101                 .name(PM_FILE_NAME) //
102                 .location(LOCATION) //
103                 .scheme(Scheme.FTPS) //
104                 .compression(GZIP_COMPRESSION) //
105                 .fileFormatType(FILE_FORMAT_TYPE) //
106                 .fileFormatVersion(FILE_FORMAT_VERSION) //
107                 .messageMetaData(messageMetaData) //
108                 .build();
109         List<FileData> files = new ArrayList<>();
110         files.add(expectedFileData);
111         FileReadyMessage expectedMessage = ImmutableFileReadyMessage.builder() //
112                 .files(files) //
113                 .build();
114
115         String messageString = message.toString();
116         String parsedString = message.getParsed();
117         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
118         JsonElement jsonElement = new JsonParser().parse(parsedString);
119         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
120                 .getJsonObjectFromAnArray(jsonElement);
121
122         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(messageString)))
123                 .expectSubscription().expectNext(expectedMessage).verifyComplete();
124     }
125
126     @Test
127     void whenPassingCorrectJsonWithTwoEvents_twoMessages() {
128         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
129                 .name(PM_FILE_NAME) //
130                 .location(LOCATION) //
131                 .compression(GZIP_COMPRESSION) //
132                 .fileFormatType(FILE_FORMAT_TYPE) //
133                 .fileFormatVersion(FILE_FORMAT_VERSION) //
134                 .build();
135         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
136                 .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
137                 .changeIdentifier(CHANGE_IDENTIFIER) //
138                 .changeType(CHANGE_TYPE) //
139                 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
140                 .addAdditionalField(additionalField) //
141                 .build();
142
143         MessageMetaData messageMetaData = ImmutableMessageMetaData.builder() //
144                 .productName(PRODUCT_NAME) //
145                 .vendorName(VENDOR_NAME) //
146                 .lastEpochMicrosec(LAST_EPOCH_MICROSEC) //
147                 .sourceName(SOURCE_NAME) //
148                 .startEpochMicrosec(START_EPOCH_MICROSEC) //
149                 .timeZoneOffset(TIME_ZONE_OFFSET) //
150                 .changeIdentifier(CHANGE_IDENTIFIER) //
151                 .changeType(CHANGE_TYPE) //
152                 .build();
153         FileData expectedFileData = ImmutableFileData.builder() //
154                 .name(PM_FILE_NAME) //
155                 .location(LOCATION) //
156                 .scheme(Scheme.FTPS) //
157                 .compression(GZIP_COMPRESSION) //
158                 .fileFormatType(FILE_FORMAT_TYPE) //
159                 .fileFormatVersion(FILE_FORMAT_VERSION) //
160                 .messageMetaData(messageMetaData) //
161                 .build();
162         List<FileData> files = new ArrayList<>();
163         files.add(expectedFileData);
164         FileReadyMessage expectedMessage = ImmutableFileReadyMessage.builder() //
165                 .files(files) //
166                 .build();
167
168         String parsedString = message.getParsed();
169         String messageString = "[" + parsedString + "," + parsedString + "]";
170         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
171         JsonElement jsonElement = new JsonParser().parse(parsedString);
172         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
173                 .getJsonObjectFromAnArray(jsonElement);
174
175         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(messageString)))
176                 .expectSubscription().expectNext(expectedMessage).expectNext(expectedMessage).verifyComplete();
177     }
178
179     @Test
180     void whenPassingCorrectJsonWithoutLocation_noMessage() {
181         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
182                 .name(PM_FILE_NAME) //
183                 .compression(GZIP_COMPRESSION) //
184                 .fileFormatType(FILE_FORMAT_TYPE) //
185                 .fileFormatVersion(FILE_FORMAT_VERSION) //
186                 .build();
187         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
188                 .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
189                 .changeIdentifier(CHANGE_IDENTIFIER) //
190                 .changeType(CHANGE_TYPE) //
191                 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
192                 .addAdditionalField(additionalField) //
193                 .build();
194
195         String messageString = message.toString();
196         String parsedString = message.getParsed();
197         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
198         JsonElement jsonElement = new JsonParser().parse(parsedString);
199         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
200                 .getJsonObjectFromAnArray(jsonElement);
201
202         ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
203         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(messageString)))
204                 .expectSubscription().expectNextCount(0).verifyComplete();
205
206         assertTrue(logAppender.list.toString()
207                 .contains("[ERROR] VES event parsing. File information wrong. " + "Missing location."));
208         assertTrue(logAppender.list.get(0).toString().contains("sourceName=5GRAN_DU"));
209     }
210
211     @Test
212     void whenPassingCorrectJsonWrongScheme_noMessage() {
213         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
214                 .name(PM_FILE_NAME) //
215                 .location("http://location.xml") //
216                 .compression(GZIP_COMPRESSION) //
217                 .fileFormatType(FILE_FORMAT_TYPE) //
218                 .fileFormatVersion(FILE_FORMAT_VERSION) //
219                 .build();
220         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
221                 .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
222                 .changeIdentifier(CHANGE_IDENTIFIER) //
223                 .changeType(CHANGE_TYPE) //
224                 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
225                 .addAdditionalField(additionalField) //
226                 .build();
227
228         String messageString = message.toString();
229         String parsedString = message.getParsed();
230         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
231         JsonElement jsonElement = new JsonParser().parse(parsedString);
232         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
233                 .getJsonObjectFromAnArray(jsonElement);
234
235         ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
236         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(messageString)))
237                 .expectSubscription().expectNextCount(0).verifyComplete();
238
239         assertTrue("Error missing in log",
240                 logAppender.list.toString()
241                         .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
242                                 + Scheme.DFC_DOES_NOT_SUPPORT_PROTOCOL_ERROR_MSG + "http"
243                                 + Scheme.SUPPORTED_PROTOCOLS_ERROR_MESSAGE + ". Location: http://location.xml"));
244         assertTrue("Missing sourceName in log", logAppender.list.toString().contains("sourceName=5GRAN_DU"));
245     }
246
247     @Test
248     void whenPassingCorrectJsonWithTwoEventsFirstNoHeader_oneFileDatan() {
249         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
250                 .name(PM_FILE_NAME) //
251                 .location(LOCATION) //
252                 .compression(GZIP_COMPRESSION) //
253                 .fileFormatType(FILE_FORMAT_TYPE) //
254                 .fileFormatVersion(FILE_FORMAT_VERSION) //
255                 .build();
256         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
257                 .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
258                 .changeIdentifier(CHANGE_IDENTIFIER) //
259                 .changeType(CHANGE_TYPE) //
260                 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
261                 .addAdditionalField(additionalField) //
262                 .build();
263
264         MessageMetaData messageMetaData = ImmutableMessageMetaData.builder() //
265                 .productName(PRODUCT_NAME) //
266                 .vendorName(VENDOR_NAME) //
267                 .lastEpochMicrosec(LAST_EPOCH_MICROSEC) //
268                 .sourceName(SOURCE_NAME) //
269                 .startEpochMicrosec(START_EPOCH_MICROSEC) //
270                 .timeZoneOffset(TIME_ZONE_OFFSET) //
271                 .changeIdentifier(CHANGE_IDENTIFIER) //
272                 .changeType(CHANGE_TYPE) //
273                 .build();
274         FileData expectedFileData = ImmutableFileData.builder() //
275                 .name(PM_FILE_NAME) //
276                 .location(LOCATION) //
277                 .scheme(Scheme.FTPS) //
278                 .compression(GZIP_COMPRESSION) //
279                 .fileFormatType(FILE_FORMAT_TYPE) //
280                 .fileFormatVersion(FILE_FORMAT_VERSION) //
281                 .messageMetaData(messageMetaData) //
282                 .build();
283         List<FileData> files = new ArrayList<>();
284         files.add(expectedFileData);
285         FileReadyMessage expectedMessage = ImmutableFileReadyMessage.builder() //
286                 .files(files) //
287                 .build();
288
289         String parsedString = message.getParsed();
290         String messageString = "[{\"event\":{}}," + parsedString + "]";
291         JsonMessageParser jsonMessageParserUnderTest = new JsonMessageParser();
292
293         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(messageString)))
294                 .expectSubscription().expectNext(expectedMessage).verifyComplete();
295     }
296
297     @Test
298     void whenPassingCorrectJsonWithFaultyEventName_noFileData() {
299         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
300                 .location(LOCATION) //
301                 .compression(GZIP_COMPRESSION) //
302                 .fileFormatType(FILE_FORMAT_TYPE) //
303                 .fileFormatVersion(FILE_FORMAT_VERSION) //
304                 .build();
305         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
306                 .eventName("Faulty event name") //
307                 .changeIdentifier(CHANGE_IDENTIFIER) //
308                 .changeType(CHANGE_TYPE) //
309                 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
310                 .addAdditionalField(additionalField) //
311                 .build();
312
313         String messageString = message.toString();
314         String parsedString = message.getParsed();
315         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
316         JsonElement jsonElement = new JsonParser().parse(parsedString);
317         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
318                 .getJsonObjectFromAnArray(jsonElement);
319
320         ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
321         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(messageString)))
322                 .expectSubscription().expectComplete().verify();
323
324         assertTrue("Error missing in log", logAppender.list.toString().contains(ERROR_LOG_TAG
325                 + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
326                 + "Can not get PRODUCT_NAME from eventName, eventName is not in correct format: Faulty event name"));
327     }
328
329     @Test
330     void whenPassingCorrectJsonWithoutName_noFileData() {
331         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
332                 .location(LOCATION) //
333                 .compression(GZIP_COMPRESSION) //
334                 .fileFormatType(FILE_FORMAT_TYPE) //
335                 .fileFormatVersion(FILE_FORMAT_VERSION) //
336                 .build();
337         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
338                 .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
339                 .changeIdentifier(CHANGE_IDENTIFIER) //
340                 .changeType(CHANGE_TYPE) //
341                 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
342                 .addAdditionalField(additionalField) //
343                 .build();
344
345         String messageString = message.toString();
346         String parsedString = message.getParsed();
347         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
348         JsonElement jsonElement = new JsonParser().parse(parsedString);
349         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
350                 .getJsonObjectFromAnArray(jsonElement);
351
352         ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
353         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(messageString)))
354                 .expectSubscription().expectNextCount(0).verifyComplete();
355
356         assertTrue("Error missing in log",
357                 logAppender.list.toString()
358                         .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
359                                 + "File information wrong. Missing data: [name] Data: "
360                                 + message.getAdditionalFields().get(0).toString()));
361     }
362
363     @Test
364     void whenPassingCorrectJsonWithoutAdditionalFields_noFileData() {
365         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
366                 .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
367                 .changeIdentifier(CHANGE_IDENTIFIER) //
368                 .changeType(CHANGE_TYPE) //
369                 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
370                 .build();
371
372         String messageString = message.toString();
373         String parsedString = message.getParsed();
374         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
375         JsonElement jsonElement = new JsonParser().parse(parsedString);
376         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
377                 .getJsonObjectFromAnArray(jsonElement);
378
379         ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
380         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(messageString)))
381                 .expectSubscription().expectNextCount(0).verifyComplete();
382
383         assertTrue("Error missing in log",
384                 logAppender.list.toString().contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
385                         + "Missing arrayOfNamedHashMap in message. " + message.getParsed()));
386     }
387
388     @Test
389     void whenPassingCorrectJsonWithoutCompression_noFileData() {
390         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
391                 .name(PM_FILE_NAME) //
392                 .location(LOCATION) //
393                 .fileFormatType(FILE_FORMAT_TYPE) //
394                 .fileFormatVersion(FILE_FORMAT_VERSION) //
395                 .build();
396         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
397                 .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
398                 .changeIdentifier(CHANGE_IDENTIFIER) //
399                 .changeType(CHANGE_TYPE) //
400                 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
401                 .addAdditionalField(additionalField) //
402                 .build();
403
404         String messageString = message.toString();
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(messageString)))
413                 .expectSubscription().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 messageString = message.toString();
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         ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
446         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(messageString)))
447                 .expectSubscription().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.FTPS) //
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 messageString = message.toString();
506         String parsedString = message.getParsed();
507         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
508         JsonElement jsonElement = new JsonParser().parse(parsedString);
509         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
510                 .getJsonObjectFromAnArray(jsonElement);
511
512         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(messageString)))
513                 .expectSubscription().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 incorrectMessageString = message.toString();
523         String parsedString = message.getParsed();
524         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
525         JsonElement jsonElement = new JsonParser().parse(parsedString);
526         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
527                 .getJsonObjectFromAnArray(jsonElement);
528
529         ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
530         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(incorrectMessageString)))
531                 .expectSubscription().expectComplete().verify();
532
533         assertTrue("Error missing in log",
534                 logAppender.list.toString()
535                         .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
536                                 + "Missing data: [changeIdentifier, changeType, notificationFieldsVersion]. "
537                                 + "Change type is wrong:  Expected: FileReady Message: " + message.getParsed()));
538     }
539
540     @Test
541     void whenPassingJsonWithNullJsonElement_noFileData() {
542         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
543         JsonElement jsonElement = new JsonParser().parse("{}");
544
545         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
546                 .getJsonObjectFromAnArray(jsonElement);
547
548         ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
549         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just("[{}]"))).expectSubscription()
550                 .expectComplete().verify();
551
552         assertTrue("Error missing in log",
553                 logAppender.list.toString().contains(ERROR_LOG_TAG + "Incorrect JsonObject - missing header. "));
554     }
555
556     @Test
557     void whenPassingCorrectJsonWithIncorrectChangeType_noFileData() {
558         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
559                 .name(PM_FILE_NAME) //
560                 .location(LOCATION) //
561                 .compression(GZIP_COMPRESSION) //
562                 .fileFormatVersion(FILE_FORMAT_VERSION) //
563                 .build();
564         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
565                 .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
566                 .changeIdentifier(CHANGE_IDENTIFIER) //
567                 .changeType(INCORRECT_CHANGE_TYPE) //
568                 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
569                 .addAdditionalField(additionalField) //
570                 .build();
571
572         String messageString = message.toString();
573         String parsedString = message.getParsed();
574         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
575         JsonElement jsonElement = new JsonParser().parse(parsedString);
576         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
577                 .getJsonObjectFromAnArray(jsonElement);
578
579         ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
580         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Mono.just(messageString)))
581                 .expectSubscription().expectNextCount(0).expectComplete().verify();
582
583         assertTrue("Error missing in log",
584                 logAppender.list.toString()
585                         .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
586                                 + " Change type is wrong: " + INCORRECT_CHANGE_TYPE + " Expected: FileReady Message: "
587                                 + message.getParsed()));
588     }
589 }