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