From: PatrikBuhr Date: Mon, 24 Oct 2022 11:40:16 +0000 (+0200) Subject: Added test, bugfix. X-Git-Tag: 1.2.0~6 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=2f86fac0e0a21cb5536f1d6cf42314a6bda0f965;p=nonrtric%2Fplt%2Fdmaapadapter.git Added test, bugfix. Bugfix, PM filtering was broken. Signed-off-by: PatrikBuhr Issue-ID: NONRTRIC-773 Change-Id: I560e137a0e036d9e03421129f17dcc453573977d --- diff --git a/src/main/java/org/oran/dmaapadapter/filter/PmReport.java b/src/main/java/org/oran/dmaapadapter/filter/PmReport.java index 45a59ed..ca2c82b 100644 --- a/src/main/java/org/oran/dmaapadapter/filter/PmReport.java +++ b/src/main/java/org/oran/dmaapadapter/filter/PmReport.java @@ -25,6 +25,8 @@ import com.google.gson.annotations.Expose; import java.util.ArrayList; import java.util.Collection; +import lombok.Builder; + public class PmReport { @Expose @@ -129,6 +131,7 @@ public class PmReport { } } + @Builder(toBuilder = true) public static class MeasDataCollection { @Expose int granularityPeriod; @@ -143,9 +146,10 @@ public class PmReport { String measuredEntitySoftwareVersion; @Expose - Collection measInfoList = new ArrayList<>(); + Collection measInfoList; } + @Builder(toBuilder = true) public static class Perf3gppFields { @Expose String perf3gppFieldsVersion; diff --git a/src/main/java/org/oran/dmaapadapter/filter/PmReportFilter.java b/src/main/java/org/oran/dmaapadapter/filter/PmReportFilter.java index 8f4976f..78fa6bb 100644 --- a/src/main/java/org/oran/dmaapadapter/filter/PmReportFilter.java +++ b/src/main/java/org/oran/dmaapadapter/filter/PmReportFilter.java @@ -87,16 +87,18 @@ public class PmReportFilter implements Filter { @Override public FilteredData filter(DataFromTopic data) { try { - PmReport report = createPmReport(data); + PmReport report = getPmReport(data); + PmReport reportFiltered = new PmReport(); + if (report.event.perf3gppFields == null) { logger.warn("Received PM report with no perf3gppFields, ignored. {}", data); return FilteredData.empty(); } - if (!filter(report, this.filterData)) { + if (!filter(report, reportFiltered, this.filterData)) { return FilteredData.empty(); } - return new FilteredData(data.key, gson.toJson(report).getBytes()); + return new FilteredData(data.key, gson.toJson(reportFiltered).getBytes()); } catch (Exception e) { logger.warn("Could not parse PM data. {}, reason: {}", data, e.getMessage()); return FilteredData.empty(); @@ -104,7 +106,7 @@ public class PmReportFilter implements Filter { } @SuppressWarnings("java:S2445") // "data" is a method parameter, and should not be used for synchronization. - private PmReport createPmReport(DataFromTopic data) { + private PmReport getPmReport(DataFromTopic data) { synchronized (data) { if (data.getCachedPmReport() == null) { data.setCachedPmReport(gsonParse.fromJson(data.valueAsString(), PmReport.class)); @@ -120,13 +122,18 @@ public class PmReportFilter implements Filter { * @param filterData * @return true if there is anything left in the report */ - private boolean filter(PmReport report, FilterData filterData) { + private boolean filter(PmReport report, PmReport reportFiltered, FilterData filterData) { if (!matchSourceNames(report, filterData.sourceNames)) { return false; } - Collection filtered = createMeasObjInstIds(report, filterData); - report.event.perf3gppFields.measDataCollection.measInfoList = filtered; - return !filtered.isEmpty(); + + Collection filteredMeasObjs = createMeasObjInstIds(report, filterData); + reportFiltered.event.commonEventHeader = report.event.commonEventHeader; + reportFiltered.event.perf3gppFields = report.event.perf3gppFields.toBuilder().build(); + reportFiltered.event.perf3gppFields.measDataCollection = + report.event.perf3gppFields.measDataCollection.toBuilder().build(); + reportFiltered.event.perf3gppFields.measDataCollection.measInfoList = filteredMeasObjs; + return !filteredMeasObjs.isEmpty(); } private boolean isContainedInAny(String aString, Collection collection) { diff --git a/src/test/java/org/oran/dmaapadapter/ApplicationTest.java b/src/test/java/org/oran/dmaapadapter/ApplicationTest.java index 139c1bb..6b48f79 100644 --- a/src/test/java/org/oran/dmaapadapter/ApplicationTest.java +++ b/src/test/java/org/oran/dmaapadapter/ApplicationTest.java @@ -33,6 +33,7 @@ import com.google.protobuf.util.JsonFormat; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; +import java.lang.invoke.MethodHandles; import java.lang.reflect.InvocationTargetException; import java.nio.charset.Charset; import java.nio.file.Files; @@ -124,7 +125,7 @@ class ApplicationTest { @LocalServerPort int localServerHttpPort; - private final Logger logger = LoggerFactory.getLogger(ApplicationTest.class); + private final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); public static class ProtoJsonUtil { diff --git a/src/test/java/org/oran/dmaapadapter/IntegrationWithKafka.java b/src/test/java/org/oran/dmaapadapter/IntegrationWithKafka.java index ff8297a..deff7ee 100644 --- a/src/test/java/org/oran/dmaapadapter/IntegrationWithKafka.java +++ b/src/test/java/org/oran/dmaapadapter/IntegrationWithKafka.java @@ -26,6 +26,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import com.google.gson.JsonParser; +import java.lang.invoke.MethodHandles; import java.nio.file.Path; import java.time.Duration; import java.time.Instant; @@ -164,7 +165,7 @@ class IntegrationWithKafka { private static class KafkaReceiver { public final String OUTPUT_TOPIC; private TopicListener.DataFromTopic receivedKafkaOutput; - private final Logger logger = LoggerFactory.getLogger(IntegrationWithKafka.class); + private final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); int count = 0; diff --git a/src/test/java/org/oran/dmaapadapter/filter/PmReportFilterTest.java b/src/test/java/org/oran/dmaapadapter/filter/PmReportFilterTest.java index 3e465da..20c03ca 100644 --- a/src/test/java/org/oran/dmaapadapter/filter/PmReportFilterTest.java +++ b/src/test/java/org/oran/dmaapadapter/filter/PmReportFilterTest.java @@ -22,15 +22,23 @@ package org.oran.dmaapadapter.filter; import static org.assertj.core.api.Assertions.assertThat; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import java.lang.invoke.MethodHandles; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; +import java.time.Instant; import org.junit.jupiter.api.Test; import org.oran.dmaapadapter.filter.Filter.FilteredData; import org.oran.dmaapadapter.tasks.TopicListener; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; class PmReportFilterTest { + private final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); private String filterReport(PmReportFilter filter) throws Exception { TopicListener.DataFromTopic data = new TopicListener.DataFromTopic(null, loadReport().getBytes()); @@ -75,17 +83,27 @@ class PmReportFilterTest { @Test void testMeasObjClass() throws Exception { - PmReportFilter.FilterData filterData = new PmReportFilter.FilterData(); - filterData.measObjClass.add("junk"); - PmReportFilter filter = new PmReportFilter(filterData); - String filtered = filterReport(filter); - assertThat(filtered).isEmpty(); - - filterData = new PmReportFilter.FilterData(); - filterData.measObjClass.add("ENodeBFunction"); - filter = new PmReportFilter(filterData); - filtered = filterReport(filter); - assertThat(filtered).contains("ENodeBFunction").doesNotContain("UtranCell"); + { + PmReportFilter.FilterData filterData = new PmReportFilter.FilterData(); + filterData.measObjClass.add("junk"); + PmReportFilter filter = new PmReportFilter(filterData); + String filtered = filterReport(filter); + assertThat(filtered).isEmpty(); + } + + { + TopicListener.DataFromTopic data = new TopicListener.DataFromTopic(null, loadReport().getBytes()); + + PmReportFilter.FilterData utranCellFilter = new PmReportFilter.FilterData(); + utranCellFilter.measObjClass.add("UtranCell"); + FilteredData filtered = new PmReportFilter(utranCellFilter).filter(data); + assertThat(filtered.getValueAString()).contains("UtranCell").doesNotContain("ENodeBFunction"); + + PmReportFilter.FilterData eNodeBFilter = new PmReportFilter.FilterData(); + eNodeBFilter.measObjClass.add("ENodeBFunction"); + filtered = new PmReportFilter(eNodeBFilter).filter(data); + assertThat(filtered.getValueAString()).contains("ENodeBFunction").doesNotContain("UtranCell"); + } } @Test @@ -103,6 +121,42 @@ class PmReportFilterTest { assertThat(filtered).contains("O-DU-1122"); } + void testCharacteristics() throws Exception { + Gson gson = new GsonBuilder() // + .disableHtmlEscaping() // + .create(); // + + String path = "./src/test/resources/A20000626.2315+0200-2330+0200_HTTPS-6-73.json"; + String report = Files.readString(Path.of(path), Charset.defaultCharset()); + + TopicListener.DataFromTopic data = new TopicListener.DataFromTopic(null, report.getBytes()); + + Instant startTime = Instant.now(); + + int CNT = 100000; + for (int i = 0; i < CNT; ++i) { + gson.fromJson(data.valueAsString(), PmReport.class); + } + printDuration("Parse", startTime, CNT); + + startTime = Instant.now(); + + PmReportFilter.FilterData filterData = new PmReportFilter.FilterData(); + filterData.measTypes.add("pmCounterNumber0"); + PmReportFilter filter = new PmReportFilter(filterData); + for (int i = 0; i < CNT; ++i) { + FilteredData filtered = filter.filter(data); + } + + printDuration("Filter", startTime, CNT); + } + + void printDuration(String str, Instant startTime, int noOfIterations) { + final long durationSeconds = Instant.now().getEpochSecond() - startTime.getEpochSecond(); + logger.info("*** Duration " + str + " :" + durationSeconds + ", objects/second: " + + noOfIterations / durationSeconds); + } + @Test void testMeasuredEntityDns() throws Exception { PmReportFilter.FilterData filterData = new PmReportFilter.FilterData();