Removing deprecated DMAAP library
[policy/drools-pdp.git] / policy-management / src / test / java / org / onap / policy / drools / protocol / coders / ProtocolCoderToolsetTest.java
1 /*
2  * ============LICENSE_START=======================================================
3  * ONAP
4  * ================================================================================
5  * Copyright (C) 2018-2021-2022 AT&T Intellectual Property. All rights reserved.
6  * Modifications Copyright (C) 2024 Nordix Foundation.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  * ============LICENSE_END=========================================================
20  */
21
22 package org.onap.policy.drools.protocol.coders;
23
24 import static org.assertj.core.api.Assertions.assertThat;
25 import static org.junit.jupiter.api.Assertions.assertEquals;
26 import static org.junit.jupiter.api.Assertions.assertFalse;
27 import static org.junit.jupiter.api.Assertions.assertNotNull;
28 import static org.junit.jupiter.api.Assertions.assertNull;
29 import static org.junit.jupiter.api.Assertions.assertSame;
30
31 import com.google.gson.Gson;
32 import com.google.gson.GsonBuilder;
33 import java.io.IOException;
34 import java.nio.file.Paths;
35 import java.util.List;
36 import java.util.Properties;
37 import lombok.AllArgsConstructor;
38 import lombok.Getter;
39 import org.junit.jupiter.api.AfterEach;
40 import org.junit.jupiter.api.BeforeAll;
41 import org.junit.jupiter.api.BeforeEach;
42 import org.junit.jupiter.api.Test;
43 import org.kie.api.builder.ReleaseId;
44 import org.onap.policy.common.endpoints.event.comm.TopicEndpointManager;
45 import org.onap.policy.common.endpoints.event.comm.TopicSink;
46 import org.onap.policy.common.endpoints.properties.PolicyEndPointProperties;
47 import org.onap.policy.drools.controller.DroolsController;
48 import org.onap.policy.drools.controller.DroolsControllerConstants;
49 import org.onap.policy.drools.controller.internal.MavenDroolsControllerTest;
50 import org.onap.policy.drools.properties.DroolsPropertyConstants;
51 import org.onap.policy.drools.protocol.coders.EventProtocolCoder.CoderFilters;
52 import org.onap.policy.drools.protocol.coders.TopicCoderFilterConfiguration.CustomGsonCoder;
53 import org.onap.policy.drools.util.KieUtils;
54 import org.slf4j.Logger;
55 import org.slf4j.LoggerFactory;
56
57 /**
58  * ProtocolCoder Toolset Junits.
59  */
60 public class ProtocolCoderToolsetTest {
61     private static final String JUNIT_PROTOCOL_CODER_ARTIFACT_ID = "protocolcoder";
62     private static final String JUNIT_PROTOCOL_CODER_TOPIC = JUNIT_PROTOCOL_CODER_ARTIFACT_ID;
63     private static final String CONTROLLER_ID = "blah";
64
65     private static final Logger logger = LoggerFactory.getLogger(ProtocolCoderToolset.class);
66
67     private static volatile ReleaseId releaseId;
68
69     // customCoder has to be public to be accessed in tests below
70     public static final Gson customCoder = new GsonBuilder().create();
71
72     private DroolsController controller;
73
74     /**
75      * Test Class Initialization.
76      */
77     @BeforeAll
78     public static void setUpClass() throws IOException {
79         releaseId = KieUtils.installArtifact(Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_PATH).toFile(),
80                         Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_POM_PATH).toFile(),
81                         MavenDroolsControllerTest.JUNIT_ECHO_KJAR_DRL_PATH,
82                         Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_DRL_PATH).toFile());
83     }
84
85     /**
86      * Test Set Up.
87      */
88     @BeforeEach
89     public void setUp() {
90         controller = createController();
91     }
92
93     /**
94      * Test Termination.
95      */
96     @AfterEach
97     public void tearDown() {
98         if (controller != null) {
99             DroolsControllerConstants.getFactory().destroy(controller);
100         }
101     }
102
103     @Test
104     void testToolsets() {
105         testGsonToolset(createFilterSet());
106     }
107
108     /**
109      * Test the Gson toolset.
110      *
111      * @param protocolFilter protocol filter
112      */
113     private void testGsonToolset(JsonProtocolFilter protocolFilter) {
114         GsonProtocolCoderToolset gsonToolset =
115                         new GsonProtocolCoderToolset(EventProtocolParams.builder().topic(JUNIT_PROTOCOL_CODER_TOPIC)
116                                         .groupId(releaseId.getGroupId()).artifactId(releaseId.getArtifactId())
117                                         .eventClass(ThreeStrings.class.getName()).protocolFilter(protocolFilter)
118                                         .customGsonCoder(null).modelClassLoaderHash(12345678).build(), CONTROLLER_ID);
119
120         assertNotNull(gsonToolset.getEncoder());
121         assertNotNull(gsonToolset.getDecoder());
122         assertThat(gsonToolset.toString()).startsWith("GsonProtocolCoderToolset [");
123         assertThat(gsonToolset.toString()).contains("=ProtocolCoderToolset [");
124         assertThat(gsonToolset.toString()).contains("[CoderFilters [");
125
126         testToolset(protocolFilter, gsonToolset);
127
128         ThreeStrings triple = createTriple();
129         gsonToolset.setCustomCoder(new CustomGsonCoder(this.getClass().getName(), "customCoder"));
130         String tripleEncoded = encode(gsonToolset, triple);
131         decode(protocolFilter, gsonToolset, triple, tripleEncoded);
132     }
133
134     private ThreeStrings createTriple() {
135         return new ThreeStrings("v1", "v2", "v3");
136     }
137
138     private void testToolset(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset) {
139
140         validateInitialization(protocolFilter, coderToolset);
141
142         updateCoderFilterRule(coderToolset);
143
144         addRemoveCoder(coderToolset);
145
146         /* restore original filters */
147         coderToolset.addCoder(ThreeStrings.class.getName(), protocolFilter, 654321);
148
149         ThreeStrings triple = createTriple();
150
151         String tripleEncoded = encode(coderToolset, triple);
152
153         decode(protocolFilter, coderToolset, triple, tripleEncoded);
154     }
155
156     private void decode(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset,
157                     ThreeStrings triple, String tripleEncoded) {
158
159         try {
160             coderToolset.decode(tripleEncoded);
161         } catch (UnsupportedOperationException e) {
162             /* OK */
163             logger.trace("Junit expected exception - decode does not pass filtering", e);
164         }
165
166         CoderFilters coderFilters = coderToolset.getCoder(ThreeStrings.class.getName());
167         assertSame(coderFilters.getFactClass(), ThreeStrings.class.getName());
168         assertSame(coderFilters.getFilter(), protocolFilter);
169         assertNotNull(coderFilters.getFilter().getRule());
170
171         coderFilters.getFilter().setRule("[?($.second =~ /^v2$/ && $.third =~ /.*v3.*/)]");
172
173         ThreeStrings tripleDecoded = (ThreeStrings) coderToolset.decode(tripleEncoded);
174
175         assertEquals(triple.getFirst(), tripleDecoded.getFirst());
176         assertEquals(triple.getSecond(), tripleDecoded.getSecond());
177         assertEquals(triple.getThird(), tripleDecoded.getThird());
178
179         coderFilters.getFilter().setRule(null);
180         assertEquals("[?($ =~ /.*/)]", coderFilters.getFilter().getRule());
181
182         tripleDecoded = (ThreeStrings) coderToolset.decode(tripleEncoded);
183
184         assertEquals(tripleDecoded.getFirst(), triple.getFirst());
185         assertEquals(tripleDecoded.getSecond(), triple.getSecond());
186         assertEquals(tripleDecoded.getThird(), triple.getThird());
187
188         coderFilters.getFilter().setRule("[?($.third =~ /.*v3.*/)]");
189     }
190
191     private String encode(ProtocolCoderToolset coderToolset, ThreeStrings triple) {
192         String tripleEncoded = coderToolset.encode(triple);
193         assertFalse(tripleEncoded.isEmpty());
194         return tripleEncoded;
195     }
196
197     private void addRemoveCoder(ProtocolCoderToolset coderToolset) {
198         coderToolset.addCoder(this.getClass().getName(), new JsonProtocolFilter("[?($.second =~ /.*/)]"), 654321);
199         assertEquals(2, coderToolset.getCoders().size());
200
201         coderToolset.removeCoders(this.getClass().getName());
202         assertEquals(1, coderToolset.getCoders().size());
203     }
204
205     private void updateCoderFilterRule(ProtocolCoderToolset coderToolset) {
206         coderToolset.addCoder(ThreeStrings.class.getName(), new JsonProtocolFilter("[?($.third =~ /.*/)]"), 654321);
207
208         assertEquals(1, coderToolset.getCoders().size());
209
210         assertEquals(654321, coderToolset.getCoder(ThreeStrings.class.getName()).getModelClassLoaderHash());
211
212         assertNotNull(coderToolset.getCoder(ThreeStrings.class.getName()).getFilter().getRule());
213
214         assertEquals("[?($.third =~ /.*/)]",
215                         coderToolset.getCoder(ThreeStrings.class.getName()).getFilter().getRule());
216     }
217
218     private void validateInitialization(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset) {
219         assertEquals(CONTROLLER_ID, coderToolset.getControllerId());
220         assertEquals(releaseId.getGroupId(), coderToolset.getGroupId());
221         assertEquals(releaseId.getArtifactId(), coderToolset.getArtifactId());
222         assertNull(coderToolset.getCustomCoder());
223
224         assertEquals(1, coderToolset.getCoders().size());
225
226         CoderFilters coderFilters = coderToolset.getCoder(CONTROLLER_ID);
227         assertNull(coderFilters);
228
229         coderFilters = coderToolset.getCoder(ThreeStrings.class.getName());
230         assertNotNull(coderFilters);
231
232         assertEquals(coderFilters.getFilter(), protocolFilter);
233     }
234
235     private DroolsController createController() {
236         if (releaseId == null) {
237             throw new IllegalStateException("no prereq artifact installed in maven repository");
238         }
239
240         Properties sinkConfig = new Properties();
241         sinkConfig.put(PolicyEndPointProperties.PROPERTY_NOOP_SINK_TOPICS, JUNIT_PROTOCOL_CODER_TOPIC);
242         final List<TopicSink> noopTopics = TopicEndpointManager.getManager().addTopicSinks(sinkConfig);
243
244         Properties droolsControllerConfig = new Properties();
245         droolsControllerConfig.put(DroolsPropertyConstants.RULES_GROUPID, releaseId.getGroupId());
246         droolsControllerConfig.put(DroolsPropertyConstants.RULES_ARTIFACTID, releaseId.getArtifactId());
247         droolsControllerConfig.put(DroolsPropertyConstants.RULES_VERSION, releaseId.getVersion());
248         droolsControllerConfig.put(
249                         PolicyEndPointProperties.PROPERTY_NOOP_SINK_TOPICS + "." + JUNIT_PROTOCOL_CODER_TOPIC
250                                         + PolicyEndPointProperties.PROPERTY_TOPIC_EVENTS_SUFFIX,
251                         ThreeStrings.class.getName());
252
253         return DroolsControllerConstants.getFactory().build(droolsControllerConfig, null, noopTopics);
254     }
255
256     private JsonProtocolFilter createFilterSet() {
257         return new JsonProtocolFilter("[?($.first =~ /.*/ && $.second =~ /^blah.*/ && $.third =~ /^hello$/)]");
258     }
259
260     /**
261      * Note: We need an object that can be constructed, but the apache Triple cannot, thus
262      * we create our own class just for these tests.
263      */
264     @Getter
265     @AllArgsConstructor
266     public static class ThreeStrings {
267         private String first;
268         private String second;
269         private String third;
270     }
271 }