d28f1e528e33d74a7501624d28efef800b9d1c3b
[policy/drools-pdp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP
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
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.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
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;
34
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;
52
53 /**
54  * ProtocolCoder Toolset JUNITs.
55  */
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>";
62
63     private static Logger logger = LoggerFactory.getLogger(ProtocolCoderToolset.class);
64
65     private volatile ReleaseId releaseId;
66
67     public static final Gson customCoder = new GsonBuilder().create();
68
69     /**
70      * Setup.
71      * 
72      * @throws IOException throws IO Exception
73      */
74     @Before
75     public void setUp() throws IOException {
76         if (releaseId != null) {
77             return;
78         }
79
80         String pom = new String(Files.readAllBytes(Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_POM_PATH)));
81
82         if (!pom.contains(ARTIFACT_ID_POM_LINE)) {
83             throw new IllegalArgumentException("unexpected junit test pom");
84         }
85
86         String newPom = pom.replace(ARTIFACT_ID_ECHO, JUNIT_PROTOCOL_CODER_ARTIFACT_ID);
87
88         String kmodule = new String(Files.readAllBytes(Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_PATH)));
89
90         String drl = new String(Files.readAllBytes(Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_DRL_PATH)));
91
92         releaseId = KieUtils.installArtifact(kmodule, newPom, MavenDroolsControllerTest.JUNIT_ECHO_KJAR_DRL_PATH, drl);
93     }
94
95     @Test
96     public void testToolsets() {
97         createController();
98         testGsonToolset(createFilterSet());
99         testJacksonToolset(createFilterSet());
100     }
101
102     /**
103      * Test the Gson toolset.
104      * 
105      * @param protocolFilter protocol filter
106      */
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);
116
117         Assert.assertNotNull(gsonToolset.getEncoder());
118         Assert.assertNotNull(gsonToolset.getDecoder());
119
120         testToolset(protocolFilter, gsonToolset);
121
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);
126     }
127
128     private Triple<String, String, String> createTriple() {
129         return new Triple<>("v1", "v2", "v3");
130     }
131
132     /**
133      * Test Jackson toolset.
134      * 
135      * @param protocolFilter protocol filter
136      */
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);
147
148         jacksonToolset.getEncoder().setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
149         jacksonToolset.getDecoder().setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
150
151         testToolset(protocolFilter, jacksonToolset);
152     }
153
154     private void testToolset(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset) {
155
156         validateInitialization(protocolFilter, coderToolset);
157
158         updateCoderFilterRule(coderToolset);
159
160         addRemoveCoder(coderToolset);
161
162         /* restore original filters */
163         coderToolset.addCoder(Triple.class.getCanonicalName(), protocolFilter, 654321);
164
165         Triple<String, String, String> triple = createTriple();
166
167         String tripleEncoded = encode(coderToolset, triple);
168
169         decode(protocolFilter, coderToolset, triple, tripleEncoded);
170     }
171
172     @SuppressWarnings("unchecked")
173     private void decode(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset,
174             Triple<String, String, String> triple, String tripleEncoded) {
175
176         Triple<String, String, String> tripleDecoded = null;
177         try {
178             tripleDecoded = (Triple<String, String, String>) coderToolset.decode(tripleEncoded);
179         } catch (UnsupportedOperationException e) {
180             /* OK */
181             logger.trace("Junit expected exception - decode does not pass filtering", e);
182         }
183
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);
189
190         coderFilters.getFilter().getRules("second").get(0).setRegex("^v2$");
191         coderFilters.getFilter().getRules("third").get(0).setRegex(".*v3.*");
192
193         tripleDecoded = (Triple<String, String, String>) coderToolset.decode(tripleEncoded);
194
195         Assert.assertTrue(tripleDecoded.first().equals(triple.first()));
196         Assert.assertTrue(tripleDecoded.second().equals(triple.second()));
197         Assert.assertTrue(tripleDecoded.third().equals(triple.third()));
198
199         coderFilters.getFilter().deleteRules("third");
200         Assert.assertTrue(coderFilters.getFilter().getRules("third").isEmpty());
201
202         tripleDecoded = (Triple<String, String, String>) coderToolset.decode(tripleEncoded);
203
204         Assert.assertTrue(tripleDecoded.first().equals(triple.first()));
205         Assert.assertTrue(tripleDecoded.second().equals(triple.second()));
206         Assert.assertTrue(tripleDecoded.third().equals(triple.third()));
207
208         coderFilters.getFilter().addRule("third", ".*v3.*");
209     }
210
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;
215     }
216
217     private void addRemoveCoder(ProtocolCoderToolset coderToolset) {
218         List<FilterRule> filters = new ArrayList<>();
219         filters.add(new FilterRule("second", ".*"));
220
221         coderToolset.addCoder(this.getClass().getCanonicalName(), new JsonProtocolFilter(filters), 654321);
222         Assert.assertTrue(coderToolset.getCoders().size() == 2);
223
224         coderToolset.removeCoders(this.getClass().getCanonicalName());
225         Assert.assertTrue(coderToolset.getCoders().size() == 1);
226     }
227
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);
232
233         Assert.assertTrue(coderToolset.getCoders().size() == 1);
234
235         Assert.assertTrue(coderToolset.getCoder(Triple.class.getCanonicalName()).getModelClassLoaderHash() == 654321);
236
237         Assert.assertTrue(
238                 coderToolset.getCoder(Triple.class.getCanonicalName()).getFilter().getRules("third").size() == 1);
239
240         Assert.assertTrue(
241                 coderToolset.getCoder(Triple.class.getCanonicalName()).getFilter().getRules("third").size() == 1);
242
243         Assert.assertTrue(".*".equals(coderToolset.getCoder(Triple.class.getCanonicalName()).getFilter()
244                 .getRules("third").get(0).getRegex()));
245     }
246
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());
252
253         Assert.assertTrue(coderToolset.getCoders().size() == 1);
254
255         CoderFilters coderFilters = coderToolset.getCoder(CONTROLLER_ID);
256         Assert.assertTrue(coderFilters == null);
257
258         coderFilters = coderToolset.getCoder(Triple.class.getCanonicalName());
259         Assert.assertNotNull(coderFilters);
260
261         Assert.assertEquals(coderFilters.getFilter(), protocolFilter);
262     }
263
264     private void createController() {
265         if (releaseId == null) {
266             throw new IllegalStateException("no prereq artifact installed in maven repository");
267         }
268
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);
272
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());
279
280         DroolsController.factory.build(droolsControllerConfig, null, noopTopics);
281     }
282
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$"));
288
289         return new JsonProtocolFilter(filters);
290     }
291 }