diff options
Diffstat (limited to 'Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp')
| -rw-r--r-- | Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp | 254 |
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 | |||
| 62 | using namespace Swift; | 58 | using namespace Swift; |
| 63 | 59 | ||
| 64 | class DummyCapsProvider : public CapsProvider { | ||
| 65 | DiscoInfo::ref getCaps(const std::string&) const {return DiscoInfo::ref(new DiscoInfo());} | ||
| 66 | }; | ||
| 67 | |||
| 68 | class ChatsManagerTest : public CppUnit::TestFixture { | 60 | class 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 | ||
| 84 | public: | 78 | public: |
| 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_; |
Swift