summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/com/isode/stroke/roster/RosterPushResponder.java2
-rw-r--r--src/com/isode/stroke/roster/XMPPRoster.java6
-rw-r--r--src/com/isode/stroke/roster/XMPPRosterController.java4
-rw-r--r--src/com/isode/stroke/roster/XMPPRosterImpl.java8
-rw-r--r--test/com/isode/stroke/roster/XMPPRosterControllerTest.java356
-rw-r--r--test/com/isode/stroke/roster/XMPPRosterImplTest.java110
-rw-r--r--test/com/isode/stroke/roster/XMPPRosterSignalHandler.java110
7 files changed, 589 insertions, 7 deletions
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<RosterPayload> {
- final Signal1<RosterPayload> onRosterReceived = new Signal1<RosterPayload>();
+ public final Signal1<RosterPayload> onRosterReceived = new Signal1<RosterPayload>();
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<XMPPRosterItem> 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<JID, XMPPRosterItem> entries_ = new HashMap<JID, XMPPRosterItem>();
- void addContact(final JID jid, final String name, final Collection<String> groups, RosterItemPayload.Subscription subscription) {
+ public void addContact(final JID jid, final String name, final Collection<String> 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<String> groups = new ArrayList<String>();
+ 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<String> groups1_ = new ArrayList<String>();
+ private Collection<String> groups2_ = new ArrayList<String>();
+
+ @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<JID>() {
+ @Override
+ public void call(JID j1) {
+ handleJIDAdded(j1);
+ }
+ });
+
+ onJIDRemovedConnection = roster.onJIDRemoved.connect(new Slot1<JID>() {
+ @Override
+ public void call(JID j1) {
+ handleJIDRemoved(j1);
+ }
+ });
+
+ onJIDUpdatedConnection = roster.onJIDUpdated.connect(new Slot3<JID, String, Collection<String> >() {
+ @Override
+ public void call(JID j1, String s1, Collection<String> c1) {
+ handleJIDUpdated(j1, s1, c1);
+ }
+ });
+ }
+
+ public XMPPRosterEvents getLastEvent() {
+ return lastEvent_;
+ }
+
+ public JID getLastJID() {
+ return lastJID_;
+ }
+
+ public String getLastOldName() {
+ return lastOldName_;
+ }
+
+ public Collection<String> 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<String> 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<String> lastOldGroups_ = new ArrayList<String>(); //initialized
+ private int eventCount;
+ private SignalConnection onJIDAddedConnection;
+ private SignalConnection onJIDRemovedConnection;
+ private SignalConnection onJIDUpdatedConnection;
+} \ No newline at end of file