/*
* Copyright (c) 2013 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.test;
import cloudeventbus.client.Connector;
import cloudeventbus.client.EventBus;
import cloudeventbus.client.Message;
import cloudeventbus.client.MessageHandler;
import cloudeventbus.client.MessageIterator;
import cloudeventbus.client.Request;
import cloudeventbus.client.Subscription;
import org.testng.annotations.Test;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import static org.testng.Assert.*;
/**
* @author Mike Heath <elcapo@gmail.com>
*/
public class PublishTest {
@Test
public void simplePublish() throws Exception {
try (
TestServer server = new TestServer()
) {
final BlockingConnectionStateListener listener = new BlockingConnectionStateListener(1);
try (
EventBus eventBus = new Connector().addServer("localhost").addConnectionStateListener(listener).connect()
) {
listener.awaitConnection();
final String subject = "test";
final String body = "This is the message body.";
final Subscription subscription = eventBus.subscribe(subject);
final MessageIterator iterator = subscription.iterator();
eventBus.publish(subject, body);
final Message message = iterator.next(2, TimeUnit.SECONDS);
assertNotNull(message);
assertEquals(message.getSubject(), subject);
assertEquals(message.getBody(), body);
assertFalse(message.isRequest());
subscription.close();
assertFalse(iterator.hasNext());
assertEquals(subscription.getReceivedMessages(), 1);
}
}
}
@Test
public void subscribeClose() throws Exception {
try (
TestServer server = new TestServer()
) {
final BlockingConnectionStateListener listener = new BlockingConnectionStateListener(1);
try (
EventBus eventBus = new Connector().addServer("localhost").addConnectionStateListener(listener).connect()
) {
listener.awaitConnection();
final String subject = "test";
final String body1 = "This is the message body.";
final String body2 = "Another message body.";
final Subscription subscription1 = eventBus.subscribe(subject);
final Subscription subscription2 = eventBus.subscribe(subject);
final MessageIterator iterator1 = subscription1.iterator();
final MessageIterator iterator2 = subscription2.iterator();
eventBus.publish(subject, body1);
// Assert first subscription received message
final Message message1 = iterator1.next(1, TimeUnit.SECONDS);
assertNotNull(message1);
assertEquals(message1.getSubject(), subject);
assertEquals(message1.getBody(), body1);
assertFalse(message1.isRequest());
// Assert second subscription received message
final Message message2 = iterator2.next(1, TimeUnit.SECONDS);
assertNotNull(message2);
assertEquals(message2.getSubject(), subject);
assertEquals(message2.getBody(), body1);
assertFalse(message2.isRequest());
// Close second subscription
subscription2.close();
assertTrue(iterator1.hasNext());
assertFalse(iterator2.hasNext());
assertEquals(subscription1.getReceivedMessages(), 1);
assertEquals(subscription2.getReceivedMessages(), 1);
// Publish second message
eventBus.publish(subject, body2);
// Make sure first iterator has the recently published message
final Message message3 = iterator1.next(1, TimeUnit.SECONDS);
assertNotNull(message3);
assertEquals(message3.getSubject(), subject);
assertEquals(message3.getBody(), body2);
}
}
}
@Test
public void request() throws Exception {
try (
TestServer server = new TestServer()
) {
try (
EventBus eventBus = new Connector().addServer("localhost").connect()
) {
final String subject = "test";
final String body = "This is the message body.";
final String replyBody = "This is the reply body.";
eventBus.subscribe(subject).addMessageHandler(new MessageHandler() {
@Override
public void onMessage(Message message) {
System.out.println("Received request, sending reply.");
message.reply(replyBody);
}
});
final CountDownLatch latch = new CountDownLatch(1);
final Request request = eventBus.request(subject, body, new MessageHandler() {
@Override
public void onMessage(Message message) {
System.out.println("Received reply.");
latch.countDown();
}
});
assertTrue(latch.await(2, TimeUnit.SECONDS));
assertEquals(request.getReceivedReplies(), 1);
}
}
}
}