package net.jxta.endpoint;
import static org.junit.Assert.*;
import org.junit.Test;
public class MessengerStateBarrierTest {
@Test(timeout=100)
public void testAwaitMatch_singleEvent_matchBeforeAwait() throws Exception {
MessengerStateBarrier barrier = new MessengerStateBarrier(Messenger.CLOSED);
// barrier should indicate that it is to be unregistered when the right state is matched
// it does this by returning false
assertFalse(barrier.messengerStateChanged(Messenger.CLOSED));
assertEquals(Messenger.CLOSED, barrier.awaitMatch(0));
}
@Test
public void testAwaitMatch_singleEvent_neverMatch() throws Exception {
MessengerStateBarrier barrier = new MessengerStateBarrier(Messenger.CLOSED);
assertEquals(MessengerStateBarrier.NO_MATCH, barrier.awaitMatch(10L));
}
@Test(timeout=100)
public void testAwaitMatch_singleEvent_matchesWhileWaiting() throws Exception {
final MessengerStateBarrier barrier = new MessengerStateBarrier(Messenger.CLOSED);
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(10L);
} catch (InterruptedException e) {
System.err.println("Interrupted while sleeping");
e.printStackTrace();
}
barrier.messengerStateChanged(Messenger.CLOSED);
}
}).start();
assertEquals(Messenger.CLOSED, barrier.awaitMatch(50L));
}
@Test
public void testAwaitMatch_singleEvent_ignoresOthers() throws Exception {
MessengerStateBarrier barrier = new MessengerStateBarrier(Messenger.CLOSED);
assertTrue(barrier.messengerStateChanged(Messenger.CLOSING));
assertEquals(MessengerStateBarrier.NO_MATCH, barrier.awaitMatch(50L));
}
@Test
public void testAwaitMatch_multipleEvents() throws Exception {
MessengerStateBarrier barrier = new MessengerStateBarrier(Messenger.CLOSED | Messenger.BROKEN);
assertTrue(barrier.messengerStateChanged(Messenger.CONNECTED));
assertFalse(barrier.messengerStateChanged(Messenger.BROKEN));
assertEquals(Messenger.BROKEN, barrier.awaitMatch(0));
barrier = new MessengerStateBarrier(Messenger.CLOSED | Messenger.BROKEN);
assertFalse(barrier.messengerStateChanged(Messenger.CLOSED));
assertEquals(Messenger.CLOSED, barrier.awaitMatch(0));
}
@Test
public void testExpire() {
MessengerStateBarrier barrier = new MessengerStateBarrier(Messenger.CLOSED);
barrier.expire();
// barrier should return false, even if the state does not match it's expectations
assertFalse(barrier.messengerStateChanged(Messenger.CONNECTED));
}
}