/* * Copyright (c) 2010-2016 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include #include #include #include #include #include using namespace Swift; class DirectedPresenceSenderTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(DirectedPresenceSenderTest); CPPUNIT_TEST(testSendPresence); CPPUNIT_TEST(testSendPresence_UndirectedPresenceWithDirectedPresenceReceivers); CPPUNIT_TEST(testSendPresence_DirectedPresenceWithDirectedPresenceReceivers); CPPUNIT_TEST(testAddDirectedPresenceReceiver); CPPUNIT_TEST(testAddDirectedPresenceReceiver_WithoutSendingPresence); CPPUNIT_TEST(testAddDirectedPresenceReceiver_AfterSendingDirectedPresence); CPPUNIT_TEST(testRemoveDirectedPresenceReceiver); CPPUNIT_TEST(testRemoveDirectedPresenceReceiver_WithoutSendingPresence); CPPUNIT_TEST_SUITE_END(); public: void setUp() { channel = std::make_unique(); testPresence = std::make_shared(); testPresence->setStatus("Foo"); secondTestPresence = std::make_shared(); secondTestPresence->setStatus("Bar"); stanzaChannelPresenceSender = std::make_unique(channel.get()); } void testSendPresence() { std::shared_ptr testling(createPresenceSender()); testling->sendPresence(testPresence); CPPUNIT_ASSERT_EQUAL(1, static_cast(channel->sentStanzas.size())); std::shared_ptr presence = std::dynamic_pointer_cast(channel->sentStanzas[0]); CPPUNIT_ASSERT(testPresence == presence); } void testSendPresence_UndirectedPresenceWithDirectedPresenceReceivers() { std::shared_ptr testling(createPresenceSender()); testling->addDirectedPresenceReceiver(JID("alice@wonderland.lit/teaparty"), DirectedPresenceSender::AndSendPresence); testling->sendPresence(testPresence); CPPUNIT_ASSERT_EQUAL(2, static_cast(channel->sentStanzas.size())); std::shared_ptr presence = std::dynamic_pointer_cast(channel->sentStanzas[0]); CPPUNIT_ASSERT(testPresence == presence); presence = std::dynamic_pointer_cast(channel->sentStanzas[1]); CPPUNIT_ASSERT_EQUAL(testPresence->getStatus(), presence->getStatus()); CPPUNIT_ASSERT_EQUAL(JID("alice@wonderland.lit/teaparty"), presence->getTo()); } void testSendPresence_DirectedPresenceWithDirectedPresenceReceivers() { std::shared_ptr testling(createPresenceSender()); testling->addDirectedPresenceReceiver(JID("alice@wonderland.lit/teaparty"), DirectedPresenceSender::AndSendPresence); channel->sentStanzas.clear(); testPresence->setTo(JID("foo@bar.com")); testling->sendPresence(testPresence); CPPUNIT_ASSERT_EQUAL(1, static_cast(channel->sentStanzas.size())); std::shared_ptr presence = std::dynamic_pointer_cast(channel->sentStanzas[0]); CPPUNIT_ASSERT(testPresence == presence); } void testAddDirectedPresenceReceiver() { std::shared_ptr testling(createPresenceSender()); testling->sendPresence(testPresence); channel->sentStanzas.clear(); testling->addDirectedPresenceReceiver(JID("alice@wonderland.lit/teaparty"), DirectedPresenceSender::AndSendPresence); CPPUNIT_ASSERT_EQUAL(1, static_cast(channel->sentStanzas.size())); std::shared_ptr presence = std::dynamic_pointer_cast(channel->sentStanzas[0]); CPPUNIT_ASSERT_EQUAL(testPresence->getStatus(), presence->getStatus()); CPPUNIT_ASSERT_EQUAL(JID("alice@wonderland.lit/teaparty"), presence->getTo()); } void testAddDirectedPresenceReceiver_WithoutSendingPresence() { std::shared_ptr testling(createPresenceSender()); testling->sendPresence(testPresence); channel->sentStanzas.clear(); testling->addDirectedPresenceReceiver(JID("alice@wonderland.lit/teaparty"), DirectedPresenceSender::DontSendPresence); CPPUNIT_ASSERT_EQUAL(0, static_cast(channel->sentStanzas.size())); } void testAddDirectedPresenceReceiver_AfterSendingDirectedPresence() { std::shared_ptr testling(createPresenceSender()); testling->sendPresence(testPresence); secondTestPresence->setTo(JID("foo@bar.com")); testling->sendPresence(secondTestPresence); channel->sentStanzas.clear(); testling->addDirectedPresenceReceiver(JID("alice@wonderland.lit/teaparty"), DirectedPresenceSender::AndSendPresence); CPPUNIT_ASSERT_EQUAL(1, static_cast(channel->sentStanzas.size())); std::shared_ptr presence = std::dynamic_pointer_cast(channel->sentStanzas[0]); CPPUNIT_ASSERT_EQUAL(testPresence->getStatus(), presence->getStatus()); CPPUNIT_ASSERT_EQUAL(JID("alice@wonderland.lit/teaparty"), presence->getTo()); } void testRemoveDirectedPresenceReceiver() { std::shared_ptr testling(createPresenceSender()); testling->addDirectedPresenceReceiver(JID("alice@wonderland.lit/teaparty"), DirectedPresenceSender::DontSendPresence); testling->removeDirectedPresenceReceiver(JID("alice@wonderland.lit/teaparty"), DirectedPresenceSender::AndSendPresence); testling->sendPresence(testPresence); CPPUNIT_ASSERT_EQUAL(2, static_cast(channel->sentStanzas.size())); CPPUNIT_ASSERT_EQUAL(std::dynamic_pointer_cast(channel->sentStanzas[0])->getType(), Presence::Unavailable); CPPUNIT_ASSERT(channel->sentStanzas[1] == testPresence); } void testRemoveDirectedPresenceReceiver_WithoutSendingPresence() { std::shared_ptr testling(createPresenceSender()); testling->addDirectedPresenceReceiver(JID("alice@wonderland.lit/teaparty"), DirectedPresenceSender::AndSendPresence); channel->sentStanzas.clear(); testling->removeDirectedPresenceReceiver(JID("alice@wonderland.lit/teaparty"), DirectedPresenceSender::DontSendPresence); testling->sendPresence(testPresence); CPPUNIT_ASSERT_EQUAL(1, static_cast(channel->sentStanzas.size())); CPPUNIT_ASSERT(channel->sentStanzas[0] == testPresence); } private: DirectedPresenceSender* createPresenceSender() { return new DirectedPresenceSender(stanzaChannelPresenceSender.get()); } private: std::unique_ptr channel; std::unique_ptr stanzaChannelPresenceSender; std::shared_ptr testPresence; std::shared_ptr secondTestPresence; }; CPPUNIT_TEST_SUITE_REGISTRATION(DirectedPresenceSenderTest);