package org.buddycloud.channelserver.queue; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.concurrent.BlockingQueue; import org.buddycloud.channelserver.ChannelsEngine; import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.utils.users.OnlineResourceManager; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.xmpp.packet.JID; import org.xmpp.packet.Message; import org.xmpp.packet.Packet; public class OutQueueConsumerTest { private static final String SERVER_DOMAIN = "server1"; private static final String SERVER_CHANNELS_DOMAIN = "channels.server1"; private static final String SERVER_TOPICS_DOMAIN = "topics.server1"; /* * Class under test */ private OutQueueConsumer consumer; @Mock private ChannelsEngine channelsEngine; @Mock private BlockingQueue<Packet> outQueue; @Mock private FederatedQueueManager federatedQueueManager; @Mock private Configuration configuration; @Mock private OnlineResourceManager onlineResourceManager; @Mock private BlockingQueue<Packet> inQueue; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); consumer = new OutQueueConsumer(channelsEngine, outQueue, federatedQueueManager, configuration, onlineResourceManager, inQueue); when(configuration.getServerDomain()).thenReturn(SERVER_DOMAIN); when(configuration.getServerChannelsDomain()).thenReturn(SERVER_CHANNELS_DOMAIN); when(configuration.getServerTopicsDomain()).thenReturn(SERVER_TOPICS_DOMAIN); } @After public void tearDown() throws Exception {} @Test public void testConsumeForRemoteServerRequestForDiscover() throws Exception { JID remoteServer = new JID("server2"); Message message = new Message(); message.setTo(remoteServer); message.getElement().addAttribute("remote-server-discover", "true"); consumer.consume(message); verify(federatedQueueManager).addChannelMap(remoteServer); } @Test public void testConsumeForRemoteServerRequestForDelivery() throws Exception { JID remoteServer = new JID("server2"); Message message = new Message(); message.setTo(remoteServer); consumer.consume(message); verify(federatedQueueManager).process(message); } @SuppressWarnings("serial") @Test public void testConsumeForRemoteUser() throws Exception { JID jid = new JID("user1@server2"); final JID resource1 = new JID("user1@server2/resource1"); final JID resource2 = new JID("user1@server2/resource2"); when(onlineResourceManager.getResources(jid)).thenReturn(new ArrayList<JID>() { { add(resource1); add(resource2); } }); Message message = new Message(); message.setTo(jid); consumer.consume(message); ArgumentCaptor<Packet> packetCaptor = ArgumentCaptor.forClass(Packet.class); Message expected1 = message.createCopy(); expected1.setTo(resource1); verify(channelsEngine, times(2)).sendPacket(packetCaptor.capture()); assertEquals("Packet not sent to " + resource1, resource1, packetCaptor.getAllValues().get(0).getTo()); assertEquals("Packet not sent to " + resource2, resource2, packetCaptor.getAllValues().get(1).getTo()); } public void testConsumeForLocalServer() throws Exception { JID jid = new JID(SERVER_DOMAIN); Message message = new Message(); message.setTo(jid); consumer.consume(message); verify(channelsEngine).sendPacket(message); } public void testConsumeForLocalChannelsServer() throws Exception { JID jid = new JID(SERVER_CHANNELS_DOMAIN); Message message = new Message(); message.setTo(jid); consumer.consume(message); verify(channelsEngine).sendPacket(message); } public void testConsumeForLocalTopicsServer() throws Exception { JID jid = new JID(SERVER_TOPICS_DOMAIN); Message message = new Message(); message.setTo(jid); consumer.consume(message); verify(channelsEngine).sendPacket(message); } }