From 1f2c3add9971e8636013c384938456388b04ed79 Mon Sep 17 00:00:00 2001 From: Tarun Gupta Date: Sun, 5 Jul 2015 02:47:12 +0530 Subject: Update Roster functionalities. Updates RosterPushResponder, XMPPRoster, XMPPRosterController. Also adds XMPPRosterSignalHandler. License: This patch is BSD-licensed, see Documentation/Licenses/BSD-simplified.txt for details. Test-Information: Adds tests for XMPPRosterController, XMPPRosterImpl. All tests passes. Change-Id: Iee3530510342ea5977022237aaa6dfbffa390408 diff --git a/src/com/isode/stroke/roster/RosterPushResponder.java b/src/com/isode/stroke/roster/RosterPushResponder.java index 18b20b5..515df82 100644 --- a/src/com/isode/stroke/roster/RosterPushResponder.java +++ b/src/com/isode/stroke/roster/RosterPushResponder.java @@ -13,7 +13,7 @@ import com.isode.stroke.signals.Signal1; public class RosterPushResponder extends SetResponder { - final Signal1 onRosterReceived = new Signal1(); + public final Signal1 onRosterReceived = new Signal1(); public RosterPushResponder(IQRouter router) { super(new RosterPayload(), router); diff --git a/src/com/isode/stroke/roster/XMPPRoster.java b/src/com/isode/stroke/roster/XMPPRoster.java index a2c3cd3..ce5ecc5 100644 --- a/src/com/isode/stroke/roster/XMPPRoster.java +++ b/src/com/isode/stroke/roster/XMPPRoster.java @@ -13,6 +13,12 @@ import com.isode.stroke.signals.Signal; import com.isode.stroke.signals.Signal1; import com.isode.stroke.signals.Signal3; +/** + * This class represents the roster of an account, as stored on the XMPP server. + * + * Changes to the roster (either due to subscription requests or by going online/offline) are + * emitted through signals. + */ public abstract class XMPPRoster { /** * Checks whether the bare jid of the given jid is in the roster. diff --git a/src/com/isode/stroke/roster/XMPPRosterController.java b/src/com/isode/stroke/roster/XMPPRosterController.java index 6ad03f2..b6ac35a 100644 --- a/src/com/isode/stroke/roster/XMPPRosterController.java +++ b/src/com/isode/stroke/roster/XMPPRosterController.java @@ -70,7 +70,7 @@ public class XMPPRosterController { rosterRequest.send(); } - void handleRosterReceived(RosterPayload rosterPayload, boolean initial, RosterPayload previousRoster) { + private void handleRosterReceived(RosterPayload rosterPayload, boolean initial, RosterPayload previousRoster) { if (rosterPayload != null) { for (final RosterItemPayload item : rosterPayload.getItems()) { //Don't worry about the updated case, the XMPPRoster sorts that out. @@ -100,7 +100,7 @@ public class XMPPRosterController { } } - void saveRoster(final String version) { + private void saveRoster(final String version) { Collection items = xmppRoster_.getItems(); RosterPayload roster = new RosterPayload(); roster.setVersion(version); diff --git a/src/com/isode/stroke/roster/XMPPRosterImpl.java b/src/com/isode/stroke/roster/XMPPRosterImpl.java index 61d0bc3..d87a20e 100644 --- a/src/com/isode/stroke/roster/XMPPRosterImpl.java +++ b/src/com/isode/stroke/roster/XMPPRosterImpl.java @@ -19,7 +19,7 @@ public class XMPPRosterImpl extends XMPPRoster { private Map entries_ = new HashMap(); - void addContact(final JID jid, final String name, final Collection groups, RosterItemPayload.Subscription subscription) { + public void addContact(final JID jid, final String name, final Collection groups, RosterItemPayload.Subscription subscription) { JID bareJID = jid.toBare(); XMPPRosterItem item = entries_.get(bareJID); @@ -35,19 +35,19 @@ public class XMPPRosterImpl extends XMPPRoster { } } - void removeContact(final JID jid) { + public void removeContact(final JID jid) { entries_.remove(jid.toBare()); onJIDRemoved.emit(jid); } - void clear() { + public void clear() { entries_.clear(); onRosterCleared.emit(); } @Override public boolean containsJID(JID jid) { - return entries_.containsKey(jid); + return entries_.containsKey(jid.toBare()); } @Override diff --git a/test/com/isode/stroke/roster/XMPPRosterControllerTest.java b/test/com/isode/stroke/roster/XMPPRosterControllerTest.java new file mode 100644 index 0000000..a3f03b2 --- /dev/null +++ b/test/com/isode/stroke/roster/XMPPRosterControllerTest.java @@ -0,0 +1,356 @@ +/* + * Copyright (c) 2010-2011 Isode Limited. + * All rights reserved. + * See the COPYING file for more information. + */ +/* + * Copyright (c) 2015 Tarun Gupta. + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +package com.isode.stroke.roster; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertNotNull; +import org.junit.Before; +import org.junit.Test; +import com.isode.stroke.roster.XMPPRosterSignalHandler; +import com.isode.stroke.roster.XMPPRosterController; +import com.isode.stroke.roster.XMPPRosterImpl; +import com.isode.stroke.roster.RosterMemoryStorage; +import com.isode.stroke.elements.RosterItemPayload; +import com.isode.stroke.elements.Payload; +import com.isode.stroke.elements.RosterPayload; +import com.isode.stroke.elements.IQ; +import com.isode.stroke.client.DummyStanzaChannel; +import com.isode.stroke.queries.IQRouter; +import com.isode.stroke.jid.JID; +import java.util.Collection; +import java.util.ArrayList; + +public class XMPPRosterControllerTest { + + private DummyStanzaChannel channel_; + private IQRouter router_; + private XMPPRosterImpl xmppRoster_; + private XMPPRosterSignalHandler handler_; + private RosterMemoryStorage rosterStorage_; + private JID jid1_; + private JID jid2_; + private JID jid3_; + + @Before + public void setUp() { + channel_ = new DummyStanzaChannel(); + router_ = new IQRouter(channel_); + router_.setJID(new JID("me@bla.com")); + xmppRoster_ = new XMPPRosterImpl(); + handler_ = new XMPPRosterSignalHandler(xmppRoster_); + rosterStorage_ = new RosterMemoryStorage(); + jid1_ = new JID("foo@bar.com"); + jid2_ = new JID("alice@wonderland.lit"); + jid3_ = new JID("jane@austen.lit"); + } + + private XMPPRosterController createController() { + return new XMPPRosterController(router_, xmppRoster_, rosterStorage_); + } + + @Test + public void testGet_Response() { + XMPPRosterController testling = createController(); + + testling.requestRoster(); + RosterPayload payload = new RosterPayload(); + payload.addItem(new RosterItemPayload(jid1_, "Bob", RosterItemPayload.Subscription.Both)); + payload.addItem(new RosterItemPayload(jid2_, "Alice", RosterItemPayload.Subscription.Both)); + channel_.onIQReceived.emit(IQ.createResult(new JID("foo@bar.com"), channel_.sentStanzas.get(0).getID(), payload)); + + assertEquals(2, handler_.getEventCount()); + assertNotNull(xmppRoster_.getItem(jid1_)); + assertNotNull(xmppRoster_.getItem(jid2_)); + } + + @Test + public void testGet_EmptyResponse() { + XMPPRosterController controller = new XMPPRosterController(router_, xmppRoster_, rosterStorage_); + + controller.requestRoster(); + + channel_.onIQReceived.emit(IQ.createResult(new JID("baz@fum.com/dum"), channel_.sentStanzas.get(0).getID(), null)); + } + + @Test + public void testAdd() { + XMPPRosterController controller = new XMPPRosterController(router_, xmppRoster_, rosterStorage_); + + RosterPayload payload = new RosterPayload(); + payload.addItem(new RosterItemPayload(jid1_, "Bob", RosterItemPayload.Subscription.Both)); + channel_.onIQReceived.emit(IQ.createRequest(IQ.Type.Set, new JID(), "eou", payload)); + + assertEquals(XMPPRosterEvents.Add, handler_.getLastEvent()); + assertEquals(jid1_, handler_.getLastJID()); + assertEquals(0, xmppRoster_.getGroupsForJID(jid1_).size()); + assertTrue(xmppRoster_.containsJID(jid1_)); + assertEquals("Bob", xmppRoster_.getNameForJID(jid1_)); + } + + @Test + public void testGet_NoRosterInStorage() { + XMPPRosterController testling = createController(); + testling.setUseVersioning(true); + + testling.requestRoster(); + + RosterPayload roster = channel_.sentStanzas.get(0).getPayload(new RosterPayload()); + assertNotNull(roster.getVersion()); + assertEquals("", roster.getVersion()); + } + + @Test + public void testGet_NoVersionInStorage() { + XMPPRosterController testling = createController(); + testling.setUseVersioning(true); + rosterStorage_.setRoster(new RosterPayload()); + + testling.requestRoster(); + + RosterPayload roster = channel_.sentStanzas.get(0).getPayload(new RosterPayload()); + assertNotNull(roster.getVersion()); + assertEquals("", roster.getVersion()); + } + + @Test + public void testGet_VersionInStorage() { + XMPPRosterController testling = createController(); + testling.setUseVersioning(true); + RosterPayload payload = new RosterPayload(); + payload.setVersion("foover"); + rosterStorage_.setRoster(payload); + + testling.requestRoster(); + + RosterPayload roster = channel_.sentStanzas.get(0).getPayload(new RosterPayload()); + assertNotNull(roster.getVersion()); + assertEquals("foover", roster.getVersion()); + } + + @Test + public void testGet_ServerDoesNotSupportVersion() { + XMPPRosterController testling = createController(); + RosterPayload payload = new RosterPayload(); + payload.setVersion("foover"); + rosterStorage_.setRoster(payload); + + testling.requestRoster(); + + RosterPayload roster = channel_.sentStanzas.get(0).getPayload(new RosterPayload()); + assertNull(roster.getVersion()); + } + + @Test + public void testGet_ResponseWithoutNewVersion() { + XMPPRosterController testling = createController(); + testling.setUseVersioning(true); + RosterPayload storedRoster = new RosterPayload(); + storedRoster.setVersion("version10"); + storedRoster.addItem(new RosterItemPayload(jid1_, "Bob", RosterItemPayload.Subscription.Both)); + storedRoster.addItem(new RosterItemPayload(jid2_, "Alice", RosterItemPayload.Subscription.Both)); + rosterStorage_.setRoster(storedRoster); + testling.requestRoster(); + + channel_.onIQReceived.emit(IQ.createResult(new JID("foo@bar.com"), channel_.sentStanzas.get(0).getID(), null)); + + assertEquals(2, handler_.getEventCount()); + assertNotNull(xmppRoster_.getItem(jid1_)); + assertNotNull(xmppRoster_.getItem(jid2_)); + assertEquals(XMPPRosterEvents.Add, handler_.getLastEvent()); + assertEquals(jid2_, handler_.getLastJID()); + assertNotNull(rosterStorage_.getRoster()); + assertNotNull(rosterStorage_.getRoster().getVersion()); + assertEquals("version10", rosterStorage_.getRoster().getVersion()); + assertNotNull(rosterStorage_.getRoster().getItem(jid1_)); + assertNotNull(rosterStorage_.getRoster().getItem(jid2_)); + } + + @Test + public void testGet_ResponseWithNewVersion() { + XMPPRosterController testling = createController(); + testling.setUseVersioning(true); + RosterPayload storedRoster = new RosterPayload(); + storedRoster.setVersion("version10"); + storedRoster.addItem(new RosterItemPayload(jid1_, "Bob", RosterItemPayload.Subscription.Both)); + rosterStorage_.setRoster(storedRoster); + testling.requestRoster(); + + RosterPayload serverRoster = new RosterPayload(); + serverRoster.setVersion("version12"); + serverRoster.addItem(new RosterItemPayload(jid2_, "Alice", RosterItemPayload.Subscription.Both)); + Collection groups = new ArrayList(); + groups.add("foo"); + groups.add("bar"); + serverRoster.addItem(new RosterItemPayload(jid3_, "Rabbit", RosterItemPayload.Subscription.Both, groups)); + channel_.onIQReceived.emit(IQ.createResult(new JID("foo@bar.com"), channel_.sentStanzas.get(0).getID(), serverRoster)); + + + assertEquals(2, handler_.getEventCount()); + assertNull(xmppRoster_.getItem(jid1_)); + assertNotNull(xmppRoster_.getItem(jid2_)); + assertNotNull(xmppRoster_.getItem(jid3_)); + assertEquals(jid3_, handler_.getLastJID()); + assertEquals(XMPPRosterEvents.Add, handler_.getLastEvent()); + assertNotNull(rosterStorage_.getRoster()); + assertNotNull(rosterStorage_.getRoster().getVersion()); + assertEquals("version12", rosterStorage_.getRoster().getVersion()); + assertNull(rosterStorage_.getRoster().getItem(jid1_)); + assertNotNull(rosterStorage_.getRoster().getItem(jid2_)); + assertNotNull(rosterStorage_.getRoster().getItem(jid3_)); + assertEquals(2, rosterStorage_.getRoster().getItem(jid3_).getGroups().size()); + } + + @Test + public void testAddFromNonAccount() { + XMPPRosterController testling = createController(); + + RosterPayload payload = new RosterPayload(); + payload.addItem(new RosterItemPayload(jid1_, "Bob", RosterItemPayload.Subscription.Both)); + IQ request = IQ.createRequest(IQ.Type.Set, new JID(), "eou", payload); + request.setFrom(jid2_); + channel_.onIQReceived.emit(request); + + assertEquals(XMPPRosterEvents.None, handler_.getLastEvent()); + } + + @Test + public void testModify() { + XMPPRosterController controller = new XMPPRosterController(router_, xmppRoster_, rosterStorage_); + RosterPayload payload1 = new RosterPayload(); + payload1.addItem(new RosterItemPayload(jid1_, "Bob", RosterItemPayload.Subscription.Both)); + channel_.onIQReceived.emit(IQ.createRequest(IQ.Type.Set, new JID(), "id1", payload1)); + + assertEquals(XMPPRosterEvents.Add, handler_.getLastEvent()); + assertEquals(jid1_, handler_.getLastJID()); + handler_.reset(); + + RosterPayload payload2 = new RosterPayload(); + payload2.addItem(new RosterItemPayload(jid1_, "Bob2", RosterItemPayload.Subscription.Both)); + channel_.onIQReceived.emit(IQ.createRequest(IQ.Type.Set, new JID(), "id2", payload2)); + + assertEquals(XMPPRosterEvents.Update, handler_.getLastEvent()); + assertEquals(jid1_, handler_.getLastJID()); + + assertEquals("Bob2", xmppRoster_.getNameForJID(jid1_)); + } + + @Test + public void testRemove() { + XMPPRosterController controller = new XMPPRosterController(router_, xmppRoster_, rosterStorage_); + RosterPayload payload1 = new RosterPayload(); + payload1.addItem(new RosterItemPayload(jid1_, "Bob", RosterItemPayload.Subscription.Both)); + channel_.onIQReceived.emit(IQ.createRequest(IQ.Type.Set, new JID(), "id1", payload1)); + + assertEquals(XMPPRosterEvents.Add, handler_.getLastEvent()); + assertEquals(jid1_, handler_.getLastJID()); + handler_.reset(); + + RosterPayload payload2 = new RosterPayload(); + payload2.addItem(new RosterItemPayload(jid1_, "Bob", RosterItemPayload.Subscription.Remove)); + channel_.onIQReceived.emit(IQ.createRequest(IQ.Type.Set, new JID(), "id2", payload2)); + assertFalse(xmppRoster_.containsJID(jid1_)); + assertEquals(XMPPRosterEvents.Remove, handler_.getLastEvent()); + assertEquals(jid1_, handler_.getLastJID()); + } + + @Test + public void testRemove_RosterStorageUpdated() { + XMPPRosterController testling = createController(); + testling.setUseVersioning(true); + RosterPayload storedRoster = new RosterPayload(); + storedRoster.setVersion("version10"); + storedRoster.addItem(new RosterItemPayload(jid1_, "Bob", RosterItemPayload.Subscription.Both)); + storedRoster.addItem(new RosterItemPayload(jid2_, "Alice", RosterItemPayload.Subscription.Both)); + rosterStorage_.setRoster(storedRoster); + testling.requestRoster(); + channel_.onIQReceived.emit(IQ.createResult(new JID("foo@bar.com"), channel_.sentStanzas.get(0).getID(), null)); + + RosterPayload payload2 = new RosterPayload(); + payload2.setVersion("version15"); + payload2.addItem(new RosterItemPayload(jid1_, "Bob", RosterItemPayload.Subscription.Remove)); + channel_.onIQReceived.emit(IQ.createRequest(IQ.Type.Set, new JID(), "id2", payload2)); + + assertNotNull(rosterStorage_.getRoster()); + assertNotNull(rosterStorage_.getRoster().getVersion()); + assertEquals("version15", rosterStorage_.getRoster().getVersion()); + assertNull(rosterStorage_.getRoster().getItem(jid1_)); + assertNotNull(rosterStorage_.getRoster().getItem(jid2_)); + } + + @Test + public void testMany() { + XMPPRosterController controller = new XMPPRosterController(router_, xmppRoster_, rosterStorage_); + RosterPayload payload1 = new RosterPayload(); + payload1.addItem(new RosterItemPayload(jid1_, "Bob", RosterItemPayload.Subscription.Both)); + channel_.onIQReceived.emit(IQ.createRequest(IQ.Type.Set, new JID(), "id1", payload1)); + + assertEquals(XMPPRosterEvents.Add, handler_.getLastEvent()); + assertEquals(jid1_, handler_.getLastJID()); + handler_.reset(); + + RosterPayload payload2 = new RosterPayload(); + payload2.addItem(new RosterItemPayload(jid2_, "Alice", RosterItemPayload.Subscription.Both)); + channel_.onIQReceived.emit(IQ.createRequest(IQ.Type.Set, new JID(), "id2", payload2)); + + assertEquals(XMPPRosterEvents.Add, handler_.getLastEvent()); + assertEquals(jid2_, handler_.getLastJID()); + handler_.reset(); + + RosterPayload payload3 = new RosterPayload(); + payload3.addItem(new RosterItemPayload(jid1_, "Ernie", RosterItemPayload.Subscription.Both)); + channel_.onIQReceived.emit(IQ.createRequest(IQ.Type.Set, new JID(), "id3", payload3)); + + assertEquals(XMPPRosterEvents.Update, handler_.getLastEvent()); + assertEquals(jid1_, handler_.getLastJID()); + handler_.reset(); + + RosterPayload payload4 = new RosterPayload(); + RosterItemPayload item = new RosterItemPayload(jid3_, "Jane", RosterItemPayload.Subscription.Both); + String janesGroup = "Jane's Group"; + item.addGroup(janesGroup); + payload4.addItem(item); + channel_.onIQReceived.emit(IQ.createRequest(IQ.Type.Set, new JID(), "id4", payload4)); + + assertEquals(XMPPRosterEvents.Add, handler_.getLastEvent()); + assertEquals(jid3_, handler_.getLastJID()); + assertEquals(1, xmppRoster_.getGroupsForJID(jid3_).size()); + assertEquals(janesGroup, xmppRoster_.getGroupsForJID(jid3_).toArray()[0]); + handler_.reset(); + + RosterPayload payload5 = new RosterPayload(); + payload5.addItem(new RosterItemPayload(jid1_, "Bob", RosterItemPayload.Subscription.Remove)); + channel_.onIQReceived.emit(IQ.createRequest(IQ.Type.Set, new JID(), "id5", payload5)); + assertFalse(xmppRoster_.containsJID(jid1_)); + assertEquals(XMPPRosterEvents.Remove, handler_.getLastEvent()); + assertEquals(jid1_, handler_.getLastJID()); + handler_.reset(); + + RosterPayload payload6 = new RosterPayload(); + RosterItemPayload item2 = new RosterItemPayload(jid2_, "Little Alice", RosterItemPayload.Subscription.Both); + String alicesGroup = "Alice's Group"; + item2.addGroup(alicesGroup); + payload6.addItem(item2); + channel_.onIQReceived.emit(IQ.createRequest(IQ.Type.Set, new JID(), "id6", payload6)); + assertEquals(XMPPRosterEvents.Update, handler_.getLastEvent()); + assertEquals(jid2_, handler_.getLastJID()); + assertEquals("Little Alice", xmppRoster_.getNameForJID(jid2_)); + assertEquals("Jane", xmppRoster_.getNameForJID(jid3_)); + assertEquals(1, xmppRoster_.getGroupsForJID(jid2_).size()); + assertEquals(alicesGroup, xmppRoster_.getGroupsForJID(jid2_).toArray()[0]); + assertEquals(1, xmppRoster_.getGroupsForJID(jid3_).size()); + assertEquals(janesGroup, xmppRoster_.getGroupsForJID(jid3_).toArray()[0]); + handler_.reset(); + } +} \ No newline at end of file diff --git a/test/com/isode/stroke/roster/XMPPRosterImplTest.java b/test/com/isode/stroke/roster/XMPPRosterImplTest.java new file mode 100644 index 0000000..191beb5 --- /dev/null +++ b/test/com/isode/stroke/roster/XMPPRosterImplTest.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2010-2011 Isode Limited. + * All rights reserved. + * See the COPYING file for more information. + */ +/* + * Copyright (c) 2015 Tarun Gupta. + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +package com.isode.stroke.roster; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertNotNull; +import org.junit.Before; +import org.junit.Test; +import com.isode.stroke.roster.XMPPRosterSignalHandler; +import com.isode.stroke.roster.XMPPRosterImpl; +import com.isode.stroke.elements.RosterItemPayload; +import com.isode.stroke.jid.JID; +import java.util.Collection; +import java.util.ArrayList; + +public class XMPPRosterImplTest { + + private XMPPRosterImpl roster_; + private XMPPRosterSignalHandler handler_; + private JID jid1_; + private JID jid2_; + private JID jid3_; + private Collection groups1_ = new ArrayList(); + private Collection groups2_ = new ArrayList(); + + @Before + public void setUp() { + jid1_ = new JID("a@b.c"); + jid2_ = new JID("b@c.d"); + jid3_ = new JID("c@d.e"); + roster_ = new XMPPRosterImpl(); + handler_ = new XMPPRosterSignalHandler(roster_); + groups1_.add("bobs"); + groups1_.add("berts"); + groups2_.add("ernies"); + } + + @Test + public void testJIDAdded() { + roster_.addContact(jid1_, "NewName", groups1_, RosterItemPayload.Subscription.Both); + assertEquals(XMPPRosterEvents.Add, handler_.getLastEvent()); + assertEquals(jid1_, handler_.getLastJID()); + assertEquals("NewName", roster_.getNameForJID(jid1_)); + assertEquals(groups1_, roster_.getGroupsForJID(jid1_)); + handler_.reset(); + roster_.addContact(jid2_, "NameTwo", groups1_, RosterItemPayload.Subscription.Both); + assertEquals(XMPPRosterEvents.Add, handler_.getLastEvent()); + assertEquals(jid2_, handler_.getLastJID()); + assertEquals("NameTwo", roster_.getNameForJID(jid2_)); + assertEquals("NewName", roster_.getNameForJID(jid1_)); + assertEquals(groups1_, roster_.getGroupsForJID(jid2_)); + assertEquals(groups1_, roster_.getGroupsForJID(jid1_)); + handler_.reset(); + roster_.addContact(jid3_, "NewName", groups2_, RosterItemPayload.Subscription.Both); + assertEquals(XMPPRosterEvents.Add, handler_.getLastEvent()); + assertEquals(jid3_, handler_.getLastJID()); + assertEquals("NewName", roster_.getNameForJID(jid3_)); + assertEquals(groups2_, roster_.getGroupsForJID(jid3_)); + } + + @Test + public void testJIDRemoved() { + roster_.addContact(jid1_, "NewName", groups1_, RosterItemPayload.Subscription.Both); + handler_.reset(); + roster_.removeContact(jid1_); + assertEquals(XMPPRosterEvents.Remove, handler_.getLastEvent()); + assertEquals(jid1_, handler_.getLastJID()); + handler_.reset(); + roster_.addContact(jid1_, "NewName2", groups1_, RosterItemPayload.Subscription.Both); + assertEquals(XMPPRosterEvents.Add, handler_.getLastEvent()); + assertEquals(jid1_, handler_.getLastJID()); + assertEquals("NewName2", roster_.getNameForJID(jid1_)); + roster_.addContact(jid2_, "NewName3", groups1_, RosterItemPayload.Subscription.Both); + handler_.reset(); + roster_.removeContact(jid2_); + assertEquals(XMPPRosterEvents.Remove, handler_.getLastEvent()); + assertEquals(jid2_, handler_.getLastJID()); + handler_.reset(); + roster_.removeContact(jid1_); + assertEquals(XMPPRosterEvents.Remove, handler_.getLastEvent()); + assertEquals(jid1_, handler_.getLastJID()); + } + + @Test + public void testJIDUpdated() { + roster_.addContact(jid1_, "NewName", groups1_, RosterItemPayload.Subscription.Both); + assertEquals(XMPPRosterEvents.Add, handler_.getLastEvent()); + assertEquals(jid1_, handler_.getLastJID()); + assertEquals("NewName", roster_.getNameForJID(jid1_)); + assertEquals(groups1_, roster_.getGroupsForJID(jid1_)); + handler_.reset(); + roster_.addContact(jid1_, "NameTwo", groups2_, RosterItemPayload.Subscription.Both); + assertEquals(XMPPRosterEvents.Update, handler_.getLastEvent()); + assertEquals(jid1_, handler_.getLastJID()); + assertEquals("NameTwo", roster_.getNameForJID(jid1_)); + assertEquals(groups2_, roster_.getGroupsForJID(jid1_)); + } +} \ No newline at end of file diff --git a/test/com/isode/stroke/roster/XMPPRosterSignalHandler.java b/test/com/isode/stroke/roster/XMPPRosterSignalHandler.java new file mode 100644 index 0000000..a6d69eb --- /dev/null +++ b/test/com/isode/stroke/roster/XMPPRosterSignalHandler.java @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2010-2011 Isode Limited. + * All rights reserved. + * See the COPYING file for more information. + */ +/* + * Copyright (c) 2015 Tarun Gupta. + * Licensed under the simplified BSD license. + * See Documentation/Licenses/BSD-simplified.txt for more information. + */ + +package com.isode.stroke.roster; + +import com.isode.stroke.roster.XMPPRosterImpl; +import com.isode.stroke.roster.XMPPRosterEvents; +import com.isode.stroke.signals.SignalConnection; +import com.isode.stroke.signals.Slot1; +import com.isode.stroke.signals.Slot3; +import com.isode.stroke.jid.JID; +import java.util.Collection; +import java.util.ArrayList; + +enum XMPPRosterEvents { + None, + Add, + Remove, + Update +}; + +public class XMPPRosterSignalHandler { + + public XMPPRosterSignalHandler(XMPPRoster roster) { + this.eventCount = 0; + lastEvent_ = XMPPRosterEvents.None; + onJIDAddedConnection = roster.onJIDAdded.connect(new Slot1() { + @Override + public void call(JID j1) { + handleJIDAdded(j1); + } + }); + + onJIDRemovedConnection = roster.onJIDRemoved.connect(new Slot1() { + @Override + public void call(JID j1) { + handleJIDRemoved(j1); + } + }); + + onJIDUpdatedConnection = roster.onJIDUpdated.connect(new Slot3 >() { + @Override + public void call(JID j1, String s1, Collection c1) { + handleJIDUpdated(j1, s1, c1); + } + }); + } + + public XMPPRosterEvents getLastEvent() { + return lastEvent_; + } + + public JID getLastJID() { + return lastJID_; + } + + public String getLastOldName() { + return lastOldName_; + } + + public Collection getLastOldGroups() { + return lastOldGroups_; + } + + public void reset() { + lastEvent_ = XMPPRosterEvents.None; + } + + public final int getEventCount() { + return eventCount; + } + + private void handleJIDAdded(final JID jid) { + lastJID_ = jid; + lastEvent_ = XMPPRosterEvents.Add; + eventCount++; + } + + private void handleJIDRemoved(final JID jid) { + lastJID_ = jid; + lastEvent_ = XMPPRosterEvents.Remove; + eventCount++; + } + + private void handleJIDUpdated(final JID jid, final String oldName, final Collection oldGroups) { + assert(lastEvent_ == XMPPRosterEvents.None); + lastJID_ = jid; + lastOldName_ = oldName; + lastOldGroups_ = oldGroups; + lastEvent_ = XMPPRosterEvents.Update; + eventCount++; + } + + private XMPPRosterEvents lastEvent_; + private JID lastJID_ = new JID(); //initialized + private String lastOldName_ = ""; + private Collection lastOldGroups_ = new ArrayList(); //initialized + private int eventCount; + private SignalConnection onJIDAddedConnection; + private SignalConnection onJIDRemovedConnection; + private SignalConnection onJIDUpdatedConnection; +} \ No newline at end of file -- cgit v0.10.2-6-g49f6