2 * ============LICENSE_START======================================================================
3 * Copyright (C) 2018 NOKIA Intellectual Property, 2018 Nordix Foundation. All rights reserved.
4 * ===============================================================================================
5 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
6 * in compliance with the License. You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software distributed under the License
11 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12 * or implied. See the License for the specific language governing permissions and limitations under
14 * ============LICENSE_END========================================================================
17 package org.onap.dcaegen2.collectors.datafile.service;
19 import static org.mockito.Mockito.spy;
21 import com.google.gson.JsonElement;
22 import com.google.gson.JsonParser;
24 import java.util.Optional;
26 import org.junit.jupiter.api.Test;
27 import org.mockito.Mockito;
28 import org.onap.dcaegen2.collectors.datafile.exceptions.DmaapNotFoundException;
29 import org.onap.dcaegen2.collectors.datafile.model.FileData;
30 import org.onap.dcaegen2.collectors.datafile.model.FileMetaData;
31 import org.onap.dcaegen2.collectors.datafile.model.ImmutableFileData;
32 import org.onap.dcaegen2.collectors.datafile.model.ImmutableFileMetaData;
33 import org.onap.dcaegen2.collectors.datafile.utils.JsonMessage;
34 import org.onap.dcaegen2.collectors.datafile.utils.JsonMessage.AdditionalField;
36 import reactor.core.publisher.Mono;
37 import reactor.test.StepVerifier;
40 * @author <a href="mailto:przemyslaw.wasala@nokia.com">Przemysław Wąsala</a> on 5/8/18
41 * @author <a href="mailto:henrik.b.andersson@est.tech">Henrik Andersson</a>
43 class DmaapConsumerJsonParserTest {
44 private static final String NR_RADIO_ERICSSON_EVENT_NAME = "Noti_NrRadio-Ericsson_FileReady";
45 private static final String PRODUCT_NAME = "NrRadio";
46 private static final String VENDOR_NAME = "Ericsson";
47 private static final String LAST_EPOCH_MICROSEC = "1519837825682";
48 private static final String SOURCE_NAME = "5GRAN_DU";
49 private static final String START_EPOCH_MICROSEC = "1519837825682";
50 private static final String TIME_ZONE_OFFSET = "UTC+05:00";
51 private static final String PM_FILE_NAME = "A20161224.1030-1045.bin.gz";
52 private static final String LOCATION = "ftpes://192.168.0.101:22/ftp/rop/" + PM_FILE_NAME;
53 private static final String GZIP_COMPRESSION = "gzip";
54 private static final String FILE_FORMAT_TYPE = "org.3GPP.32.435#measCollec";
55 private static final String FILE_FORMAT_VERSION = "V10";
56 private static final String CHANGE_IDENTIFIER = "PM_MEAS_FILES";
57 private static final String INCORRECT_CHANGE_IDENTIFIER = "INCORRECT_PM_MEAS_FILES";
58 private static final String CHANGE_TYPE = "FileReady";
59 private static final String INCORRECT_CHANGE_TYPE = "IncorrectFileReady";
60 private static final String NOTIFICATION_FIELDS_VERSION = "1.0";
63 void whenPassingCorrectJson_oneFileData() throws DmaapNotFoundException {
65 AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder()
68 .compression(GZIP_COMPRESSION)
69 .fileFormatType(FILE_FORMAT_TYPE)
70 .fileFormatVersion(FILE_FORMAT_VERSION)
72 JsonMessage message = new JsonMessage.JsonMessageBuilder()
73 .eventName(NR_RADIO_ERICSSON_EVENT_NAME)
74 .changeIdentifier(CHANGE_IDENTIFIER)
75 .changeType(CHANGE_TYPE)
76 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION)
77 .addAdditionalField(additionalField)
80 FileMetaData fileMetaData = ImmutableFileMetaData.builder()
81 .productName(PRODUCT_NAME)
82 .vendorName(VENDOR_NAME)
83 .lastEpochMicrosec(LAST_EPOCH_MICROSEC)
84 .sourceName(SOURCE_NAME)
85 .startEpochMicrosec(START_EPOCH_MICROSEC)
86 .timeZoneOffset(TIME_ZONE_OFFSET)
87 .changeIdentifier(CHANGE_IDENTIFIER)
88 .changeType(CHANGE_TYPE)
90 FileData expectedFileData = ImmutableFileData.builder()
91 .fileMetaData(fileMetaData)
94 .compression(GZIP_COMPRESSION)
95 .fileFormatType(FILE_FORMAT_TYPE)
96 .fileFormatVersion(FILE_FORMAT_VERSION)
99 String messageString = message.toString();
100 String parsedString = message.getParsed();
101 DmaapConsumerJsonParser dmaapConsumerJsonParser = spy(new DmaapConsumerJsonParser());
102 JsonElement jsonElement = new JsonParser().parse(parsedString);
103 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(dmaapConsumerJsonParser)
104 .getJsonObjectFromAnArray(jsonElement);
106 StepVerifier.create(dmaapConsumerJsonParser.getJsonObject(Mono.just(messageString))).expectSubscription()
107 .expectNext(expectedFileData).verifyComplete();
111 void whenPassingCorrectJsonWithTwoEvents_twoFileData() throws DmaapNotFoundException {
113 AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder()
116 .compression(GZIP_COMPRESSION)
117 .fileFormatType(FILE_FORMAT_TYPE)
118 .fileFormatVersion(FILE_FORMAT_VERSION)
120 JsonMessage message = new JsonMessage.JsonMessageBuilder()
121 .eventName(NR_RADIO_ERICSSON_EVENT_NAME)
122 .changeIdentifier(CHANGE_IDENTIFIER)
123 .changeType(CHANGE_TYPE)
124 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION)
125 .addAdditionalField(additionalField)
128 FileMetaData fileMetaData = ImmutableFileMetaData.builder()
129 .productName(PRODUCT_NAME)
130 .vendorName(VENDOR_NAME)
131 .lastEpochMicrosec(LAST_EPOCH_MICROSEC)
132 .sourceName(SOURCE_NAME)
133 .startEpochMicrosec(START_EPOCH_MICROSEC)
134 .timeZoneOffset(TIME_ZONE_OFFSET)
135 .changeIdentifier(CHANGE_IDENTIFIER)
136 .changeType(CHANGE_TYPE)
138 FileData expectedFileData = ImmutableFileData.builder()
139 .fileMetaData(fileMetaData)
142 .compression(GZIP_COMPRESSION)
143 .fileFormatType(FILE_FORMAT_TYPE)
144 .fileFormatVersion(FILE_FORMAT_VERSION)
147 String parsedString = message.getParsed();
148 String messageString = "[" + parsedString + "," + parsedString + "]";
149 DmaapConsumerJsonParser dmaapConsumerJsonParser = new DmaapConsumerJsonParser();
151 StepVerifier.create(dmaapConsumerJsonParser.getJsonObject(Mono.just(messageString))).expectSubscription()
152 .expectNext(expectedFileData).expectNext(expectedFileData).verifyComplete();
156 void whenPassingCorrectJsonWithTwoEventsFirstNoHeader_oneFileDatan()
157 throws DmaapNotFoundException {
159 AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder()
162 .compression(GZIP_COMPRESSION)
163 .fileFormatType(FILE_FORMAT_TYPE)
164 .fileFormatVersion(FILE_FORMAT_VERSION)
166 JsonMessage message = new JsonMessage.JsonMessageBuilder()
167 .eventName(NR_RADIO_ERICSSON_EVENT_NAME)
168 .changeIdentifier(CHANGE_IDENTIFIER)
169 .changeType(CHANGE_TYPE)
170 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION)
171 .addAdditionalField(additionalField)
174 FileMetaData fileMetaData = ImmutableFileMetaData.builder()
175 .productName(PRODUCT_NAME)
176 .vendorName(VENDOR_NAME)
177 .lastEpochMicrosec(LAST_EPOCH_MICROSEC)
178 .sourceName(SOURCE_NAME)
179 .startEpochMicrosec(START_EPOCH_MICROSEC)
180 .timeZoneOffset(TIME_ZONE_OFFSET)
181 .changeIdentifier(CHANGE_IDENTIFIER)
182 .changeType(CHANGE_TYPE)
184 FileData expectedFileData = ImmutableFileData.builder()
185 .fileMetaData(fileMetaData)
188 .compression(GZIP_COMPRESSION)
189 .fileFormatType(FILE_FORMAT_TYPE)
190 .fileFormatVersion(FILE_FORMAT_VERSION)
193 String parsedString = message.getParsed();
194 String messageString = "[{\"event\":{}}," + parsedString + "]";
195 DmaapConsumerJsonParser dmaapConsumerJsonParser = new DmaapConsumerJsonParser();
197 StepVerifier.create(dmaapConsumerJsonParser.getJsonObject(Mono.just(messageString))).expectSubscription()
198 .expectNext(expectedFileData).verifyComplete();
202 void whenPassingCorrectJsonWithFaultyEventName_noFileData() {
204 AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder()
206 .compression(GZIP_COMPRESSION)
207 .fileFormatType(FILE_FORMAT_TYPE)
208 .fileFormatVersion(FILE_FORMAT_VERSION)
210 JsonMessage message = new JsonMessage.JsonMessageBuilder()
211 .eventName("Faulty event name")
212 .changeIdentifier(CHANGE_IDENTIFIER)
213 .changeType(CHANGE_TYPE)
214 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION)
215 .addAdditionalField(additionalField)
218 String messageString = message.toString();
219 String parsedString = message.getParsed();
220 DmaapConsumerJsonParser dmaapConsumerJsonParser = spy(new DmaapConsumerJsonParser());
221 JsonElement jsonElement = new JsonParser().parse(parsedString);
222 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(dmaapConsumerJsonParser)
223 .getJsonObjectFromAnArray(jsonElement);
225 StepVerifier.create(dmaapConsumerJsonParser.getJsonObject(Mono.just(messageString))).expectSubscription()
226 .expectComplete().verify();
230 void whenPassingCorrectJsonWithoutName_noFileData() {
232 AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder()
234 .compression(GZIP_COMPRESSION)
235 .fileFormatType(FILE_FORMAT_TYPE)
236 .fileFormatVersion(FILE_FORMAT_VERSION)
238 JsonMessage message = new JsonMessage.JsonMessageBuilder()
239 .eventName(NR_RADIO_ERICSSON_EVENT_NAME)
240 .changeIdentifier(CHANGE_IDENTIFIER)
241 .changeType(CHANGE_TYPE)
242 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION)
243 .addAdditionalField(additionalField)
246 String messageString = message.toString();
247 String parsedString = message.getParsed();
248 DmaapConsumerJsonParser dmaapConsumerJsonParser = spy(new DmaapConsumerJsonParser());
249 JsonElement jsonElement = new JsonParser().parse(parsedString);
250 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(dmaapConsumerJsonParser)
251 .getJsonObjectFromAnArray(jsonElement);
253 StepVerifier.create(dmaapConsumerJsonParser.getJsonObject(Mono.just(messageString))).expectSubscription()
254 .expectNextCount(0).verifyComplete();
258 void whenPassingCorrectJsonWithoutAdditionalFields_noFileData() {
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)
267 String messageString = message.toString();
268 String parsedString = message.getParsed();
269 DmaapConsumerJsonParser dmaapConsumerJsonParser = spy(new DmaapConsumerJsonParser());
270 JsonElement jsonElement = new JsonParser().parse(parsedString);
271 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(dmaapConsumerJsonParser)
272 .getJsonObjectFromAnArray(jsonElement);
274 StepVerifier.create(dmaapConsumerJsonParser.getJsonObject(Mono.just(messageString))).expectSubscription()
275 .expectNextCount(0).verifyComplete();
279 void whenPassingCorrectJsonWithoutLocation_noFileData() {
281 AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder()
283 .compression(GZIP_COMPRESSION)
284 .fileFormatType(FILE_FORMAT_TYPE)
285 .fileFormatVersion(FILE_FORMAT_VERSION)
287 JsonMessage message = new JsonMessage.JsonMessageBuilder()
288 .eventName(NR_RADIO_ERICSSON_EVENT_NAME)
289 .changeIdentifier(CHANGE_IDENTIFIER)
290 .changeType(CHANGE_TYPE)
291 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION)
292 .addAdditionalField(additionalField)
295 String messageString = message.toString();
296 String parsedString = message.getParsed();
297 DmaapConsumerJsonParser dmaapConsumerJsonParser = spy(new DmaapConsumerJsonParser());
298 JsonElement jsonElement = new JsonParser().parse(parsedString);
299 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(dmaapConsumerJsonParser)
300 .getJsonObjectFromAnArray(jsonElement);
302 StepVerifier.create(dmaapConsumerJsonParser.getJsonObject(Mono.just(messageString))).expectSubscription()
303 .expectNextCount(0).verifyComplete();
307 void whenPassingCorrectJsonWithoutCompression_noFileData() {
309 AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder()
312 .fileFormatType(FILE_FORMAT_TYPE)
313 .fileFormatVersion(FILE_FORMAT_VERSION)
315 JsonMessage message = new JsonMessage.JsonMessageBuilder()
316 .eventName(NR_RADIO_ERICSSON_EVENT_NAME)
317 .changeIdentifier(CHANGE_IDENTIFIER)
318 .changeType(CHANGE_TYPE)
319 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION)
320 .addAdditionalField(additionalField)
323 String messageString = message.toString();
324 String parsedString = message.getParsed();
325 DmaapConsumerJsonParser dmaapConsumerJsonParser = spy(new DmaapConsumerJsonParser());
326 JsonElement jsonElement = new JsonParser().parse(parsedString);
327 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(dmaapConsumerJsonParser)
328 .getJsonObjectFromAnArray(jsonElement);
330 StepVerifier.create(dmaapConsumerJsonParser.getJsonObject(Mono.just(messageString))).expectSubscription()
331 .expectNextCount(0).verifyComplete();
335 void whenPassingCorrectJsonWithoutFileFormatType_noFileData() {
337 AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder()
340 .compression(GZIP_COMPRESSION)
341 .fileFormatVersion(FILE_FORMAT_VERSION)
343 JsonMessage message = new JsonMessage.JsonMessageBuilder()
344 .eventName(NR_RADIO_ERICSSON_EVENT_NAME)
345 .changeIdentifier(CHANGE_IDENTIFIER)
346 .changeType(CHANGE_TYPE)
347 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION)
348 .addAdditionalField(additionalField)
351 String messageString = message.toString();
352 String parsedString = message.getParsed();
353 DmaapConsumerJsonParser dmaapConsumerJsonParser = spy(new DmaapConsumerJsonParser());
354 JsonElement jsonElement = new JsonParser().parse(parsedString);
355 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(dmaapConsumerJsonParser)
356 .getJsonObjectFromAnArray(jsonElement);
358 StepVerifier.create(dmaapConsumerJsonParser.getJsonObject(Mono.just(messageString))).expectSubscription()
359 .expectNextCount(0).verifyComplete();
363 void whenPassingOneCorrectJsonWithoutFileFormatVersionAndOneCorrect_oneFileData() {
365 AdditionalField additionalFaultyField = new JsonMessage.AdditionalFieldBuilder()
368 .compression(GZIP_COMPRESSION)
369 .fileFormatType(FILE_FORMAT_TYPE)
371 AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder()
374 .compression(GZIP_COMPRESSION)
375 .fileFormatType(FILE_FORMAT_TYPE)
376 .fileFormatVersion(FILE_FORMAT_VERSION)
378 JsonMessage message = new JsonMessage.JsonMessageBuilder()
379 .eventName(NR_RADIO_ERICSSON_EVENT_NAME)
380 .changeIdentifier(CHANGE_IDENTIFIER)
381 .changeType(CHANGE_TYPE)
382 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION)
383 .addAdditionalField(additionalFaultyField)
384 .addAdditionalField(additionalField)
387 FileMetaData fileMetaData = ImmutableFileMetaData.builder()
388 .productName(PRODUCT_NAME)
389 .vendorName(VENDOR_NAME)
390 .lastEpochMicrosec(LAST_EPOCH_MICROSEC)
391 .sourceName(SOURCE_NAME)
392 .startEpochMicrosec(START_EPOCH_MICROSEC)
393 .timeZoneOffset(TIME_ZONE_OFFSET)
394 .changeIdentifier(CHANGE_IDENTIFIER)
395 .changeType(CHANGE_TYPE)
397 FileData expectedFileData = ImmutableFileData.builder()
398 .fileMetaData(fileMetaData)
401 .compression(GZIP_COMPRESSION)
402 .fileFormatType(FILE_FORMAT_TYPE)
403 .fileFormatVersion(FILE_FORMAT_VERSION)
406 String messageString = message.toString();
407 String parsedString = message.getParsed();
408 DmaapConsumerJsonParser dmaapConsumerJsonParser = spy(new DmaapConsumerJsonParser());
409 JsonElement jsonElement = new JsonParser().parse(parsedString);
410 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(dmaapConsumerJsonParser)
411 .getJsonObjectFromAnArray(jsonElement);
413 StepVerifier.create(dmaapConsumerJsonParser.getJsonObject(Mono.just(messageString))).expectSubscription()
414 .expectNext(expectedFileData).verifyComplete();
418 void whenPassingJsonWithoutMandatoryHeaderInformation_noFileData() {
420 JsonMessage message = new JsonMessage.JsonMessageBuilder()
421 .eventName(NR_RADIO_ERICSSON_EVENT_NAME)
422 .changeIdentifier("PM_MEAS_FILES_INVALID")
423 .changeType("FileReady_INVALID")
424 .notificationFieldsVersion("1.0_INVALID")
427 String incorrectMessageString = message.toString();
428 String parsedString = message.getParsed();
429 DmaapConsumerJsonParser dmaapConsumerJsonParser = spy(new DmaapConsumerJsonParser());
430 JsonElement jsonElement = new JsonParser().parse(parsedString);
431 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(dmaapConsumerJsonParser)
432 .getJsonObjectFromAnArray(jsonElement);
434 StepVerifier.create(dmaapConsumerJsonParser.getJsonObject(Mono.just(incorrectMessageString)))
435 .expectSubscription().expectComplete().verify();
439 void whenPassingJsonWithNullJsonElement_noFileData() {
440 DmaapConsumerJsonParser dmaapConsumerJsonParser = spy(new DmaapConsumerJsonParser());
441 JsonElement jsonElement = new JsonParser().parse("{}");
443 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(dmaapConsumerJsonParser)
444 .getJsonObjectFromAnArray(jsonElement);
446 StepVerifier.create(dmaapConsumerJsonParser.getJsonObject(Mono.just("[{}]"))).expectSubscription()
447 .expectComplete().verify();
451 void whenPassingCorrectJsonWithIncorrectChangeType_noFileData() {
453 AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder()
456 .compression(GZIP_COMPRESSION)
457 .fileFormatVersion(FILE_FORMAT_VERSION)
459 JsonMessage message = new JsonMessage.JsonMessageBuilder()
460 .eventName(NR_RADIO_ERICSSON_EVENT_NAME)
461 .changeIdentifier(CHANGE_IDENTIFIER)
462 .changeType(INCORRECT_CHANGE_TYPE)
463 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION)
464 .addAdditionalField(additionalField)
467 String messageString = message.toString();
468 String parsedString = message.getParsed();
469 DmaapConsumerJsonParser dmaapConsumerJsonParser = spy(new DmaapConsumerJsonParser());
470 JsonElement jsonElement = new JsonParser().parse(parsedString);
471 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(dmaapConsumerJsonParser)
472 .getJsonObjectFromAnArray(jsonElement);
474 StepVerifier.create(dmaapConsumerJsonParser.getJsonObject(Mono.just(messageString))).expectSubscription()
475 .expectNextCount(0).expectComplete().verify();
479 void whenPassingCorrectJsonWithIncorrectChangeIdentifier_noFileData() {
481 AdditionalField additionalField = new JsonMessage.AdditionalFieldBuilder()
484 .compression(GZIP_COMPRESSION)
485 .fileFormatVersion(FILE_FORMAT_VERSION)
487 JsonMessage message = new JsonMessage.JsonMessageBuilder()
488 .eventName(NR_RADIO_ERICSSON_EVENT_NAME)
489 .changeIdentifier(INCORRECT_CHANGE_IDENTIFIER)
490 .changeType(CHANGE_TYPE)
491 .notificationFieldsVersion(NOTIFICATION_FIELDS_VERSION)
492 .addAdditionalField(additionalField)
495 String messageString = message.toString();
496 String parsedString = message.getParsed();
497 DmaapConsumerJsonParser dmaapConsumerJsonParser = spy(new DmaapConsumerJsonParser());
498 JsonElement jsonElement = new JsonParser().parse(parsedString);
499 Mockito.doReturn(Optional.of(jsonElement.getAsJsonObject())).when(dmaapConsumerJsonParser)
500 .getJsonObjectFromAnArray(jsonElement);
502 StepVerifier.create(dmaapConsumerJsonParser.getJsonObject(Mono.just(messageString))).expectSubscription()
503 .expectComplete().verify();