package io.vertx.test.core;
import io.vertx.core.Handler;
import io.vertx.core.eventbus.EventBus;
import io.vertx.core.eventbus.SendContext;
import org.junit.Test;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author <a href="http://tfox.org">Tim Fox</a>
*/
public class EventBusInterceptorTest extends VertxTestBase {
protected EventBus eb;
@Test
public void testInterceptorSend() {
eb.addInterceptor(sc -> {
assertEquals("armadillo", sc.message().body());
assertTrue(sc.send());
sc.next();
});
eb.consumer("some-address", msg -> {
assertEquals("armadillo", msg.body());
testComplete();
});
eb.send("some-address", "armadillo");
await();
}
@Test
public void testInterceptorPublish() {
eb.addInterceptor(sc -> {
assertEquals("armadillo", sc.message().body());
assertFalse(sc.send());
sc.next();
});
eb.consumer("some-address", msg -> {
assertEquals("armadillo", msg.body());
testComplete();
});
eb.publish("some-address", "armadillo");
await();
}
@Test
public void testInterceptorNoNext() {
eb.addInterceptor(sc -> {
assertEquals("armadillo", sc.message().body());
});
eb.consumer("some-address", msg -> {
fail("Should not receive message");
});
eb.send("some-address", "armadillo");
vertx.setTimer(200, tid -> testComplete());
await();
}
@Test
public void testMultipleInterceptors() {
AtomicInteger cnt = new AtomicInteger();
int interceptorNum = 10;
for (int i = 0; i < interceptorNum; i++) {
final int expectedCount = i;
eb.addInterceptor(sc -> {
assertEquals("armadillo", sc.message().body());
int count = cnt.getAndIncrement();
assertEquals(expectedCount, count);
sc.next();
});
}
eb.consumer("some-address", msg -> {
assertEquals("armadillo", msg.body());
assertEquals(interceptorNum, cnt.get());
testComplete();
});
eb.send("some-address", "armadillo");
await();
}
@Test
public void testRemoveInterceptor() {
AtomicInteger cnt1 = new AtomicInteger();
AtomicInteger cnt2 = new AtomicInteger();
Handler<SendContext> eb1 = sc -> {
cnt1.incrementAndGet();
sc.next();
};
Handler<SendContext> eb2 = sc -> {
cnt2.incrementAndGet();
sc.next();
};
eb.addInterceptor(eb1).addInterceptor(eb2);
eb.consumer("some-address", msg -> {
if (msg.body().equals("armadillo")) {
assertEquals(1, cnt1.get());
assertEquals(1, cnt2.get());
eb.removeInterceptor(eb2);
eb.send("some-address", "aardvark");
} else if (msg.body().equals("aardvark")) {
assertEquals(2, cnt1.get());
assertEquals(1, cnt2.get());
testComplete();
} else {
fail("wrong body");
}
});
eb.send("some-address", "armadillo");
await();
}
@Test
public void testInterceptorOnReply() {
AtomicInteger cnt = new AtomicInteger();
eb.addInterceptor(sc -> {
if (sc.message().body().equals("armadillo")) {
assertEquals(0, cnt.get());
} else if (sc.message().body().equals("echidna")) {
assertEquals(1, cnt.get());
} else {
fail("wrong body");
}
cnt.incrementAndGet();
sc.next();
});
eb.consumer("some-address", msg -> {
assertEquals("armadillo", msg.body());
assertEquals(1, cnt.get());
msg.reply("echidna");
});
eb.send("some-address", "armadillo", reply -> {
assertEquals("echidna", reply.result().body());
assertEquals(2, cnt.get());
testComplete();
});
await();
}
@Test
public void testExceptionInInterceptor() {
AtomicInteger cnt = new AtomicInteger();
Handler<SendContext> eb1 = sc -> {
cnt.incrementAndGet();
vertx.runOnContext(v -> sc.next());
throw new RuntimeException("foo");
};
Handler<SendContext> eb2 = sc -> {
cnt.incrementAndGet();
sc.next();
};
eb.addInterceptor(eb1).addInterceptor(eb2);
eb.consumer("some-address", msg -> {
assertEquals("armadillo", msg.body());
assertEquals(2, cnt.get());
testComplete();
});
eb.send("some-address", "armadillo");
await();
}
@Override
public void setUp() throws Exception {
super.setUp();
eb = vertx.eventBus();
}
}