/* * Copyright (C) 2012 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 com.google.gwt.user.client.Timer; import org.jboss.errai.bus.client.api.Subscription; 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.MessageCallback; import org.jboss.errai.bus.client.framework.ChaosMonkey; import org.jboss.errai.bus.common.AbstractErraiTest; import java.util.ArrayList; import java.util.List; /** * @author Mike Brock */ public class ShadowServicesTests extends AbstractErraiTest { private final List<Timer> timerList = new ArrayList<Timer>(); private final List<Subscription> cleanUpPile = new ArrayList<Subscription>(); @Override public String getModuleName() { return "org.jboss.errai.bus.ErraiBusTests"; } @Override protected void gwtSetUp() throws Exception { super.gwtSetUp(); } @Override protected void gwtTearDown() throws Exception { super.gwtTearDown(); bus.clearProperties(); for (Timer timer : timerList) { timer.cancel(); } for (Subscription subscription : cleanUpPile) { subscription.remove(); } } private Timer cleaned(Timer timer) { timerList.add(timer); return timer; } private Subscription cleaned(Subscription subscription) { cleanUpPile.add(subscription); return subscription; } public void testShadowServicesKickInProperty() { final List<String> receivedMessages = new ArrayList<String>(); final String receivingService = "AwesomousPrime"; final String remoteService = "MaximumAwesome"; final List<String> expected = new ArrayList<String>(); expected.add("FromServer"); expected.add("FromShadow"); cleaned(bus.subscribe(receivingService, new MessageCallback() { @Override public void callback(final Message message) { final String value = message.getValue(String.class); receivedMessages.add(value); System.out.println("Received: " + value); } })); cleaned(bus.subscribeShadow(remoteService, new MessageCallback() { @Override public void callback(final Message message) { MessageBuilder.createConversation(message).subjectProvided().withValue("FromShadow").done().reply(); } })); runAfterInit(new Runnable() { @Override public void run() { cleaned(new Timer() { @Override public void run() { MessageBuilder.createMessage().toSubject(remoteService).withValue("Test!").done() .repliesToSubject(receivingService).sendNowWith(bus); } }).scheduleRepeating(500); cleaned(new Timer() { @Override public void run() { if (receivedMessages.contains("FromServer")) { System.out.println("Received message from server. " + "Now stopping bus to let shadow service kick in."); bus.stop(false); } } }).schedule(3000); cleaned(new Timer() { @Override public void run() { if (receivedMessages.containsAll(expected)) { finishTest(); cancel(); } } }).scheduleRepeating(1000); } }); } public void testDeferralsGetSentToShadow() { final List<String> receivedMessages = new ArrayList<String>(); final String receivingService = "AwesomousPrime"; final String remoteService = "MaximumAwesome"; // Tell the Chaos Monkey, who lives inside the bus, to not really connect to // the server // when asked to do so, leaving the bus in a perpetual CONNECTING state. bus.setProperty(ChaosMonkey.DONT_REALLY_CONNECT, "true"); bus.setProperty(ChaosMonkey.FAIL_ON_CONNECT_AFTER_MS, "2000"); // Normally, when the bus is explicitly stopped, the state transitions to // LOCAL_ONLY (which is good). // But for this test, we want the bus to drop back to the UNINITIALIZED // state to simulate a cold start. bus.setProperty(ChaosMonkey.DEGRADE_TO_UNINITIALIZED_ON_STOP, "true"); bus.stop(false); bus.subscribe(receivingService, new MessageCallback() { @Override public void callback(final Message message) { final String value = message.getValue(String.class); receivedMessages.add(value); System.out.println("Received: " + value); } }); bus.subscribeShadow(remoteService, new MessageCallback() { @Override public void callback(final Message message) { MessageBuilder.createConversation(message).subjectProvided().withValue("FromShadow").done().reply(); } }); bus.init(); final Message message = MessageBuilder.createMessage().toSubject(remoteService).withValue("ZZZ").done() .repliesToSubject(receivingService).getMessage(); bus.send(message); bus.send(message); bus.send(message); /** * We prove the messages are deferred. */ assertEquals(0, receivedMessages.size()); delayTestFinish(30000); new Timer() { @Override public void run() { /** * We prove the deferrals were delivered to the shadow service. */ assertEquals(3, receivedMessages.size()); finishTest(); } }.schedule(5000); } }