summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Markmann <tm@ayena.de>2015-09-14 15:08:39 (GMT)
committerKevin Smith <kevin.smith@isode.com>2015-10-16 14:58:03 (GMT)
commit9e6ee0f262e7dc663f4c706b16a346a268f425aa (patch)
tree5926fd9cc9dec1233f95239b259a7730f99a5a72 /Swift/Controllers/Roster/UnitTest/RosterControllerTest.cpp
parent8da6e35afab55d7232d47575faea2bde7cd44ece (diff)
downloadswift-9e6ee0f262e7dc663f4c706b16a346a268f425aa.zip
swift-9e6ee0f262e7dc663f4c706b16a346a268f425aa.tar.bz2
Mark removed contacts as unavailable in Swift
When removing a contact, a XMPP client will not receive an explicit unavailable presence stanza for the contact from the server. Because of that Swift used to show removed contacts still with their old presence in the Chats tab or the chat view. With this patch, the PresenceOracle will flush all known presence of a contact as soon as the JID is removed from the roster. An unavailable presence will stored under the removed bare JID and is emitted via the PresenceOracle::onPresenceChange signal. Test-Information: Added a unit test verifying this behavior. Tested the behavior with two scenarios: a) Account A and B adding each other and accepting the subscription request. Starting a chat between A and B. After removing B in A's account, B used to be shown as available in the chat view and the Chats tab. With this patch B is shown as unavailable. b) Account A and B adding each other and accepting the subscription request. A removing B, and B removing A. After A adds B again, B used to be shown with the old presence even before B accepted the subscription request. This behavior is also fixed with this patch, not showing B as online until B accepted the subscription request. Change-Id: Iba97d3bedd0ac962ea00b25a0d2ed6106ed55a55
Diffstat (limited to 'Swift/Controllers/Roster/UnitTest/RosterControllerTest.cpp')
-rw-r--r--Swift/Controllers/Roster/UnitTest/RosterControllerTest.cpp34
1 files changed, 28 insertions, 6 deletions
diff --git a/Swift/Controllers/Roster/UnitTest/RosterControllerTest.cpp b/Swift/Controllers/Roster/UnitTest/RosterControllerTest.cpp
index c396e48..9320af1 100644
--- a/Swift/Controllers/Roster/UnitTest/RosterControllerTest.cpp
+++ b/Swift/Controllers/Roster/UnitTest/RosterControllerTest.cpp
@@ -1,8 +1,7 @@
1
2/* 1/*
3 * Copyright (c) 2010 Isode Limited. 2 * Copyright (c) 2010-2015 Isode Limited.
4 * All rights reserved. 3 * All rights reserved.
5 * See the COPYING file for more information. 4 * See the COPYING file for more information.
6 */ 5 */
7 6
8#include <cppunit/extensions/HelperMacros.h> 7#include <cppunit/extensions/HelperMacros.h>
@@ -26,15 +25,14 @@
26#include <Swiften/Presence/PresenceOracle.h> 25#include <Swiften/Presence/PresenceOracle.h>
27#include <Swiften/Presence/SubscriptionManager.h> 26#include <Swiften/Presence/SubscriptionManager.h>
28#include <Swiften/Queries/DummyIQChannel.h> 27#include <Swiften/Queries/DummyIQChannel.h>
29#include <Swiften/Queries/IQRouter.h> 28#include <Swiften/Queries/IQRouter.h>
30#include <Swiften/Roster/XMPPRosterImpl.h> 29#include <Swiften/Roster/XMPPRosterImpl.h>
30#include <Swiften/VCards/VCardManager.h>
31#include <Swiften/VCards/VCardMemoryStorage.h> 31#include <Swiften/VCards/VCardMemoryStorage.h>
32// #include <Swiften/Elements/Payload.h>
33// #include <Swiften/Elements/RosterItemPayload.h>
34// #include <Swiften/Elements/RosterPayload.h>
35 32
33#include <Swift/Controllers/FileTransfer/FileTransferOverview.h>
36#include <Swift/Controllers/Roster/ContactRosterItem.h> 34#include <Swift/Controllers/Roster/ContactRosterItem.h>
37#include <Swift/Controllers/Roster/GroupRosterItem.h> 35#include <Swift/Controllers/Roster/GroupRosterItem.h>
38#include <Swift/Controllers/Roster/Roster.h> 36#include <Swift/Controllers/Roster/Roster.h>
39#include <Swift/Controllers/Roster/RosterController.h> 37#include <Swift/Controllers/Roster/RosterController.h>
40#include <Swift/Controllers/Settings/DummySettingsProvider.h> 38#include <Swift/Controllers/Settings/DummySettingsProvider.h>
@@ -60,10 +58,11 @@ class RosterControllerTest : public CppUnit::TestFixture {
60 CPPUNIT_TEST(testSendRename); 58 CPPUNIT_TEST(testSendRename);
61 CPPUNIT_TEST(testPresence); 59 CPPUNIT_TEST(testPresence);
62 CPPUNIT_TEST(testHighestPresence); 60 CPPUNIT_TEST(testHighestPresence);
63 CPPUNIT_TEST(testNotHighestPresence); 61 CPPUNIT_TEST(testNotHighestPresence);
64 CPPUNIT_TEST(testUnavailablePresence); 62 CPPUNIT_TEST(testUnavailablePresence);
63 CPPUNIT_TEST(testRemoveResultsInUnavailablePresence);
65 CPPUNIT_TEST_SUITE_END(); 64 CPPUNIT_TEST_SUITE_END();
66 65
67 public: 66 public:
68 void setUp() { 67 void setUp() {
69 jid_ = JID("testjid@swift.im/swift"); 68 jid_ = JID("testjid@swift.im/swift");
@@ -73,11 +72,11 @@ class RosterControllerTest : public CppUnit::TestFixture {
73 mucRegistry_ = new MUCRegistry(); 72 mucRegistry_ = new MUCRegistry();
74 nickResolver_ = new NickResolver(jid_.toBare(), xmppRoster_, NULL, mucRegistry_); 73 nickResolver_ = new NickResolver(jid_.toBare(), xmppRoster_, NULL, mucRegistry_);
75 channel_ = new DummyIQChannel(); 74 channel_ = new DummyIQChannel();
76 router_ = new IQRouter(channel_); 75 router_ = new IQRouter(channel_);
77 stanzaChannel_ = new DummyStanzaChannel(); 76 stanzaChannel_ = new DummyStanzaChannel();
78 presenceOracle_ = new PresenceOracle(stanzaChannel_); 77 presenceOracle_ = new PresenceOracle(stanzaChannel_, xmppRoster_);
79 subscriptionManager_ = new SubscriptionManager(stanzaChannel_); 78 subscriptionManager_ = new SubscriptionManager(stanzaChannel_);
80 eventController_ = new EventController(); 79 eventController_ = new EventController();
81 uiEventStream_ = new UIEventStream(); 80 uiEventStream_ = new UIEventStream();
82 settings_ = new DummySettingsProvider(); 81 settings_ = new DummySettingsProvider();
83 nickManager_ = new DummyNickManager(); 82 nickManager_ = new DummyNickManager();
@@ -317,10 +316,33 @@ class RosterControllerTest : public CppUnit::TestFixture {
317 316
318 CPPUNIT_ASSERT_EQUAL(groups.size(), item.getGroups().size()); 317 CPPUNIT_ASSERT_EQUAL(groups.size(), item.getGroups().size());
319 assertVectorsEqual(groups, item.getGroups(), __LINE__); 318 assertVectorsEqual(groups, item.getGroups(), __LINE__);
320 } 319 }
321 320
321 void testRemoveResultsInUnavailablePresence() {
322 std::vector<std::string> groups;
323 groups.push_back("testGroup1");
324 JID from("test@testdomain.com");
325 xmppRoster_->addContact(from, "name", groups, RosterItemPayload::Both);
326 Presence::ref lowPresence(new Presence());
327 lowPresence->setFrom(withResource(from, "bob"));
328 lowPresence->setPriority(2);
329 lowPresence->setStatus("Not here");
330 Presence::ref highPresence(new Presence());
331 highPresence->setFrom(withResource(from, "bert"));
332 highPresence->setPriority(10);
333 highPresence->setStatus("So totally here");
334 stanzaChannel_->onPresenceReceived(highPresence);
335 stanzaChannel_->onPresenceReceived(lowPresence);
336
337 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(2), presenceOracle_->getAllPresence("test@testdomain.com").size());
338
339 xmppRoster_->onJIDRemoved(JID("test@testdomain.com"));
340 CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), presenceOracle_->getAllPresence("test@testdomain.com").size());
341 CPPUNIT_ASSERT_EQUAL(Presence::Unavailable, presenceOracle_->getAllPresence("test@testdomain.com")[0]->getType());
342 }
343
322 void assertVectorsEqual(const std::vector<std::string>& v1, const std::vector<std::string>& v2, int line) { 344 void assertVectorsEqual(const std::vector<std::string>& v1, const std::vector<std::string>& v2, int line) {
323 foreach (const std::string& entry, v1) { 345 foreach (const std::string& entry, v1) {
324 if (std::find(v2.begin(), v2.end(), entry) == v2.end()) { 346 if (std::find(v2.begin(), v2.end(), entry) == v2.end()) {
325 std::stringstream stream; 347 std::stringstream stream;
326 stream << "Couldn't find " << entry << " in v2 (line " << line << ")"; 348 stream << "Couldn't find " << entry << " in v2 (line " << line << ")";