/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.portal.kernel.nio.intraband.messaging; import com.liferay.portal.kernel.messaging.BaseDestination; import com.liferay.portal.kernel.messaging.Message; import com.liferay.portal.kernel.messaging.MessageBus; import com.liferay.portal.kernel.messaging.MessageBusException; import com.liferay.portal.kernel.messaging.MessageListener; import com.liferay.portal.kernel.messaging.MessageListenerException; import com.liferay.portal.kernel.messaging.SynchronousDestination; import com.liferay.portal.kernel.nio.intraband.Datagram; import com.liferay.portal.kernel.nio.intraband.PortalExecutorManagerUtilAdvice; import com.liferay.portal.kernel.nio.intraband.SystemDataType; import com.liferay.portal.kernel.nio.intraband.test.MockIntraband; import com.liferay.portal.kernel.nio.intraband.test.MockRegistrationReference; import com.liferay.portal.kernel.test.ReflectionTestUtil; import com.liferay.portal.kernel.test.rule.AggregateTestRule; import com.liferay.portal.kernel.test.rule.CodeCoverageAssertor; import com.liferay.portal.kernel.test.rule.NewEnv; import com.liferay.portal.kernel.util.PortalClassLoaderUtil; import com.liferay.portal.test.rule.AdviseWith; import com.liferay.portal.test.rule.AspectJNewEnvTestRule; import com.liferay.registry.BasicRegistryImpl; import com.liferay.registry.RegistryUtil; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.concurrent.atomic.AtomicReference; import org.junit.Assert; import org.junit.Before; import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.mockito.Matchers; import org.mockito.Mockito; /** * @author Shuyang Zhou */ public class MessageDatagramReceiveHandlerTest { @ClassRule @Rule public static final AggregateTestRule aggregateTestRule = new AggregateTestRule( CodeCoverageAssertor.INSTANCE, AspectJNewEnvTestRule.INSTANCE); @Before public void setUp() { RegistryUtil.setRegistry(new BasicRegistryImpl()); } @AdviseWith(adviceClasses = {PortalExecutorManagerUtilAdvice.class}) @NewEnv(type = NewEnv.Type.CLASSLOADER) @Test public void testDoReceive1() throws Exception { // No such destination, not synchronized PortalClassLoaderUtil.setClassLoader( MessageDatagramReceiveHandlerTest.class.getClassLoader()); MessageBus messageBus = Mockito.mock(MessageBus.class); MessageDatagramReceiveHandler messageDatagramReceiveHandler = new MessageDatagramReceiveHandler(messageBus); SystemDataType systemDataType = SystemDataType.MESSAGE; Message message = new Message(); message.setDestinationName( MessageDatagramReceiveHandlerTest.class.getName()); MessageRoutingBag messageRoutingBag = new MessageRoutingBag( message, false); Datagram datagram = Datagram.createRequestDatagram( systemDataType.getValue(), messageRoutingBag.toByteArray()); messageDatagramReceiveHandler.doReceive( _mockRegistrationReference, datagram); // No such destination, synchronized messageRoutingBag = new MessageRoutingBag(message, true); datagram = Datagram.createRequestDatagram( systemDataType.getValue(), messageRoutingBag.toByteArray()); messageDatagramReceiveHandler.doReceive( _mockRegistrationReference, datagram); Datagram responseDatagram = _mockIntraband.getDatagram(); ByteBuffer byteBuffer = responseDatagram.getDataByteBuffer(); MessageRoutingBag responseMessageRoutingBag = MessageRoutingBag.fromByteArray(byteBuffer.array()); assertMessageRoutingBagEquals( messageRoutingBag, responseMessageRoutingBag); // Normal destination, synchronized, no listener BaseDestination baseDestination = new SynchronousDestination(); baseDestination.setName( MessageDatagramReceiveHandlerTest.class.getName()); messageBus.addDestination(baseDestination); Mockito.when( messageBus.getDestination(Matchers.anyString()) ).thenReturn( baseDestination ); datagram = Datagram.createRequestDatagram( systemDataType.getValue(), messageRoutingBag.toByteArray()); messageDatagramReceiveHandler.doReceive( _mockRegistrationReference, datagram); responseDatagram = _mockIntraband.getDatagram(); byteBuffer = responseDatagram.getDataByteBuffer(); responseMessageRoutingBag = MessageRoutingBag.fromByteArray( byteBuffer.array()); assertMessageRoutingBagEquals( messageRoutingBag, responseMessageRoutingBag); // Normal destination, synchronized, with listener final AtomicReference<Message> messageReference = new AtomicReference<>(); baseDestination.register( new MessageListener() { @Override public void receive(Message message) { messageReference.set(message); } }); datagram = Datagram.createRequestDatagram( systemDataType.getValue(), messageRoutingBag.toByteArray()); messageDatagramReceiveHandler.doReceive( _mockRegistrationReference, datagram); responseDatagram = _mockIntraband.getDatagram(); byteBuffer = responseDatagram.getDataByteBuffer(); responseMessageRoutingBag = MessageRoutingBag.fromByteArray( byteBuffer.array()); assertMessageRoutingBagEquals( messageRoutingBag, responseMessageRoutingBag); Message receivedMessage = messageReference.get(); Assert.assertNotNull(receivedMessage); // Normal destination, synchronized, with listener that throws an // exception final MessageListenerException messageListenerException = new MessageListenerException(); baseDestination.register( new MessageListener() { @Override public void receive(Message message) throws MessageListenerException { throw messageListenerException; } }); datagram = Datagram.createRequestDatagram( systemDataType.getValue(), messageRoutingBag.toByteArray()); try { messageDatagramReceiveHandler.doReceive( _mockRegistrationReference, datagram); Assert.fail(); } catch (MessageBusException mbe) { Assert.assertSame(messageListenerException, mbe.getCause()); } // Intraband bridge destination, not synchronized, no listener baseDestination = new SynchronousDestination(); baseDestination.setName( MessageDatagramReceiveHandlerTest.class.getName()); final AtomicReference<MessageRoutingBag> messageRoutingBagReference = new AtomicReference<>(); IntrabandBridgeDestination intrabandBridgeDestination = new IntrabandBridgeDestination(baseDestination) { @Override public void sendMessageRoutingBag( MessageRoutingBag messageRoutingBag) { messageRoutingBagReference.set(messageRoutingBag); } }; messageBus.addDestination(intrabandBridgeDestination); Mockito.when( messageBus.getDestination(Matchers.anyString()) ).thenReturn( intrabandBridgeDestination ); datagram = Datagram.createRequestDatagram( systemDataType.getValue(), messageRoutingBag.toByteArray()); messageDatagramReceiveHandler.doReceive( _mockRegistrationReference, datagram); assertMessageRoutingBagEquals( messageRoutingBag, messageRoutingBagReference.get()); // Intraband bridge destination, not synchronized, with listener messageReference.set(null); baseDestination.register( new MessageListener() { @Override public void receive(Message message) { messageReference.set(message); } }); datagram = Datagram.createRequestDatagram( systemDataType.getValue(), messageRoutingBag.toByteArray()); messageDatagramReceiveHandler.doReceive( _mockRegistrationReference, datagram); Assert.assertNotNull(messageReference.get()); } protected void assertMessageRoutingBagEquals( MessageRoutingBag expectedMessageRoutingBag, MessageRoutingBag actualMessageRoutingBag) { Assert.assertEquals( expectedMessageRoutingBag.getDestinationName(), actualMessageRoutingBag.getDestinationName()); Assert.assertEquals( expectedMessageRoutingBag.isRoutingDowncast(), actualMessageRoutingBag.isRoutingDowncast()); Assert.assertEquals( ReflectionTestUtil.<ArrayList<String>>getFieldValue( expectedMessageRoutingBag, "_routingTrace"), ReflectionTestUtil.<ArrayList<String>>getFieldValue( actualMessageRoutingBag, "_routingTrace")); } private final MockIntraband _mockIntraband = new MockIntraband(); private final MockRegistrationReference _mockRegistrationReference = new MockRegistrationReference(_mockIntraband); }