/*
* Copyright (c) 2015, 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.rabbitmq.qos.jira;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import org.wso2.carbon.automation.engine.context.AutomationContext;
import org.wso2.carbon.automation.engine.context.TestUserMode;
import org.wso2.carbon.esb.rabbitmq.utils.RabbitMQTestUtils;
import org.wso2.carbon.integration.common.utils.exceptions.AutomationUtilException;
import org.wso2.carbon.integration.common.utils.mgt.ServerConfigurationManager;
import org.wso2.esb.integration.common.clients.proxy.admin.ProxyServiceAdminClient;
import org.wso2.esb.integration.common.utils.ESBIntegrationTest;
import org.wso2.esb.integration.common.utils.clients.rabbitmqclient.RabbitMQConsumerClient;
import org.wso2.esb.integration.common.utils.clients.rabbitmqclient.RabbitMQProducerClient;
import org.wso2.esb.integration.common.utils.servers.RabbitMQServer;
import java.io.File;
import java.io.IOException;
import java.util.List;
/**
* This class is to test rabbitMQ qos settings applied correctly or not
*/
public class ESBJAVA4571RabbitMQQOSTestCase extends ESBIntegrationTest {
private RabbitMQProducerClient sender;
private ProxyServiceAdminClient proxyServiceAdminClient;
private RabbitMQServer rabbitMQServer;
private ServerConfigurationManager configurationManagerAxis2;
@BeforeClass(alwaysRun = true)
public void init() throws Exception {
super.init();
configurationManagerAxis2 =
new ServerConfigurationManager(new AutomationContext("ESB", TestUserMode.SUPER_TENANT_ADMIN));
File customAxisConfigAxis2 = new File(getESBResourceLocation() + File.separator +
"axis2config" + File.separator + "axis2.xml");
configurationManagerAxis2.applyConfiguration(customAxisConfigAxis2);
super.init();
rabbitMQServer = RabbitMQTestUtils.getRabbitMQServerInstance();
//This is to stop existing rabbitMQ server instances
rabbitMQServer.stop();
rabbitMQServer.start();
Assert.assertTrue(rabbitMQServer.isRabbitMQStarted(90), "Failed to start rabbitMQ server properly within given timeout");
initRabbitMQBroker();
loadESBConfigurationFromClasspath("/artifacts/ESB/qos/rabbitMQ/RabbitMQQOSProxy.xml");
proxyServiceAdminClient = new ProxyServiceAdminClient(contextUrls.getBackEndUrl(), getSessionCookie());
}
private void initRabbitMQBroker() throws Exception{
//Retrying rabbitMQ connection until timeout happens
for (int i = 1; i * 5 < 90; i++) {
sender = new RabbitMQProducerClient("localhost", 5672, "guest", "guest");
try {
sender.declareAndConnect("qosExchange", "qosQueue");
log.info("Successfully connected to rabbitMQ broker in " + i + " attempt");
return;
} catch (IOException e) {
log.warn("Error connecting to the broker in " + i + " attempt - " + e.getMessage(), e);
Thread.sleep(300);//sleep for 5 seconds
}
}
Assert.fail("Could not connect to RabbitMQ broker");
}
@Test(groups = {"wso2.esb"}, description = "Test ESB as a RabbitMQ consumer QOS applied")
public void testRabbitMQQOSConsumer() throws Exception {
proxyServiceAdminClient.stopProxyService("RabbitMQQOSProxy");
RabbitMQConsumerClient consumer = new RabbitMQConsumerClient("localhost");
try {
consumer.declareAndConnect("qosExchange", "qosQueue");
} catch (IOException e) {
Assert.fail("Could not connect to RabbitMQ broker");
}
consumer.popAllMessages(); //this is to remove already existing messages
try {
sender.declareAndConnect("qosExchange", "qosQueue");
String message = "<sample><message>This is a sample message</message></sample>";
for (int i = 0; i < 100; i++) {
sender.sendMessage(message, "application/xml");
}
} catch (IOException e) {
Assert.fail("Could not connect to RabbitMQ broker");
} finally {
sender.disconnect();
}
proxyServiceAdminClient.startProxyService("RabbitMQQOSProxy");
long beforeGettingMessages = System.currentTimeMillis();
List<String> messages = consumer.popAllMessages();
/**
* Here logic is proxy is set with auto ack false and qos 5 and thread sleep of 120000 millis, so when we activate the proxy
* it won't send a ack until 120000 millis passed, so up until then, message broker won't send another message to proxy
* hence message broker should contain 95 messages(which we get through "RabbitMQConsumerClient")
* 95 = total send message count - messages came to ESB(which is qos value)
*/
long afterGettingMessages = System.currentTimeMillis();
if ((afterGettingMessages - beforeGettingMessages) < 120000) {
Assert.assertEquals(messages.size(), 95, "Wrong number of messages exist in queue");
log.info("ESBJAVA4571RabbitMQQOSTestCase testRabbitMQQOSConsumer passed");
}
}
@AfterClass(alwaysRun = true)
public void end() throws Exception {
super.cleanup();
try {
rabbitMQServer.stop();
sender = null;
configurationManagerAxis2.restoreToLastConfiguration();
} catch (AutomationUtilException e) {
log.info("Error cleaning up - " + e.getMessage(), e);
}
}
}