diff options
| author | Richard Maudsley <richard.maudsley@isode.com> | 2014-06-23 10:52:31 (GMT) | 
|---|---|---|
| committer | Richard Maudsley <richard.maudsley@isode.com> | 2014-06-24 14:32:55 (GMT) | 
| commit | c779e07f6d1d23cc157ab3823a00edd95f70ab3b (patch) | |
| tree | 5de546a38677ce19be1b34932144460f11197f96 /Swiften/Avatars/UnitTest/AvatarManagerImplTest.cpp | |
| parent | bd7f30aec53fc776be678577dbe4f9afec5898a6 (diff) | |
| download | swift-contrib-c779e07f6d1d23cc157ab3823a00edd95f70ab3b.zip swift-contrib-c779e07f6d1d23cc157ab3823a00edd95f70ab3b.tar.bz2 | |
Fix old avatar being displayed in QtRosterHeader when cleared.
Test-Information:
Added unit tests for AvatarManagerImpl and CombinedAvatarProvider. Updated test cases to distinguish between error case and empty avatar. Tested changing between blank and non-blank avatars while watching MUC and 1-to-1 chats.
Change-Id: I0bea89c7a22ae9c44a0b126e672a7af94b6f5049
Diffstat (limited to 'Swiften/Avatars/UnitTest/AvatarManagerImplTest.cpp')
| -rw-r--r-- | Swiften/Avatars/UnitTest/AvatarManagerImplTest.cpp | 142 | 
1 files changed, 142 insertions, 0 deletions
| diff --git a/Swiften/Avatars/UnitTest/AvatarManagerImplTest.cpp b/Swiften/Avatars/UnitTest/AvatarManagerImplTest.cpp new file mode 100644 index 0000000..9b7515d --- /dev/null +++ b/Swiften/Avatars/UnitTest/AvatarManagerImplTest.cpp @@ -0,0 +1,142 @@ +/* + * Copyright (c) 2014 Kevin Smith and Remko Tronçon + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include <cppunit/extensions/HelperMacros.h> +#include <cppunit/extensions/TestFactoryRegistry.h> +#include <boost/bind.hpp> + +#include <Swiften/JID/JID.h> +#include <string> +#include <Swiften/Avatars/AvatarManagerImpl.h> +#include <Swiften/Avatars/CombinedAvatarProvider.h> +#include <Swiften/Avatars/VCardAvatarManager.h> +#include <Swiften/Avatars/OfflineAvatarManager.h> +#include <Swiften/Elements/VCardUpdate.h> +#include <Swiften/MUC/MUCRegistry.h> +#include <Swiften/Client/DummyStanzaChannel.h> +#include <Swiften/Crypto/CryptoProvider.h> +#include <Swiften/Crypto/PlatformCryptoProvider.h> +#include <Swiften/Queries/IQRouter.h> +#include <Swiften/Avatars/AvatarMemoryStorage.h> +#include <Swiften/VCards/VCardMemoryStorage.h> +#include <Swiften/VCards/VCardManager.h> +#include <Swiften/Avatars/VCardUpdateAvatarManager.h> +#include <Swiften/StringCodecs/Hexify.h> + +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 = boost::make_shared<DummyStanzaChannel>(); +			iqRouter = boost::make_shared<IQRouter>(stanzaChannel.get()); +			crypto = boost::shared_ptr<CryptoProvider>(PlatformCryptoProvider::create()); +			vcardStorage = boost::make_shared<VCardMemoryStorage>(crypto.get()); +			vcardManager = boost::make_shared<VCardManager>(ownerJID, iqRouter.get(), vcardStorage.get()); +			avatarStorage = boost::make_shared<AvatarMemoryStorage>(); +			mucRegistry = boost::make_shared<DummyMUCRegistry>(); +			avatarManager = boost::make_shared<AvatarManagerImpl>(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"); +			boost::shared_ptr<VCardUpdate> vcardUpdate = boost::make_shared<VCardUpdate>(); +			vcardUpdate->setPhotoHash(Hexify::hexify(crypto->getSHA1Hash(fullAvatar))); +			boost::shared_ptr<Presence> presence = boost::make_shared<Presence>(); +			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()); +			boost::shared_ptr<IQ> request = boost::dynamic_pointer_cast<IQ>(stanzaChannel->sentStanzas[0]); +			stanzaChannel->sentStanzas.pop_back(); +			CPPUNIT_ASSERT(!!request); +			boost::shared_ptr<VCard> vcard = request->getPayload<VCard>(); +			CPPUNIT_ASSERT(!!vcard); + +			boost::shared_ptr<IQ> reply = boost::make_shared<IQ>(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 = boost::make_shared<VCardUpdate>(); +			presence = boost::make_shared<Presence>(); +			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 = boost::dynamic_pointer_cast<IQ>(stanzaChannel->sentStanzas[0]); +			stanzaChannel->sentStanzas.pop_back(); +			CPPUNIT_ASSERT(!!request); +			vcard = request->getPayload<VCard>(); +			CPPUNIT_ASSERT(!!vcard); + +			ByteArray blankAvatar = createByteArray(""); +			reply = boost::make_shared<IQ>(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<JID> mucs_; +		}; + +	private: + +		JID ownerJID; +		boost::shared_ptr<DummyStanzaChannel> stanzaChannel; +		boost::shared_ptr<IQRouter> iqRouter; +		boost::shared_ptr<CryptoProvider> crypto; +		boost::shared_ptr<VCardMemoryStorage> vcardStorage; +		boost::shared_ptr<VCardManager> vcardManager; +		boost::shared_ptr<AvatarMemoryStorage> avatarStorage; +		boost::shared_ptr<DummyMUCRegistry> mucRegistry; +		boost::shared_ptr<AvatarManagerImpl> avatarManager; + +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(AvatarManagerImplTest); | 
 Swift
 Swift