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