summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Markmann <tm@ayena.de>2015-10-16 10:10:09 (GMT)
committerTobias Markmann <tm@ayena.de>2015-10-16 12:33:11 (GMT)
commit907fdbdab74b72cc4fde2425dc9b2d4d461daf66 (patch)
tree1dc977342eee505c60fcd88f7a67ed5b801b317b
parentf5b5f35868b3f1fd93906d6458cca965f12c6a5f (diff)
downloadswift-907fdbdab74b72cc4fde2425dc9b2d4d461daf66.zip
swift-907fdbdab74b72cc4fde2425dc9b2d4d461daf66.tar.bz2
Add additional unit tests for Chat <-> JID binding
The recent commit 582ca91 changed the behavior the binding between chat sessions and the full JID of a chat contact. This commit adds additional unit tests verifying the behavior of implemented in 582ca91. This means a chat session binds to the full JID of an incoming message only if the message has a non-empty body text or is a 'typing' chat state notification. It also tests the rebind to another resource if a 'typing'-CSN or a body message is received from that resource. Test-Information: All unit tests pass on OS X 10.10.5. Change-Id: Id3f25d8a3ff78c407ed4b2a97bd421dc4aa58688
-rw-r--r--Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp254
1 files changed, 233 insertions, 21 deletions
diff --git a/Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp b/Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp
index cf3253a..487f0f9 100644
--- a/Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp
+++ b/Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp
@@ -1,29 +1,27 @@
1/* 1/*
2 * Copyright (c) 2010-2012 Isode Limited. 2 * Copyright (c) 2010-2015 Isode Limited.
3 * All rights reserved. 3 * All rights reserved.
4 * See the COPYING file for more information. 4 * See the COPYING file for more information.
5 */ 5 */
6 6
7#include <boost/bind.hpp>
8
7#include <cppunit/extensions/HelperMacros.h> 9#include <cppunit/extensions/HelperMacros.h>
8#include <cppunit/extensions/TestFactoryRegistry.h> 10#include <cppunit/extensions/TestFactoryRegistry.h>
9
10#include <hippomocks.h> 11#include <hippomocks.h>
11 12
12#include <boost/bind.hpp>
13
14#include <Swiften/Avatars/AvatarMemoryStorage.h> 13#include <Swiften/Avatars/AvatarMemoryStorage.h>
15#include <Swiften/Avatars/NullAvatarManager.h> 14#include <Swiften/Avatars/NullAvatarManager.h>
16#include <Swiften/Base/Algorithm.h> 15#include <Swiften/Base/Algorithm.h>
17#include <Swiften/Client/Client.h> 16#include <Swiften/Client/Client.h>
18#include <Swiften/Client/ClientBlockListManager.h> 17#include <Swiften/Client/ClientBlockListManager.h>
19#include <Swiften/Client/DummyStanzaChannel.h> 18#include <Swiften/Client/DummyStanzaChannel.h>
20#include <Swiften/Client/NickResolver.h> 19#include <Swiften/Client/NickResolver.h>
21#include <Swiften/Crypto/CryptoProvider.h> 20#include <Swiften/Crypto/CryptoProvider.h>
22#include <Swiften/Crypto/PlatformCryptoProvider.h> 21#include <Swiften/Crypto/PlatformCryptoProvider.h>
23#include <Swiften/Disco/CapsProvider.h> 22#include <Swiften/Disco/DummyEntityCapsProvider.h>
24#include <Swiften/Disco/EntityCapsManager.h>
25#include <Swiften/Elements/DeliveryReceipt.h> 23#include <Swiften/Elements/DeliveryReceipt.h>
26#include <Swiften/Elements/DeliveryReceiptRequest.h> 24#include <Swiften/Elements/DeliveryReceiptRequest.h>
27#include <Swiften/FileTransfer/UnitTest/DummyFileTransferManager.h> 25#include <Swiften/FileTransfer/UnitTest/DummyFileTransferManager.h>
28#include <Swiften/Jingle/JingleSessionManager.h> 26#include <Swiften/Jingle/JingleSessionManager.h>
29#include <Swiften/MUC/MUCManager.h> 27#include <Swiften/MUC/MUCManager.h>
@@ -31,16 +29,15 @@
31#include <Swiften/Presence/PresenceOracle.h> 29#include <Swiften/Presence/PresenceOracle.h>
32#include <Swiften/Presence/StanzaChannelPresenceSender.h> 30#include <Swiften/Presence/StanzaChannelPresenceSender.h>
33#include <Swiften/Queries/DummyIQChannel.h> 31#include <Swiften/Queries/DummyIQChannel.h>
34#include <Swiften/Roster/XMPPRosterImpl.h> 32#include <Swiften/Roster/XMPPRosterImpl.h>
35#include <Swiften/VCards/VCardManager.h> 33#include <Swiften/VCards/VCardManager.h>
36#include <Swiften/VCards/VCardManager.h>
37#include <Swiften/VCards/VCardMemoryStorage.h> 34#include <Swiften/VCards/VCardMemoryStorage.h>
38#include <Swiften/Whiteboard/WhiteboardSessionManager.h> 35#include <Swiften/Whiteboard/WhiteboardSessionManager.h>
39 36
40#include <Swift/Controllers/Chat/ChatsManager.h>
41#include <Swift/Controllers/Chat/ChatController.h> 37#include <Swift/Controllers/Chat/ChatController.h>
38#include <Swift/Controllers/Chat/ChatsManager.h>
42#include <Swift/Controllers/Chat/MUCController.h> 39#include <Swift/Controllers/Chat/MUCController.h>
43#include <Swift/Controllers/Chat/UnitTest/MockChatListWindow.h> 40#include <Swift/Controllers/Chat/UnitTest/MockChatListWindow.h>
44#include <Swift/Controllers/FileTransfer/FileTransferOverview.h> 41#include <Swift/Controllers/FileTransfer/FileTransferOverview.h>
45#include <Swift/Controllers/ProfileSettingsProvider.h> 42#include <Swift/Controllers/ProfileSettingsProvider.h>
46#include <Swift/Controllers/SettingConstants.h> 43#include <Swift/Controllers/SettingConstants.h>
@@ -56,17 +53,12 @@
56#include <Swift/Controllers/UIInterfaces/WhiteboardWindowFactory.h> 53#include <Swift/Controllers/UIInterfaces/WhiteboardWindowFactory.h>
57#include <Swift/Controllers/UnitTest/MockChatWindow.h> 54#include <Swift/Controllers/UnitTest/MockChatWindow.h>
58#include <Swift/Controllers/WhiteboardManager.h> 55#include <Swift/Controllers/WhiteboardManager.h>
59#include <Swift/Controllers/XMPPEvents/EventController.h> 56#include <Swift/Controllers/XMPPEvents/EventController.h>
60 57
61
62using namespace Swift; 58using namespace Swift;
63 59
64class DummyCapsProvider : public CapsProvider {
65 DiscoInfo::ref getCaps(const std::string&) const {return DiscoInfo::ref(new DiscoInfo());}
66};
67
68class ChatsManagerTest : public CppUnit::TestFixture { 60class ChatsManagerTest : public CppUnit::TestFixture {
69 CPPUNIT_TEST_SUITE(ChatsManagerTest); 61 CPPUNIT_TEST_SUITE(ChatsManagerTest);
70 CPPUNIT_TEST(testFirstOpenWindowIncoming); 62 CPPUNIT_TEST(testFirstOpenWindowIncoming);
71 CPPUNIT_TEST(testSecondOpenWindowIncoming); 63 CPPUNIT_TEST(testSecondOpenWindowIncoming);
72 CPPUNIT_TEST(testFirstOpenWindowOutgoing); 64 CPPUNIT_TEST(testFirstOpenWindowOutgoing);
@@ -77,20 +69,22 @@ class ChatsManagerTest : public CppUnit::TestFixture {
77 CPPUNIT_TEST(testThreeMUCWindows); 69 CPPUNIT_TEST(testThreeMUCWindows);
78 CPPUNIT_TEST(testChatControllerPresenceAccessUpdatedOnRemoveFromRoster); 70 CPPUNIT_TEST(testChatControllerPresenceAccessUpdatedOnRemoveFromRoster);
79 CPPUNIT_TEST(testChatControllerPresenceAccessUpdatedOnAddToRoster); 71 CPPUNIT_TEST(testChatControllerPresenceAccessUpdatedOnAddToRoster);
80 CPPUNIT_TEST(testChatControllerPresenceAccessUpdatedOnSubscriptionChangeToBoth); 72 CPPUNIT_TEST(testChatControllerPresenceAccessUpdatedOnSubscriptionChangeToBoth);
81 CPPUNIT_TEST(testChatControllerPresenceAccessUpdatedOnSubscriptionChangeToFrom); 73 CPPUNIT_TEST(testChatControllerPresenceAccessUpdatedOnSubscriptionChangeToFrom);
74 CPPUNIT_TEST(testChatControllerFullJIDBindingOnMessageAndNotReceipt);
75 CPPUNIT_TEST(testChatControllerFullJIDBindingOnTypingAndNotActive);
82 CPPUNIT_TEST_SUITE_END(); 76 CPPUNIT_TEST_SUITE_END();
83 77
84public: 78public:
85 void setUp() { 79 void setUp() {
86 mocks_ = new MockRepository(); 80 mocks_ = new MockRepository();
87 jid_ = JID("test@test.com/resource"); 81 jid_ = JID("test@test.com/resource");
88 stanzaChannel_ = new DummyStanzaChannel(); 82 stanzaChannel_ = new DummyStanzaChannel();
89 iqChannel_ = new DummyIQChannel(); 83 iqChannel_ = new DummyIQChannel();
90 iqRouter_ = new IQRouter(iqChannel_); 84 iqRouter_ = new IQRouter(iqChannel_);
91 capsProvider_ = new DummyCapsProvider(); 85// capsProvider_ = new DummyCapsProvider();
92 eventController_ = new EventController(); 86 eventController_ = new EventController();
93 chatWindowFactory_ = mocks_->InterfaceMock<ChatWindowFactory>(); 87 chatWindowFactory_ = mocks_->InterfaceMock<ChatWindowFactory>();
94 joinMUCWindowFactory_ = mocks_->InterfaceMock<JoinMUCWindowFactory>(); 88 joinMUCWindowFactory_ = mocks_->InterfaceMock<JoinMUCWindowFactory>();
95 xmppRoster_ = new XMPPRosterImpl(); 89 xmppRoster_ = new XMPPRosterImpl();
96 mucRegistry_ = new MUCRegistry(); 90 mucRegistry_ = new MUCRegistry();
@@ -99,29 +93,30 @@ public:
99 serverDiscoInfo_ = boost::make_shared<DiscoInfo>(); 93 serverDiscoInfo_ = boost::make_shared<DiscoInfo>();
100 presenceSender_ = new StanzaChannelPresenceSender(stanzaChannel_); 94 presenceSender_ = new StanzaChannelPresenceSender(stanzaChannel_);
101 directedPresenceSender_ = new DirectedPresenceSender(presenceSender_); 95 directedPresenceSender_ = new DirectedPresenceSender(presenceSender_);
102 mucManager_ = new MUCManager(stanzaChannel_, iqRouter_, directedPresenceSender_, mucRegistry_); 96 mucManager_ = new MUCManager(stanzaChannel_, iqRouter_, directedPresenceSender_, mucRegistry_);
103 uiEventStream_ = new UIEventStream(); 97 uiEventStream_ = new UIEventStream();
104 entityCapsManager_ = new EntityCapsManager(capsProvider_, stanzaChannel_); 98// entityCapsManager_ = new EntityCapsManager(capsProvider_, stanzaChannel_);
99 entityCapsProvider_ = new DummyEntityCapsProvider();
105 chatListWindowFactory_ = mocks_->InterfaceMock<ChatListWindowFactory>(); 100 chatListWindowFactory_ = mocks_->InterfaceMock<ChatListWindowFactory>();
106 mucSearchWindowFactory_ = mocks_->InterfaceMock<MUCSearchWindowFactory>(); 101 mucSearchWindowFactory_ = mocks_->InterfaceMock<MUCSearchWindowFactory>();
107 settings_ = new DummySettingsProvider(); 102 settings_ = new DummySettingsProvider();
108 profileSettings_ = new ProfileSettingsProvider("a", settings_); 103 profileSettings_ = new ProfileSettingsProvider("a", settings_);
109 chatListWindow_ = new MockChatListWindow(); 104 chatListWindow_ = new MockChatListWindow();
110 ftManager_ = new DummyFileTransferManager(); 105 ftManager_ = new DummyFileTransferManager();
111 ftOverview_ = new FileTransferOverview(ftManager_); 106 ftOverview_ = new FileTransferOverview(ftManager_);
112 avatarManager_ = new NullAvatarManager(); 107 avatarManager_ = new NullAvatarManager();
113 wbSessionManager_ = new WhiteboardSessionManager(iqRouter_, stanzaChannel_, presenceOracle_, entityCapsManager_); 108 wbSessionManager_ = new WhiteboardSessionManager(iqRouter_, stanzaChannel_, presenceOracle_, entityCapsProvider_);
114 wbManager_ = new WhiteboardManager(whiteboardWindowFactory_, uiEventStream_, nickResolver_, wbSessionManager_); 109 wbManager_ = new WhiteboardManager(whiteboardWindowFactory_, uiEventStream_, nickResolver_, wbSessionManager_);
115 highlightManager_ = new HighlightManager(settings_); 110 highlightManager_ = new HighlightManager(settings_);
116 111
117 crypto_ = PlatformCryptoProvider::create(); 112 crypto_ = PlatformCryptoProvider::create();
118 vcardStorage_ = new VCardMemoryStorage(crypto_); 113 vcardStorage_ = new VCardMemoryStorage(crypto_);
119 vcardManager_ = new VCardManager(jid_, iqRouter_, vcardStorage_); 114 vcardManager_ = new VCardManager(jid_, iqRouter_, vcardStorage_);
120 mocks_->ExpectCall(chatListWindowFactory_, ChatListWindowFactory::createChatListWindow).With(uiEventStream_).Return(chatListWindow_); 115 mocks_->ExpectCall(chatListWindowFactory_, ChatListWindowFactory::createChatListWindow).With(uiEventStream_).Return(chatListWindow_);
121 clientBlockListManager_ = new ClientBlockListManager(iqRouter_); 116 clientBlockListManager_ = new ClientBlockListManager(iqRouter_);
122 manager_ = new ChatsManager(jid_, stanzaChannel_, iqRouter_, eventController_, chatWindowFactory_, joinMUCWindowFactory_, nickResolver_, presenceOracle_, directedPresenceSender_, uiEventStream_, chatListWindowFactory_, true, NULL, mucRegistry_, entityCapsManager_, mucManager_, mucSearchWindowFactory_, profileSettings_, ftOverview_, xmppRoster_, false, settings_, NULL, wbManager_, highlightManager_, clientBlockListManager_, emoticons_, NULL, vcardManager_); 117 manager_ = new ChatsManager(jid_, stanzaChannel_, iqRouter_, eventController_, chatWindowFactory_, joinMUCWindowFactory_, nickResolver_, presenceOracle_, directedPresenceSender_, uiEventStream_, chatListWindowFactory_, true, NULL, mucRegistry_, entityCapsProvider_, mucManager_, mucSearchWindowFactory_, profileSettings_, ftOverview_, xmppRoster_, false, settings_, NULL, wbManager_, highlightManager_, clientBlockListManager_, emoticons_, NULL, vcardManager_);
123 118
124 manager_->setAvatarManager(avatarManager_); 119 manager_->setAvatarManager(avatarManager_);
125 } 120 }
126 121
127 void tearDown() { 122 void tearDown() {
@@ -148,12 +143,11 @@ public:
148 delete iqRouter_; 143 delete iqRouter_;
149 delete iqChannel_; 144 delete iqChannel_;
150 delete uiEventStream_; 145 delete uiEventStream_;
151 delete mucManager_; 146 delete mucManager_;
152 delete xmppRoster_; 147 delete xmppRoster_;
153 delete entityCapsManager_; 148 delete entityCapsProvider_;
154 delete capsProvider_;
155 delete chatListWindow_; 149 delete chatListWindow_;
156 delete mocks_; 150 delete mocks_;
157 delete settings_; 151 delete settings_;
158 } 152 }
159 153
@@ -427,10 +421,229 @@ public:
427 */ 421 */
428 void testChatControllerPresenceAccessUpdatedOnSubscriptionChangeToFrom() { 422 void testChatControllerPresenceAccessUpdatedOnSubscriptionChangeToFrom() {
429 testhelperChatControllerPresenceAccessUpdatedOnSubscriptionChangeReceiptsAllowed(RosterItemPayload::To, RosterItemPayload::From); 423 testhelperChatControllerPresenceAccessUpdatedOnSubscriptionChangeReceiptsAllowed(RosterItemPayload::To, RosterItemPayload::From);
430 } 424 }
431 425
426 void testChatControllerFullJIDBindingOnMessageAndNotReceipt() {
427 JID ownJID("test@test.com/resource");
428 JID sender("foo@test.com");
429 std::vector<JID> senderResource;
430 senderResource.push_back(sender.withResource("resourceA"));
431 senderResource.push_back(sender.withResource("resourceB"));
432
433 // We support delivery receipts.
434 settings_->storeSetting(SettingConstants::REQUEST_DELIVERYRECEIPTS, true);
435
436 // Open chat window to a sender.
437 MockChatWindow* window = new MockChatWindow();
438 mocks_->ExpectCall(chatWindowFactory_, ChatWindowFactory::createChatWindow).With(sender, uiEventStream_).Return(window);
439
440 uiEventStream_->send(boost::make_shared<RequestChatUIEvent>(sender));
441
442 foreach(const JID& senderJID, senderResource) {
443 // The sender supports delivery receipts.
444 DiscoInfo::ref disco = boost::make_shared<DiscoInfo>();
445 disco->addFeature(DiscoInfo::MessageDeliveryReceiptsFeature);
446 entityCapsProvider_->caps[senderJID] = disco;
447
448 // The sender is online.
449 Presence::ref senderPresence = boost::make_shared<Presence>();
450 senderPresence->setFrom(senderJID);
451 senderPresence->setTo(ownJID);
452 stanzaChannel_->onPresenceReceived(senderPresence);
453
454 entityCapsProvider_->onCapsChanged(senderJID);
455 }
456
457 // Send first message.
458 window->onSendMessageRequest("hello there", false);
459
460 // A bare message is send because no resources is bound.
461 CPPUNIT_ASSERT_EQUAL(sender, stanzaChannel_->getStanzaAtIndex<Message>(0)->getTo());
462 CPPUNIT_ASSERT(stanzaChannel_->getStanzaAtIndex<Message>(0)->getPayload<DeliveryReceiptRequest>());
463
464 // Two resources respond with message receipts.
465 foreach(const JID& senderJID, senderResource) {
466 Message::ref receiptReply = boost::make_shared<Message>();
467 receiptReply->setFrom(senderJID);
468 receiptReply->setTo(ownJID);
469
470 boost::shared_ptr<DeliveryReceipt> receipt = boost::make_shared<DeliveryReceipt>();
471 receipt->setReceivedID(stanzaChannel_->getStanzaAtIndex<Message>(0)->getID());
472 receiptReply->addPayload(receipt);
473 manager_->handleIncomingMessage(receiptReply);
474 }
475
476 // Send second message.
477 window->onSendMessageRequest("how are you?", false);
478
479 // A bare message is send because no resources is bound.
480 CPPUNIT_ASSERT_EQUAL(sender, stanzaChannel_->getStanzaAtIndex<Message>(1)->getTo());
481 CPPUNIT_ASSERT(stanzaChannel_->getStanzaAtIndex<Message>(1)->getPayload<DeliveryReceiptRequest>());
482
483 // Two resources respond with message receipts.
484 foreach(const JID& senderJID, senderResource) {
485 Message::ref receiptReply = boost::make_shared<Message>();
486 receiptReply->setFrom(senderJID);
487 receiptReply->setTo(ownJID);
488
489 boost::shared_ptr<DeliveryReceipt> receipt = boost::make_shared<DeliveryReceipt>();
490 receipt->setReceivedID(stanzaChannel_->getStanzaAtIndex<Message>(1)->getID());
491 receiptReply->addPayload(receipt);
492 manager_->handleIncomingMessage(receiptReply);
493 }
494
495 // Reply with a message including a body text.
496 Message::ref reply = boost::make_shared<Message>();
497 reply->setFrom(senderResource[0]);
498 reply->setTo(ownJID);
499 reply->setBody("fine.");
500 manager_->handleIncomingMessage(reply);
501
502 // Send third message.
503 window->onSendMessageRequest("great to hear.", false);
504
505 // The chat session is bound to the full JID of the first resource.
506 CPPUNIT_ASSERT_EQUAL(senderResource[0], stanzaChannel_->getStanzaAtIndex<Message>(2)->getTo());
507 CPPUNIT_ASSERT(stanzaChannel_->getStanzaAtIndex<Message>(2)->getPayload<DeliveryReceiptRequest>());
508
509 // Receive random receipt from second sender resource.
510 reply = boost::make_shared<Message>();
511 reply->setFrom(senderResource[1]);
512 reply->setTo(ownJID);
513
514 boost::shared_ptr<DeliveryReceipt> receipt = boost::make_shared<DeliveryReceipt>();
515 receipt->setReceivedID(stanzaChannel_->getStanzaAtIndex<Message>(2)->getID());
516 reply->addPayload(receipt);
517 manager_->handleIncomingMessage(reply);
518
519 // Send forth message.
520 window->onSendMessageRequest("what else is new?", false);
521
522 // The chat session is bound to the full JID of the first resource.
523 CPPUNIT_ASSERT_EQUAL(senderResource[0], stanzaChannel_->getStanzaAtIndex<Message>(3)->getTo());
524 CPPUNIT_ASSERT(stanzaChannel_->getStanzaAtIndex<Message>(3)->getPayload<DeliveryReceiptRequest>());
525
526 // Reply with a message including a body text from second resource.
527 reply = boost::make_shared<Message>();
528 reply->setFrom(senderResource[1]);
529 reply->setTo(ownJID);
530 reply->setBody("nothing.");
531 manager_->handleIncomingMessage(reply);
532
533 // Send fifth message.
534 window->onSendMessageRequest("okay", false);
535
536 // The chat session is now bound to the full JID of the second resource.
537 CPPUNIT_ASSERT_EQUAL(senderResource[1], stanzaChannel_->getStanzaAtIndex<Message>(4)->getTo());
538 CPPUNIT_ASSERT(stanzaChannel_->getStanzaAtIndex<Message>(4)->getPayload<DeliveryReceiptRequest>());
539 }
540
541 void testChatControllerFullJIDBindingOnTypingAndNotActive() {
542 JID ownJID("test@test.com/resource");
543 JID sender("foo@test.com");
544 std::vector<JID> senderResource;
545 senderResource.push_back(sender.withResource("resourceA"));
546 senderResource.push_back(sender.withResource("resourceB"));
547
548 // We support delivery receipts.
549 settings_->storeSetting(SettingConstants::REQUEST_DELIVERYRECEIPTS, true);
550
551 // Open chat window to a sender.
552 MockChatWindow* window = new MockChatWindow();
553 mocks_->ExpectCall(chatWindowFactory_, ChatWindowFactory::createChatWindow).With(sender, uiEventStream_).Return(window);
554
555 uiEventStream_->send(boost::make_shared<RequestChatUIEvent>(sender));
556
557 foreach(const JID& senderJID, senderResource) {
558 // The sender supports delivery receipts.
559 DiscoInfo::ref disco = boost::make_shared<DiscoInfo>();
560 disco->addFeature(DiscoInfo::MessageDeliveryReceiptsFeature);
561 entityCapsProvider_->caps[senderJID] = disco;
562
563 // The sender is online.
564 Presence::ref senderPresence = boost::make_shared<Presence>();
565 senderPresence->setFrom(senderJID);
566 senderPresence->setTo(ownJID);
567 stanzaChannel_->onPresenceReceived(senderPresence);
568
569 entityCapsProvider_->onCapsChanged(senderJID);
570 }
571
572 // Send first message.
573 window->onSendMessageRequest("hello there", false);
574
575 // A bare message is send because no resources is bound.
576 CPPUNIT_ASSERT_EQUAL(sender, stanzaChannel_->getStanzaAtIndex<Message>(0)->getTo());
577 CPPUNIT_ASSERT(stanzaChannel_->getStanzaAtIndex<Message>(0)->getPayload<DeliveryReceiptRequest>());
578
579 // Two resources respond with message receipts.
580 foreach(const JID& senderJID, senderResource) {
581 Message::ref reply = boost::make_shared<Message>();
582 reply->setFrom(senderJID);
583 reply->setTo(ownJID);
584
585 boost::shared_ptr<ChatState> csn = boost::make_shared<ChatState>();
586 csn->setChatState(ChatState::Active);
587 reply->addPayload(csn);
588 manager_->handleIncomingMessage(reply);
589 }
590
591 // Send second message.
592 window->onSendMessageRequest("how are you?", false);
593
594 // A bare message is send because no resources is bound.
595 CPPUNIT_ASSERT_EQUAL(sender, stanzaChannel_->getStanzaAtIndex<Message>(1)->getTo());
596 CPPUNIT_ASSERT(stanzaChannel_->getStanzaAtIndex<Message>(1)->getPayload<DeliveryReceiptRequest>());
597
598 // Two resources respond with message receipts.
599 foreach(const JID& senderJID, senderResource) {
600 Message::ref receiptReply = boost::make_shared<Message>();
601 receiptReply->setFrom(senderJID);
602 receiptReply->setTo(ownJID);
603
604 boost::shared_ptr<DeliveryReceipt> receipt = boost::make_shared<DeliveryReceipt>();
605 receipt->setReceivedID(stanzaChannel_->getStanzaAtIndex<Message>(1)->getID());
606 receiptReply->addPayload(receipt);
607 manager_->handleIncomingMessage(receiptReply);
608 }
609
610 // Reply with a message including a CSN.
611 Message::ref reply = boost::make_shared<Message>();
612 reply->setFrom(senderResource[0]);
613 reply->setTo(ownJID);
614
615 boost::shared_ptr<ChatState> csn = boost::make_shared<ChatState>();
616 csn->setChatState(ChatState::Composing);
617 reply->addPayload(csn);
618 manager_->handleIncomingMessage(reply);
619
620 // Send third message.
621 window->onSendMessageRequest("great to hear.", false);
622
623 // The chat session is now bound to the full JID of the first resource due to its recent composing message.
624 CPPUNIT_ASSERT_EQUAL(senderResource[0], stanzaChannel_->getStanzaAtIndex<Message>(2)->getTo());
625 CPPUNIT_ASSERT(stanzaChannel_->getStanzaAtIndex<Message>(2)->getPayload<DeliveryReceiptRequest>());
626
627 // Reply with a message including a CSN from the other resource.
628 reply = boost::make_shared<Message>();
629 reply->setFrom(senderResource[1]);
630 reply->setTo(ownJID);
631
632 csn = boost::make_shared<ChatState>();
633 csn->setChatState(ChatState::Composing);
634 reply->addPayload(csn);
635 manager_->handleIncomingMessage(reply);
636
637 // Send third message.
638 window->onSendMessageRequest("ping.", false);
639
640 // The chat session is now bound to the full JID of the second resource due to its recent composing message.
641 CPPUNIT_ASSERT_EQUAL(senderResource[1], stanzaChannel_->getStanzaAtIndex<Message>(3)->getTo());
642 CPPUNIT_ASSERT(stanzaChannel_->getStanzaAtIndex<Message>(3)->getPayload<DeliveryReceiptRequest>());
643 }
644
432 void testhelperChatControllerPresenceAccessUpdatedOnSubscriptionChangeReceiptsAllowed(RosterItemPayload::Subscription from, RosterItemPayload::Subscription to) { 645 void testhelperChatControllerPresenceAccessUpdatedOnSubscriptionChangeReceiptsAllowed(RosterItemPayload::Subscription from, RosterItemPayload::Subscription to) {
433 JID messageJID("testling@test.com/resource1"); 646 JID messageJID("testling@test.com/resource1");
434 xmppRoster_->addContact(messageJID, "foo", std::vector<std::string>(), from); 647 xmppRoster_->addContact(messageJID, "foo", std::vector<std::string>(), from);
435 648
436 MockChatWindow* window = new MockChatWindow();//mocks_->InterfaceMock<ChatWindow>(); 649 MockChatWindow* window = new MockChatWindow();//mocks_->InterfaceMock<ChatWindow>();
@@ -485,12 +698,11 @@ private:
485 ChatListWindowFactory* chatListWindowFactory_; 698 ChatListWindowFactory* chatListWindowFactory_;
486 WhiteboardWindowFactory* whiteboardWindowFactory_; 699 WhiteboardWindowFactory* whiteboardWindowFactory_;
487 MUCSearchWindowFactory* mucSearchWindowFactory_; 700 MUCSearchWindowFactory* mucSearchWindowFactory_;
488 MUCRegistry* mucRegistry_; 701 MUCRegistry* mucRegistry_;
489 DirectedPresenceSender* directedPresenceSender_; 702 DirectedPresenceSender* directedPresenceSender_;
490 EntityCapsManager* entityCapsManager_; 703 DummyEntityCapsProvider* entityCapsProvider_;
491 CapsProvider* capsProvider_;
492 MUCManager* mucManager_; 704 MUCManager* mucManager_;
493 DummySettingsProvider* settings_; 705 DummySettingsProvider* settings_;
494 ProfileSettingsProvider* profileSettings_; 706 ProfileSettingsProvider* profileSettings_;
495 ChatListWindow* chatListWindow_; 707 ChatListWindow* chatListWindow_;
496 FileTransferOverview* ftOverview_; 708 FileTransferOverview* ftOverview_;