2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2018 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.fasterxml.jackson.annotation.JsonAutoDetect.Visibility;
24 import com.fasterxml.jackson.annotation.PropertyAccessor;
25 import com.google.gson.Gson;
26 import com.google.gson.GsonBuilder;
28 import java.io.IOException;
29 import java.nio.file.Files;
30 import java.nio.file.Paths;
31 import java.util.ArrayList;
32 import java.util.List;
33 import java.util.Properties;
35 import org.junit.Assert;
36 import org.junit.Before;
37 import org.junit.Test;
38 import org.kie.api.builder.ReleaseId;
39 import org.onap.policy.common.endpoints.event.comm.TopicEndpoint;
40 import org.onap.policy.common.endpoints.event.comm.TopicSink;
41 import org.onap.policy.common.endpoints.properties.PolicyEndPointProperties;
42 import org.onap.policy.drools.controller.DroolsController;
43 import org.onap.policy.drools.controller.internal.MavenDroolsControllerTest;
44 import org.onap.policy.drools.properties.DroolsProperties;
45 import org.onap.policy.drools.protocol.coders.EventProtocolCoder.CoderFilters;
46 import org.onap.policy.drools.protocol.coders.JsonProtocolFilter.FilterRule;
47 import org.onap.policy.drools.protocol.coders.TopicCoderFilterConfiguration.CustomGsonCoder;
48 import org.onap.policy.drools.util.KieUtils;
49 import org.onap.policy.drools.utils.Triple;
50 import org.slf4j.Logger;
51 import org.slf4j.LoggerFactory;
54 * ProtocolCoder Toolset JUNITs.
56 public class ProtocolCoderToolsetTest {
57 public static final String JUNIT_PROTOCOL_CODER_ARTIFACT_ID = "protocolcoder";
58 public static final String JUNIT_PROTOCOL_CODER_TOPIC = JUNIT_PROTOCOL_CODER_ARTIFACT_ID;
59 public static final String CONTROLLER_ID = "blah";
60 public static final String ARTIFACT_ID_ECHO = "echo";
61 public static final String ARTIFACT_ID_POM_LINE = "<artifactId>" + ARTIFACT_ID_ECHO + "</artifactId>";
63 private static Logger logger = LoggerFactory.getLogger(ProtocolCoderToolset.class);
65 private volatile ReleaseId releaseId;
67 public static final Gson customCoder = new GsonBuilder().create();
72 * @throws IOException throws IO Exception
75 public void setUp() throws IOException {
76 if (releaseId != null) {
80 String pom = new String(Files.readAllBytes(Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_POM_PATH)));
82 if (!pom.contains(ARTIFACT_ID_POM_LINE)) {
83 throw new IllegalArgumentException("unexpected junit test pom");
86 String newPom = pom.replace(ARTIFACT_ID_ECHO, JUNIT_PROTOCOL_CODER_ARTIFACT_ID);
88 String kmodule = new String(Files.readAllBytes(Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_PATH)));
90 String drl = new String(Files.readAllBytes(Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_DRL_PATH)));
92 releaseId = KieUtils.installArtifact(kmodule, newPom, MavenDroolsControllerTest.JUNIT_ECHO_KJAR_DRL_PATH, drl);
96 public void testToolsets() {
98 testGsonToolset(createFilterSet());
99 testJacksonToolset(createFilterSet());
103 * Test the Gson toolset.
105 * @param protocolFilter protocol filter
107 public void testGsonToolset(JsonProtocolFilter protocolFilter) {
108 GsonProtocolCoderToolset gsonToolset = new GsonProtocolCoderToolset(
109 EventProtocolParams.builder().topic(JUNIT_PROTOCOL_CODER_TOPIC)
110 .groupId(this.releaseId.getGroupId())
111 .artifactId(this.releaseId.getArtifactId())
112 .eventClass(Triple.class.getCanonicalName())
113 .protocolFilter(protocolFilter)
114 .customGsonCoder(null)
115 .modelClassLoaderHash(12345678), CONTROLLER_ID);
117 Assert.assertNotNull(gsonToolset.getEncoder());
118 Assert.assertNotNull(gsonToolset.getDecoder());
120 testToolset(protocolFilter, gsonToolset);
122 Triple<String, String, String> triple = createTriple();
123 gsonToolset.setCustomCoder(new CustomGsonCoder(this.getClass().getCanonicalName(), "customCoder"));
124 String tripleEncoded = encode(gsonToolset, triple);
125 decode(protocolFilter, gsonToolset, triple, tripleEncoded);
128 private Triple<String, String, String> createTriple() {
129 return new Triple<>("v1", "v2", "v3");
133 * Test Jackson toolset.
135 * @param protocolFilter protocol filter
137 public void testJacksonToolset(JsonProtocolFilter protocolFilter) {
138 JacksonProtocolCoderToolset jacksonToolset = new JacksonProtocolCoderToolset(
139 EventProtocolParams.builder()
140 .topic(JUNIT_PROTOCOL_CODER_TOPIC)
141 .groupId(this.releaseId.getGroupId())
142 .artifactId(this.releaseId.getArtifactId())
143 .eventClass(Triple.class.getCanonicalName())
144 .protocolFilter(protocolFilter)
145 .customJacksonCoder(null)
146 .modelClassLoaderHash(12345678), CONTROLLER_ID);
148 jacksonToolset.getEncoder().setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
149 jacksonToolset.getDecoder().setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
151 testToolset(protocolFilter, jacksonToolset);
154 private void testToolset(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset) {
156 validateInitialization(protocolFilter, coderToolset);
158 updateCoderFilterRule(coderToolset);
160 addRemoveCoder(coderToolset);
162 /* restore original filters */
163 coderToolset.addCoder(Triple.class.getCanonicalName(), protocolFilter, 654321);
165 Triple<String, String, String> triple = createTriple();
167 String tripleEncoded = encode(coderToolset, triple);
169 decode(protocolFilter, coderToolset, triple, tripleEncoded);
172 @SuppressWarnings("unchecked")
173 private void decode(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset,
174 Triple<String, String, String> triple, String tripleEncoded) {
176 Triple<String, String, String> tripleDecoded = null;
178 tripleDecoded = (Triple<String, String, String>) coderToolset.decode(tripleEncoded);
179 } catch (UnsupportedOperationException e) {
181 logger.trace("Junit expected exception - decode does not pass filtering", e);
184 CoderFilters coderFilters = coderToolset.getCoder(Triple.class.getCanonicalName());
185 Assert.assertTrue(coderFilters.getCodedClass() == Triple.class.getCanonicalName());
186 Assert.assertTrue(coderFilters.getFilter() == protocolFilter);
187 Assert.assertTrue(coderFilters.getFilter().getRules("second").size() == 1);
188 Assert.assertTrue(coderFilters.getFilter().getRules("third").size() == 1);
190 coderFilters.getFilter().getRules("second").get(0).setRegex("^v2$");
191 coderFilters.getFilter().getRules("third").get(0).setRegex(".*v3.*");
193 tripleDecoded = (Triple<String, String, String>) coderToolset.decode(tripleEncoded);
195 Assert.assertTrue(tripleDecoded.first().equals(triple.first()));
196 Assert.assertTrue(tripleDecoded.second().equals(triple.second()));
197 Assert.assertTrue(tripleDecoded.third().equals(triple.third()));
199 coderFilters.getFilter().deleteRules("third");
200 Assert.assertTrue(coderFilters.getFilter().getRules("third").isEmpty());
202 tripleDecoded = (Triple<String, String, String>) coderToolset.decode(tripleEncoded);
204 Assert.assertTrue(tripleDecoded.first().equals(triple.first()));
205 Assert.assertTrue(tripleDecoded.second().equals(triple.second()));
206 Assert.assertTrue(tripleDecoded.third().equals(triple.third()));
208 coderFilters.getFilter().addRule("third", ".*v3.*");
211 private String encode(ProtocolCoderToolset coderToolset, Triple<String, String, String> triple) {
212 String tripleEncoded = coderToolset.encode(triple);
213 Assert.assertTrue(!tripleEncoded.isEmpty());
214 return tripleEncoded;
217 private void addRemoveCoder(ProtocolCoderToolset coderToolset) {
218 List<FilterRule> filters = new ArrayList<>();
219 filters.add(new FilterRule("second", ".*"));
221 coderToolset.addCoder(this.getClass().getCanonicalName(), new JsonProtocolFilter(filters), 654321);
222 Assert.assertTrue(coderToolset.getCoders().size() == 2);
224 coderToolset.removeCoders(this.getClass().getCanonicalName());
225 Assert.assertTrue(coderToolset.getCoders().size() == 1);
228 private void updateCoderFilterRule(ProtocolCoderToolset coderToolset) {
229 List<FilterRule> filters = new ArrayList<>();
230 filters.add(new FilterRule("third", ".*"));
231 coderToolset.addCoder(Triple.class.getCanonicalName(), new JsonProtocolFilter(filters), 654321);
233 Assert.assertTrue(coderToolset.getCoders().size() == 1);
235 Assert.assertTrue(coderToolset.getCoder(Triple.class.getCanonicalName()).getModelClassLoaderHash() == 654321);
238 coderToolset.getCoder(Triple.class.getCanonicalName()).getFilter().getRules("third").size() == 1);
241 coderToolset.getCoder(Triple.class.getCanonicalName()).getFilter().getRules("third").size() == 1);
243 Assert.assertTrue(".*".equals(coderToolset.getCoder(Triple.class.getCanonicalName()).getFilter()
244 .getRules("third").get(0).getRegex()));
247 private void validateInitialization(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset) {
248 Assert.assertTrue(CONTROLLER_ID.equals(coderToolset.getControllerId()));
249 Assert.assertTrue(this.releaseId.getGroupId().equals(coderToolset.getGroupId()));
250 Assert.assertTrue(this.releaseId.getArtifactId().equals(coderToolset.getArtifactId()));
251 Assert.assertNull(coderToolset.getCustomCoder());
253 Assert.assertTrue(coderToolset.getCoders().size() == 1);
255 CoderFilters coderFilters = coderToolset.getCoder(CONTROLLER_ID);
256 Assert.assertTrue(coderFilters == null);
258 coderFilters = coderToolset.getCoder(Triple.class.getCanonicalName());
259 Assert.assertNotNull(coderFilters);
261 Assert.assertEquals(coderFilters.getFilter(), protocolFilter);
264 private void createController() {
265 if (releaseId == null) {
266 throw new IllegalStateException("no prereq artifact installed in maven repository");
269 Properties sinkConfig = new Properties();
270 sinkConfig.put(PolicyEndPointProperties.PROPERTY_NOOP_SINK_TOPICS, JUNIT_PROTOCOL_CODER_TOPIC);
271 final List<? extends TopicSink> noopTopics = TopicEndpoint.manager.addTopicSinks(sinkConfig);
273 Properties droolsControllerConfig = new Properties();
274 droolsControllerConfig.put(DroolsProperties.RULES_GROUPID, releaseId.getGroupId());
275 droolsControllerConfig.put(DroolsProperties.RULES_ARTIFACTID, releaseId.getArtifactId());
276 droolsControllerConfig.put(DroolsProperties.RULES_VERSION, releaseId.getVersion());
277 droolsControllerConfig.put(PolicyEndPointProperties.PROPERTY_NOOP_SINK_TOPICS + "." + JUNIT_PROTOCOL_CODER_TOPIC
278 + PolicyEndPointProperties.PROPERTY_TOPIC_EVENTS_SUFFIX, Triple.class.getCanonicalName());
280 DroolsController.factory.build(droolsControllerConfig, null, noopTopics);
283 private JsonProtocolFilter createFilterSet() {
284 List<FilterRule> filters = new ArrayList<>();
285 filters.add(new FilterRule("first", ".*"));
286 filters.add(new FilterRule("second", "^blah.*"));
287 filters.add(new FilterRule("third", "^hello$"));
289 return new JsonProtocolFilter(filters);