2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2018-2019 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 com.google.gson.Gson;
24 import com.google.gson.GsonBuilder;
25 import java.io.IOException;
26 import java.nio.file.Paths;
27 import java.util.List;
28 import java.util.Properties;
29 import org.junit.Assert;
30 import org.junit.BeforeClass;
31 import org.junit.Test;
32 import org.kie.api.builder.ReleaseId;
33 import org.onap.policy.common.endpoints.event.comm.TopicEndpointManager;
34 import org.onap.policy.common.endpoints.event.comm.TopicSink;
35 import org.onap.policy.common.endpoints.properties.PolicyEndPointProperties;
36 import org.onap.policy.drools.controller.DroolsControllerConstants;
37 import org.onap.policy.drools.controller.internal.MavenDroolsControllerTest;
38 import org.onap.policy.drools.properties.DroolsPropertyConstants;
39 import org.onap.policy.drools.protocol.coders.EventProtocolCoder.CoderFilters;
40 import org.onap.policy.drools.protocol.coders.TopicCoderFilterConfiguration.CustomGsonCoder;
41 import org.onap.policy.drools.util.KieUtils;
42 import org.onap.policy.drools.utils.Triple;
43 import org.slf4j.Logger;
44 import org.slf4j.LoggerFactory;
47 * ProtocolCoder Toolset Junits.
49 public class ProtocolCoderToolsetTest {
50 public static final String JUNIT_PROTOCOL_CODER_ARTIFACT_ID = "protocolcoder";
51 public static final String JUNIT_PROTOCOL_CODER_TOPIC = JUNIT_PROTOCOL_CODER_ARTIFACT_ID;
52 public static final String CONTROLLER_ID = "blah";
54 private static Logger logger = LoggerFactory.getLogger(ProtocolCoderToolset.class);
56 private static volatile ReleaseId releaseId;
58 // customCoder has to be public to be accessed in tests below
59 public static final Gson customCoder = new GsonBuilder().create();
62 * Test Class Initialization.
65 public static void setupClass() throws IOException {
66 releaseId = KieUtils.installArtifact(
67 Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_PATH).toFile(),
68 Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_POM_PATH).toFile(),
69 MavenDroolsControllerTest.JUNIT_ECHO_KJAR_DRL_PATH,
70 Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_DRL_PATH).toFile());
74 public void testToolsets() {
76 testGsonToolset(createFilterSet());
80 * Test the Gson toolset.
82 * @param protocolFilter protocol filter
84 public void testGsonToolset(JsonProtocolFilter protocolFilter) {
85 GsonProtocolCoderToolset gsonToolset = new GsonProtocolCoderToolset(
86 EventProtocolParams.builder().topic(JUNIT_PROTOCOL_CODER_TOPIC)
87 .groupId(releaseId.getGroupId())
88 .artifactId(releaseId.getArtifactId())
89 .eventClass(Triple.class.getName())
90 .protocolFilter(protocolFilter)
91 .customGsonCoder(null)
92 .modelClassLoaderHash(12345678), CONTROLLER_ID);
94 Assert.assertNotNull(gsonToolset.getEncoder());
95 Assert.assertNotNull(gsonToolset.getDecoder());
97 testToolset(protocolFilter, gsonToolset);
99 Triple<String, String, String> triple = createTriple();
100 gsonToolset.setCustomCoder(new CustomGsonCoder(this.getClass().getName(), "customCoder"));
101 String tripleEncoded = encode(gsonToolset, triple);
102 decode(protocolFilter, gsonToolset, triple, tripleEncoded);
105 private Triple<String, String, String> createTriple() {
106 return new Triple<>("v1", "v2", "v3");
109 private void testToolset(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset) {
111 validateInitialization(protocolFilter, coderToolset);
113 updateCoderFilterRule(coderToolset);
115 addRemoveCoder(coderToolset);
117 /* restore original filters */
118 coderToolset.addCoder(Triple.class.getName(), protocolFilter, 654321);
120 Triple<String, String, String> triple = createTriple();
122 String tripleEncoded = encode(coderToolset, triple);
124 decode(protocolFilter, coderToolset, triple, tripleEncoded);
127 @SuppressWarnings("unchecked")
128 private void decode(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset,
129 Triple<String, String, String> triple, String tripleEncoded) {
131 Triple<String, String, String> tripleDecoded = null;
133 tripleDecoded = (Triple<String, String, String>) coderToolset.decode(tripleEncoded);
134 } catch (UnsupportedOperationException e) {
136 logger.trace("Junit expected exception - decode does not pass filtering", e);
139 CoderFilters coderFilters = coderToolset.getCoder(Triple.class.getName());
140 Assert.assertTrue(coderFilters.getCodedClass() == Triple.class.getName());
141 Assert.assertTrue(coderFilters.getFilter() == protocolFilter);
142 Assert.assertTrue(coderFilters.getFilter().getRule() != null);
144 coderFilters.getFilter().setRule("[?($.second =~ /^v2$/ && $.third =~ /.*v3.*/)]");
146 tripleDecoded = (Triple<String, String, String>) coderToolset.decode(tripleEncoded);
148 Assert.assertTrue(tripleDecoded.first().equals(triple.first()));
149 Assert.assertTrue(tripleDecoded.second().equals(triple.second()));
150 Assert.assertTrue(tripleDecoded.third().equals(triple.third()));
152 coderFilters.getFilter().setRule(null);
153 Assert.assertEquals("[?($ =~ /.*/)]", coderFilters.getFilter().getRule());
155 tripleDecoded = (Triple<String, String, String>) coderToolset.decode(tripleEncoded);
157 Assert.assertTrue(tripleDecoded.first().equals(triple.first()));
158 Assert.assertTrue(tripleDecoded.second().equals(triple.second()));
159 Assert.assertTrue(tripleDecoded.third().equals(triple.third()));
161 coderFilters.getFilter().setRule("[?($.third =~ /.*v3.*/)]");
164 private String encode(ProtocolCoderToolset coderToolset, Triple<String, String, String> triple) {
165 String tripleEncoded = coderToolset.encode(triple);
166 Assert.assertTrue(!tripleEncoded.isEmpty());
167 return tripleEncoded;
170 private void addRemoveCoder(ProtocolCoderToolset coderToolset) {
171 coderToolset.addCoder(this.getClass().getName(),
172 new JsonProtocolFilter("[?($.second =~ /.*/)]"), 654321);
173 Assert.assertTrue(coderToolset.getCoders().size() == 2);
175 coderToolset.removeCoders(this.getClass().getName());
176 Assert.assertTrue(coderToolset.getCoders().size() == 1);
179 private void updateCoderFilterRule(ProtocolCoderToolset coderToolset) {
180 coderToolset.addCoder(Triple.class.getName(), new JsonProtocolFilter("[?($.third =~ /.*/)]"), 654321);
182 Assert.assertTrue(coderToolset.getCoders().size() == 1);
184 Assert.assertTrue(coderToolset.getCoder(Triple.class.getName()).getModelClassLoaderHash() == 654321);
187 coderToolset.getCoder(
188 Triple.class.getName()).getFilter().getRule() != null);
190 Assert.assertTrue("[?($.third =~ /.*/)]".equals(coderToolset.getCoder(Triple.class.getName())
191 .getFilter().getRule()));
194 private void validateInitialization(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset) {
195 Assert.assertTrue(CONTROLLER_ID.equals(coderToolset.getControllerId()));
196 Assert.assertTrue(releaseId.getGroupId().equals(coderToolset.getGroupId()));
197 Assert.assertTrue(releaseId.getArtifactId().equals(coderToolset.getArtifactId()));
198 Assert.assertNull(coderToolset.getCustomCoder());
200 Assert.assertTrue(coderToolset.getCoders().size() == 1);
202 CoderFilters coderFilters = coderToolset.getCoder(CONTROLLER_ID);
203 Assert.assertTrue(coderFilters == null);
205 coderFilters = coderToolset.getCoder(Triple.class.getName());
206 Assert.assertNotNull(coderFilters);
208 Assert.assertEquals(coderFilters.getFilter(), protocolFilter);
211 private void createController() {
212 if (releaseId == null) {
213 throw new IllegalStateException("no prereq artifact installed in maven repository");
216 Properties sinkConfig = new Properties();
217 sinkConfig.put(PolicyEndPointProperties.PROPERTY_NOOP_SINK_TOPICS, JUNIT_PROTOCOL_CODER_TOPIC);
218 final List<TopicSink> noopTopics = TopicEndpointManager.getManager().addTopicSinks(sinkConfig);
220 Properties droolsControllerConfig = new Properties();
221 droolsControllerConfig.put(DroolsPropertyConstants.RULES_GROUPID, releaseId.getGroupId());
222 droolsControllerConfig.put(DroolsPropertyConstants.RULES_ARTIFACTID, releaseId.getArtifactId());
223 droolsControllerConfig.put(DroolsPropertyConstants.RULES_VERSION, releaseId.getVersion());
224 droolsControllerConfig.put(PolicyEndPointProperties.PROPERTY_NOOP_SINK_TOPICS + "." + JUNIT_PROTOCOL_CODER_TOPIC
225 + PolicyEndPointProperties.PROPERTY_TOPIC_EVENTS_SUFFIX, Triple.class.getName());
227 DroolsControllerConstants.getFactory().build(droolsControllerConfig, null, noopTopics);
230 private JsonProtocolFilter createFilterSet() {
231 return new JsonProtocolFilter("[?($.first =~ /.*/ && $.second =~ /^blah.*/ && $.third =~ /^hello$/)]");