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