/* * Copyright (c) 2014-2018 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace Swift; class AvatarManagerImplTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(AvatarManagerImplTest); CPPUNIT_TEST(testGetSetAvatar); CPPUNIT_TEST_SUITE_END(); public: void setUp() { ownerJID = JID("owner@domain.com/theowner"); stanzaChannel = std::make_shared(); iqRouter = std::make_shared(stanzaChannel.get()); crypto = std::shared_ptr(PlatformCryptoProvider::create()); vcardStorage = std::make_shared(crypto.get()); vcardManager = std::make_shared(ownerJID, iqRouter.get(), vcardStorage.get()); avatarStorage = std::make_shared(); mucRegistry = std::make_shared(); avatarManager = std::make_shared(vcardManager.get(), stanzaChannel.get(), avatarStorage.get(), crypto.get(), mucRegistry.get()); } void testGetSetAvatar() { /* initially we have no knowledge of the user or their avatar */ JID personJID("person@domain.com/theperson"); ByteArray avatar = avatarManager->getAvatar(personJID.toBare()); CPPUNIT_ASSERT(!avatar.size()); /* notify the 'owner' JID that our avatar has changed */ ByteArray fullAvatar = createByteArray("abcdefg"); std::shared_ptr vcardUpdate = std::make_shared(); vcardUpdate->setPhotoHash(Hexify::hexify(crypto->getSHA1Hash(fullAvatar))); std::shared_ptr presence = std::make_shared(); presence->setTo(ownerJID); presence->setFrom(personJID); presence->setType(Presence::Available); presence->addPayload(vcardUpdate); stanzaChannel->onPresenceReceived(presence); /* reply to the avatar request with our new avatar */ CPPUNIT_ASSERT_EQUAL(size_t(1), stanzaChannel->sentStanzas.size()); std::shared_ptr request = std::dynamic_pointer_cast(stanzaChannel->sentStanzas[0]); stanzaChannel->sentStanzas.pop_back(); CPPUNIT_ASSERT(!!request); std::shared_ptr vcard = request->getPayload(); CPPUNIT_ASSERT(!!vcard); std::shared_ptr reply = std::make_shared(IQ::Result); reply->setTo(request->getFrom()); reply->setFrom(request->getTo()); reply->setID(request->getID()); vcard->setPhoto(fullAvatar); reply->addPayload(vcard); stanzaChannel->onIQReceived(reply); /* check hash through avatarManager that it received the correct photo */ ByteArray reportedAvatar = avatarManager->getAvatar(personJID.toBare()); CPPUNIT_ASSERT_EQUAL(byteArrayToString(fullAvatar), byteArrayToString(reportedAvatar)); /* send new presence to notify of blank avatar */ vcardUpdate = std::make_shared(); vcardUpdate->setPhotoHash("da39a3ee5e6b4b0d3255bfef95601890afd80709"); presence = std::make_shared(); presence->setTo(ownerJID); presence->setFrom(personJID); presence->setType(Presence::Available); presence->addPayload(vcardUpdate); stanzaChannel->onPresenceReceived(presence); /* reply to the avatar request with our EMPTY avatar */ CPPUNIT_ASSERT_EQUAL(size_t(1), stanzaChannel->sentStanzas.size()); request = std::dynamic_pointer_cast(stanzaChannel->sentStanzas[0]); stanzaChannel->sentStanzas.pop_back(); CPPUNIT_ASSERT(!!request); vcard = request->getPayload(); CPPUNIT_ASSERT(!!vcard); ByteArray blankAvatar = createByteArray(""); reply = std::make_shared(IQ::Result); reply->setTo(request->getFrom()); reply->setFrom(request->getTo()); reply->setID(request->getID()); vcard->setPhoto(blankAvatar); reply->addPayload(vcard); stanzaChannel->onIQReceived(reply); /* check hash through avatarManager that it received the correct photo */ reportedAvatar = avatarManager->getAvatar(personJID.toBare()); CPPUNIT_ASSERT_EQUAL(byteArrayToString(blankAvatar), byteArrayToString(reportedAvatar)); } struct DummyMUCRegistry : public MUCRegistry { bool isMUC(const JID& jid) const { return std::find(mucs_.begin(), mucs_.end(), jid) != mucs_.end(); } std::vector mucs_; }; private: JID ownerJID; std::shared_ptr stanzaChannel; std::shared_ptr iqRouter; std::shared_ptr crypto; std::shared_ptr vcardStorage; std::shared_ptr vcardManager; std::shared_ptr avatarStorage; std::shared_ptr mucRegistry; std::shared_ptr avatarManager; }; CPPUNIT_TEST_SUITE_REGISTRATION(AvatarManagerImplTest);