Remove jackson from policy coders
[policy/drools-pdp.git] / policy-management / src / test / java / org / onap / policy / drools / protocol / coders / ProtocolCoderToolsetTest.java
1 /*
2  * ============LICENSE_START=======================================================
3  * ONAP
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
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
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=========================================================
19  */
20
21 package org.onap.policy.drools.protocol.coders;
22
23 import com.google.gson.Gson;
24 import com.google.gson.GsonBuilder;
25 import java.io.IOException;
26 import java.nio.file.Files;
27 import java.nio.file.Paths;
28 import java.util.ArrayList;
29 import java.util.List;
30 import java.util.Properties;
31 import org.junit.Assert;
32 import org.junit.Before;
33 import org.junit.Test;
34 import org.kie.api.builder.ReleaseId;
35 import org.onap.policy.common.endpoints.event.comm.TopicEndpoint;
36 import org.onap.policy.common.endpoints.event.comm.TopicSink;
37 import org.onap.policy.common.endpoints.properties.PolicyEndPointProperties;
38 import org.onap.policy.drools.controller.DroolsController;
39 import org.onap.policy.drools.controller.internal.MavenDroolsControllerTest;
40 import org.onap.policy.drools.properties.DroolsProperties;
41 import org.onap.policy.drools.protocol.coders.EventProtocolCoder.CoderFilters;
42 import org.onap.policy.drools.protocol.coders.JsonProtocolFilter.FilterRule;
43 import org.onap.policy.drools.protocol.coders.TopicCoderFilterConfiguration.CustomGsonCoder;
44 import org.onap.policy.drools.util.KieUtils;
45 import org.onap.policy.drools.utils.Triple;
46 import org.slf4j.Logger;
47 import org.slf4j.LoggerFactory;
48
49 /**
50  * ProtocolCoder Toolset JUNITs.
51  */
52 public class ProtocolCoderToolsetTest {
53     public static final String JUNIT_PROTOCOL_CODER_ARTIFACT_ID = "protocolcoder";
54     public static final String JUNIT_PROTOCOL_CODER_TOPIC = JUNIT_PROTOCOL_CODER_ARTIFACT_ID;
55     public static final String CONTROLLER_ID = "blah";
56     public static final String ARTIFACT_ID_ECHO = "echo";
57     public static final String ARTIFACT_ID_POM_LINE = "<artifactId>" + ARTIFACT_ID_ECHO + "</artifactId>";
58
59     private static Logger logger = LoggerFactory.getLogger(ProtocolCoderToolset.class);
60
61     private volatile ReleaseId releaseId;
62
63     public static final Gson customCoder = new GsonBuilder().create();
64
65     /**
66      * Setup.
67      * 
68      * @throws IOException throws IO Exception
69      */
70     @Before
71     public void setUp() throws IOException {
72         if (releaseId != null) {
73             return;
74         }
75
76         String pom = new String(Files.readAllBytes(Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_POM_PATH)));
77
78         if (!pom.contains(ARTIFACT_ID_POM_LINE)) {
79             throw new IllegalArgumentException("unexpected junit test pom");
80         }
81
82         String newPom = pom.replace(ARTIFACT_ID_ECHO, JUNIT_PROTOCOL_CODER_ARTIFACT_ID);
83
84         String kmodule = new String(Files.readAllBytes(Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_PATH)));
85
86         String drl = new String(Files.readAllBytes(Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_DRL_PATH)));
87
88         releaseId = KieUtils.installArtifact(kmodule, newPom, MavenDroolsControllerTest.JUNIT_ECHO_KJAR_DRL_PATH, drl);
89     }
90
91     @Test
92     public void testToolsets() {
93         createController();
94         testGsonToolset(createFilterSet());
95     }
96
97     /**
98      * Test the Gson toolset.
99      * 
100      * @param protocolFilter protocol filter
101      */
102     public void testGsonToolset(JsonProtocolFilter protocolFilter) {
103         GsonProtocolCoderToolset gsonToolset = new GsonProtocolCoderToolset(
104                 EventProtocolParams.builder().topic(JUNIT_PROTOCOL_CODER_TOPIC)
105                         .groupId(this.releaseId.getGroupId())
106                         .artifactId(this.releaseId.getArtifactId())
107                         .eventClass(Triple.class.getCanonicalName())
108                         .protocolFilter(protocolFilter)
109                         .customGsonCoder(null)
110                         .modelClassLoaderHash(12345678), CONTROLLER_ID);
111
112         Assert.assertNotNull(gsonToolset.getEncoder());
113         Assert.assertNotNull(gsonToolset.getDecoder());
114
115         testToolset(protocolFilter, gsonToolset);
116
117         Triple<String, String, String> triple = createTriple();
118         gsonToolset.setCustomCoder(new CustomGsonCoder(this.getClass().getCanonicalName(), "customCoder"));
119         String tripleEncoded = encode(gsonToolset, triple);
120         decode(protocolFilter, gsonToolset, triple, tripleEncoded);
121     }
122
123     private Triple<String, String, String> createTriple() {
124         return new Triple<>("v1", "v2", "v3");
125     }
126
127     private void testToolset(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset) {
128
129         validateInitialization(protocolFilter, coderToolset);
130
131         updateCoderFilterRule(coderToolset);
132
133         addRemoveCoder(coderToolset);
134
135         /* restore original filters */
136         coderToolset.addCoder(Triple.class.getCanonicalName(), protocolFilter, 654321);
137
138         Triple<String, String, String> triple = createTriple();
139
140         String tripleEncoded = encode(coderToolset, triple);
141
142         decode(protocolFilter, coderToolset, triple, tripleEncoded);
143     }
144
145     @SuppressWarnings("unchecked")
146     private void decode(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset,
147             Triple<String, String, String> triple, String tripleEncoded) {
148
149         Triple<String, String, String> tripleDecoded = null;
150         try {
151             tripleDecoded = (Triple<String, String, String>) coderToolset.decode(tripleEncoded);
152         } catch (UnsupportedOperationException e) {
153             /* OK */
154             logger.trace("Junit expected exception - decode does not pass filtering", e);
155         }
156
157         CoderFilters coderFilters = coderToolset.getCoder(Triple.class.getCanonicalName());
158         Assert.assertTrue(coderFilters.getCodedClass() == Triple.class.getCanonicalName());
159         Assert.assertTrue(coderFilters.getFilter() == protocolFilter);
160         Assert.assertTrue(coderFilters.getFilter().getRules("second").size() == 1);
161         Assert.assertTrue(coderFilters.getFilter().getRules("third").size() == 1);
162
163         coderFilters.getFilter().getRules("second").get(0).setRegex("^v2$");
164         coderFilters.getFilter().getRules("third").get(0).setRegex(".*v3.*");
165
166         tripleDecoded = (Triple<String, String, String>) coderToolset.decode(tripleEncoded);
167
168         Assert.assertTrue(tripleDecoded.first().equals(triple.first()));
169         Assert.assertTrue(tripleDecoded.second().equals(triple.second()));
170         Assert.assertTrue(tripleDecoded.third().equals(triple.third()));
171
172         coderFilters.getFilter().deleteRules("third");
173         Assert.assertTrue(coderFilters.getFilter().getRules("third").isEmpty());
174
175         tripleDecoded = (Triple<String, String, String>) coderToolset.decode(tripleEncoded);
176
177         Assert.assertTrue(tripleDecoded.first().equals(triple.first()));
178         Assert.assertTrue(tripleDecoded.second().equals(triple.second()));
179         Assert.assertTrue(tripleDecoded.third().equals(triple.third()));
180
181         coderFilters.getFilter().addRule("third", ".*v3.*");
182     }
183
184     private String encode(ProtocolCoderToolset coderToolset, Triple<String, String, String> triple) {
185         String tripleEncoded = coderToolset.encode(triple);
186         Assert.assertTrue(!tripleEncoded.isEmpty());
187         return tripleEncoded;
188     }
189
190     private void addRemoveCoder(ProtocolCoderToolset coderToolset) {
191         List<FilterRule> filters = new ArrayList<>();
192         filters.add(new FilterRule("second", ".*"));
193
194         coderToolset.addCoder(this.getClass().getCanonicalName(), new JsonProtocolFilter(filters), 654321);
195         Assert.assertTrue(coderToolset.getCoders().size() == 2);
196
197         coderToolset.removeCoders(this.getClass().getCanonicalName());
198         Assert.assertTrue(coderToolset.getCoders().size() == 1);
199     }
200
201     private void updateCoderFilterRule(ProtocolCoderToolset coderToolset) {
202         List<FilterRule> filters = new ArrayList<>();
203         filters.add(new FilterRule("third", ".*"));
204         coderToolset.addCoder(Triple.class.getCanonicalName(), new JsonProtocolFilter(filters), 654321);
205
206         Assert.assertTrue(coderToolset.getCoders().size() == 1);
207
208         Assert.assertTrue(coderToolset.getCoder(Triple.class.getCanonicalName()).getModelClassLoaderHash() == 654321);
209
210         Assert.assertTrue(
211                 coderToolset.getCoder(Triple.class.getCanonicalName()).getFilter().getRules("third").size() == 1);
212
213         Assert.assertTrue(
214                 coderToolset.getCoder(Triple.class.getCanonicalName()).getFilter().getRules("third").size() == 1);
215
216         Assert.assertTrue(".*".equals(coderToolset.getCoder(Triple.class.getCanonicalName()).getFilter()
217                 .getRules("third").get(0).getRegex()));
218     }
219
220     private void validateInitialization(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset) {
221         Assert.assertTrue(CONTROLLER_ID.equals(coderToolset.getControllerId()));
222         Assert.assertTrue(this.releaseId.getGroupId().equals(coderToolset.getGroupId()));
223         Assert.assertTrue(this.releaseId.getArtifactId().equals(coderToolset.getArtifactId()));
224         Assert.assertNull(coderToolset.getCustomCoder());
225
226         Assert.assertTrue(coderToolset.getCoders().size() == 1);
227
228         CoderFilters coderFilters = coderToolset.getCoder(CONTROLLER_ID);
229         Assert.assertTrue(coderFilters == null);
230
231         coderFilters = coderToolset.getCoder(Triple.class.getCanonicalName());
232         Assert.assertNotNull(coderFilters);
233
234         Assert.assertEquals(coderFilters.getFilter(), protocolFilter);
235     }
236
237     private void createController() {
238         if (releaseId == null) {
239             throw new IllegalStateException("no prereq artifact installed in maven repository");
240         }
241
242         Properties sinkConfig = new Properties();
243         sinkConfig.put(PolicyEndPointProperties.PROPERTY_NOOP_SINK_TOPICS, JUNIT_PROTOCOL_CODER_TOPIC);
244         final List<? extends TopicSink> noopTopics = TopicEndpoint.manager.addTopicSinks(sinkConfig);
245
246         Properties droolsControllerConfig = new Properties();
247         droolsControllerConfig.put(DroolsProperties.RULES_GROUPID, releaseId.getGroupId());
248         droolsControllerConfig.put(DroolsProperties.RULES_ARTIFACTID, releaseId.getArtifactId());
249         droolsControllerConfig.put(DroolsProperties.RULES_VERSION, releaseId.getVersion());
250         droolsControllerConfig.put(PolicyEndPointProperties.PROPERTY_NOOP_SINK_TOPICS + "." + JUNIT_PROTOCOL_CODER_TOPIC
251                 + PolicyEndPointProperties.PROPERTY_TOPIC_EVENTS_SUFFIX, Triple.class.getCanonicalName());
252
253         DroolsController.factory.build(droolsControllerConfig, null, noopTopics);
254     }
255
256     private JsonProtocolFilter createFilterSet() {
257         List<FilterRule> filters = new ArrayList<>();
258         filters.add(new FilterRule("first", ".*"));
259         filters.add(new FilterRule("second", "^blah.*"));
260         filters.add(new FilterRule("third", "^hello$"));
261
262         return new JsonProtocolFilter(filters);
263     }
264 }