/*
* Copyright (C) 2015 Red Hat, Inc. and/or its affiliates.
*
* 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 org.jboss.errai.bus.client.tests;
import org.jboss.errai.bus.client.ErraiBus;
import org.jboss.errai.bus.client.api.base.MessageBuilder;
import org.jboss.errai.bus.client.api.messaging.Message;
import org.jboss.errai.bus.client.api.messaging.MessageBus;
import org.jboss.errai.bus.client.api.messaging.MessageCallback;
import org.jboss.errai.bus.common.AbstractErraiTest;
import com.google.gwt.user.client.Timer;
/**
* @author Max Barkley <mbarkley@redhat.com>
*/
public class MessageReplyCallbackTest extends AbstractErraiTest {
private static final int TIMEOUT = 60000;
private static final int POLL = 500;
private MessageBus bus;
private boolean received;
private MessageCallback callback = new MessageCallback() {
@Override
public void callback(Message message) {
received = true;
}
};
@Override
public String getModuleName() {
return "org.jboss.errai.bus.MessageReplyCallbackTests";
}
@Override
protected void gwtSetUp() throws Exception {
super.gwtSetUp();
bus = ErraiBus.get();
received = false;
}
public void testSendViaDefaultMessageBuilder() throws Exception {
runAndWait(new Runnable() {
@Override
public void run() {
MessageBuilder.createMessage().toSubject("ReplyCallbackTestService").done().repliesTo(callback)
.sendNowWith(bus);
}
});
}
public void testSendViaMessage() throws Exception {
runAndWait(new Runnable() {
@Override
public void run() {
Message message = MessageBuilder.createMessage().toSubject("ReplyCallbackTestService").done()
.repliesTo(callback).getMessage();
message.sendNowWith(bus);
}
});
}
public void testReuseMessage() {
final Message message = MessageBuilder.createMessage("ReplyCallbackTestService").done().repliesTo(callback)
.getMessage();
runAndWaitAndThen(new Runnable() {
@Override
public void run() {
message.sendNowWith(bus);
}
}, new Runnable() {
@Override
public void run() {
received = false;
message.sendNowWith(bus);
}
});
}
/*
* This test in a nut shell:
* - send message to ReplyCallbackTestService and wait for first reply
* - send second message to ReplyCallbackTestService by building conversation
* - test that this conversation was repliable by waiting for second reply from ReplyCallbackTestService
*/
public void testReplyToConversationViaMessage() {
delayTestFinish(TIMEOUT);
MessageBuilder.createMessage("ReplyCallbackTestService").done().repliesTo(new MessageCallback() {
@Override
public void callback(Message message) {
final Message m = message;
runAndWait(new Runnable() {
@Override
public void run() {
MessageBuilder.createConversation(m).subjectProvided().done().repliesTo(callback).getMessage()
.sendNowWith(bus);
}
});
}
}).sendNowWith(bus);
}
/*
* This test in a nut shell:
* - send message to ReplyCallbackTestService and wait for first reply
* - send second message to ReplyCallbackTestService by building conversation
* - test that this conversation was repliable by waiting for second reply from ReplyCallbackTestService
*/
public void testReplyToConversationViaDefaultBuilder() {
delayTestFinish(TIMEOUT);
MessageBuilder.createMessage("ReplyCallbackTestService").done().repliesTo(new MessageCallback() {
@Override
public void callback(Message message) {
final Message m = message;
runAndWait(new Runnable() {
@Override
public void run() {
MessageBuilder.createConversation(m).subjectProvided().done().repliesTo(callback).sendNowWith(bus);
}
});
}
}).sendNowWith(bus);
}
public void testSendGlobalViaDefaultBuilder() {
runAndWait(new Runnable() {
@Override
public void run() {
MessageBuilder.createMessage("ReplyCallbackTestService").done().repliesTo(callback).sendGlobalWith(bus);
}
});
}
public void testSendNoListenersViaDefaultBuilder() {
runAndWait(new Runnable() {
@Override
public void run() {
MessageBuilder.createMessage("ReplyCallbackTestService").done().repliesTo(callback).sendNowWith(bus, false);
}
});
}
private void runAndWait(Runnable test) {
runAndWaitAndThen(test, null);
}
private void runAndWaitAndThen(Runnable first, final Runnable second) {
delayTestFinish(TIMEOUT + 2 * POLL);
final long start = System.currentTimeMillis();
first.run();
new Timer() {
@Override
public void run() {
if (System.currentTimeMillis() - start > TIMEOUT) {
cancel();
fail();
}
else if (received) {
cancel();
if (second != null) {
runAndWaitAndThen(second, null);
}
else {
finishTest();
}
}
}
}.scheduleRepeating(POLL);
}
}