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;
27 import java.io.IOException;
28 import java.nio.file.Files;
29 import java.nio.file.Paths;
30 import java.util.ArrayList;
31 import java.util.List;
32 import java.util.Properties;
33 import org.junit.Assert;
34 import org.junit.Before;
35 import org.junit.Test;
36 import org.kie.api.builder.ReleaseId;
37 import org.onap.policy.drools.controller.DroolsController;
38 import org.onap.policy.drools.controller.internal.MavenDroolsControllerTest;
39 import org.onap.policy.drools.event.comm.TopicEndpoint;
40 import org.onap.policy.drools.event.comm.TopicSink;
41 import org.onap.policy.drools.properties.PolicyProperties;
42 import org.onap.policy.drools.protocol.coders.EventProtocolCoder.CoderFilters;
43 import org.onap.policy.drools.protocol.coders.JsonProtocolFilter.FilterRule;
44 import org.onap.policy.drools.protocol.coders.TopicCoderFilterConfiguration.CustomGsonCoder;
45 import org.onap.policy.drools.util.KieUtils;
46 import org.onap.policy.drools.utils.Triple;
47 import org.slf4j.Logger;
48 import org.slf4j.LoggerFactory;
51 * ProtocolCoder Toolset JUNITs
53 public class ProtocolCoderToolsetTest {
54 public static final String JUNIT_PROTOCOL_CODER_ARTIFACT_ID = "protocolcoder";
55 public static final String JUNIT_PROTOCOL_CODER_TOPIC = JUNIT_PROTOCOL_CODER_ARTIFACT_ID;
56 public static final String CONTROLLER_ID = "blah";
57 public static final String ARTIFACT_ID_ECHO = "echo";
58 public static final String ARTIFACT_ID_POM_LINE =
59 "<artifactId>" + ARTIFACT_ID_ECHO + "</artifactId>";
61 private static Logger logger = LoggerFactory.getLogger(ProtocolCoderToolset.class);
63 private volatile ReleaseId releaseId;
65 public static final Gson customCoder = new GsonBuilder().create();
68 public void setUp() throws IOException {
69 if (releaseId != null)
72 String pom = new String(Files.readAllBytes
73 (Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_POM_PATH)));
75 if (!pom.contains(ARTIFACT_ID_POM_LINE))
76 throw new IllegalArgumentException("unexpected junit test pom");
78 String newPom = pom.replace(ARTIFACT_ID_ECHO, JUNIT_PROTOCOL_CODER_ARTIFACT_ID);
80 String kmodule = new String(Files.readAllBytes
81 (Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_PATH)));
83 String drl = new String(Files.readAllBytes
84 (Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_DRL_PATH)));
87 KieUtils.installArtifact(kmodule, newPom,
88 MavenDroolsControllerTest.JUNIT_ECHO_KJAR_DRL_PATH, drl);
92 public void testToolsets() {
94 testGsonToolset(createFilterSet());
95 testJacksonToolset(createFilterSet());
98 public void testGsonToolset(JsonProtocolFilter protocolFilter) {
99 GsonProtocolCoderToolset gsonToolset =
100 new GsonProtocolCoderToolset(JUNIT_PROTOCOL_CODER_TOPIC,
102 this.releaseId.getGroupId(),
103 this.releaseId.getArtifactId(),
104 Triple.class.getCanonicalName(),
109 Assert.assertNotNull(gsonToolset.getEncoder());
110 Assert.assertNotNull(gsonToolset.getDecoder());
112 testToolset(protocolFilter, gsonToolset);
114 Triple<String, String, String> triple = createTriple();
115 gsonToolset.setCustomCoder(new CustomGsonCoder(this.getClass().getCanonicalName(),
117 String tripleEncoded = encode(gsonToolset, triple);
118 decode(protocolFilter, gsonToolset, triple, tripleEncoded);
121 private Triple<String, String, String> createTriple() {
122 return new Triple<>("v1", "v2", "v3");
125 public void testJacksonToolset(JsonProtocolFilter protocolFilter) {
126 JacksonProtocolCoderToolset jacksonToolset =
127 new JacksonProtocolCoderToolset(JUNIT_PROTOCOL_CODER_TOPIC,
129 this.releaseId.getGroupId(),
130 this.releaseId.getArtifactId(),
131 Triple.class.getCanonicalName(),
136 jacksonToolset.getEncoder().setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
137 jacksonToolset.getDecoder().setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
139 testToolset(protocolFilter, jacksonToolset);
142 private void testToolset(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset) {
144 validateInitialization(protocolFilter, coderToolset);
146 updateCoderFilterRule(coderToolset);
148 addRemoveCoder(coderToolset);
150 /* restore original filters */
151 coderToolset.addCoder(Triple.class.getCanonicalName(), protocolFilter, 654321);
153 Triple<String, String, String> triple = createTriple();
155 String tripleEncoded = encode(coderToolset, triple);
157 decode(protocolFilter, coderToolset, triple, tripleEncoded);
160 private void decode(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset,
161 Triple<String, String, String> triple, String tripleEncoded) {
163 Triple<String, String, String> tripleDecoded = null;
166 (Triple<String, String, String>) coderToolset.decode(tripleEncoded);
167 } catch(UnsupportedOperationException e){
169 logger.trace("Junit expected exception - decode does not pass filtering", e);
172 CoderFilters coderFilters = coderToolset.getCoder(Triple.class.getCanonicalName());
173 Assert.assertTrue(coderFilters.getCodedClass() == Triple.class.getCanonicalName());
174 Assert.assertTrue(coderFilters.getFilter() == protocolFilter);
175 Assert.assertTrue(coderFilters.getFilter().getRules("second").size() == 1);
176 Assert.assertTrue(coderFilters.getFilter().getRules("third").size() == 1);
178 coderFilters.getFilter().getRules("second").get(0).setRegex("^v2$");
179 coderFilters.getFilter().getRules("third").get(0).setRegex(".*v3.*");
182 (Triple<String, String, String>) coderToolset.decode(tripleEncoded);
184 Assert.assertTrue(tripleDecoded.first().equals(triple.first()));
185 Assert.assertTrue(tripleDecoded.second().equals(triple.second()));
186 Assert.assertTrue(tripleDecoded.third().equals(triple.third()));
188 coderFilters.getFilter().deleteRules("third");
189 Assert.assertTrue(coderFilters.getFilter().getRules("third").isEmpty());
192 (Triple<String, String, String>) coderToolset.decode(tripleEncoded);
194 Assert.assertTrue(tripleDecoded.first().equals(triple.first()));
195 Assert.assertTrue(tripleDecoded.second().equals(triple.second()));
196 Assert.assertTrue(tripleDecoded.third().equals(triple.third()));
198 coderFilters.getFilter().addRule("third", ".*v3.*");
201 private String encode(ProtocolCoderToolset coderToolset, Triple<String, String, String> triple) {
202 String tripleEncoded = coderToolset.encode(triple);
203 Assert.assertTrue(!tripleEncoded.isEmpty());
204 return tripleEncoded;
207 private void addRemoveCoder(ProtocolCoderToolset coderToolset) {
208 List<FilterRule> filters = new ArrayList<>();
209 filters.add(new FilterRule("second", ".*"));
211 coderToolset.addCoder(this.getClass().getCanonicalName(), new JsonProtocolFilter(filters),654321);
212 Assert.assertTrue(coderToolset.getCoders().size() == 2);
214 coderToolset.removeCoders(this.getClass().getCanonicalName());
215 Assert.assertTrue(coderToolset.getCoders().size() == 1);
218 private void updateCoderFilterRule(ProtocolCoderToolset coderToolset) {
219 List<FilterRule> filters = new ArrayList<>();
220 filters.add(new FilterRule("third", ".*"));
221 coderToolset.addCoder(Triple.class.getCanonicalName(),
222 new JsonProtocolFilter(filters), 654321);
224 Assert.assertTrue(coderToolset.getCoders().size() == 1);
227 (coderToolset.getCoder(Triple.class.getCanonicalName()).
228 getModelClassLoaderHash() == 654321);
231 (coderToolset.getCoder(Triple.class.getCanonicalName()).
232 getFilter().getRules("third").size() == 1);
235 (coderToolset.getCoder(Triple.class.getCanonicalName()).
236 getFilter().getRules("third").size() == 1);
239 (".*".equals(coderToolset.getCoder(Triple.class.getCanonicalName()).
240 getFilter().getRules("third").get(0).getRegex()));
243 private void validateInitialization(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset) {
244 Assert.assertTrue(CONTROLLER_ID.equals(coderToolset.getControllerId()));
245 Assert.assertTrue(this.releaseId.getGroupId().equals(coderToolset.getGroupId()));
246 Assert.assertTrue(this.releaseId.getArtifactId().equals(coderToolset.getArtifactId()));
247 Assert.assertNull(coderToolset.getCustomCoder());
249 Assert.assertTrue(coderToolset.getCoders().size() == 1);
251 CoderFilters coderFilters = coderToolset.getCoder(CONTROLLER_ID);
252 Assert.assertTrue(coderFilters == null);
254 coderFilters = coderToolset.getCoder(Triple.class.getCanonicalName());
255 Assert.assertNotNull(coderFilters);
257 Assert.assertEquals(coderFilters.getFilter(), protocolFilter);
260 private void createController() {
261 if (releaseId == null)
262 throw new IllegalStateException("no prereq artifact installed in maven repository");
264 Properties sinkConfig = new Properties();
265 sinkConfig.put(PolicyProperties.PROPERTY_NOOP_SINK_TOPICS, JUNIT_PROTOCOL_CODER_TOPIC);
266 List<? extends TopicSink> noopTopics =
267 TopicEndpoint.manager.addTopicSinks(sinkConfig);
269 Properties droolsControllerConfig = new Properties();
270 droolsControllerConfig.put(PolicyProperties.RULES_GROUPID, releaseId.getGroupId());
271 droolsControllerConfig.put(PolicyProperties.RULES_ARTIFACTID, releaseId.getArtifactId());
272 droolsControllerConfig.put(PolicyProperties.RULES_VERSION, releaseId.getVersion());
273 droolsControllerConfig.put(PolicyProperties.PROPERTY_NOOP_SINK_TOPICS + "." +
274 JUNIT_PROTOCOL_CODER_TOPIC + PolicyProperties.PROPERTY_TOPIC_EVENTS_SUFFIX,
275 Triple.class.getCanonicalName());
277 DroolsController droolsController =
278 DroolsController.factory.build(droolsControllerConfig, null, noopTopics);
281 private JsonProtocolFilter createFilterSet() {
282 List<FilterRule> filters = new ArrayList<>();
283 filters.add(new FilterRule("first", ".*"));
284 filters.add(new FilterRule("second", "^blah.*"));
285 filters.add(new FilterRule("third", "^hello$"));
287 return new JsonProtocolFilter(filters);