/* * ============LICENSE_START======================================================= * ONAP * ================================================================================ * Copyright (C) 2018-2019 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.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.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.common.endpoints.event.comm.TopicEndpoint; import org.onap.policy.common.endpoints.event.comm.TopicSink; import org.onap.policy.common.endpoints.properties.PolicyEndPointProperties; import org.onap.policy.drools.controller.DroolsController; import org.onap.policy.drools.controller.internal.MavenDroolsControllerTest; import org.onap.policy.drools.properties.DroolsProperties; import org.onap.policy.drools.protocol.coders.EventProtocolCoder.CoderFilters; 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(); /** * Setup. * * @throws IOException throws IO Exception */ @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()); } /** * Test the Gson toolset. * * @param protocolFilter protocol filter */ public void testGsonToolset(JsonProtocolFilter protocolFilter) { GsonProtocolCoderToolset gsonToolset = new GsonProtocolCoderToolset( EventProtocolParams.builder().topic(JUNIT_PROTOCOL_CODER_TOPIC) .groupId(this.releaseId.getGroupId()) .artifactId(this.releaseId.getArtifactId()) .eventClass(Triple.class.getCanonicalName()) .protocolFilter(protocolFilter) .customGsonCoder(null) .modelClassLoaderHash(12345678), CONTROLLER_ID); 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"); } 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); } @SuppressWarnings("unchecked") 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().getRule() != null); coderFilters.getFilter().setRule("[?($.second =~ /^v2$/ && $.third =~ /.*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().setRule(null); Assert.assertEquals("[?($ =~ /.*/)]", coderFilters.getFilter().getRule()); 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().setRule("[?($.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) { coderToolset.addCoder(this.getClass().getCanonicalName(), new JsonProtocolFilter("[?($.second =~ /.*/)]"), 654321); Assert.assertTrue(coderToolset.getCoders().size() == 2); coderToolset.removeCoders(this.getClass().getCanonicalName()); Assert.assertTrue(coderToolset.getCoders().size() == 1); } private void updateCoderFilterRule(ProtocolCoderToolset coderToolset) { coderToolset.addCoder(Triple.class.getCanonicalName(), new JsonProtocolFilter("[?($.third =~ /.*/)]"), 654321); Assert.assertTrue(coderToolset.getCoders().size() == 1); Assert.assertTrue(coderToolset.getCoder(Triple.class.getCanonicalName()).getModelClassLoaderHash() == 654321); Assert.assertTrue( coderToolset.getCoder( Triple.class.getCanonicalName()).getFilter().getRule() != null); Assert.assertTrue("[?($.third =~ /.*/)]".equals(coderToolset.getCoder(Triple.class.getCanonicalName()) .getFilter().getRule())); } 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(PolicyEndPointProperties.PROPERTY_NOOP_SINK_TOPICS, JUNIT_PROTOCOL_CODER_TOPIC); final List noopTopics = TopicEndpoint.manager.addTopicSinks(sinkConfig); Properties droolsControllerConfig = new Properties(); droolsControllerConfig.put(DroolsProperties.RULES_GROUPID, releaseId.getGroupId()); droolsControllerConfig.put(DroolsProperties.RULES_ARTIFACTID, releaseId.getArtifactId()); droolsControllerConfig.put(DroolsProperties.RULES_VERSION, releaseId.getVersion()); droolsControllerConfig.put(PolicyEndPointProperties.PROPERTY_NOOP_SINK_TOPICS + "." + JUNIT_PROTOCOL_CODER_TOPIC + PolicyEndPointProperties.PROPERTY_TOPIC_EVENTS_SUFFIX, Triple.class.getCanonicalName()); DroolsController.factory.build(droolsControllerConfig, null, noopTopics); } private JsonProtocolFilter createFilterSet() { return new JsonProtocolFilter("[?($.first =~ /.*/ && $.second =~ /^blah.*/ && $.third =~ /^hello$/)]"); } }