2 * ============LICENSE_START=======================================================
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
12 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
22 package org.onap.policy.drools.protocol.coders;
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;
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;
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;
58 * ProtocolCoder Toolset Junits.
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";
65 private static final Logger logger = LoggerFactory.getLogger(ProtocolCoderToolset.class);
67 private static volatile ReleaseId releaseId;
69 // customCoder has to be public to be accessed in tests below
70 public static final Gson customCoder = new GsonBuilder().create();
72 private DroolsController controller;
75 * Test Class Initialization.
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());
90 controller = createController();
97 public void tearDown() {
98 if (controller != null) {
99 DroolsControllerConstants.getFactory().destroy(controller);
104 void testToolsets() {
105 testGsonToolset(createFilterSet());
109 * Test the Gson toolset.
111 * @param protocolFilter protocol filter
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);
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 [");
126 testToolset(protocolFilter, gsonToolset);
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);
134 private ThreeStrings createTriple() {
135 return new ThreeStrings("v1", "v2", "v3");
138 private void testToolset(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset) {
140 validateInitialization(protocolFilter, coderToolset);
142 updateCoderFilterRule(coderToolset);
144 addRemoveCoder(coderToolset);
146 /* restore original filters */
147 coderToolset.addCoder(ThreeStrings.class.getName(), protocolFilter, 654321);
149 ThreeStrings triple = createTriple();
151 String tripleEncoded = encode(coderToolset, triple);
153 decode(protocolFilter, coderToolset, triple, tripleEncoded);
156 private void decode(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset,
157 ThreeStrings triple, String tripleEncoded) {
160 coderToolset.decode(tripleEncoded);
161 } catch (UnsupportedOperationException e) {
163 logger.trace("Junit expected exception - decode does not pass filtering", e);
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());
171 coderFilters.getFilter().setRule("[?($.second =~ /^v2$/ && $.third =~ /.*v3.*/)]");
173 ThreeStrings tripleDecoded = (ThreeStrings) coderToolset.decode(tripleEncoded);
175 assertEquals(triple.getFirst(), tripleDecoded.getFirst());
176 assertEquals(triple.getSecond(), tripleDecoded.getSecond());
177 assertEquals(triple.getThird(), tripleDecoded.getThird());
179 coderFilters.getFilter().setRule(null);
180 assertEquals("[?($ =~ /.*/)]", coderFilters.getFilter().getRule());
182 tripleDecoded = (ThreeStrings) coderToolset.decode(tripleEncoded);
184 assertEquals(tripleDecoded.getFirst(), triple.getFirst());
185 assertEquals(tripleDecoded.getSecond(), triple.getSecond());
186 assertEquals(tripleDecoded.getThird(), triple.getThird());
188 coderFilters.getFilter().setRule("[?($.third =~ /.*v3.*/)]");
191 private String encode(ProtocolCoderToolset coderToolset, ThreeStrings triple) {
192 String tripleEncoded = coderToolset.encode(triple);
193 assertFalse(tripleEncoded.isEmpty());
194 return tripleEncoded;
197 private void addRemoveCoder(ProtocolCoderToolset coderToolset) {
198 coderToolset.addCoder(this.getClass().getName(), new JsonProtocolFilter("[?($.second =~ /.*/)]"), 654321);
199 assertEquals(2, coderToolset.getCoders().size());
201 coderToolset.removeCoders(this.getClass().getName());
202 assertEquals(1, coderToolset.getCoders().size());
205 private void updateCoderFilterRule(ProtocolCoderToolset coderToolset) {
206 coderToolset.addCoder(ThreeStrings.class.getName(), new JsonProtocolFilter("[?($.third =~ /.*/)]"), 654321);
208 assertEquals(1, coderToolset.getCoders().size());
210 assertEquals(654321, coderToolset.getCoder(ThreeStrings.class.getName()).getModelClassLoaderHash());
212 assertNotNull(coderToolset.getCoder(ThreeStrings.class.getName()).getFilter().getRule());
214 assertEquals("[?($.third =~ /.*/)]",
215 coderToolset.getCoder(ThreeStrings.class.getName()).getFilter().getRule());
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());
224 assertEquals(1, coderToolset.getCoders().size());
226 CoderFilters coderFilters = coderToolset.getCoder(CONTROLLER_ID);
227 assertNull(coderFilters);
229 coderFilters = coderToolset.getCoder(ThreeStrings.class.getName());
230 assertNotNull(coderFilters);
232 assertEquals(coderFilters.getFilter(), protocolFilter);
235 private DroolsController createController() {
236 if (releaseId == null) {
237 throw new IllegalStateException("no prereq artifact installed in maven repository");
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);
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());
253 return DroolsControllerConstants.getFactory().build(droolsControllerConfig, null, noopTopics);
256 private JsonProtocolFilter createFilterSet() {
257 return new JsonProtocolFilter("[?($.first =~ /.*/ && $.second =~ /^blah.*/ && $.third =~ /^hello$/)]");
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.
266 public static class ThreeStrings {
267 private String first;
268 private String second;
269 private String third;