/* * 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 org.jboss.errai.bus.client.ErraiBus; import org.jboss.errai.bus.client.api.messaging.Message; import org.jboss.errai.bus.client.api.messaging.MessageCallback; import org.jboss.errai.bus.client.api.Subscription; import org.jboss.errai.cdi.client.event.FunEvent; import org.jboss.errai.cdi.client.qualifier.A; import org.jboss.errai.cdi.client.qualifier.B; import org.jboss.errai.cdi.event.client.EventRoutingTestModule; import org.jboss.errai.enterprise.client.cdi.AbstractCDIEventCallback; 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.jboss.errai.ioc.client.container.IOC; import java.util.ArrayList; import java.util.List; /** * @author Mike Brock */ public class EventRoutingIntegrationTest extends AbstractErraiCDITest { @Override public String getModuleName() { return "org.jboss.errai.cdi.event.EventRoutingTestModule"; } public void testEventRouting() { delayTestFinish(60000); final List<FunEvent> wireEvents = new ArrayList<FunEvent>(); final List<FunEvent> actualEvents = new ArrayList<FunEvent>(); final EventRoutingTestModule module = IOC.getBeanManager().lookupBean(EventRoutingTestModule.class).getInstance(); final Runnable verifier = new Runnable() { @Override public void run() { for (final FunEvent funEvent : wireEvents) { // none of the events should have text that contain the character 'A'. if (funEvent.getText().contains("A")) { fail("should not have received qualifier A on the wire"); } assertEquals("same number of events should be received on wire and actual", wireEvents.size(), actualEvents.size()); } finishTest(); } }; CDI.addPostInitTask(new Runnable() { @Override public void run() { module.setResultVerifier(verifier); final Subscription subscribeA = CDI.subscribe(FunEvent.class.getName(), new AbstractCDIEventCallback<FunEvent>() { { qualifierSet.add(A.class.getName()); } @Override protected void fireEvent(FunEvent event) { actualEvents.add(event); } }); final Subscription subscribeB = CDI.subscribe(FunEvent.class.getName(), new AbstractCDIEventCallback<FunEvent>() { { qualifierSet.add(B.class.getName()); } @Override protected void fireEvent(FunEvent event) { actualEvents.add(event); } }); final String eventSubject = CDI.getSubjectNameByType(FunEvent.class.getName()); ErraiBus.get().subscribe(eventSubject, CDI.ROUTING_CALLBACK); ErraiBus.get().subscribe(eventSubject, new MessageCallback() { @Override public void callback(final Message message) { final Object beanRef = message.get(Object.class, CDIProtocol.BeanReference); if (beanRef instanceof FunEvent) { wireEvents.add((FunEvent) beanRef); } } }); // intentionally remove the subscription with the "A" qualifier, to ensure the server-side routing // logic remove it from the route correctly. subscribeA.remove(); // send the initial event to begin the test module.start(); } }); } }