/* * Copyright (c) 2010 Remko Tronçon * Licensed under the GNU General Public License v3. * See Documentation/Licenses/GPLv3.txt for more information. */ #include #include #include #include #include #include #include #include using namespace Swift; class PayloadAddingPresenceSenderTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(PayloadAddingPresenceSenderTest); CPPUNIT_TEST(testSetPayloadAddsPayloadOnPresenceSend); CPPUNIT_TEST(testSetNullPayloadDoesNotAddPayloadOnPresenceSend); CPPUNIT_TEST(testSendPresenceDoesNotAlterOriginalPayload); CPPUNIT_TEST(testSetPayloadAfterInitialPresenceResendsPresence); CPPUNIT_TEST(testSetPayloadAfterUnavailablePresenceDoesNotResendPresence); CPPUNIT_TEST(testSendDirectedPresenceIsNotResent); CPPUNIT_TEST_SUITE_END(); public: void setUp() { stanzaChannel = new DummyStanzaChannel(); presenceSender = new StanzaChannelPresenceSender(stanzaChannel); } void tearDown() { delete presenceSender; delete stanzaChannel; } void testSetPayloadAddsPayloadOnPresenceSend() { std::auto_ptr testling(createSender()); testling->setPayload(MyPayload::create("foo")); testling->sendPresence(Presence::create("bar")); CPPUNIT_ASSERT_EQUAL(1, static_cast(stanzaChannel->sentStanzas.size())); CPPUNIT_ASSERT_EQUAL(std::string("bar"), stanzaChannel->getStanzaAtIndex(0)->getStatus()); CPPUNIT_ASSERT(stanzaChannel->getStanzaAtIndex(0)->getPayload()); } void testSetNullPayloadDoesNotAddPayloadOnPresenceSend() { std::auto_ptr testling(createSender()); testling->setPayload(MyPayload::ref()); testling->sendPresence(Presence::create("bar")); CPPUNIT_ASSERT_EQUAL(1, static_cast(stanzaChannel->sentStanzas.size())); CPPUNIT_ASSERT_EQUAL(std::string("bar"), stanzaChannel->getStanzaAtIndex(0)->getStatus()); CPPUNIT_ASSERT(!stanzaChannel->getStanzaAtIndex(0)->getPayload()); } void testSendPresenceDoesNotAlterOriginalPayload() { std::auto_ptr testling(createSender()); testling->setPayload(MyPayload::create("foo")); Presence::ref presence(Presence::create("bar")); testling->sendPresence(presence); CPPUNIT_ASSERT(!presence->getPayload()); } void testSetPayloadAfterInitialPresenceResendsPresence() { std::auto_ptr testling(createSender()); testling->sendPresence(Presence::create("bar")); testling->setPayload(MyPayload::create("foo")); CPPUNIT_ASSERT_EQUAL(2, static_cast(stanzaChannel->sentStanzas.size())); CPPUNIT_ASSERT_EQUAL(std::string("bar"), stanzaChannel->getStanzaAtIndex(1)->getStatus()); CPPUNIT_ASSERT(stanzaChannel->getStanzaAtIndex(1)->getPayload()); } void testSetPayloadAfterUnavailablePresenceDoesNotResendPresence() { std::auto_ptr testling(createSender()); Presence::ref presence = Presence::create("bar"); presence->setType(Presence::Unavailable); testling->sendPresence(presence); testling->setPayload(MyPayload::create("foo")); CPPUNIT_ASSERT_EQUAL(1, static_cast(stanzaChannel->sentStanzas.size())); } void testSendDirectedPresenceIsNotResent() { std::auto_ptr testling(createSender()); testling->sendPresence(Presence::create("bar")); Presence::ref directedPresence = Presence::create("baz"); directedPresence->setTo(JID("foo@bar.com")); testling->sendPresence(directedPresence); testling->setPayload(MyPayload::create("foo")); CPPUNIT_ASSERT_EQUAL(3, static_cast(stanzaChannel->sentStanzas.size())); CPPUNIT_ASSERT_EQUAL(std::string("bar"), stanzaChannel->getStanzaAtIndex(2)->getStatus()); } private: std::auto_ptr createSender() { std::auto_ptr sender(new PayloadAddingPresenceSender(presenceSender)); return sender; } struct MyPayload : public Payload { typedef boost::shared_ptr ref; MyPayload(const std::string& body) : body(body) {} static ref create(const std::string& body) { return ref(new MyPayload(body)); } std::string body; }; private: DummyStanzaChannel* stanzaChannel; StanzaChannelPresenceSender* presenceSender; }; CPPUNIT_TEST_SUITE_REGISTRATION(PayloadAddingPresenceSenderTest);