9e642b7d846ce908347a70aa65916b9165947381
[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.jupiter.api.Assertions.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.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 = JsonParser.parseString(parsedString);
124         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
125             .getJsonObjectFromAnArray(jsonElement);
126
127         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.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 = JsonParser.parseString(parsedString);
177         JsonElement jsonElement1 = JsonParser.parseString(messageString);
178         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
179             .getJsonObjectFromAnArray(jsonElement);
180
181         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.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 = JsonParser.parseString(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(Flux.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 = JsonParser.parseString(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(Flux.just(jsonElement))).expectSubscription()
241             .expectNextCount(0).verifyComplete();
242
243         assertTrue(logAppender.list.toString()
244                 .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
245                     + Scheme.DFC_DOES_NOT_SUPPORT_PROTOCOL_ERROR_MSG + "http" + Scheme.SUPPORTED_PROTOCOLS_ERROR_MESSAGE
246                     + ". Location: http://location.xml"),"Error missing in log");
247         assertTrue(logAppender.list.toString().contains("sourceName=5GRAN_DU"),"Missing sourceName in log");
248     }
249
250     @Test
251     void whenPassingCorrectJsonWithTwoEventsFirstNoHeader_oneFileDatan() {
252         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
253             .name(PM_FILE_NAME) //
254             .location(LOCATION) //
255             .compression(GZIP_COMPRESSION) //
256             .fileFormatType(FILE_FORMAT_TYPE) //
257             .fileFormatVersion(FILE_FORMAT_VERSION) //
258             .build();
259         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
260             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
261             .changeIdentifier(CHANGE_IDENTIFIER) //
262             .changeType(CHANGE_TYPE) //
263             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
264             .addAdditionalField(additionalField) //
265             .build();
266
267         MessageMetaData messageMetaData = ImmutableMessageMetaData.builder() //
268             .productName(PRODUCT_NAME) //
269             .vendorName(VENDOR_NAME) //
270             .lastEpochMicrosec(LAST_EPOCH_MICROSEC) //
271             .sourceName(SOURCE_NAME) //
272             .startEpochMicrosec(START_EPOCH_MICROSEC) //
273             .timeZoneOffset(TIME_ZONE_OFFSET) //
274             .changeIdentifier(CHANGE_IDENTIFIER) //
275             .changeType(CHANGE_TYPE) //
276             .build();
277         FileData expectedFileData = ImmutableFileData.builder() //
278             .name(PM_FILE_NAME) //
279             .location(LOCATION) //
280             .scheme(Scheme.FTPES) //
281             .compression(GZIP_COMPRESSION) //
282             .fileFormatType(FILE_FORMAT_TYPE) //
283             .fileFormatVersion(FILE_FORMAT_VERSION) //
284             .messageMetaData(messageMetaData) //
285             .build();
286         List<FileData> files = new ArrayList<>();
287         files.add(expectedFileData);
288         FileReadyMessage expectedMessage = ImmutableFileReadyMessage.builder() //
289             .files(files) //
290             .build();
291
292         String parsedString = message.getParsed();
293         String messageString = "[{\"event\":{}}," + parsedString + "]";
294         JsonMessageParser jsonMessageParserUnderTest = new JsonMessageParser();
295         JsonElement jsonElement = JsonParser.parseString(messageString);
296
297         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
298             .expectNext(expectedMessage).verifyComplete();
299     }
300
301     @Test
302     void whenPassingCorrectJsonWithFaultyEventName_noFileData() {
303         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
304             .location(LOCATION) //
305             .compression(GZIP_COMPRESSION) //
306             .fileFormatType(FILE_FORMAT_TYPE) //
307             .fileFormatVersion(FILE_FORMAT_VERSION) //
308             .build();
309         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
310             .eventName("Faulty event name") //
311             .changeIdentifier(CHANGE_IDENTIFIER) //
312             .changeType(CHANGE_TYPE) //
313             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
314             .addAdditionalField(additionalField) //
315             .build();
316
317         String parsedString = message.getParsed();
318         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
319         JsonElement jsonElement = JsonParser.parseString(parsedString);
320         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
321             .getJsonObjectFromAnArray(jsonElement);
322
323         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
324         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
325             .expectComplete().verify();
326
327         assertTrue(logAppender.list.toString().contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
328                 + "Can not get PRODUCT_NAME from eventName, eventName is not in correct format: Faulty event name"),"Error missing in log");
329     }
330
331     @Test
332     void whenPassingCorrectJsonWithoutName_noFileData() {
333         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
334             .location(LOCATION) //
335             .compression(GZIP_COMPRESSION) //
336             .fileFormatType(FILE_FORMAT_TYPE) //
337             .fileFormatVersion(FILE_FORMAT_VERSION) //
338             .build();
339         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
340             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
341             .changeIdentifier(CHANGE_IDENTIFIER) //
342             .changeType(CHANGE_TYPE) //
343             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
344             .addAdditionalField(additionalField) //
345             .build();
346
347         String parsedString = message.getParsed();
348         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
349         JsonElement jsonElement = JsonParser.parseString(parsedString);
350         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
351             .getJsonObjectFromAnArray(jsonElement);
352
353         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
354         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
355             .expectNextCount(0).verifyComplete();
356
357         assertTrue(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()),"Error missing in log");
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 parsedString = message.getParsed();
373         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
374         JsonElement jsonElement = JsonParser.parseString(parsedString);
375         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
376             .getJsonObjectFromAnArray(jsonElement);
377
378         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
379         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
380             .expectNextCount(0).verifyComplete();
381
382         assertTrue(logAppender.list.toString().contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
383                 + "Missing arrayOfNamedHashMap in message. " + message.getParsed()),"Error missing in log");
384     }
385
386     @Test
387     void whenPassingCorrectJsonWithoutCompression_noFileData() {
388         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
389             .name(PM_FILE_NAME) //
390             .location(LOCATION) //
391             .fileFormatType(FILE_FORMAT_TYPE) //
392             .fileFormatVersion(FILE_FORMAT_VERSION) //
393             .build();
394         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
395             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
396             .changeIdentifier(CHANGE_IDENTIFIER) //
397             .changeType(CHANGE_TYPE) //
398             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
399             .addAdditionalField(additionalField) //
400             .build();
401
402         String parsedString = message.getParsed();
403         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
404         JsonElement jsonElement = JsonParser.parseString(parsedString);
405         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
406             .getJsonObjectFromAnArray(jsonElement);
407
408         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
409         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
410             .expectNextCount(0).verifyComplete();
411
412         assertTrue(logAppender.list.toString()
413                 .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
414                     + "File information wrong. Missing data: [compression] Data: "
415                     + message.getAdditionalFields().get(0).toString()),"Error missing in log");
416     }
417
418     @Test
419     void whenPassingCorrectJsonWithoutFileFormatType_noFileData() {
420         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
421             .name(PM_FILE_NAME) //
422             .location(LOCATION) //
423             .compression(GZIP_COMPRESSION) //
424             .fileFormatVersion(FILE_FORMAT_VERSION) //
425             .build();
426         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
427             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
428             .changeIdentifier(CHANGE_IDENTIFIER) //
429             .changeType(CHANGE_TYPE) //
430             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
431             .addAdditionalField(additionalField) //
432             .build();
433
434         String parsedString = message.getParsed();
435         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
436         JsonElement jsonElement = JsonParser.parseString(parsedString);
437         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
438             .getJsonObjectFromAnArray(jsonElement);
439
440         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
441         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
442             .expectNextCount(0).verifyComplete();
443
444         assertTrue(logAppender.list.toString()
445                 .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
446                     + "File information wrong. Missing data: [fileFormatType] Data: "
447                     + message.getAdditionalFields().get(0).toString()),"Error missing in log");
448     }
449
450     @Test
451     void whenPassingOneCorrectJsonWithoutFileFormatVersionAndOneCorrect_oneFileData() {
452         AdditionalField additionalFaultyField = new JsonMessage.AdditionalFieldBuilder() //
453             .name(PM_FILE_NAME) //
454             .location(LOCATION) //
455             .compression(GZIP_COMPRESSION) //
456             .fileFormatType(FILE_FORMAT_TYPE) //
457             .build();
458         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
459             .name(PM_FILE_NAME) //
460             .location(LOCATION) //
461             .compression(GZIP_COMPRESSION) //
462             .fileFormatType(FILE_FORMAT_TYPE) //
463             .fileFormatVersion(FILE_FORMAT_VERSION) //
464             .build();
465         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
466             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
467             .changeIdentifier(CHANGE_IDENTIFIER) //
468             .changeType(CHANGE_TYPE) //
469             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
470             .addAdditionalField(additionalFaultyField) //
471             .addAdditionalField(additionalField) //
472             .build();
473
474         MessageMetaData messageMetaData = ImmutableMessageMetaData.builder() //
475             .productName(PRODUCT_NAME) //
476             .vendorName(VENDOR_NAME) //
477             .lastEpochMicrosec(LAST_EPOCH_MICROSEC) //
478             .sourceName(SOURCE_NAME) //
479             .startEpochMicrosec(START_EPOCH_MICROSEC) //
480             .timeZoneOffset(TIME_ZONE_OFFSET) //
481             .changeIdentifier(CHANGE_IDENTIFIER) //
482             .changeType(CHANGE_TYPE) //
483             .build();
484         FileData expectedFileData = ImmutableFileData.builder() //
485             .name(PM_FILE_NAME) //
486             .location(LOCATION) //
487             .scheme(Scheme.FTPES) //
488             .compression(GZIP_COMPRESSION) //
489             .fileFormatType(FILE_FORMAT_TYPE) //
490             .fileFormatVersion(FILE_FORMAT_VERSION) //
491             .messageMetaData(messageMetaData) //
492             .build();
493         List<FileData> files = new ArrayList<>();
494         files.add(expectedFileData);
495         FileReadyMessage expectedMessage = ImmutableFileReadyMessage.builder() //
496             .files(files) //
497             .build();
498
499         String parsedString = message.getParsed();
500         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
501         JsonElement jsonElement = JsonParser.parseString(parsedString);
502         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
503             .getJsonObjectFromAnArray(jsonElement);
504
505         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
506             .expectNext(expectedMessage).verifyComplete();
507     }
508
509     @Test
510     void whenPassingJsonWithoutMandatoryHeaderInformation_noFileData() {
511         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
512             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
513             .build();
514
515         String parsedString = message.getParsed();
516         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
517         JsonElement jsonElement = JsonParser.parseString(parsedString);
518         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
519             .getJsonObjectFromAnArray(jsonElement);
520
521         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
522         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
523             .expectComplete().verify();
524
525         assertTrue(logAppender.list.toString()
526                 .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING
527                     + "Missing data: [changeIdentifier, changeType, notificationFieldsVersion]. "
528                     + "Change type is wrong:  Expected: FileReady Message: " + message.getParsed()),"Error missing in log");
529     }
530
531     @Test
532     void whenPassingJsonWithNullJsonElement_noFileData() {
533         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
534         JsonElement jsonElement = JsonParser.parseString("{}");
535
536         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
537             .getJsonObjectFromAnArray(jsonElement);
538
539         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
540         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
541             .expectComplete().verify();
542
543         assertTrue(logAppender.list.toString().contains(ERROR_LOG_TAG + "Incorrect JsonObject - missing header. ")
544             ,"Error missing in log");
545     }
546
547     @Test
548     void whenPassingCorrectJsonWithIncorrectChangeType_noFileData() {
549         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
550             .name(PM_FILE_NAME) //
551             .location(LOCATION) //
552             .compression(GZIP_COMPRESSION) //
553             .fileFormatVersion(FILE_FORMAT_VERSION) //
554             .build();
555         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
556             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
557             .changeIdentifier(CHANGE_IDENTIFIER) //
558             .changeType(INCORRECT_CHANGE_TYPE) //
559             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
560             .addAdditionalField(additionalField) //
561             .build();
562
563         String parsedString = message.getParsed();
564         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
565         JsonElement jsonElement = JsonParser.parseString(parsedString);
566         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
567             .getJsonObjectFromAnArray(jsonElement);
568
569         final ListAppender<ILoggingEvent> logAppender = LoggingUtils.getLogListAppender(JsonMessageParser.class);
570         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
571             .expectNextCount(0).expectComplete().verify();
572
573         assertTrue(logAppender.list.toString()
574                 .contains(ERROR_LOG_TAG + JsonMessageParser.ERROR_MSG_VES_EVENT_PARSING + " Change type is wrong: "
575                     + INCORRECT_CHANGE_TYPE + " Expected: FileReady Message: " + message.getParsed()),"Error missing in log");
576     }
577
578     @Test
579     void whenPassingCorrectJsonWithIncorrectChangeIdentifier_noFileData() {
580         AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder() //
581             .name(PM_FILE_NAME) //
582             .location(LOCATION) //
583             .compression(GZIP_COMPRESSION) //
584             .fileFormatVersion(FILE_FORMAT_VERSION) //
585             .build();
586         JsonMessage message = new JsonMessage.JsonMessageBuilder() //
587             .eventName(NR_RADIO_ERICSSON_EVENT_NAME) //
588             .changeIdentifier(INCORRECT_CHANGE_IDENTIFIER) //
589             .changeType(CHANGE_TYPE) //
590             .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION) //
591             .addAdditionalField(additionalField) //
592             .build();
593
594         String parsedString = message.getParsed();
595         JsonMessageParser jsonMessageParserUnderTest = spy(new JsonMessageParser());
596         JsonElement jsonElement = JsonParser.parseString(parsedString);
597         Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(jsonMessageParserUnderTest)
598             .getJsonObjectFromAnArray(jsonElement);
599
600         StepVerifier.create(jsonMessageParserUnderTest.getMessagesFromJson(Flux.just(jsonElement))).expectSubscription()
601             .expectComplete().verify();
602     }
603 }