package com.netflix.eventbus;
import java.util.concurrent.TimeUnit;
import org.junit.Assert;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.netflix.eventbus.impl.EventBusImpl;
import com.netflix.eventbus.spi.EventBus;
public class AbstractEventBusBridgeTest {
private static final Logger LOG = LoggerFactory.getLogger(AbstractEventBusBridgeTest.class);
@Test
public void testString() throws Exception {
EventBus eventBus = new EventBusImpl();
DummyEventBusBridge bridge = DummyEventBusBridge.builder()
.withEventBus(eventBus)
.withEventType(String.class)
.withExpectedCount(1)
.build();
eventBus.publish(new String("Foo"));
Assert.assertTrue(bridge.await(3, TimeUnit.SECONDS));
Assert.assertEquals(1, bridge.getConsumeCount());
Assert.assertEquals(0, bridge.getConsumeErrorCount());
}
@Test
public void testConsumeErrorStats() throws Exception {
EventBus eventBus = new EventBusImpl();
final RuntimeException e = new RuntimeException("Suro failed to send the message");
DummyEventBusBridge bridge = DummyEventBusBridge.builder()
.withEventBus(eventBus)
.withEventType(String.class)
.build();
bridge.setError(e);
eventBus.publish(new String("Foo"));
TimeUnit.SECONDS.sleep(1);
Assert.assertEquals(0, bridge.getConsumeCount());
Assert.assertEquals(1, bridge.getConsumeErrorCount());
Assert.assertEquals(e, bridge.getLastConsumeException());
}
@Test
public void testGetStatusAreImmutable() throws Exception {
EventBus eventBus = new EventBusImpl();
DummyEventBusBridge bridge = DummyEventBusBridge.builder()
.withEventBus(eventBus)
.withEventType(String.class)
.build();
try {
bridge.getStats().incConsumeCount();
Assert.fail("Stats should be immutable");
}
catch (UnsupportedOperationException e) {
}
}
@Test
public void testPauseAndResume() throws Exception {
EventBus eventBus = new EventBusImpl();
DummyEventBusBridge bridge = DummyEventBusBridge.builder()
.withExpectedCount(2)
.withEventBus(eventBus)
.withEventType(String.class)
.build();
eventBus.publish(new String("Foo"));
Assert.assertTrue(waitForConsumeCount(bridge, 1, 1, TimeUnit.SECONDS));
bridge.pause();
eventBus.publish(new String("Foo"));
Assert.assertFalse(waitForConsumeCount(bridge, 2, 1, TimeUnit.SECONDS));
bridge.resume();
eventBus.publish(new String("Foo"));
Assert.assertTrue(waitForConsumeCount(bridge, 2, 1, TimeUnit.SECONDS));
}
public boolean waitForConsumeCount(DummyEventBusBridge bridge, long expected, long delay, TimeUnit units) throws Exception {
long intervals = TimeUnit.MILLISECONDS.convert(delay, units)/100;
assert intervals > 0;
for (long i = 0; i < intervals; i++) {
if (bridge.getConsumeCount() == expected)
return true;
TimeUnit.MILLISECONDS.sleep(100);
}
return false;
}
}