/*- * ============LICENSE_START======================================================= * ONAP * ================================================================================ * Copyright (C) 2018 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============LICENSE_END========================================================= */ package org.onap.policy.drools.protocol.coders; import com.fasterxml.jackson.annotation.JsonAutoDetect.Visibility; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import java.util.Properties; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.kie.api.builder.ReleaseId; import org.onap.policy.drools.controller.DroolsController; import org.onap.policy.drools.controller.internal.MavenDroolsControllerTest; import org.onap.policy.drools.event.comm.TopicEndpoint; import org.onap.policy.drools.event.comm.TopicSink; import org.onap.policy.drools.properties.PolicyProperties; import org.onap.policy.drools.protocol.coders.EventProtocolCoder.CoderFilters; import org.onap.policy.drools.protocol.coders.JsonProtocolFilter.FilterRule; import org.onap.policy.drools.protocol.coders.TopicCoderFilterConfiguration.CustomGsonCoder; import org.onap.policy.drools.util.KieUtils; import org.onap.policy.drools.utils.Triple; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * ProtocolCoder Toolset JUNITs */ public class ProtocolCoderToolsetTest { public static final String JUNIT_PROTOCOL_CODER_ARTIFACT_ID = "protocolcoder"; public static final String JUNIT_PROTOCOL_CODER_TOPIC = JUNIT_PROTOCOL_CODER_ARTIFACT_ID; public static final String CONTROLLER_ID = "blah"; public static final String ARTIFACT_ID_ECHO = "echo"; public static final String ARTIFACT_ID_POM_LINE = "" + ARTIFACT_ID_ECHO + ""; private static Logger logger = LoggerFactory.getLogger(ProtocolCoderToolset.class); private volatile ReleaseId releaseId; public static final Gson customCoder = new GsonBuilder().create(); @Before public void setUp() throws IOException { if (releaseId != null) return; String pom = new String(Files.readAllBytes (Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_POM_PATH))); if (!pom.contains(ARTIFACT_ID_POM_LINE)) throw new IllegalArgumentException("unexpected junit test pom"); String newPom = pom.replace(ARTIFACT_ID_ECHO, JUNIT_PROTOCOL_CODER_ARTIFACT_ID); String kmodule = new String(Files.readAllBytes (Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_PATH))); String drl = new String(Files.readAllBytes (Paths.get(MavenDroolsControllerTest.JUNIT_ECHO_KMODULE_DRL_PATH))); releaseId = KieUtils.installArtifact(kmodule, newPom, MavenDroolsControllerTest.JUNIT_ECHO_KJAR_DRL_PATH, drl); } @Test public void testToolsets() { createController(); testGsonToolset(createFilterSet()); testJacksonToolset(createFilterSet()); } public void testGsonToolset(JsonProtocolFilter protocolFilter) { GsonProtocolCoderToolset gsonToolset = new GsonProtocolCoderToolset(JUNIT_PROTOCOL_CODER_TOPIC, CONTROLLER_ID, this.releaseId.getGroupId(), this.releaseId.getArtifactId(), Triple.class.getCanonicalName(), protocolFilter, null, 12345678); Assert.assertNotNull(gsonToolset.getEncoder()); Assert.assertNotNull(gsonToolset.getDecoder()); testToolset(protocolFilter, gsonToolset); Triple triple = createTriple(); gsonToolset.setCustomCoder(new CustomGsonCoder(this.getClass().getCanonicalName(), "customCoder")); String tripleEncoded = encode(gsonToolset, triple); decode(protocolFilter, gsonToolset, triple, tripleEncoded); } private Triple createTriple() { return new Triple<>("v1", "v2", "v3"); } public void testJacksonToolset(JsonProtocolFilter protocolFilter) { JacksonProtocolCoderToolset jacksonToolset = new JacksonProtocolCoderToolset(JUNIT_PROTOCOL_CODER_TOPIC, CONTROLLER_ID, this.releaseId.getGroupId(), this.releaseId.getArtifactId(), Triple.class.getCanonicalName(), protocolFilter, null, 12345678); jacksonToolset.getEncoder().setVisibility(PropertyAccessor.FIELD, Visibility.ANY); jacksonToolset.getDecoder().setVisibility(PropertyAccessor.FIELD, Visibility.ANY); testToolset(protocolFilter, jacksonToolset); } private void testToolset(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset) { validateInitialization(protocolFilter, coderToolset); updateCoderFilterRule(coderToolset); addRemoveCoder(coderToolset); /* restore original filters */ coderToolset.addCoder(Triple.class.getCanonicalName(), protocolFilter, 654321); Triple triple = createTriple(); String tripleEncoded = encode(coderToolset, triple); decode(protocolFilter, coderToolset, triple, tripleEncoded); } private void decode(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset, Triple triple, String tripleEncoded) { Triple tripleDecoded = null; try { tripleDecoded = (Triple) coderToolset.decode(tripleEncoded); } catch(UnsupportedOperationException e){ /* OK */ logger.trace("Junit expected exception - decode does not pass filtering", e); } CoderFilters coderFilters = coderToolset.getCoder(Triple.class.getCanonicalName()); Assert.assertTrue(coderFilters.getCodedClass() == Triple.class.getCanonicalName()); Assert.assertTrue(coderFilters.getFilter() == protocolFilter); Assert.assertTrue(coderFilters.getFilter().getRules("second").size() == 1); Assert.assertTrue(coderFilters.getFilter().getRules("third").size() == 1); coderFilters.getFilter().getRules("second").get(0).setRegex("^v2$"); coderFilters.getFilter().getRules("third").get(0).setRegex(".*v3.*"); tripleDecoded = (Triple) coderToolset.decode(tripleEncoded); Assert.assertTrue(tripleDecoded.first().equals(triple.first())); Assert.assertTrue(tripleDecoded.second().equals(triple.second())); Assert.assertTrue(tripleDecoded.third().equals(triple.third())); coderFilters.getFilter().deleteRules("third"); Assert.assertTrue(coderFilters.getFilter().getRules("third").isEmpty()); tripleDecoded = (Triple) coderToolset.decode(tripleEncoded); Assert.assertTrue(tripleDecoded.first().equals(triple.first())); Assert.assertTrue(tripleDecoded.second().equals(triple.second())); Assert.assertTrue(tripleDecoded.third().equals(triple.third())); coderFilters.getFilter().addRule("third", ".*v3.*"); } private String encode(ProtocolCoderToolset coderToolset, Triple triple) { String tripleEncoded = coderToolset.encode(triple); Assert.assertTrue(!tripleEncoded.isEmpty()); return tripleEncoded; } private void addRemoveCoder(ProtocolCoderToolset coderToolset) { List filters = new ArrayList<>(); filters.add(new FilterRule("second", ".*")); coderToolset.addCoder(this.getClass().getCanonicalName(), new JsonProtocolFilter(filters),654321); Assert.assertTrue(coderToolset.getCoders().size() == 2); coderToolset.removeCoders(this.getClass().getCanonicalName()); Assert.assertTrue(coderToolset.getCoders().size() == 1); } private void updateCoderFilterRule(ProtocolCoderToolset coderToolset) { List filters = new ArrayList<>(); filters.add(new FilterRule("third", ".*")); coderToolset.addCoder(Triple.class.getCanonicalName(), new JsonProtocolFilter(filters), 654321); Assert.assertTrue(coderToolset.getCoders().size() == 1); Assert.assertTrue (coderToolset.getCoder(Triple.class.getCanonicalName()). getModelClassLoaderHash() == 654321); Assert.assertTrue (coderToolset.getCoder(Triple.class.getCanonicalName()). getFilter().getRules("third").size() == 1); Assert.assertTrue (coderToolset.getCoder(Triple.class.getCanonicalName()). getFilter().getRules("third").size() == 1); Assert.assertTrue (".*".equals(coderToolset.getCoder(Triple.class.getCanonicalName()). getFilter().getRules("third").get(0).getRegex())); } private void validateInitialization(JsonProtocolFilter protocolFilter, ProtocolCoderToolset coderToolset) { Assert.assertTrue(CONTROLLER_ID.equals(coderToolset.getControllerId())); Assert.assertTrue(this.releaseId.getGroupId().equals(coderToolset.getGroupId())); Assert.assertTrue(this.releaseId.getArtifactId().equals(coderToolset.getArtifactId())); Assert.assertNull(coderToolset.getCustomCoder()); Assert.assertTrue(coderToolset.getCoders().size() == 1); CoderFilters coderFilters = coderToolset.getCoder(CONTROLLER_ID); Assert.assertTrue(coderFilters == null); coderFilters = coderToolset.getCoder(Triple.class.getCanonicalName()); Assert.assertNotNull(coderFilters); Assert.assertEquals(coderFilters.getFilter(), protocolFilter); } private void createController() { if (releaseId == null) throw new IllegalStateException("no prereq artifact installed in maven repository"); Properties sinkConfig = new Properties(); sinkConfig.put(PolicyProperties.PROPERTY_NOOP_SINK_TOPICS, JUNIT_PROTOCOL_CODER_TOPIC); List noopTopics = TopicEndpoint.manager.addTopicSinks(sinkConfig); Properties droolsControllerConfig = new Properties(); droolsControllerConfig.put(PolicyProperties.RULES_GROUPID, releaseId.getGroupId()); droolsControllerConfig.put(PolicyProperties.RULES_ARTIFACTID, releaseId.getArtifactId()); droolsControllerConfig.put(PolicyProperties.RULES_VERSION, releaseId.getVersion()); droolsControllerConfig.put(PolicyProperties.PROPERTY_NOOP_SINK_TOPICS + "." + JUNIT_PROTOCOL_CODER_TOPIC + PolicyProperties.PROPERTY_TOPIC_EVENTS_SUFFIX, Triple.class.getCanonicalName()); DroolsController droolsController = DroolsController.factory.build(droolsControllerConfig, null, noopTopics); } private JsonProtocolFilter createFilterSet() { List filters = new ArrayList<>(); filters.add(new FilterRule("first", ".*")); filters.add(new FilterRule("second", "^blah.*")); filters.add(new FilterRule("third", "^hello$")); return new JsonProtocolFilter(filters); } }