/* * 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.cdi.event.client.test; import java.util.ArrayList; import java.util.List; import junit.framework.AssertionFailedError; 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.framework.ClientMessageBusImpl; import org.jboss.errai.cdi.client.event.LocalEventA; import org.jboss.errai.cdi.client.event.MyEventImpl; import org.jboss.errai.cdi.event.client.shared.PortableLocalEventA; import org.jboss.errai.common.client.api.extension.InitVotes; import org.jboss.errai.enterprise.client.cdi.AbstractErraiCDITest; import org.jboss.errai.enterprise.client.cdi.CDIProtocol; import org.jboss.errai.enterprise.client.cdi.api.CDI; import org.junit.Test; import com.google.gwt.user.client.Timer; /** * @author Christian Sadilek <csadilek@redhat.com> * @author Jonathan Fuerth <jfuerth@redhat.com> * @author Max Barkely <mbarkley@redhat.com> */ public class EventAdvertisingIntegrationTest extends AbstractErraiCDITest { private final List<String> messageBeanTypeLog = new ArrayList<String>(); private ClientMessageBusImpl backupBus; private Timer testTimer; @Override public String getModuleName() { return "org.jboss.errai.cdi.event.EventObserverTestModule"; } @Override protected void gwtSetUp() throws Exception { ClientMessageBusImpl fakeBus = new ClientMessageBusImpl() { @Override public void send(Message message) { if (message.hasPart(CDIProtocol.BeanType) && message.getSubject().equals(CDI.SERVER_DISPATCHER_SUBJECT)) { messageBeanTypeLog.add(message.get(String.class, CDIProtocol.BeanType)); } super.send(message); } }; backupBus = UntestableFrameworkUtil.installAlternativeBusImpl(fakeBus); InitVotes.reset(); super.gwtSetUp(); } @Override protected void gwtTearDown() throws Exception { messageBeanTypeLog.clear(); if (testTimer != null) { testTimer.cancel(); } super.gwtTearDown(); ClientMessageBusImpl fakeBus = UntestableFrameworkUtil.installAlternativeBusImpl(backupBus); fakeBus.stop(true); } @Test public void testLocalEventNotInitiallyAdvertisedToServer() { final long start = System.currentTimeMillis(); testTimer = new Timer() { @Override public void run() { try { // this is the actual point of the test assertFalse("Local event should not have been advertised to the server", messageBeanTypeLog.contains(LocalEventA.class.getName())); // this is an important safety check, because it would be too easy for the test to // fake-pass if the implementation details change. assertTrue("Portable event should have been advertised to the server", messageBeanTypeLog.contains(MyEventImpl.class.getName())); finishTest(); } catch (AssertionFailedError ex) { if (System.currentTimeMillis() - start > 25000) { cancel(); throw ex; } } } }; testTimer.scheduleRepeating(500); delayTestFinish(30000); } @Test public void testLocalEventNotReadvertisedToServer() { /* * Test overview: * - Wait for initial CDI Event Advertising to occur * - Invalidate the Session Queue * - Check for re-advertised CDI Events until timeout */ final long start = System.currentTimeMillis(); new Timer() { @Override public void run() { if (!messageBeanTypeLog.contains(LocalEventA.class.getName()) && messageBeanTypeLog.contains(MyEventImpl.class.getName())) { messageBeanTypeLog.clear(); cancel(); MessageBuilder.createMessage("queueSessionInvalidationService").done().sendNowWith(ErraiBus.get()); delayTestFinish(30000); final long secondStart = System.currentTimeMillis(); testTimer = new Timer() { @Override public void run() { try { // this is the actual point of the test assertFalse("Local event should not have been advertised to the server", messageBeanTypeLog.contains(LocalEventA.class.getName())); // this is an important safety check, because it would be too easy for the test to // fake-pass if the implementation details change. assertTrue("Portable event should have been advertised to the server", messageBeanTypeLog.contains(MyEventImpl.class.getName())); finishTest(); } catch (AssertionFailedError ex) { if (System.currentTimeMillis() - secondStart > 25000) { cancel(); throw ex; } } } }; testTimer.scheduleRepeating(500); } else if (System.currentTimeMillis() - start > 25000) { cancel(); fail("Timed out while waiting for initial advertising of services"); } } }.scheduleRepeating(500); delayTestFinish(30000); } @Test public void testPortableLocalEventNotInitiallyAdvertisedToServer() { final long start = System.currentTimeMillis(); testTimer = new Timer() { @Override public void run() { try { // this is the actual point of the test assertFalse("Local event should not have been advertised to the server", messageBeanTypeLog.contains(PortableLocalEventA.class.getName())); // this is an important safety check, because it would be too easy for the test to // fake-pass if the implementation details change. assertTrue("Portable event should have been advertised to the server", messageBeanTypeLog.contains(MyEventImpl.class.getName())); finishTest(); } catch (AssertionFailedError ex) { if (System.currentTimeMillis() - start > 55000) { cancel(); throw ex; } } } }; testTimer.scheduleRepeating(500); delayTestFinish(60000); } @Test public void testPortableLocalEventNotReadvertisedToServer() { final long start = System.currentTimeMillis(); new Timer() { @Override public void run() { if (!messageBeanTypeLog.contains(PortableLocalEventA.class.getName()) && messageBeanTypeLog.contains(MyEventImpl.class.getName())) { messageBeanTypeLog.clear(); cancel(); MessageBuilder.createMessage("queueSessionInvalidationService").done().sendNowWith(ErraiBus.get()); delayTestFinish(30000); final long secondStart = System.currentTimeMillis(); testTimer = new Timer() { @Override public void run() { try { // this is the actual point of the test assertFalse("Local event should not have been advertised to the server", messageBeanTypeLog.contains(PortableLocalEventA.class.getName())); // this is an important safety check, because it would be too easy for the test to // fake-pass if the implementation details change. assertTrue("Portable event should have been advertised to the server", messageBeanTypeLog.contains(MyEventImpl.class.getName())); finishTest(); } catch (AssertionFailedError ex) { if (System.currentTimeMillis() - secondStart > 25000) { cancel(); throw ex; } } } }; testTimer.scheduleRepeating(500); } else if (System.currentTimeMillis() - start > 25000) { cancel(); fail("Timed out while waiting for initial advertising of services"); } } }.scheduleRepeating(500); delayTestFinish(30000); } }