package cz.cuni.mff.d3s.been.socketworks.oneway; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.MockitoAnnotations.initMocks; import java.util.UUID; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import cz.cuni.mff.d3s.been.mq.IMessageSender; import cz.cuni.mff.d3s.been.mq.MessageQueues; import cz.cuni.mff.d3s.been.mq.MessagingException; import cz.cuni.mff.d3s.been.socketworks.SocketHandlerException; public class ReadOnlyGuardTest { private ReadOnlyGuard guard; private IMessageSender<String> sender; private String message; private String queueName; private TestHandler handler; private Object lock; @Before public void setUpGuard() throws MessagingException { initMocks(this); lock = new Object(); queueName = UUID.randomUUID().toString(); message = UUID.randomUUID().toString(); handler = new TestHandler(message, lock); guard = ReadOnlyGuard.create("localhost", queueName, handler); guard.listen(); sender = MessageQueues.getInstance().createSender(queueName); } @After public void tearDownGuard() throws MessagingException { sender.close(); guard.terminate(); } @Test(timeout = 1000) public void testTerminateEmpty() throws MessagingException { // just dry-run the @Before and @After methods } @Test(timeout = 1000) public void testReceive() throws MessagingException, SocketHandlerException, InterruptedException { sendAndWait(); assertEquals(1, handler.getCount()); } @Test(timeout = 1000) public void testReopenQueueWithSameName() throws MessagingException, InterruptedException, SocketHandlerException { sendAndWait(); sender.close(); guard.terminate(); guard = ReadOnlyGuard.create("localhost", queueName, handler); guard.listen(); sender = MessageQueues.getInstance().createSender(queueName); sendAndWait(); assertEquals(2, handler.getCount()); } /** * Send a message and wait on {@link #lock} until {@link #handler} wakes us up * * @throws InterruptedException If the {@link Object#wait()} on {@link #lock} gets interrupted * @throws MessagingException */ private void sendAndWait() throws InterruptedException,MessagingException { synchronized (lock) { sender.send(message); lock.wait(); } } class TestHandler implements ReadOnlyHandler { private final String message; private final Object lock; private int count; TestHandler(String message, Object lock) { this.message = message; this.lock = lock; this.count = 0; } @Override public void handle(String message) throws SocketHandlerException { assertEquals(this.message, message); ++count; synchronized (lock) { lock.notifyAll(); } } int getCount() { return count; } } }