package cz.cuni.mff.d3s.been.mq;
import static cz.cuni.mff.d3s.been.mq.TestParams.TEST_TIMEOUT;
import org.junit.Assert;
import org.junit.Test;
/**
* Basic set of tests for message queues used in BEEN.
*
* Tests should subclass and implement {@link #getQueue()}.
*
* @author Martin Sixta
*/
public abstract class BasicQueueTests extends Assert {
/**
*
* Returns
*
* @return message queue used for tests.
* @throws MessagingException
* when a queue cannot be created.
*/
protected abstract IMessageQueue<String> getQueue() throws MessagingException;
/**
* Tests correct termination of a queue. Since there is only receiver the
* termination should not block.
*
* @throws MessagingException
*/
@Test(timeout = TEST_TIMEOUT)
public void testQueueTerminationWithNoSenders() throws MessagingException {
IMessageQueue<String> queue = getQueue();
@SuppressWarnings("unused")
// lazy bind receiver to the socket
IMessageReceiver<String> receiver = queue.getReceiver();
queue.terminate();
}
/**
* Tests correct termination of a queue with readers.
*
* @throws MessagingException
*/
@Test(timeout = TEST_TIMEOUT)
public void testQueueTerminationWithSenders() throws MessagingException {
IMessageQueue<String> queue = getQueue();
// we do not need to lazy bind receiver to the socket (as in prev. test)
// because createSender method calls getReceiver() internally
IMessageSender<String> sender1 = queue.createSender();
IMessageSender<String> sender2 = queue.createSender();
sender1.close();
sender2.close();
queue.terminate();
}
/**
* Tests simple push-pull on a queue.
*
* @throws MessagingException
*/
@Test(timeout = TEST_TIMEOUT)
public void testPushPull() throws MessagingException {
IMessageQueue<String> queue = getQueue();
IMessageReceiver<String> receiver = queue.getReceiver();
IMessageSender<String> sender1 = queue.createSender();
final String message = "MESSAGE";
sender1.send(message);
String receivedMessage = receiver.receive();
assertEquals(message, receivedMessage);
sender1.close();
queue.terminate();
}
/**
* Tests simple push-pull on a queue with receiver and sender running in
* different thread.
*
* @throws MessagingException
*/
@Test(timeout = TEST_TIMEOUT)
public void testMultiThreadedPushPull() throws MessagingException, InterruptedException {
IMessageQueue<String> queue = getQueue();
final IMessageReceiver<String> receiver = queue.getReceiver();
final IMessageSender<String> sender = queue.createSender();
final String message = "MESSAGE";
ReceiverThread<String> receiverThread = new ReceiverThread<>(receiver, 1);
SenderThread<String> senderThread = new SenderThread<>(sender, message, 1);
receiverThread.start();
senderThread.start();
senderThread.join();
receiverThread.join();
assertEquals(1, receiverThread.getReceivedMessages().size());
for (String s : receiverThread.getReceivedMessages()) {
assertEquals(message, s);
}
sender.close();
queue.terminate();
}
/**
* Tests simple push-pull on a queue with receiver and sender running in
* different thread.
*
* @throws MessagingException
*/
@Test(timeout = TEST_TIMEOUT)
public void testMultiThreadedPushPullMulti() throws MessagingException, InterruptedException {
IMessageQueue<String> queue = getQueue();
final IMessageReceiver<String> receiver = queue.getReceiver();
final IMessageSender<String> sender = queue.createSender();
final String message = "MESSAGE";
int count = 10000;
ReceiverThread<String> receiverThread = new ReceiverThread<>(receiver, count);
SenderThread<String> senderThread = new SenderThread<>(sender, message, count);
receiverThread.start();
senderThread.start();
senderThread.join();
receiverThread.join();
assertEquals(count, receiverThread.getReceivedMessages().size());
for (String s : receiverThread.getReceivedMessages()) {
assertEquals(message, s);
}
sender.close();
queue.terminate();
}
@Test(timeout = TEST_TIMEOUT)
public void testMultiThreadedPushPullMultiMulti() throws MessagingException, InterruptedException {
IMessageQueue<String> queue = getQueue();
final IMessageReceiver<String> receiver = queue.getReceiver();
final IMessageSender<String> sender1 = queue.createSender();
final IMessageSender<String> sender2 = queue.createSender();
final String message = "MESSAGE";
int count = 10000;
ReceiverThread<String> receiverThread = new ReceiverThread<>(receiver, count * 2);
SenderThread<String> senderThread1 = new SenderThread<>(sender1, message, count);
SenderThread<String> senderThread2 = new SenderThread<>(sender2, message, count);
receiverThread.start();
senderThread1.start();
senderThread2.start();
senderThread1.join();
senderThread2.join();
receiverThread.join();
assertEquals(count * 2, receiverThread.getReceivedMessages().size());
for (String s : receiverThread.getReceivedMessages()) {
assertEquals(message, s);
}
sender1.close();
sender2.close();
queue.terminate();
}
@Test
public void testTerminateWithInterruptedListener() throws MessagingException {
final int count = 1;
IMessageQueue<String> queue = getQueue();
IMessageReceiver<String> receiver = queue.getReceiver();
ReceiverThread<String> receiverThread = new ReceiverThread<>(receiver, count);
receiverThread.interrupt();
queue.terminate();
}
@Test
public void testTerminateWithClosedReceiver() throws MessagingException {
IMessageQueue<String> queue = getQueue();
IMessageReceiver<String> receiver = queue.getReceiver();
receiver.close();
queue.terminate();
}
}