2 * ========================LICENSE_START=================================
5 * Copyright (C) 2023 Nordix Foundation
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ========================LICENSE_END===================================
21 package org.oran.pmproducer.filter;
23 import static org.assertj.core.api.Assertions.assertThat;
25 import com.google.gson.Gson;
26 import com.google.gson.GsonBuilder;
28 import java.lang.invoke.MethodHandles;
29 import java.nio.charset.Charset;
30 import java.nio.file.Files;
31 import java.nio.file.Path;
32 import java.time.Instant;
34 import org.junit.jupiter.api.Test;
35 import org.oran.pmproducer.tasks.TopicListener;
36 import org.oran.pmproducer.tasks.TopicListener.DataFromTopic;
37 import org.slf4j.Logger;
38 import org.slf4j.LoggerFactory;
40 class PmReportFilterTest {
42 private final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
44 private static Gson gson = new GsonBuilder() //
45 .disableHtmlEscaping() //
48 private String filterReport(PmReportFilter filter) throws Exception {
50 TopicListener.DataFromTopic data =
51 new TopicListener.DataFromTopic("typeId", null, null, loadReport().getBytes());
52 FilteredData filtered = filter.filter(data);
54 String reportAfterFilter = gson.toJson(data.getCachedPmReport());
55 String reportBeforeFilter = gson.toJson(gson.fromJson(loadReport(), PmReport.class));
57 assertThat(reportAfterFilter).isEqualTo(reportBeforeFilter);
59 return filtered.getValueAString();
63 void testPmFilterMeasTypes() throws Exception {
65 PmReportFilter.FilterData filterData = new PmReportFilter.FilterData();
66 filterData.addMeasTypes("UtranCell", "succImmediateAssignProcs");
68 PmReportFilter filter = new PmReportFilter(filterData);
69 String filtered = filterReport(filter);
71 assertThat(filtered).contains("succImmediateAssignProcs").doesNotContain("\"p\":2").contains("\"p\":1")
74 // Test that no report is returned if not meas types were found
75 filterData = new PmReportFilter.FilterData();
76 filterData.addMeasTypes("junk", "succImmediateAssignProcs");
78 filter = new PmReportFilter(filterData);
79 filtered = filterReport(filter);
80 assertThat(filtered).isEmpty();
84 void testMeasObjInstIds() throws Exception {
85 PmReportFilter.FilterData filterData = new PmReportFilter.FilterData();
86 filterData.measObjInstIds.add("junk");
87 PmReportFilter filter = new PmReportFilter(filterData);
88 String filtered = filterReport(filter);
89 assertThat(filtered).isEmpty();
91 filterData = new PmReportFilter.FilterData();
92 filterData.measObjInstIds.add("UtranCell=Gbg-997");
93 filter = new PmReportFilter(filterData);
94 filtered = filterReport(filter);
95 assertThat(filtered).contains("Gbg-997").doesNotContain("Gbg-998");
99 void testMeasObjClass() throws Exception {
101 PmReportFilter.FilterData filterData = new PmReportFilter.FilterData();
102 filterData.addMeasTypes("junk");
103 PmReportFilter filter = new PmReportFilter(filterData);
104 String filtered = filterReport(filter);
105 assertThat(filtered).isEmpty();
109 TopicListener.DataFromTopic data =
110 new TopicListener.DataFromTopic("typeId", null, null, loadReport().getBytes());
112 PmReportFilter.FilterData utranCellFilter = new PmReportFilter.FilterData();
113 utranCellFilter.addMeasTypes("UtranCell");
114 FilteredData filtered = new PmReportFilter(utranCellFilter).filter(data);
115 assertThat(filtered.getValueAString()).contains("UtranCell").doesNotContain("ENodeBFunction");
117 PmReportFilter.FilterData eNodeBFilter = new PmReportFilter.FilterData();
118 eNodeBFilter.addMeasTypes("ENodeBFunction");
119 filtered = new PmReportFilter(eNodeBFilter).filter(data);
120 assertThat(filtered.getValueAString()).contains("ENodeBFunction").doesNotContain("UtranCell");
125 void testSourceNames() throws Exception {
126 PmReportFilter.FilterData filterData = new PmReportFilter.FilterData();
127 filterData.sourceNames.add("junk");
128 PmReportFilter filter = new PmReportFilter(filterData);
129 String filtered = filterReport(filter);
130 assertThat(filtered).isEmpty();
132 filterData = new PmReportFilter.FilterData();
133 filterData.sourceNames.add("O-DU-1122");
134 filter = new PmReportFilter(filterData);
135 filtered = filterReport(filter);
136 assertThat(filtered).contains("O-DU-1122");
140 void testSomeCharacteristics() throws Exception {
141 String path = "./src/test/resources/A20000626.2315+0200-2330+0200_HTTPS-6-73.json";
143 String pmReportJson = Files.readString(Path.of(path), Charset.defaultCharset());
148 path = "./src/test/resources/A20000626.2315+0200-2330+0200_HTTPS-6-73.json.gz";
149 byte[] pmReportZipped = Files.readAllBytes(Path.of(path));
151 Instant startTime = Instant.now();
152 for (int i = 0; i < TIMES; ++i) {
153 TopicListener.unzip(pmReportZipped);
156 printDuration("Unzip", startTime, TIMES);
160 PmReportFilter.FilterData filterData = new PmReportFilter.FilterData();
161 filterData.addMeasTypes("NRCellCU", "pmCounterNumber0");
162 PmReportFilter filter = new PmReportFilter(filterData);
163 DataFromTopic topicData = new DataFromTopic("typeId", null, null, pmReportJson.getBytes());
165 Instant startTime = Instant.now();
166 for (int i = 0; i < TIMES; ++i) {
167 filter.filter(topicData);
169 printDuration("PM Filter", startTime, TIMES);
172 Instant startTime = Instant.now();
173 for (int i = 0; i < TIMES; ++i) {
174 gson.fromJson(pmReportJson, PmReport.class);
176 printDuration("Json parsing", startTime, TIMES);
181 void printDuration(String str, Instant startTime, int noOfIterations) {
182 final long durationMs = Instant.now().toEpochMilli() - startTime.toEpochMilli();
183 logger.info("*** Duration (ms) " + str + " :" + durationMs + ", objects/second: "
184 + (noOfIterations * 1000) / durationMs);
188 void testMeasuredEntityDns() throws Exception {
189 PmReportFilter.FilterData filterData = new PmReportFilter.FilterData();
190 filterData.measuredEntityDns.add("junk");
191 PmReportFilter filter = new PmReportFilter(filterData);
192 String filtered = filterReport(filter);
193 assertThat(filtered).isEmpty();
195 filterData = new PmReportFilter.FilterData();
196 filterData.measuredEntityDns.add("ManagedElement=RNC-Gbg-1");
197 filter = new PmReportFilter(filterData);
198 filtered = filterReport(filter);
199 assertThat(filtered).contains("ManagedElement=RNC-Gbg-1");
203 void testCrapInput() {
204 PmReportFilter.FilterData filterData = new PmReportFilter.FilterData();
205 PmReportFilter filter = new PmReportFilter(filterData);
207 FilteredData filtered = filter.filter(new TopicListener.DataFromTopic("typeId", null, null, "junk".getBytes()));
208 assertThat(filtered.isEmpty()).isTrue();
211 .filter(new TopicListener.DataFromTopic("typeId", null, null, reQuote("{'msg': 'test'}").getBytes()));
212 assertThat(filtered.isEmpty()).isTrue();
216 private String reQuote(String str) {
217 return str.replaceAll("'", "\\\"");
221 void testParse() throws Exception {
222 com.google.gson.Gson gson = new com.google.gson.GsonBuilder().disableHtmlEscaping().create();
223 PmReport report = gson.fromJson(loadReport(), PmReport.class);
225 String dn = report.event.getPerf3gppFields().getMeasDataCollection().getMeasuredEntityDn();
226 String json = gson.toJson(report);
227 report = gson.fromJson(json, PmReport.class);
229 // '=' is escaped to unicode by gson. but converted back
230 assertThat(report.event.getPerf3gppFields().getMeasDataCollection().getMeasuredEntityDn()).isEqualTo(dn);
233 private String loadReport() throws Exception {
234 String path = "./src/test/resources/pm_report.json";
235 return Files.readString(Path.of(path), Charset.defaultCharset());