/*
* Copyright (c) 2012 Mike Heath. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package cloudeventbus.hub;
import cloudeventbus.Subject;
import org.testng.annotations.Test;
import java.util.concurrent.atomic.AtomicBoolean;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
/**
* @author Mike Heath <elcapo@gmail.com>
*/
public class HubTest {
@Test
public void simpleSubscribe() throws Exception {
final Subject subject = new Subject("test");
final String body = "Message body";
final AtomicBoolean methodCalled = new AtomicBoolean();
final SubscribeableHub<TestHub.Message> hub = new TestHub();
hub.subscribe(new Subject("test"), new Handler<TestHub.Message>() {
@Override
public void publish(TestHub.Message message) {
assertEquals(subject, message.getSubject());
assertEquals(body, message.getBody());
methodCalled.set(true);
}
});
hub.publish(subject, null, body);
assertTrue(methodCalled.get());
}
@Test
public void wildCardSubscribe() {
final Subject subject = new Subject("test.foo");
final Subject wildCardSubject = new Subject("test.*");
final SubscribeableHub<TestHub.Message> hub = new TestHub();
final CountHandler handler = new CountHandler();
hub.subscribe(wildCardSubject, handler);
hub.publish(subject, null, "Test");
assertEquals(handler.getCallCount(), 1);
}
@Test
public void wildCardAllSubscribe() throws Exception {
final Subject subject = new Subject("test");
final String body = "Message body";
final AtomicBoolean methodCalled = new AtomicBoolean();
final SubscribeableHub<TestHub.Message> hub = new TestHub();
hub.subscribe(Subject.ALL, new Handler<TestHub.Message>() {
@Override
public void publish(TestHub.Message message) {
assertEquals(subject, message.getSubject());
assertEquals(body, message.getBody());
methodCalled.set(true);
}
});
hub.publish(subject, null, body);
assertTrue(methodCalled.get());
}
@Test
public void handlerCalledOnce() throws Exception {
final Subject subject = new Subject("test");
final String body = "Message body";
final CountHandler handler = new CountHandler();
final SubscribeableHub<TestHub.Message> hub = new TestHub();
hub.subscribe(Subject.ALL, handler);
hub.subscribe(subject, handler);
hub.publish(subject, null, body);
assertEquals(1, handler.getCallCount());
}
@Test
public void multipleWildCards() throws Exception {
final Subject subject1 = new Subject("test1.*");
final Subject subject2 = new Subject("test2.*");
final Subject subject3 = new Subject("test3.*");
final String body = "Message body";
final CountHandler handlerAll = new CountHandler();
final CountHandler handler1 = new CountHandler();
final CountHandler handler2 = new CountHandler();
final CountHandler handler3 = new CountHandler();
final SubscribeableHub<TestHub.Message> hub = new TestHub();
hub.subscribe(Subject.ALL, handlerAll);
hub.subscribe(subject1, handler1);
hub.subscribe(subject2, handler2);
hub.subscribe(subject3, handler3);
hub.publish(new Subject("test1.foo"), null, body);
hub.publish(new Subject("test2.bar"), null, body);
hub.publish(new Subject("test3.baz"), null, body);
assertEquals(handlerAll.getCallCount(), 3);
assertEquals(handler1.getCallCount(), 1);
assertEquals(handler2.getCallCount(), 1);
assertEquals(handler3.getCallCount(), 1);
}
@Test
public void wildCardDepthTest() throws Exception {
final Subject subject1 = new Subject("foo.*");
final Subject subject2 = new Subject("foo.bar.*");
final Subject subject3 = new Subject("foo.bar.baz.*");
final String body = "Message body";
final CountHandler handlerAll = new CountHandler();
final CountHandler handler1 = new CountHandler();
final CountHandler handler2 = new CountHandler();
final CountHandler handler3 = new CountHandler();
final SubscribeableHub<TestHub.Message> hub = new TestHub();
hub.subscribe(Subject.ALL, handlerAll);
hub.subscribe(subject1, handler1);
hub.subscribe(subject2, handler2);
hub.subscribe(subject3, handler3);
hub.publish(new Subject("foo"), null, body);
hub.publish(new Subject("foo.bar"), null, body);
hub.publish(new Subject("foo.bar.baz"), null, body);
hub.publish(new Subject("foo.bar.baz.joe"), null, body);
assertEquals(handlerAll.getCallCount(), 4);
assertEquals(handler1.getCallCount(), 3);
assertEquals(handler2.getCallCount(), 2);
assertEquals(handler3.getCallCount(), 1);
}
private class CountHandler implements Handler<TestHub.Message> {
private int callCount = 0;
@Override
public void publish(TestHub.Message message) {
callCount++;
}
public int getCallCount() {
return callCount;
}
}
}