7a5ed2c0ab933e0a232fb84560f0877240ab5079
[policy/drools-pdp.git] /
1 /*
2  * ============LICENSE_START=======================================================
3  * ONAP
4  * ================================================================================
5  * Copyright (C) 2018-2020 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.Paths;
27 import java.util.List;
28 import java.util.Properties;
29 import org.junit.After;
30 import org.junit.Assert;
31 import org.junit.Before;
32 import org.junit.BeforeClass;
33 import org.junit.Test;
34 import org.kie.api.builder.ReleaseId;
35 import org.onap.policy.common.endpoints.event.comm.TopicEndpointManager;
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.DroolsControllerConstants;
40 import org.onap.policy.drools.controller.internal.MavenDroolsControllerTest;
41 import org.onap.policy.drools.properties.DroolsPropertyConstants;
42 import org.onap.policy.drools.protocol.coders.EventProtocolCoder.CoderFilters;
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     private static final String JUNIT_PROTOCOL_CODER_ARTIFACT_ID = "protocolcoder";
54     private static final String JUNIT_PROTOCOL_CODER_TOPIC = JUNIT_PROTOCOL_CODER_ARTIFACT_ID;
55     private static final String CONTROLLER_ID = "blah";
56
57     private static Logger logger = LoggerFactory.getLogger(ProtocolCoderToolset.class);
58
59     private static volatile ReleaseId releaseId;
60
61     // customCoder has to be public to be accessed in tests below
62     public static final Gson customCoder = new GsonBuilder().create();
63
64     private DroolsController controller;
65
66     /**
67      * Test Class Initialization.
68      */
69     @BeforeClass
70     public static void setUpClass() throws IOException {
71         releaseId = KieUtils.installArtifact(
72             Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_PATH).toFile(),
73             Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_POM_PATH).toFile(),
74             MavenDroolsControllerTest.JUNIT_ECHO_KJAR_DRL_PATH,
75             Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_DRL_PATH).toFile());
76     }
77
78     /**
79      * Test Set Up.
80      */
81     @Before
82     public void setUp() {
83         controller = createController();
84     }
85
86     /**
87      * Test Termination.
88      */
89     @After
90     public void tearDown() {
91         if (controller != null) {
92             DroolsControllerConstants.getFactory().destroy(controller);
93         }
94     }
95
96     @Test
97     public void testToolsets() {
98         testGsonToolset(createFilterSet());
99     }
100
101     /**
102      * Test the Gson toolset.
103      *
104      * @param protocolFilter protocol filter
105      */
106     private void testGsonToolset(JsonProtocolFilter protocolFilter) {
107         GsonProtocolCoderToolset gsonToolset = new GsonProtocolCoderToolset(
108                 EventProtocolParams.builder().topic(JUNIT_PROTOCOL_CODER_TOPIC)
109                         .groupId(releaseId.getGroupId())
110                         .artifactId(releaseId.getArtifactId())
111                         .eventClass(Triple.class.getName())
112                         .protocolFilter(protocolFilter)
113                         .customGsonCoder(null)
114                         .modelClassLoaderHash(12345678), CONTROLLER_ID);
115
116         Assert.assertNotNull(gsonToolset.getEncoder());
117         Assert.assertNotNull(gsonToolset.getDecoder());
118
119         testToolset(protocolFilter, gsonToolset);
120
121         Triple<String, String, String> triple = createTriple();
122         gsonToolset.setCustomCoder(new CustomGsonCoder(this.getClass().getName(), "customCoder"));
123         String tripleEncoded = encode(gsonToolset, triple);
124         decode(protocolFilter, gsonToolset, triple, tripleEncoded);
125     }
126
127     private Triple<String, String, String> createTriple() {
128         return new Triple<>("v1", "v2", "v3");
129     }
130
131     private void testToolset(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset) {
132
133         validateInitialization(protocolFilter, coderToolset);
134
135         updateCoderFilterRule(coderToolset);
136
137         addRemoveCoder(coderToolset);
138
139         /* restore original filters */
140         coderToolset.addCoder(Triple.class.getName(), protocolFilter, 654321);
141
142         Triple<String, String, String> triple = createTriple();
143
144         String tripleEncoded = encode(coderToolset, triple);
145
146         decode(protocolFilter, coderToolset, triple, tripleEncoded);
147     }
148
149     @SuppressWarnings("unchecked")
150     private void decode(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset,
151             Triple<String, String, String> triple, String tripleEncoded) {
152
153         Triple<String, String, String> tripleDecoded = null;
154         try {
155             tripleDecoded = (Triple<String, String, String>) coderToolset.decode(tripleEncoded);
156         } catch (UnsupportedOperationException e) {
157             /* OK */
158             logger.trace("Junit expected exception - decode does not pass filtering", e);
159         }
160
161         CoderFilters coderFilters = coderToolset.getCoder(Triple.class.getName());
162         Assert.assertSame(coderFilters.getCodedClass(), Triple.class.getName());
163         Assert.assertSame(coderFilters.getFilter(), protocolFilter);
164         Assert.assertNotNull(coderFilters.getFilter().getRule());
165
166         coderFilters.getFilter().setRule("[?($.second =~ /^v2$/ && $.third =~ /.*v3.*/)]");
167
168         tripleDecoded = (Triple<String, String, String>) coderToolset.decode(tripleEncoded);
169
170         Assert.assertEquals(triple.first(), tripleDecoded.first());
171         Assert.assertEquals(triple.second(), tripleDecoded.second());
172         Assert.assertEquals(triple.third(), tripleDecoded.third());
173
174         coderFilters.getFilter().setRule(null);
175         Assert.assertEquals("[?($ =~ /.*/)]", coderFilters.getFilter().getRule());
176
177         tripleDecoded = (Triple<String, String, String>) coderToolset.decode(tripleEncoded);
178
179         Assert.assertTrue(tripleDecoded.first().equals(triple.first()));
180         Assert.assertTrue(tripleDecoded.second().equals(triple.second()));
181         Assert.assertTrue(tripleDecoded.third().equals(triple.third()));
182
183         coderFilters.getFilter().setRule("[?($.third =~ /.*v3.*/)]");
184     }
185
186     private String encode(ProtocolCoderToolset coderToolset, Triple<String, String, String> triple) {
187         String tripleEncoded = coderToolset.encode(triple);
188         Assert.assertTrue(!tripleEncoded.isEmpty());
189         return tripleEncoded;
190     }
191
192     private void addRemoveCoder(ProtocolCoderToolset coderToolset) {
193         coderToolset.addCoder(this.getClass().getName(),
194                 new JsonProtocolFilter("[?($.second =~ /.*/)]"), 654321);
195         Assert.assertEquals(2, coderToolset.getCoders().size());
196
197         coderToolset.removeCoders(this.getClass().getName());
198         Assert.assertEquals(1, coderToolset.getCoders().size());
199     }
200
201     private void updateCoderFilterRule(ProtocolCoderToolset coderToolset) {
202         coderToolset.addCoder(Triple.class.getName(), new JsonProtocolFilter("[?($.third =~ /.*/)]"), 654321);
203
204         Assert.assertEquals(1, coderToolset.getCoders().size());
205
206         Assert.assertEquals(654321, coderToolset.getCoder(Triple.class.getName()).getModelClassLoaderHash());
207
208         Assert.assertNotNull(
209                 coderToolset.getCoder(
210                         Triple.class.getName()).getFilter().getRule());
211
212         Assert.assertEquals("[?($.third =~ /.*/)]", coderToolset.getCoder(Triple.class.getName())
213                 .getFilter().getRule());
214     }
215
216     private void validateInitialization(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset) {
217         Assert.assertEquals(CONTROLLER_ID, coderToolset.getControllerId());
218         Assert.assertEquals(releaseId.getGroupId(), coderToolset.getGroupId());
219         Assert.assertEquals(releaseId.getArtifactId(), coderToolset.getArtifactId());
220         Assert.assertNull(coderToolset.getCustomCoder());
221
222         Assert.assertEquals(1, coderToolset.getCoders().size());
223
224         CoderFilters coderFilters = coderToolset.getCoder(CONTROLLER_ID);
225         Assert.assertNull(coderFilters);
226
227         coderFilters = coderToolset.getCoder(Triple.class.getName());
228         Assert.assertNotNull(coderFilters);
229
230         Assert.assertEquals(coderFilters.getFilter(), protocolFilter);
231     }
232
233     private DroolsController createController() {
234         if (releaseId == null) {
235             throw new IllegalStateException("no prereq artifact installed in maven repository");
236         }
237
238         Properties sinkConfig = new Properties();
239         sinkConfig.put(PolicyEndPointProperties.PROPERTY_NOOP_SINK_TOPICS, JUNIT_PROTOCOL_CODER_TOPIC);
240         final List<TopicSink> noopTopics = TopicEndpointManager.getManager().addTopicSinks(sinkConfig);
241
242         Properties droolsControllerConfig = new Properties();
243         droolsControllerConfig.put(DroolsPropertyConstants.RULES_GROUPID, releaseId.getGroupId());
244         droolsControllerConfig.put(DroolsPropertyConstants.RULES_ARTIFACTID, releaseId.getArtifactId());
245         droolsControllerConfig.put(DroolsPropertyConstants.RULES_VERSION, releaseId.getVersion());
246         droolsControllerConfig.put(PolicyEndPointProperties.PROPERTY_NOOP_SINK_TOPICS + "." + JUNIT_PROTOCOL_CODER_TOPIC
247                 + PolicyEndPointProperties.PROPERTY_TOPIC_EVENTS_SUFFIX, Triple.class.getName());
248
249         return DroolsControllerConstants.getFactory().build(droolsControllerConfig, null, noopTopics);
250     }
251
252     private JsonProtocolFilter createFilterSet() {
253         return new JsonProtocolFilter("[?($.first =~ /.*/ && $.second =~ /^blah.*/ && $.third =~ /^hello$/)]");
254     }
255 }