2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2018-2021-2022 AT&T Intellectual Property. All rights reserved.
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
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.onap.policy.drools.protocol.coders;
23 import static org.assertj.core.api.Assertions.assertThat;
24 import static org.junit.Assert.assertEquals;
25 import static org.junit.Assert.assertFalse;
26 import static org.junit.Assert.assertNotNull;
27 import static org.junit.Assert.assertNull;
28 import static org.junit.Assert.assertSame;
30 import com.google.gson.Gson;
31 import com.google.gson.GsonBuilder;
32 import java.io.IOException;
33 import java.nio.file.Paths;
34 import java.util.List;
35 import java.util.Properties;
36 import lombok.AllArgsConstructor;
38 import org.junit.After;
39 import org.junit.Before;
40 import org.junit.BeforeClass;
41 import org.junit.Test;
42 import org.kie.api.builder.ReleaseId;
43 import org.onap.policy.common.endpoints.event.comm.TopicEndpointManager;
44 import org.onap.policy.common.endpoints.event.comm.TopicSink;
45 import org.onap.policy.common.endpoints.properties.PolicyEndPointProperties;
46 import org.onap.policy.drools.controller.DroolsController;
47 import org.onap.policy.drools.controller.DroolsControllerConstants;
48 import org.onap.policy.drools.controller.internal.MavenDroolsControllerTest;
49 import org.onap.policy.drools.properties.DroolsPropertyConstants;
50 import org.onap.policy.drools.protocol.coders.EventProtocolCoder.CoderFilters;
51 import org.onap.policy.drools.protocol.coders.TopicCoderFilterConfiguration.CustomGsonCoder;
52 import org.onap.policy.drools.util.KieUtils;
53 import org.slf4j.Logger;
54 import org.slf4j.LoggerFactory;
57 * ProtocolCoder Toolset Junits.
59 public class ProtocolCoderToolsetTest {
60 private static final String JUNIT_PROTOCOL_CODER_ARTIFACT_ID = "protocolcoder";
61 private static final String JUNIT_PROTOCOL_CODER_TOPIC = JUNIT_PROTOCOL_CODER_ARTIFACT_ID;
62 private static final String CONTROLLER_ID = "blah";
64 private static final Logger logger = LoggerFactory.getLogger(ProtocolCoderToolset.class);
66 private static volatile ReleaseId releaseId;
68 // customCoder has to be public to be accessed in tests below
69 public static final Gson customCoder = new GsonBuilder().create();
71 private DroolsController controller;
74 * Test Class Initialization.
77 public static void setUpClass() throws IOException {
78 releaseId = KieUtils.installArtifact(Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_PATH).toFile(),
79 Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_POM_PATH).toFile(),
80 MavenDroolsControllerTest.JUNIT_ECHO_KJAR_DRL_PATH,
81 Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_DRL_PATH).toFile());
89 controller = createController();
96 public void tearDown() {
97 if (controller != null) {
98 DroolsControllerConstants.getFactory().destroy(controller);
103 public void testToolsets() {
104 testGsonToolset(createFilterSet());
108 * Test the Gson toolset.
110 * @param protocolFilter protocol filter
112 private void testGsonToolset(JsonProtocolFilter protocolFilter) {
113 GsonProtocolCoderToolset gsonToolset =
114 new GsonProtocolCoderToolset(EventProtocolParams.builder().topic(JUNIT_PROTOCOL_CODER_TOPIC)
115 .groupId(releaseId.getGroupId()).artifactId(releaseId.getArtifactId())
116 .eventClass(ThreeStrings.class.getName()).protocolFilter(protocolFilter)
117 .customGsonCoder(null).modelClassLoaderHash(12345678).build(), CONTROLLER_ID);
119 assertNotNull(gsonToolset.getEncoder());
120 assertNotNull(gsonToolset.getDecoder());
121 assertThat(gsonToolset.toString()).startsWith("GsonProtocolCoderToolset [");
122 assertThat(gsonToolset.toString()).contains("=ProtocolCoderToolset [");
123 assertThat(gsonToolset.toString()).contains("[CoderFilters [");
125 testToolset(protocolFilter, gsonToolset);
127 ThreeStrings triple = createTriple();
128 gsonToolset.setCustomCoder(new CustomGsonCoder(this.getClass().getName(), "customCoder"));
129 String tripleEncoded = encode(gsonToolset, triple);
130 decode(protocolFilter, gsonToolset, triple, tripleEncoded);
133 private ThreeStrings createTriple() {
134 return new ThreeStrings("v1", "v2", "v3");
137 private void testToolset(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset) {
139 validateInitialization(protocolFilter, coderToolset);
141 updateCoderFilterRule(coderToolset);
143 addRemoveCoder(coderToolset);
145 /* restore original filters */
146 coderToolset.addCoder(ThreeStrings.class.getName(), protocolFilter, 654321);
148 ThreeStrings triple = createTriple();
150 String tripleEncoded = encode(coderToolset, triple);
152 decode(protocolFilter, coderToolset, triple, tripleEncoded);
155 private void decode(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset,
156 ThreeStrings triple, String tripleEncoded) {
159 coderToolset.decode(tripleEncoded);
160 } catch (UnsupportedOperationException e) {
162 logger.trace("Junit expected exception - decode does not pass filtering", e);
165 CoderFilters coderFilters = coderToolset.getCoder(ThreeStrings.class.getName());
166 assertSame(coderFilters.getFactClass(), ThreeStrings.class.getName());
167 assertSame(coderFilters.getFilter(), protocolFilter);
168 assertNotNull(coderFilters.getFilter().getRule());
170 coderFilters.getFilter().setRule("[?($.second =~ /^v2$/ && $.third =~ /.*v3.*/)]");
172 ThreeStrings tripleDecoded = (ThreeStrings) coderToolset.decode(tripleEncoded);
174 assertEquals(triple.getFirst(), tripleDecoded.getFirst());
175 assertEquals(triple.getSecond(), tripleDecoded.getSecond());
176 assertEquals(triple.getThird(), tripleDecoded.getThird());
178 coderFilters.getFilter().setRule(null);
179 assertEquals("[?($ =~ /.*/)]", coderFilters.getFilter().getRule());
181 tripleDecoded = (ThreeStrings) coderToolset.decode(tripleEncoded);
183 assertEquals(tripleDecoded.getFirst(), triple.getFirst());
184 assertEquals(tripleDecoded.getSecond(), triple.getSecond());
185 assertEquals(tripleDecoded.getThird(), triple.getThird());
187 coderFilters.getFilter().setRule("[?($.third =~ /.*v3.*/)]");
190 private String encode(ProtocolCoderToolset coderToolset, ThreeStrings triple) {
191 String tripleEncoded = coderToolset.encode(triple);
192 assertFalse(tripleEncoded.isEmpty());
193 return tripleEncoded;
196 private void addRemoveCoder(ProtocolCoderToolset coderToolset) {
197 coderToolset.addCoder(this.getClass().getName(), new JsonProtocolFilter("[?($.second =~ /.*/)]"), 654321);
198 assertEquals(2, coderToolset.getCoders().size());
200 coderToolset.removeCoders(this.getClass().getName());
201 assertEquals(1, coderToolset.getCoders().size());
204 private void updateCoderFilterRule(ProtocolCoderToolset coderToolset) {
205 coderToolset.addCoder(ThreeStrings.class.getName(), new JsonProtocolFilter("[?($.third =~ /.*/)]"), 654321);
207 assertEquals(1, coderToolset.getCoders().size());
209 assertEquals(654321, coderToolset.getCoder(ThreeStrings.class.getName()).getModelClassLoaderHash());
211 assertNotNull(coderToolset.getCoder(ThreeStrings.class.getName()).getFilter().getRule());
213 assertEquals("[?($.third =~ /.*/)]",
214 coderToolset.getCoder(ThreeStrings.class.getName()).getFilter().getRule());
217 private void validateInitialization(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset) {
218 assertEquals(CONTROLLER_ID, coderToolset.getControllerId());
219 assertEquals(releaseId.getGroupId(), coderToolset.getGroupId());
220 assertEquals(releaseId.getArtifactId(), coderToolset.getArtifactId());
221 assertNull(coderToolset.getCustomCoder());
223 assertEquals(1, coderToolset.getCoders().size());
225 CoderFilters coderFilters = coderToolset.getCoder(CONTROLLER_ID);
226 assertNull(coderFilters);
228 coderFilters = coderToolset.getCoder(ThreeStrings.class.getName());
229 assertNotNull(coderFilters);
231 assertEquals(coderFilters.getFilter(), protocolFilter);
234 private DroolsController createController() {
235 if (releaseId == null) {
236 throw new IllegalStateException("no prereq artifact installed in maven repository");
239 Properties sinkConfig = new Properties();
240 sinkConfig.put(PolicyEndPointProperties.PROPERTY_NOOP_SINK_TOPICS, JUNIT_PROTOCOL_CODER_TOPIC);
241 final List<TopicSink> noopTopics = TopicEndpointManager.getManager().addTopicSinks(sinkConfig);
243 Properties droolsControllerConfig = new Properties();
244 droolsControllerConfig.put(DroolsPropertyConstants.RULES_GROUPID, releaseId.getGroupId());
245 droolsControllerConfig.put(DroolsPropertyConstants.RULES_ARTIFACTID, releaseId.getArtifactId());
246 droolsControllerConfig.put(DroolsPropertyConstants.RULES_VERSION, releaseId.getVersion());
247 droolsControllerConfig.put(
248 PolicyEndPointProperties.PROPERTY_NOOP_SINK_TOPICS + "." + JUNIT_PROTOCOL_CODER_TOPIC
249 + PolicyEndPointProperties.PROPERTY_TOPIC_EVENTS_SUFFIX,
250 ThreeStrings.class.getName());
252 return DroolsControllerConstants.getFactory().build(droolsControllerConfig, null, noopTopics);
255 private JsonProtocolFilter createFilterSet() {
256 return new JsonProtocolFilter("[?($.first =~ /.*/ && $.second =~ /^blah.*/ && $.third =~ /^hello$/)]");
260 * Note: We need an object that can be constructed, but the apache Triple cannot, thus
261 * we create our own class just for these tests.
265 public static class ThreeStrings {
266 private String first;
267 private String second;
268 private String third;