diff --git a/src/tests/conversationmanager.cpp b/src/tests/conversationmanager.cpp index 4cc56db7df64f24798daca37b516a06aac7dbc9e..5c9851ec21795ec4ecb0b726b8c89869ed5affcd 100644 --- a/src/tests/conversationmanager.cpp +++ b/src/tests/conversationmanager.cpp @@ -27,6 +27,7 @@ class ConversationManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTe CPPUNIT_TEST(handleNormalMessagesHeadline); CPPUNIT_TEST(handleGroupchatMessages); CPPUNIT_TEST(handleGroupchatMessagesBouncer); + CPPUNIT_TEST(handleGroupchatMessagesBouncerLeave); CPPUNIT_TEST(handleGroupchatMessagesTwoResources); CPPUNIT_TEST(handleChatstateMessages); CPPUNIT_TEST(handleSubjectMessages); @@ -355,6 +356,71 @@ class ConversationManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTe } + void handleGroupchatMessagesBouncerLeave() { + User *user = userManager->getUser("user@localhost"); + user->addUserSetting("stay_connected", "1"); + TestingConversation *conv = new TestingConversation(user->getConversationManager(), "#room", true); + user->getConversationManager()->addConversation(conv); + conv->onMessageToSend.connect(boost::bind(&ConversationManagerTest::handleMessageReceived, this, _1, _2)); + conv->setNickname("nickname"); + conv->addJID("user@localhost/resource"); + + CPPUNIT_ASSERT(!user->shouldCacheMessages()); + + Swift::Presence::ref response3 = Swift::Presence::create(); + response3->setType(Swift::Presence::Unavailable); + response3->setTo("#room@localhost/hanzz"); + response3->setFrom("user@localhost/resource"); + + Swift::MUCPayload *payload3 = new Swift::MUCPayload(); + payload3->setPassword("password"); + response3->addPayload(boost::shared_ptr(payload3)); + injectPresence(response3); + loop->processEvents(); + + CPPUNIT_ASSERT(!user->shouldCacheMessages()); + + // reset resources should not touch this resource + user->getConversationManager()->resetResources(); + + boost::shared_ptr msg(new Swift::Message()); + msg->setBody("hi there!"); + conv->handleMessage(msg, "anotheruser"); + + boost::shared_ptr msg2(new Swift::Message()); + msg2->setBody("hi there2!"); + conv->handleMessage(msg2, "anotheruser"); + + loop->processEvents(); + CPPUNIT_ASSERT_EQUAL(0, (int) received.size()); + + userRegistry->isValidUserPassword(Swift::JID("user@localhost/resource"), serverFromClientSession.get(), Swift::createSafeByteArray("password")); + userRegistry->onPasswordValid(Swift::JID("user@localhost/resource")); + loop->processEvents(); + + Swift::Presence::ref response = Swift::Presence::create(); + response->setTo("#room@localhost/hanzz"); + response->setFrom("user@localhost/resource"); + + Swift::MUCPayload *payload = new Swift::MUCPayload(); + payload->setPassword("password"); + response->addPayload(boost::shared_ptr(payload)); + injectPresence(response); + loop->processEvents(); + + CPPUNIT_ASSERT_EQUAL(4, (int) received.size()); + CPPUNIT_ASSERT(dynamic_cast(getStanza(received[2]))); + CPPUNIT_ASSERT_EQUAL(std::string("hi there!"), dynamic_cast(getStanza(received[2]))->getBody()); + CPPUNIT_ASSERT_EQUAL(std::string("user@localhost/resource"), dynamic_cast(getStanza(received[2]))->getTo().toString()); + CPPUNIT_ASSERT_EQUAL(std::string("#room@localhost/anotheruser"), dynamic_cast(getStanza(received[2]))->getFrom().toString()); + + CPPUNIT_ASSERT(dynamic_cast(getStanza(received[3]))); + CPPUNIT_ASSERT_EQUAL(std::string("hi there2!"), dynamic_cast(getStanza(received[3]))->getBody()); + CPPUNIT_ASSERT_EQUAL(std::string("user@localhost/resource"), dynamic_cast(getStanza(received[3]))->getTo().toString()); + CPPUNIT_ASSERT_EQUAL(std::string("#room@localhost/anotheruser"), dynamic_cast(getStanza(received[3]))->getFrom().toString()); + + } + void handleGroupchatMessagesTwoResources() { connectSecondResource(); received2.clear();