package org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.get.items.special;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import junit.framework.Assert;
import org.buddycloud.channelserver.channel.ChannelManager;
import org.buddycloud.channelserver.db.ClosableIteratorImpl;
import org.buddycloud.channelserver.db.exception.NodeStoreException;
import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler;
import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.JabberPubsub;
import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.get.RecentItemsGet;
import org.buddycloud.channelserver.pubsub.model.NodeItem;
import org.buddycloud.channelserver.pubsub.model.impl.NodeItemImpl;
import org.dom4j.Element;
import org.dom4j.tree.BaseElement;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.xmpp.packet.IQ;
import org.xmpp.packet.JID;
import org.xmpp.packet.Packet;
import org.xmpp.packet.PacketError;
public class FirehoseGetTest extends IQTestHandler {
private IQ request;
private FirehoseGet recentItemsGet;
private Element element;
private BlockingQueue<Packet> queue = new LinkedBlockingQueue<Packet>();
private JID jid = new JID("user1@server1");
private ChannelManager channelManager;
private static final String TEST_NODE_1 = "node1";
private static final String TEST_NODE_2 = "node2";
@Before
public void setUp() throws Exception {
queue = new LinkedBlockingQueue<Packet>();
channelManager = Mockito.mock(ChannelManager.class);
recentItemsGet = new FirehoseGet(queue, channelManager);
new IQTestHandler();
request = readStanzaAsIq("/iq/pubsub/items/request.stanza");
element = new BaseElement("items");
readConf();
}
@Test
public void testPassingItemsAsElementNameReturnsTrue() {
Assert.assertTrue(recentItemsGet.accept(element));
}
@Test
public void testPassingNotItemsAsElementNameReturnsFalse() {
Element element = new BaseElement("not-items");
Assert.assertFalse(recentItemsGet.accept(element));
}
@Test
public void testNodeStoreExceptionGeneratesAnErrorStanza() throws Exception {
Mockito.when(
channelManager.getFirehose(Mockito.anyInt(),
Mockito.anyString(), Mockito.anyBoolean(),
Mockito.anyString())).thenThrow(
new NodeStoreException());
recentItemsGet.process(element, jid, request, null);
Packet response = queue.poll();
PacketError error = response.getError();
Assert.assertNotNull(error);
Assert.assertEquals(PacketError.Type.wait, error.getType());
Assert.assertEquals(PacketError.Condition.internal_server_error,
error.getCondition());
}
@Test
public void testItemsReturnsEmptyStanza() throws Exception {
Mockito.when(
channelManager.getFirehose(Mockito.anyInt(), Mockito.anyString(),
Mockito.anyBoolean(), Mockito.anyString())).thenReturn(
new ClosableIteratorImpl<NodeItem>(new ArrayList<NodeItem>()
.iterator()));
recentItemsGet.process(element, jid, request, null);
IQ response = (IQ) queue.poll();
Assert.assertEquals(IQ.Type.result, response.getType());
Element pubsub = response.getChildElement();
Assert.assertEquals("pubsub", pubsub.getName());
Assert.assertEquals(JabberPubsub.NAMESPACE_URI,
pubsub.getNamespaceURI());
}
@SuppressWarnings("unchecked")
@Test
public void testOutgoingStanzaFormattedAsExpected() throws Exception {
NodeItem item1 = new NodeItemImpl(TEST_NODE_1, "1", new Date(),
"<entry>item1</entry>");
NodeItem item2 = new NodeItemImpl(TEST_NODE_2, "1", new Date(),
"<entry>item2</entry>");
NodeItem item3 = new NodeItemImpl(TEST_NODE_1, "2", new Date(),
"<entry>item3</entry>");
NodeItem item4 = new NodeItemImpl(TEST_NODE_1, "3", new Date(),
"<entry>item4</entry>");
ArrayList<NodeItem> results = new ArrayList<NodeItem>();
results.add(item1);
results.add(item2);
results.add(item3);
results.add(item4);
Mockito.when(
channelManager.getFirehose(Mockito.anyInt(), Mockito.anyString(), Mockito.anyBoolean(), Mockito.anyString())).thenReturn(
new ClosableIteratorImpl<NodeItem>(results.iterator()));
Mockito.when(
channelManager.getFirehoseItemCount(Mockito.anyBoolean(), Mockito.anyString())).thenReturn(4);
recentItemsGet.process(element, jid, request, null);
IQ response = (IQ) queue.poll();
Assert.assertEquals(IQ.Type.result, response.getType());
Element pubsub = response.getChildElement();
Assert.assertEquals("pubsub", pubsub.getName());
Assert.assertEquals(JabberPubsub.NAMESPACE_URI,
pubsub.getNamespaceURI());
List<Element> items = pubsub.elements("items");
Assert.assertEquals(3, items.size());
Assert.assertEquals(TEST_NODE_1, items.get(0).attributeValue("node"));
Assert.assertEquals(TEST_NODE_2, items.get(1).attributeValue("node"));
Assert.assertEquals(TEST_NODE_1, items.get(2).attributeValue("node"));
Assert.assertEquals(1, items.get(0).elements("item").size());
Assert.assertEquals(2, items.get(2).elements("item").size());
}
@Test
public void testUnparsableItemEntriesAreSimplyIgnored() throws Exception {
NodeItem item1 = new NodeItemImpl(TEST_NODE_1, "1", new Date(),
"<entry>item1</entry>");
NodeItem item2 = new NodeItemImpl(TEST_NODE_1, "2", new Date(),
"<entry>item2");
ArrayList<NodeItem> results = new ArrayList<NodeItem>();
results.add(item1);
results.add(item2);
Mockito.when(
channelManager.getFirehose(Mockito.anyInt(), Mockito.anyString(), Mockito.anyBoolean(), Mockito.anyString())).thenReturn(
new ClosableIteratorImpl<NodeItem>(results.iterator()));
recentItemsGet.process(element, jid, request, null);
IQ response = (IQ) queue.poll();
Assert.assertEquals(1, response.getChildElement().element("items")
.elements("item").size());
}
@SuppressWarnings("unchecked")
@Test
public void testCanControlGatheredEntriesUsingRsm() throws Exception {
NodeItem item2 = new NodeItemImpl(TEST_NODE_2, "node2:1", new Date(),
"<entry>item2</entry>");
NodeItem item3 = new NodeItemImpl(TEST_NODE_1, "node1:2", new Date(),
"<entry>item3</entry>");
ArrayList<NodeItem> results = new ArrayList<NodeItem>();
results.add(item2);
results.add(item3);
Mockito.when(
channelManager.getFirehose(Mockito.anyInt(), Mockito.anyString(),
Mockito.anyBoolean(), Mockito.anyString())).thenReturn(
new ClosableIteratorImpl<NodeItem>(results.iterator()));
Mockito.when(
channelManager.getFirehoseItemCount(Mockito.anyBoolean(),
Mockito.anyString())).thenReturn(2);
Element rsm = request.getElement().addElement("rsm");
rsm.addNamespace("", RecentItemsGet.NS_RSM);
rsm.addElement("max").addText("2");
rsm.addElement("after").addText("node1:1");
recentItemsGet.process(element, jid, request, null);
IQ response = (IQ) queue.poll();
Assert.assertEquals(IQ.Type.result, response.getType());
Element pubsub = response.getChildElement();
Assert.assertEquals("pubsub", pubsub.getName());
Assert.assertEquals(JabberPubsub.NAMESPACE_URI,
pubsub.getNamespaceURI());
List<Element> items = pubsub.elements("items");
Assert.assertEquals(2, items.size());
Assert.assertEquals(TEST_NODE_2, items.get(0).attributeValue("node"));
Assert.assertEquals(TEST_NODE_1, items.get(1).attributeValue("node"));
Assert.assertEquals(1, items.get(0).elements("item").size());
Assert.assertEquals(1, items.get(1).elements("item").size());
Element rsmResult = pubsub.element("set");
Assert.assertEquals("2", rsmResult.element("count").getText());
Assert.assertEquals("node2:1", rsmResult.element("first").getText());
Assert.assertEquals("node1:2", rsmResult.element("last").getText());
}
@Test
public void testAdminUsersHaveRequestsMadeAsExpected() throws Exception {
ArrayList<NodeItem> results = new ArrayList<NodeItem>();
Mockito.when(
channelManager.getFirehose(Mockito.anyInt(), Mockito.anyString(), Mockito.eq(true),
Mockito.anyString())).thenReturn(
new ClosableIteratorImpl<NodeItem>(results.iterator()));
recentItemsGet.process(element, jid, request, null);
}
}