e3dd7c5487a36f0776120009c262fa02f26d70b8
[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 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;
49
50 /**
51  * ProtocolCoder Toolset JUNITs
52  */
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>";
60
61     private static Logger logger = LoggerFactory.getLogger(ProtocolCoderToolset.class);
62
63     private volatile ReleaseId releaseId;
64
65     public static final Gson customCoder = new GsonBuilder().create();
66
67     @Before
68     public void setUp() throws IOException {
69         if (releaseId != null)
70             return;
71
72         String pom = new String(Files.readAllBytes
73             (Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_POM_PATH)));
74
75         if (!pom.contains(ARTIFACT_ID_POM_LINE))
76             throw new IllegalArgumentException("unexpected junit test pom");
77
78         String newPom = pom.replace(ARTIFACT_ID_ECHO,  JUNIT_PROTOCOL_CODER_ARTIFACT_ID);
79
80         String kmodule = new String(Files.readAllBytes
81             (Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_PATH)));
82
83         String drl = new String(Files.readAllBytes
84             (Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_DRL_PATH)));
85
86         releaseId =
87             KieUtils.installArtifact(kmodule, newPom,
88                     MavenDroolsControllerTest.JUNIT_ECHO_KJAR_DRL_PATH, drl);
89     }
90
91     @Test
92     public void testToolsets() {
93         createController();
94         testGsonToolset(createFilterSet());
95         testJacksonToolset(createFilterSet());
96     }
97
98     public void testGsonToolset(JsonProtocolFilter protocolFilter) {
99         GsonProtocolCoderToolset gsonToolset =
100             new GsonProtocolCoderToolset(JUNIT_PROTOCOL_CODER_TOPIC,
101                 CONTROLLER_ID,
102                 this.releaseId.getGroupId(),
103                 this.releaseId.getArtifactId(),
104                 Triple.class.getCanonicalName(),
105                 protocolFilter,
106                 null,
107                 12345678);
108
109         Assert.assertNotNull(gsonToolset.getEncoder());
110         Assert.assertNotNull(gsonToolset.getDecoder());
111
112         testToolset(protocolFilter, gsonToolset);
113
114         Triple<String, String, String> triple = createTriple();
115         gsonToolset.setCustomCoder(new CustomGsonCoder(this.getClass().getCanonicalName(),
116                                     "customCoder"));
117         String tripleEncoded = encode(gsonToolset, triple);
118         decode(protocolFilter, gsonToolset, triple, tripleEncoded);
119     }
120
121     private Triple<String, String, String> createTriple() {
122         return new Triple<>("v1", "v2", "v3");
123     }
124
125     public void testJacksonToolset(JsonProtocolFilter protocolFilter) {
126         JacksonProtocolCoderToolset jacksonToolset =
127             new JacksonProtocolCoderToolset(JUNIT_PROTOCOL_CODER_TOPIC,
128                 CONTROLLER_ID,
129                 this.releaseId.getGroupId(),
130                 this.releaseId.getArtifactId(),
131                 Triple.class.getCanonicalName(),
132                 protocolFilter,
133                 null,
134                 12345678);
135
136         jacksonToolset.getEncoder().setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
137         jacksonToolset.getDecoder().setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
138
139         testToolset(protocolFilter, jacksonToolset);
140     }
141
142     private void testToolset(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset) {
143
144         validateInitialization(protocolFilter, coderToolset);
145
146         updateCoderFilterRule(coderToolset);
147
148         addRemoveCoder(coderToolset);
149
150         /* restore original filters */
151         coderToolset.addCoder(Triple.class.getCanonicalName(), protocolFilter, 654321);
152
153         Triple<String, String, String> triple = createTriple();
154
155         String tripleEncoded = encode(coderToolset, triple);
156
157         decode(protocolFilter, coderToolset, triple, tripleEncoded);
158     }
159
160     private void decode(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset,
161                         Triple<String, String, String> triple, String tripleEncoded) {
162
163         Triple<String, String, String> tripleDecoded = null;
164         try {
165             tripleDecoded =
166                 (Triple<String, String, String>) coderToolset.decode(tripleEncoded);
167         } catch(UnsupportedOperationException e){
168             /* OK */
169             logger.trace("Junit expected exception - decode does not pass filtering", e);
170         }
171
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);
177
178         coderFilters.getFilter().getRules("second").get(0).setRegex("^v2$");
179         coderFilters.getFilter().getRules("third").get(0).setRegex(".*v3.*");
180
181         tripleDecoded =
182             (Triple<String, String, String>) coderToolset.decode(tripleEncoded);
183
184         Assert.assertTrue(tripleDecoded.first().equals(triple.first()));
185         Assert.assertTrue(tripleDecoded.second().equals(triple.second()));
186         Assert.assertTrue(tripleDecoded.third().equals(triple.third()));
187
188         coderFilters.getFilter().deleteRules("third");
189         Assert.assertTrue(coderFilters.getFilter().getRules("third").isEmpty());
190
191         tripleDecoded =
192             (Triple<String, String, String>) coderToolset.decode(tripleEncoded);
193
194         Assert.assertTrue(tripleDecoded.first().equals(triple.first()));
195         Assert.assertTrue(tripleDecoded.second().equals(triple.second()));
196         Assert.assertTrue(tripleDecoded.third().equals(triple.third()));
197
198         coderFilters.getFilter().addRule("third", ".*v3.*");
199     }
200
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;
205     }
206
207     private void addRemoveCoder(ProtocolCoderToolset coderToolset) {
208         List<FilterRule> filters = new ArrayList<>();
209         filters.add(new FilterRule("second", ".*"));
210
211         coderToolset.addCoder(this.getClass().getCanonicalName(), new JsonProtocolFilter(filters),654321);
212         Assert.assertTrue(coderToolset.getCoders().size() == 2);
213
214         coderToolset.removeCoders(this.getClass().getCanonicalName());
215         Assert.assertTrue(coderToolset.getCoders().size() == 1);
216     }
217
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);
223
224         Assert.assertTrue(coderToolset.getCoders().size() == 1);
225
226         Assert.assertTrue
227             (coderToolset.getCoder(Triple.class.getCanonicalName()).
228                 getModelClassLoaderHash() == 654321);
229
230         Assert.assertTrue
231             (coderToolset.getCoder(Triple.class.getCanonicalName()).
232                 getFilter().getRules("third").size() == 1);
233
234         Assert.assertTrue
235             (coderToolset.getCoder(Triple.class.getCanonicalName()).
236                 getFilter().getRules("third").size() == 1);
237
238         Assert.assertTrue
239             (".*".equals(coderToolset.getCoder(Triple.class.getCanonicalName()).
240                 getFilter().getRules("third").get(0).getRegex()));
241     }
242
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());
248
249         Assert.assertTrue(coderToolset.getCoders().size() == 1);
250
251         CoderFilters coderFilters = coderToolset.getCoder(CONTROLLER_ID);
252         Assert.assertTrue(coderFilters == null);
253
254         coderFilters = coderToolset.getCoder(Triple.class.getCanonicalName());
255         Assert.assertNotNull(coderFilters);
256
257         Assert.assertEquals(coderFilters.getFilter(), protocolFilter);
258     }
259
260     private void createController() {
261         if (releaseId == null)
262             throw new IllegalStateException("no prereq artifact installed in maven repository");
263
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);
268
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());
276
277         DroolsController droolsController =
278             DroolsController.factory.build(droolsControllerConfig, null, noopTopics);
279     }
280
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$"));
286
287         return new JsonProtocolFilter(filters);
288     }
289 }