Some tidying up
[nonrtric/plt/ranpm.git] / pmproducer / src / test / java / org / oran / pmproducer / filter / PmReportFilterTest.java
1 /*-
2  * ========================LICENSE_START=================================
3  * O-RAN-SC
4  * %%
5  * Copyright (C) 2023 Nordix Foundation
6  * %%
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
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
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===================================
19  */
20
21 package org.oran.pmproducer.filter;
22
23 import static org.assertj.core.api.Assertions.assertThat;
24
25 import com.google.gson.Gson;
26 import com.google.gson.GsonBuilder;
27
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;
33
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;
39
40 class PmReportFilterTest {
41
42     private final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
43
44     private static Gson gson = new GsonBuilder() //
45             .disableHtmlEscaping() //
46             .create(); //
47
48     private String filterReport(PmReportFilter filter) throws Exception {
49
50         TopicListener.DataFromTopic data =
51                 new TopicListener.DataFromTopic("typeId", null, null, loadReport().getBytes());
52         FilteredData filtered = filter.filter(data);
53
54         String reportAfterFilter = gson.toJson(data.getCachedPmReport());
55         String reportBeforeFilter = gson.toJson(gson.fromJson(loadReport(), PmReport.class));
56
57         assertThat(reportAfterFilter).isEqualTo(reportBeforeFilter);
58
59         return filtered.getValueAString();
60     }
61
62     @Test
63     void testPmFilterMeasTypes() throws Exception {
64
65         PmReportFilter.FilterData filterData = new PmReportFilter.FilterData();
66         filterData.addMeasTypes("UtranCell", "succImmediateAssignProcs");
67
68         PmReportFilter filter = new PmReportFilter(filterData);
69         String filtered = filterReport(filter);
70
71         assertThat(filtered).contains("succImmediateAssignProcs").doesNotContain("\"p\":2").contains("\"p\":1")
72                 .contains("Gbg-997");
73
74         // Test that no report is returned if not meas types were found
75         filterData = new PmReportFilter.FilterData();
76         filterData.addMeasTypes("junk", "succImmediateAssignProcs");
77
78         filter = new PmReportFilter(filterData);
79         filtered = filterReport(filter);
80         assertThat(filtered).isEmpty();
81     }
82
83     @Test
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();
90
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");
96     }
97
98     @Test
99     void testMeasObjClass() throws Exception {
100         {
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();
106         }
107
108         {
109             TopicListener.DataFromTopic data =
110                     new TopicListener.DataFromTopic("typeId", null, null, loadReport().getBytes());
111
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");
116
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");
121         }
122     }
123
124     @Test
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();
131
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");
137     }
138
139     // @Test
140     void testSomeCharacteristics() throws Exception {
141         String path = "./src/test/resources/A20000626.2315+0200-2330+0200_HTTPS-6-73.json";
142
143         String pmReportJson = Files.readString(Path.of(path), Charset.defaultCharset());
144
145         int TIMES = 100000;
146
147         {
148             path = "./src/test/resources/A20000626.2315+0200-2330+0200_HTTPS-6-73.json.gz";
149             byte[] pmReportZipped = Files.readAllBytes(Path.of(path));
150
151             Instant startTime = Instant.now();
152             for (int i = 0; i < TIMES; ++i) {
153                 TopicListener.unzip(pmReportZipped);
154             }
155
156             printDuration("Unzip", startTime, TIMES);
157         }
158         {
159
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());
164
165             Instant startTime = Instant.now();
166             for (int i = 0; i < TIMES; ++i) {
167                 filter.filter(topicData);
168             }
169             printDuration("PM Filter", startTime, TIMES);
170         }
171         {
172             Instant startTime = Instant.now();
173             for (int i = 0; i < TIMES; ++i) {
174                 gson.fromJson(pmReportJson, PmReport.class);
175             }
176             printDuration("Json parsing", startTime, TIMES);
177         }
178
179     }
180
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);
185     }
186
187     @Test
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();
194
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");
200     }
201
202     @Test
203     void testCrapInput() {
204         PmReportFilter.FilterData filterData = new PmReportFilter.FilterData();
205         PmReportFilter filter = new PmReportFilter(filterData);
206
207         FilteredData filtered = filter.filter(new TopicListener.DataFromTopic("typeId", null, null, "junk".getBytes()));
208         assertThat(filtered.isEmpty()).isTrue();
209
210         filtered = filter
211                 .filter(new TopicListener.DataFromTopic("typeId", null, null, reQuote("{'msg': 'test'}").getBytes()));
212         assertThat(filtered.isEmpty()).isTrue();
213
214     }
215
216     private String reQuote(String str) {
217         return str.replaceAll("'", "\\\"");
218     }
219
220     @Test
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);
224
225         String dn = report.event.getPerf3gppFields().getMeasDataCollection().getMeasuredEntityDn();
226         String json = gson.toJson(report);
227         report = gson.fromJson(json, PmReport.class);
228
229         // '=' is escaped to unicode by gson. but converted back
230         assertThat(report.event.getPerf3gppFields().getMeasDataCollection().getMeasuredEntityDn()).isEqualTo(dn);
231     }
232
233     private String loadReport() throws Exception {
234         String path = "./src/test/resources/pm_report.json";
235         return Files.readString(Path.of(path), Charset.defaultCharset());
236     }
237
238 }