Added test, bugfix. 82/9382/1
authorPatrikBuhr <patrik.buhr@est.tech>
Mon, 24 Oct 2022 11:40:16 +0000 (13:40 +0200)
committerPatrikBuhr <patrik.buhr@est.tech>
Mon, 24 Oct 2022 11:40:16 +0000 (13:40 +0200)
Bugfix, PM filtering was broken.

Signed-off-by: PatrikBuhr <patrik.buhr@est.tech>
Issue-ID: NONRTRIC-773
Change-Id: I560e137a0e036d9e03421129f17dcc453573977d

src/main/java/org/oran/dmaapadapter/filter/PmReport.java
src/main/java/org/oran/dmaapadapter/filter/PmReportFilter.java
src/test/java/org/oran/dmaapadapter/ApplicationTest.java
src/test/java/org/oran/dmaapadapter/IntegrationWithKafka.java
src/test/java/org/oran/dmaapadapter/filter/PmReportFilterTest.java

index 45a59ed..ca2c82b 100644 (file)
@@ -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> measInfoList = new ArrayList<>();
+        Collection<MeasInfoList> measInfoList;
     }
 
+    @Builder(toBuilder = true)
     public static class Perf3gppFields {
         @Expose
         String perf3gppFieldsVersion;
index 8f4976f..78fa6bb 100644 (file)
@@ -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<PmReport.MeasInfoList> filtered = createMeasObjInstIds(report, filterData);
-        report.event.perf3gppFields.measDataCollection.measInfoList = filtered;
-        return !filtered.isEmpty();
+
+        Collection<PmReport.MeasInfoList> 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<String> collection) {
index 139c1bb..6b48f79 100644 (file)
@@ -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 {
 
index ff8297a..deff7ee 100644 (file)
@@ -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;
 
index 3e465da..20c03ca 100644 (file)
@@ -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();