/* * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * WSO2 Inc. licenses this file to you 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. */ package org.wso2.carbon.esb.mediator.test.aggregate; import org.apache.axiom.om.OMAbstractFactory; import org.apache.axiom.om.OMElement; import org.apache.axiom.om.OMFactory; import org.apache.axiom.om.xpath.AXIOMXPath; import org.jaxen.JaxenException; import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import org.wso2.carbon.integration.common.admin.client.LogViewerClient; import org.wso2.carbon.logging.view.stub.types.carbon.LogEvent; import org.wso2.esb.integration.common.utils.ESBIntegrationTest; import org.wso2.esb.integration.common.utils.servers.axis2.SampleAxis2Server; import javax.xml.stream.XMLStreamException; /** * This test case will make sure that onComplete in Aggregate mediator will only call one time. * This happens when a message received after the aggregate time out, It also try to create a aggregate and * after the time out , It is also calling onComplete. After Aggregate timeout, It should ignore the * messages received * https://wso2.org/jira/browse/ESBJAVA-4792 */ public class ESBJAVA4792AggregateTimeoutTestCase extends ESBIntegrationTest { private SampleAxis2Server axis2Server1; @BeforeClass(alwaysRun = true) public void setEnvironment() throws Exception { super.init(); axis2Server1 = new SampleAxis2Server("test_axis2_server_9001.xml"); axis2Server1.deployService("LBServiceWithSleep"); axis2Server1.start(); loadESBConfigurationFromClasspath("/artifacts/ESB/mediatorconfig/aggregate/aggregateConfig.xml"); } @Test(groups = "wso2.esb", description = "Make sure that on complete is not triggered when message received after " + "aggregator timeout when iterator is used") public void checkOnCompleteExecutionInIterator() throws Exception { LogViewerClient logViewerClient = new LogViewerClient(contextUrls.getBackEndUrl(),getSessionCookie()); logViewerClient.clearLogs(); OMElement payload = getSleepOperationRequestForIterator(); OMElement response = axis2Client.send(getProxyServiceURLHttp("timeoutIterator"), null, "sleepOperation", payload); Assert.assertEquals(countLoadElement(response), 2, "Response must have two aggregated responses"); //wait a last response to come to aggregator Thread.sleep(10000); LogEvent[] logEvents = logViewerClient.getAllRemoteSystemLogs(); int onCompleteCount = 0; if (logEvents != null) { for (LogEvent log : logEvents) { System.out.println(log.getMessage()); if (log.getMessage().contains("On Complete Triggered in Iterator for ESBJAVA4792AggregateTimeoutTestCase")) { onCompleteCount++; } } } Assert.assertEquals(onCompleteCount, 1, "OnComplete has been triggered more than expecting"); } @Test(groups = "wso2.esb", description = "Make sure that on complete is not triggered when message received after " + "aggregator timeout when clone is used") public void checkOnCompleteExecutionInClone() throws Exception { LogViewerClient logViewerClient = new LogViewerClient(contextUrls.getBackEndUrl(),getSessionCookie()); logViewerClient.clearLogs(); OMElement payload = getSleepOperationRequest(); OMElement response = axis2Client.send(getProxyServiceURLHttps("timeoutClone"), null, "sleepOperation", payload); Assert.assertEquals(countLoadElement(response), 2, "Response must have two aggregated responses"); //wait a last response to come to aggregator Thread.sleep(10000); LogEvent[] logEvents = logViewerClient.getAllRemoteSystemLogs(); int onCompleteCount = 0; if (logEvents != null) { for (LogEvent log : logEvents) { System.out.println(log.getMessage()); if (log.getMessage().contains("On Complete Triggered in Clone for ESBJAVA4792AggregateTimeoutTestCase")) { onCompleteCount++; } } } Assert.assertEquals(onCompleteCount, 1, "OnComplete has been triggered more than expecting"); } @AfterClass(alwaysRun = true) public void destroy() throws Exception { try { super.cleanup(); }finally { axis2Server1.stop(); } } private OMElement getSleepOperationRequestForIterator() throws XMLStreamException { OMFactory fac = OMAbstractFactory.getOMFactory(); OMElement omeSleep = fac.createOMElement("sleepOperation", null); OMElement omeLoad1 = fac.createOMElement("load", null); omeLoad1.setText("1000"); omeSleep.addChild(omeLoad1); OMElement omeLoad2 = fac.createOMElement("load", null); omeLoad2.setText("1000"); omeSleep.addChild(omeLoad2); OMElement omeLoad3 = fac.createOMElement("load", null); omeLoad3.setText("8000"); omeSleep.addChild(omeLoad3); return omeSleep; } private OMElement getSleepOperationRequest() throws XMLStreamException { OMFactory fac = OMAbstractFactory.getOMFactory(); OMElement omeSleep = fac.createOMElement("sleepOperation", null); OMElement omeLoad = fac.createOMElement("load", null); omeLoad.setText("8000"); omeSleep.addChild(omeLoad); return omeSleep; } private int countLoadElement(OMElement response) throws JaxenException { AXIOMXPath xPath = new AXIOMXPath("//load"); return xPath.selectNodes(response.cloneOMElement()).size(); } }