package org.buddycloud.channelserver.packetprocessor.iq.namespace.register; import java.util.ArrayList; import java.util.Date; import java.util.LinkedList; import java.util.List; import java.util.concurrent.LinkedBlockingQueue; import junit.framework.Assert; import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.ChannelManager; import org.buddycloud.channelserver.channel.Conf; import org.buddycloud.channelserver.db.NodeStore.Transaction; import org.buddycloud.channelserver.db.exception.NodeStoreException; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; import org.buddycloud.channelserver.pubsub.model.NodeItem; import org.buddycloud.channelserver.pubsub.model.NodeMembership; import org.buddycloud.channelserver.pubsub.model.impl.NodeItemImpl; import org.buddycloud.channelserver.pubsub.model.impl.NodeMembershipImpl; import org.buddycloud.channelserver.pubsub.subscription.Subscriptions; import org.dom4j.Element; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import org.xmpp.packet.IQ; import org.xmpp.packet.IQ.Type; import org.xmpp.packet.JID; import org.xmpp.packet.Packet; import org.xmpp.packet.PacketError; import org.xmpp.resultsetmanagement.ResultSetImpl; public class UnregisterSetTest extends IQTestHandler { private ChannelManager channelManager; private LinkedBlockingQueue<Packet> queue; private UnregisterSet unregisterSet; @Before public void setUp() throws Exception { this.channelManager = Mockito.mock(ChannelManager.class); this.queue = new LinkedBlockingQueue<Packet>(); this.unregisterSet = new UnregisterSet(queue, channelManager); } private void recordEmptyMockResponses(JID actorJid) throws NodeStoreException { Mockito.when( channelManager.nodeExists(Mockito.eq("/user/" + actorJid.toBareJID() + "/posts"))).thenReturn(true); Mockito.when(channelManager.getUserMemberships(Mockito.eq(actorJid))).thenReturn( new ResultSetImpl<NodeMembership>( new LinkedList<NodeMembership>())); Mockito.when(channelManager.getUserMemberships(Mockito.eq(actorJid))).thenReturn( new ResultSetImpl<NodeMembership>( new LinkedList<NodeMembership>())); Mockito.when(channelManager.getUserPublishedItems(Mockito.eq(actorJid))).thenReturn( new ResultSetImpl<NodeItem>(new LinkedList<NodeItem>())); Mockito.when(channelManager.beginTransaction()).thenReturn( Mockito.mock(Transaction.class)); Configuration.getInstance().putProperty( Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); } @Test public void testRemoteRequestWrongDomain() throws Exception { IQ request = readStanzaAsIq("/iq/unregister/fail/remote-wrong-domain.stanza"); unregisterSet.process(request); Packet response = queue.poll(); PacketError error = response.getError(); Assert.assertNotNull(error); Assert.assertEquals(PacketError.Type.cancel, error.getType()); Assert.assertEquals(PacketError.Condition.bad_request, error.getCondition()); } @Test public void testBadFormattedStanza() throws Exception { IQ request = readStanzaAsIq("/iq/unregister/fail/bad-formatted.stanza"); unregisterSet.process(request); Packet response = queue.poll(); PacketError error = response.getError(); Assert.assertNotNull(error); Assert.assertEquals(PacketError.Type.modify, error.getType()); Assert.assertEquals(PacketError.Condition.bad_request, error.getCondition()); } @Test public void testUnregisteredUser() throws Exception { IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); unregisterSet.process(request); Packet response = queue.poll(); PacketError error = response.getError(); Assert.assertNotNull(error); Assert.assertEquals(PacketError.Type.auth, error.getType()); Assert.assertEquals(PacketError.Condition.registration_required, error.getCondition()); } @Test public void testRegisteredUserNoNotifications() throws Exception { IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); JID actorJid = request.getFrom(); recordEmptyMockResponses(actorJid); unregisterSet.process(request); IQ response = (IQ) queue.poll(); Assert.assertNull(response.getError()); Assert.assertEquals(Type.result, response.getType()); Assert.assertTrue(queue.isEmpty()); } @Test public void notifyDeletePersonalNode() throws Exception { IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); JID actorJid = request.getFrom(); recordEmptyMockResponses(actorJid); String personalNode = "/user/" + actorJid.toBareJID() + "/posts"; // Record affiliations NodeMembership membership = new NodeMembershipImpl(personalNode, actorJid, actorJid, Subscriptions.subscribed, Affiliations.owner, null); List<NodeMembership> memberships = new LinkedList<NodeMembership>(); memberships.add(membership); Mockito.when(channelManager.getUserMemberships(Mockito.eq(actorJid))).thenReturn( new ResultSetImpl<NodeMembership>(memberships)); // Record channel type Mockito.when( channelManager .getNodeConfValue(personalNode, Conf.CHANNEL_TYPE)) .thenReturn("personal"); unregisterSet.process(request); IQ response = (IQ) queue.poll(); Assert.assertNull(response.getError()); Assert.assertEquals(Type.result, response.getType()); Assert.assertFalse(queue.isEmpty()); int adminCount = Configuration.getInstance().getAdminUsers().size() * 2; Assert.assertEquals(adminCount, queue.size()); Packet deleteNodeNotification = queue.poll(); Element deleteEl = deleteNodeNotification.getElement().element("event") .element("delete"); Assert.assertEquals(personalNode, deleteEl.attributeValue("node")); } @Test public void dontNotifyDeleteRemoteTopicNode() throws Exception { IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); JID actorJid = request.getFrom(); recordEmptyMockResponses(actorJid); String topicNode = "/user/topic@shakespeare.lit/posts"; // Record affiliations NodeMembership membership = new NodeMembershipImpl(topicNode, actorJid, actorJid, Subscriptions.subscribed, Affiliations.owner, null, new Date()); List<NodeMembership> memberships = new LinkedList<NodeMembership>(); memberships.add(membership); Mockito.when(channelManager.getUserMemberships(actorJid)).thenReturn( new ResultSetImpl<NodeMembership>(memberships)); Mockito.when( channelManager.getNodeMemberships(Mockito.eq(topicNode))).thenReturn( new ResultSetImpl<NodeMembership>(memberships)); Configuration.getInstance().putProperty( Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); // Record channel type Mockito.when( channelManager.getNodeConfValue(topicNode, Conf.CHANNEL_TYPE)) .thenReturn("topic"); unregisterSet.process(request); IQ response = (IQ) queue.poll(); Assert.assertNull(response.getError()); Assert.assertEquals(Type.result, response.getType()); Assert.assertEquals(2, queue.size()); } @Test public void notifyDeleteLocalTopicNode() throws Exception { IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); JID actorJid = request.getFrom(); recordEmptyMockResponses(actorJid); String topicNode = "/user/topic@shakespeare.lit/posts"; // Record affiliations NodeMembership membership = new NodeMembershipImpl(topicNode, actorJid, actorJid, Subscriptions.subscribed, Affiliations.owner, null, new Date()); List<NodeMembership> memberships = new LinkedList<NodeMembership>(); memberships.add(membership); Mockito.when(channelManager.getUserMemberships(actorJid)).thenReturn( new ResultSetImpl<NodeMembership>(memberships)); Mockito.when( channelManager.getNodeMemberships(Mockito.eq(topicNode))).thenReturn( new ResultSetImpl<NodeMembership>(memberships)); // Record channel type Mockito.when( channelManager.getNodeConfValue(topicNode, Conf.CHANNEL_TYPE)) .thenReturn("topic"); unregisterSet.process(request); IQ response = (IQ) queue.poll(); Assert.assertNull(response.getError()); Assert.assertEquals(Type.result, response.getType()); Assert.assertFalse(queue.isEmpty()); // Two delete notifications, two subscription notifications int adminCount = Configuration.getInstance().getAdminUsers().size() * 2; Assert.assertEquals(adminCount, queue.size()); Packet deleteNodeNotification = queue.poll(); Element deleteEl = deleteNodeNotification.getElement().element("event") .element("delete"); Assert.assertEquals(topicNode, deleteEl.attributeValue("node")); } @Test public void testDontNotifyDeleteRemoteNodeItem() throws Exception { IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); JID actorJid = request.getFrom(); recordEmptyMockResponses(actorJid); String topicNode = "/user/topic@shakespeare.lit/posts"; // Record remote node Configuration.getInstance().putProperty( Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString()); // Record node items NodeItem nodeItem = new NodeItemImpl(topicNode, "entry1", new Date(), "<payload/>"); List<NodeItem> nodeItems = new LinkedList<NodeItem>(); nodeItems.add(nodeItem); Mockito.when(channelManager.getUserPublishedItems(actorJid)).thenReturn( new ResultSetImpl<NodeItem>(nodeItems)); unregisterSet.process(request); IQ response = (IQ) queue.poll(); Assert.assertNull(response.getError()); Assert.assertEquals(Type.result, response.getType()); Assert.assertTrue(queue.isEmpty()); } @Test public void testNotifyDeleteLocalNodeItem() throws Exception { IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); JID actorJid = request.getFrom(); recordEmptyMockResponses(actorJid); String topicNode = "/user/topic@shakespeare.lit/posts"; // Record node items String itemId = "entry1"; NodeItem nodeItem = new NodeItemImpl(topicNode, itemId, new Date(), "<payload/>"); List<NodeItem> nodeItems = new LinkedList<NodeItem>(); nodeItems.add(nodeItem); Mockito.when(channelManager.getUserPublishedItems(actorJid)).thenReturn( new ResultSetImpl<NodeItem>(nodeItems)); unregisterSet.process(request); IQ response = (IQ) queue.poll(); Assert.assertNull(response.getError()); Assert.assertEquals(Type.result, response.getType()); Assert.assertFalse(queue.isEmpty()); int adminCount = Configuration.getInstance().getAdminUsers().size(); Assert.assertEquals(adminCount, queue.size()); Packet deleteNodeNotification = queue.poll(); Element itemsEl = deleteNodeNotification.getElement().element("event") .element("items"); Assert.assertEquals(topicNode, itemsEl.attributeValue("node")); Element retractEl = itemsEl.element("retract"); Assert.assertEquals(itemId, retractEl.attributeValue("id")); } @Test public void testNotifyDeleteLocalSubscriptions() throws Exception { IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); JID actorJid = request.getFrom(); recordEmptyMockResponses(actorJid); String topicNode = "/user/topic@shakespeare.lit/posts"; // Record subscriptions NodeMembership membership = new NodeMembershipImpl(topicNode, actorJid, Subscriptions.subscribed, Affiliations.member, null); List<NodeMembership> memberships = new LinkedList<NodeMembership>(); memberships.add(membership); Mockito.when(channelManager.getUserMemberships(Mockito.eq(actorJid))).thenReturn( new ResultSetImpl<NodeMembership>(memberships)); List<NodeMembership> nodeMemberships = new LinkedList<NodeMembership>(); nodeMemberships.add(membership); Mockito.when(channelManager.getNodeMemberships(Mockito.anyString())).thenReturn( new ResultSetImpl<NodeMembership>(nodeMemberships)); unregisterSet.process(request); IQ response = (IQ) queue.poll(); Assert.assertNull(response.getError()); Assert.assertEquals(Type.result, response.getType()); Assert.assertFalse(queue.isEmpty()); int adminCount = Configuration.getInstance().getAdminUsers().size(); Assert.assertEquals(adminCount, queue.size()); Packet deleteNodeNotification = queue.poll(); Element itemsEl = deleteNodeNotification.getElement().element("event") .element("subscription"); Assert.assertEquals(topicNode, itemsEl.attributeValue("node")); Assert.assertEquals(actorJid.toBareJID(), itemsEl.attributeValue("jid")); Assert.assertEquals("none", itemsEl.attributeValue("subscription")); } @Test public void testForwardRemoteRequests() throws Exception { IQ request = readStanzaAsIq("/iq/unregister/local-request.stanza"); JID actorJid = request.getFrom(); recordEmptyMockResponses(actorJid); String remoteNode = "/user/remotenode@remotedomain.com/posts"; ArrayList<String> remoteNodes = new ArrayList<String>(); remoteNodes.add(remoteNode); Mockito.when(channelManager.getNodeList()).thenReturn(remoteNodes); Configuration.getInstance().remove( Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); Configuration.getInstance().putProperty( Configuration.CONFIGURATION_SERVER_CHANNELS_DOMAIN, "shakespeare.lit"); unregisterSet.process(request); IQ response = (IQ) queue.poll(); Assert.assertNull(response.getError()); Assert.assertEquals(Type.result, response.getType()); Assert.assertFalse(queue.isEmpty()); Assert.assertEquals(1, queue.size()); Packet remoteRequest = queue.poll(); Element removeEl = remoteRequest.getElement().element("query") .element("remove"); Assert.assertNotNull(removeEl); Element actorEl = removeEl.element("actor"); Assert.assertEquals(actorJid.toBareJID(), actorEl.getText()); } }