package com.mcafee;
import static org.junit.Assert.*;
import java.io.IOException;
import java.io.Serializable;
import java.util.Random;
import javax.jms.BytesMessage;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.Connection;
import javax.jms.MessageProducer;
import javax.jms.ObjectMessage;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.StreamMessage;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.apache.activemq.ScheduledMessage;
import org.apache.activemq.util.IdGenerator;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.apache.commons.lang.RandomStringUtils;
class RandomPerson implements Serializable {
private static Random random = new Random();
private String name;
private int age;
public RandomPerson() {
name = RandomStringUtils.random(random.nextInt(15));
age = random.nextInt(20);
}
}
/**
*
* @author Gursev Singh Kalra @ McAfee, Inc.
*
*/
public class JmsDumpDestinationTest {
private InitialContext ctx;
private String dumpQueue11Msgs = "dumpQueue11Msgs";
private String dumpQueue00Msgs = "dumpQueue00Msgs";
private String dumpTopic00Msgs = "dumpTopic00Msgs";
private String dumpTopic11Msgs = "dumpTopic11Msgs";
private String topic4DurableSubscriber = "topic4DurableSubscriber";
private String durableSubscriberName = "durableSubscriberName";
private String connFactName = "ConnectionFactory";
private ConnectionFactory connFact;
private JmsDumpDestination destDumper;
private JmsDurableSubscriberManipulator durableSubsManipulator;
private String clientId = "gursev";
//The "session" and "connection" are used to send messages to the test queues and topics.
// They are never passed on to the JmsDumpDestination object
private Session session;
private Connection connection;
private InitialContext getInitialContext() throws JmsDiggerException
{
JmsInitialContextFactory contextFactory = new JmsInitialContextFactory("org.apache.activemq.jndi.ActiveMQInitialContextFactory", "tcp://127.0.0.1:61616");
contextFactory.addConnectionFactory(connFactName);
contextFactory.addQueue(dumpQueue11Msgs, "jms."+dumpQueue11Msgs);
contextFactory.addQueue(dumpQueue00Msgs, "jms."+dumpQueue00Msgs);
contextFactory.addTopic(dumpTopic00Msgs, "jms."+dumpTopic00Msgs);
contextFactory.addTopic(dumpTopic11Msgs, "jms."+dumpTopic11Msgs);
contextFactory.addTopic(topic4DurableSubscriber, "jms."+topic4DurableSubscriber);
InitialContext ctxx = contextFactory.getInitialContext();
return ctxx;
}
@Before
public void setUp() throws Exception {
ctx = getInitialContext();
connFact = (ConnectionFactory) ctx.lookup(connFactName);
connection = (Connection) connFact.createConnection();
}
@After
public void tearDown() throws Exception {
if(destDumper != null)
destDumper.close();
}
// @Test
// public void testDumpQueue00MsgsForNoMessage() throws JMSException, IOException, Exception {
// String qName = dumpQueue00Msgs;
// destDumper = new JmsDumpDestination(ctx, qName, connFactName);
// destDumper.setMsgCountToDump(0);
// destDumper.init();
// try {
// destDumper.dump();
// } catch(Exception ex) {
// //gobble it up
// }
// destDumper.close();
// assertEquals(0, destDumper.getMsgsWritten());
// }
private void sendMessages(Session session, MessageProducer mp) throws NamingException, JMSException {
byte[] b = {0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47};
Message msg = session.createMessage();
mp.send(msg);
msg = session.createMessage();
mp.send(msg);
TextMessage tmsg = (TextMessage) session.createTextMessage();
tmsg.setText("text message by gursev");
tmsg.setStringProperty(ScheduledMessage.AMQ_SCHEDULED_CRON, "* * * * *");
String s = new IdGenerator().generateId();
tmsg.setStringProperty(ScheduledMessage.AMQ_SCHEDULED_ID, s);
System.out.println(s);
mp.send(tmsg);
tmsg = (TextMessage) session.createTextMessage();
tmsg.setText("text message by gursev");
mp.send(tmsg);
ObjectMessage omsg = (ObjectMessage) session.createObjectMessage(true);
omsg.setObject(new RandomPerson());
mp.send(omsg);
MapMessage mmsg = (MapMessage) session.createMapMessage();
mmsg.setBoolean("boolean", false);
mmsg.setByte("byte", (byte) 0x44);
mmsg.setChar("char", 'c');
mmsg.setFloat("float", (float) 4.444);
mmsg.setInt("int", 33);
mmsg.setBytes("bytes[]", b);
mp.send(mmsg);
mmsg = (MapMessage) session.createMapMessage();
mmsg.setBoolean("boolean", false);
mmsg.setByte("byte", (byte) 0x44);
mmsg.setChar("char", 'c');
mmsg.setFloat("float", (float) 4.444);
mmsg.setInt("int", 33);
mmsg.setBytes("bytes[]", b);
mp.send(mmsg);
BytesMessage bmsg = (BytesMessage) session.createBytesMessage();
bmsg.writeBytes(b);
mp.send(bmsg);
bmsg = (BytesMessage) session.createBytesMessage();
bmsg.writeBytes(b);
mp.send(bmsg);
StreamMessage smsg = (StreamMessage) session.createStreamMessage();
smsg.writeBoolean(true);
smsg.writeByte((byte) 0x44);
smsg.writeChar('c');
smsg.writeFloat((float) 4.444);
smsg.writeInt(3333);
smsg.writeBytes(b);
mp.send(smsg);
smsg = (StreamMessage) session.createStreamMessage();
smsg.writeBoolean(true);
smsg.writeByte((byte) 0x44);
smsg.writeChar('c');
smsg.writeFloat((float) 4.444);
smsg.writeInt(3333);
smsg.writeBytes(b);
mp.send(smsg);
}
@Test
public void testDumpTopic00MsgsForNoMessage() throws JMSException, IOException, Exception {
String tName = dumpTopic00Msgs;
destDumper = new JmsDumpDestination(ctx, tName, connFactName);
destDumper.setTargetDirectory("/Users/Consultant/jmsdigger");
destDumper.init();
destDumper.dump();
//Sleep to ensure that every message is read
Thread.sleep(5000);
destDumper.close();
assertEquals(0, destDumper.getMsgsWritten());
}
@Test
public void testDumpTopic11MsgsFor11Messages() throws JMSException, IOException, Exception {
Topic topic = (Topic) ctx.lookup(dumpTopic11Msgs);
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer mp = session.createProducer(topic);
destDumper = new JmsDumpDestination(ctx, dumpTopic11Msgs, connFactName);
destDumper.setTargetDirectory("/Users/Consultant/jmsdigger");
destDumper.init();
//Initiating dump before sending messages. This ensures that onMessage has started listening before messages are sent
destDumper.dump();
//Sending messages after initiating the dump process so messages are read
sendMessages(session, mp);
//Sleep to ensure that every message is read
Thread.sleep(10000);
destDumper.close();
assertEquals(11, destDumper.getMsgsWritten());
}
@Test
public void testDumpQueue11MsgsFor11Messages() throws JMSException, IOException, Exception {
Queue queue = (Queue) ctx.lookup(dumpQueue11Msgs);
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer mp = session.createProducer(queue);
sendMessages(session, mp);
destDumper = new JmsDumpDestination(ctx, dumpQueue11Msgs, connFactName);
destDumper.setTargetDirectory("/Users/Consultant/jmsdigger");
destDumper.setMsgCountToDump(11);
destDumper.init();
destDumper.dump();
destDumper.close();
assertEquals(11, destDumper.getMsgsWritten());
}
/**
* This test works with two classes
* 1. Durable subscriber manipulation class
* 2. Dump destination.
* @throws NamingException
* @throws JMSException
* @throws InterruptedException
* @throws IOException
* @throws IllegalAccessException
*/
@Test
public void testDurableSubscriberDump() throws NamingException, JMSException, InterruptedException, IOException, IllegalAccessException {
Topic topic = (Topic) ctx.lookup(topic4DurableSubscriber);
durableSubsManipulator = new JmsDurableSubscriberManipulator(ctx, topic4DurableSubscriber, connFactName);
durableSubsManipulator.init(clientId);
durableSubsManipulator.createDurableSubscriber(durableSubscriberName);
durableSubsManipulator.close(); // Important to close as a only one connection can use a single client ID.
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer mp = session.createProducer(topic);
mp.setTimeToLive(0);
sendMessages(session, mp);
//Closing to ensure that dump method connectivity with same ID does not error out.
session.close();
connection.close();
destDumper = new JmsDumpDestination(ctx, topic4DurableSubscriber, connFactName);
destDumper.setTargetDirectory("/Users/Consultant/jmsdigger");
destDumper.setClientId(clientId);
destDumper.setDurableSubscriberName(durableSubscriberName);
destDumper.init();
destDumper.dump();
Thread.sleep(10000);
destDumper.close();
assertEquals(11, destDumper.getMsgsWritten());
}
@Test
public void zSendMessagesToDurableSubscriber() throws NamingException, JMSException {
Topic topic = (Topic) ctx.lookup(topic4DurableSubscriber);
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer mp = session.createProducer(topic);
for(int i = 0; i < 10; i ++) {
//mp.setTimeToLive(0);
sendMessages(session, mp);
}
session.close();
connection.close();
destDumper = null;
}
@Test
public void zSendMessagesToTopic11Msgs() throws NamingException, JMSException {
Topic topic = (Topic) ctx.lookup(dumpTopic11Msgs);
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer mp = session.createProducer(topic);
sendMessages(session, mp);
destDumper = null;
}
@Test
public void zSendMessagesToQueue() throws NamingException, JMSException {
Queue queue = (Queue) ctx.lookup(dumpQueue11Msgs);
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer mp = session.createProducer(queue);
sendMessages(session, mp);
destDumper = null;
}
}