2  * ============LICENSE_START=======================================================
 
   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
 
  11  *      http://www.apache.org/licenses/LICENSE-2.0
 
  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=========================================================
 
  21 package org.onap.policy.drools.protocol.coders;
 
  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;
 
  28 import java.io.IOException;
 
  29 import java.nio.file.Files;
 
  30 import java.nio.file.Paths;
 
  31 import java.util.ArrayList;
 
  32 import java.util.List;
 
  33 import java.util.Properties;
 
  35 import org.junit.Assert;
 
  36 import org.junit.Before;
 
  37 import org.junit.Test;
 
  38 import org.kie.api.builder.ReleaseId;
 
  39 import org.onap.policy.common.endpoints.event.comm.TopicEndpoint;
 
  40 import org.onap.policy.common.endpoints.event.comm.TopicSink;
 
  41 import org.onap.policy.common.endpoints.properties.PolicyEndPointProperties;
 
  42 import org.onap.policy.drools.controller.DroolsController;
 
  43 import org.onap.policy.drools.controller.internal.MavenDroolsControllerTest;
 
  44 import org.onap.policy.drools.properties.DroolsProperties;
 
  45 import org.onap.policy.drools.protocol.coders.EventProtocolCoder.CoderFilters;
 
  46 import org.onap.policy.drools.protocol.coders.JsonProtocolFilter.FilterRule;
 
  47 import org.onap.policy.drools.protocol.coders.TopicCoderFilterConfiguration.CustomGsonCoder;
 
  48 import org.onap.policy.drools.util.KieUtils;
 
  49 import org.onap.policy.drools.utils.Triple;
 
  50 import org.slf4j.Logger;
 
  51 import org.slf4j.LoggerFactory;
 
  54  * ProtocolCoder Toolset JUNITs.
 
  56 public class ProtocolCoderToolsetTest {
 
  57     public static final String JUNIT_PROTOCOL_CODER_ARTIFACT_ID = "protocolcoder";
 
  58     public static final String JUNIT_PROTOCOL_CODER_TOPIC = JUNIT_PROTOCOL_CODER_ARTIFACT_ID;
 
  59     public static final String CONTROLLER_ID = "blah";
 
  60     public static final String ARTIFACT_ID_ECHO = "echo";
 
  61     public static final String ARTIFACT_ID_POM_LINE = "<artifactId>" + ARTIFACT_ID_ECHO + "</artifactId>";
 
  63     private static Logger logger = LoggerFactory.getLogger(ProtocolCoderToolset.class);
 
  65     private volatile ReleaseId releaseId;
 
  67     public static final Gson customCoder = new GsonBuilder().create();
 
  72      * @throws IOException throws IO Exception
 
  75     public void setUp() throws IOException {
 
  76         if (releaseId != null) {
 
  80         String pom = new String(Files.readAllBytes(Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_POM_PATH)));
 
  82         if (!pom.contains(ARTIFACT_ID_POM_LINE)) {
 
  83             throw new IllegalArgumentException("unexpected junit test pom");
 
  86         String newPom = pom.replace(ARTIFACT_ID_ECHO, JUNIT_PROTOCOL_CODER_ARTIFACT_ID);
 
  88         String kmodule = new String(Files.readAllBytes(Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_PATH)));
 
  90         String drl = new String(Files.readAllBytes(Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_DRL_PATH)));
 
  92         releaseId = KieUtils.installArtifact(kmodule, newPom, MavenDroolsControllerTest.JUNIT_ECHO_KJAR_DRL_PATH, drl);
 
  96     public void testToolsets() {
 
  98         testGsonToolset(createFilterSet());
 
  99         testJacksonToolset(createFilterSet());
 
 103      * Test the Gson toolset.
 
 105      * @param protocolFilter protocol filter
 
 107     public void testGsonToolset(JsonProtocolFilter protocolFilter) {
 
 108         GsonProtocolCoderToolset gsonToolset = new GsonProtocolCoderToolset(JUNIT_PROTOCOL_CODER_TOPIC, CONTROLLER_ID,
 
 109                 this.releaseId.getGroupId(), this.releaseId.getArtifactId(), Triple.class.getCanonicalName(),
 
 110                 protocolFilter, null, 12345678);
 
 112         Assert.assertNotNull(gsonToolset.getEncoder());
 
 113         Assert.assertNotNull(gsonToolset.getDecoder());
 
 115         testToolset(protocolFilter, gsonToolset);
 
 117         Triple<String, String, String> triple = createTriple();
 
 118         gsonToolset.setCustomCoder(new CustomGsonCoder(this.getClass().getCanonicalName(), "customCoder"));
 
 119         String tripleEncoded = encode(gsonToolset, triple);
 
 120         decode(protocolFilter, gsonToolset, triple, tripleEncoded);
 
 123     private Triple<String, String, String> createTriple() {
 
 124         return new Triple<>("v1", "v2", "v3");
 
 128      * Test Jackson toolset.
 
 130      * @param protocolFilter protocol filter
 
 132     public void testJacksonToolset(JsonProtocolFilter protocolFilter) {
 
 133         JacksonProtocolCoderToolset jacksonToolset = new JacksonProtocolCoderToolset(JUNIT_PROTOCOL_CODER_TOPIC,
 
 134                 CONTROLLER_ID, this.releaseId.getGroupId(), this.releaseId.getArtifactId(),
 
 135                 Triple.class.getCanonicalName(), protocolFilter, null, 12345678);
 
 137         jacksonToolset.getEncoder().setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
 
 138         jacksonToolset.getDecoder().setVisibility(PropertyAccessor.FIELD, Visibility.ANY);
 
 140         testToolset(protocolFilter, jacksonToolset);
 
 143     private void testToolset(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset) {
 
 145         validateInitialization(protocolFilter, coderToolset);
 
 147         updateCoderFilterRule(coderToolset);
 
 149         addRemoveCoder(coderToolset);
 
 151         /* restore original filters */
 
 152         coderToolset.addCoder(Triple.class.getCanonicalName(), protocolFilter, 654321);
 
 154         Triple<String, String, String> triple = createTriple();
 
 156         String tripleEncoded = encode(coderToolset, triple);
 
 158         decode(protocolFilter, coderToolset, triple, tripleEncoded);
 
 161     @SuppressWarnings("unchecked")
 
 162     private void decode(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset,
 
 163             Triple<String, String, String> triple, String tripleEncoded) {
 
 165         Triple<String, String, String> tripleDecoded = null;
 
 167             tripleDecoded = (Triple<String, String, String>) coderToolset.decode(tripleEncoded);
 
 168         } catch (UnsupportedOperationException e) {
 
 170             logger.trace("Junit expected exception - decode does not pass filtering", e);
 
 173         CoderFilters coderFilters = coderToolset.getCoder(Triple.class.getCanonicalName());
 
 174         Assert.assertTrue(coderFilters.getCodedClass() == Triple.class.getCanonicalName());
 
 175         Assert.assertTrue(coderFilters.getFilter() == protocolFilter);
 
 176         Assert.assertTrue(coderFilters.getFilter().getRules("second").size() == 1);
 
 177         Assert.assertTrue(coderFilters.getFilter().getRules("third").size() == 1);
 
 179         coderFilters.getFilter().getRules("second").get(0).setRegex("^v2$");
 
 180         coderFilters.getFilter().getRules("third").get(0).setRegex(".*v3.*");
 
 182         tripleDecoded = (Triple<String, String, String>) coderToolset.decode(tripleEncoded);
 
 184         Assert.assertTrue(tripleDecoded.first().equals(triple.first()));
 
 185         Assert.assertTrue(tripleDecoded.second().equals(triple.second()));
 
 186         Assert.assertTrue(tripleDecoded.third().equals(triple.third()));
 
 188         coderFilters.getFilter().deleteRules("third");
 
 189         Assert.assertTrue(coderFilters.getFilter().getRules("third").isEmpty());
 
 191         tripleDecoded = (Triple<String, String, String>) coderToolset.decode(tripleEncoded);
 
 193         Assert.assertTrue(tripleDecoded.first().equals(triple.first()));
 
 194         Assert.assertTrue(tripleDecoded.second().equals(triple.second()));
 
 195         Assert.assertTrue(tripleDecoded.third().equals(triple.third()));
 
 197         coderFilters.getFilter().addRule("third", ".*v3.*");
 
 200     private String encode(ProtocolCoderToolset coderToolset, Triple<String, String, String> triple) {
 
 201         String tripleEncoded = coderToolset.encode(triple);
 
 202         Assert.assertTrue(!tripleEncoded.isEmpty());
 
 203         return tripleEncoded;
 
 206     private void addRemoveCoder(ProtocolCoderToolset coderToolset) {
 
 207         List<FilterRule> filters = new ArrayList<>();
 
 208         filters.add(new FilterRule("second", ".*"));
 
 210         coderToolset.addCoder(this.getClass().getCanonicalName(), new JsonProtocolFilter(filters), 654321);
 
 211         Assert.assertTrue(coderToolset.getCoders().size() == 2);
 
 213         coderToolset.removeCoders(this.getClass().getCanonicalName());
 
 214         Assert.assertTrue(coderToolset.getCoders().size() == 1);
 
 217     private void updateCoderFilterRule(ProtocolCoderToolset coderToolset) {
 
 218         List<FilterRule> filters = new ArrayList<>();
 
 219         filters.add(new FilterRule("third", ".*"));
 
 220         coderToolset.addCoder(Triple.class.getCanonicalName(), new JsonProtocolFilter(filters), 654321);
 
 222         Assert.assertTrue(coderToolset.getCoders().size() == 1);
 
 224         Assert.assertTrue(coderToolset.getCoder(Triple.class.getCanonicalName()).getModelClassLoaderHash() == 654321);
 
 227                 coderToolset.getCoder(Triple.class.getCanonicalName()).getFilter().getRules("third").size() == 1);
 
 230                 coderToolset.getCoder(Triple.class.getCanonicalName()).getFilter().getRules("third").size() == 1);
 
 232         Assert.assertTrue(".*".equals(coderToolset.getCoder(Triple.class.getCanonicalName()).getFilter()
 
 233                 .getRules("third").get(0).getRegex()));
 
 236     private void validateInitialization(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset) {
 
 237         Assert.assertTrue(CONTROLLER_ID.equals(coderToolset.getControllerId()));
 
 238         Assert.assertTrue(this.releaseId.getGroupId().equals(coderToolset.getGroupId()));
 
 239         Assert.assertTrue(this.releaseId.getArtifactId().equals(coderToolset.getArtifactId()));
 
 240         Assert.assertNull(coderToolset.getCustomCoder());
 
 242         Assert.assertTrue(coderToolset.getCoders().size() == 1);
 
 244         CoderFilters coderFilters = coderToolset.getCoder(CONTROLLER_ID);
 
 245         Assert.assertTrue(coderFilters == null);
 
 247         coderFilters = coderToolset.getCoder(Triple.class.getCanonicalName());
 
 248         Assert.assertNotNull(coderFilters);
 
 250         Assert.assertEquals(coderFilters.getFilter(), protocolFilter);
 
 253     private void createController() {
 
 254         if (releaseId == null) {
 
 255             throw new IllegalStateException("no prereq artifact installed in maven repository");
 
 258         Properties sinkConfig = new Properties();
 
 259         sinkConfig.put(PolicyEndPointProperties.PROPERTY_NOOP_SINK_TOPICS, JUNIT_PROTOCOL_CODER_TOPIC);
 
 260         final List<? extends TopicSink> noopTopics = TopicEndpoint.manager.addTopicSinks(sinkConfig);
 
 262         Properties droolsControllerConfig = new Properties();
 
 263         droolsControllerConfig.put(DroolsProperties.RULES_GROUPID, releaseId.getGroupId());
 
 264         droolsControllerConfig.put(DroolsProperties.RULES_ARTIFACTID, releaseId.getArtifactId());
 
 265         droolsControllerConfig.put(DroolsProperties.RULES_VERSION, releaseId.getVersion());
 
 266         droolsControllerConfig.put(PolicyEndPointProperties.PROPERTY_NOOP_SINK_TOPICS + "." + JUNIT_PROTOCOL_CODER_TOPIC
 
 267                 + PolicyEndPointProperties.PROPERTY_TOPIC_EVENTS_SUFFIX, Triple.class.getCanonicalName());
 
 269         DroolsController.factory.build(droolsControllerConfig, null, noopTopics);
 
 272     private JsonProtocolFilter createFilterSet() {
 
 273         List<FilterRule> filters = new ArrayList<>();
 
 274         filters.add(new FilterRule("first", ".*"));
 
 275         filters.add(new FilterRule("second", "^blah.*"));
 
 276         filters.add(new FilterRule("third", "^hello$"));
 
 278         return new JsonProtocolFilter(filters);