Files @ dc6c6f8337db
Branch filter:

Location: libtransport.git/tests/libtransport/rostermanager.cpp - annotation

Jan Kaluza
Libpurple: Change the nickname before joining the room to match the nickname used by the libpurple
c82202f16bda
c82202f16bda
c82202f16bda
c82202f16bda
c82202f16bda
c82202f16bda
c82202f16bda
c82202f16bda
c82202f16bda
c82202f16bda
c82202f16bda
c82202f16bda
c82202f16bda
c82202f16bda
c82202f16bda
c82202f16bda
c82202f16bda
8d64493eef2a
f9eb932dbc9d
f57929c659c0
cb2dbb39379f
0cd6ed850207
9c48437b09d7
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
c82202f16bda
c82202f16bda
c82202f16bda
31b80dbe76f2
31b80dbe76f2
c82202f16bda
31b80dbe76f2
c82202f16bda
c82202f16bda
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
c82202f16bda
c82202f16bda
c82202f16bda
c82202f16bda
c82202f16bda
c82202f16bda
c82202f16bda
c82202f16bda
c82202f16bda
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
c82202f16bda
c82202f16bda
9c48437b09d7
9c48437b09d7
9c48437b09d7
9c48437b09d7
9c48437b09d7
9c48437b09d7
9c48437b09d7
9c48437b09d7
6eb53393c74f
9c48437b09d7
9c48437b09d7
9c48437b09d7
f9eb932dbc9d
f9eb932dbc9d
f9eb932dbc9d
f9eb932dbc9d
f9eb932dbc9d
f9eb932dbc9d
f9eb932dbc9d
f9eb932dbc9d
f9eb932dbc9d
f9eb932dbc9d
f9eb932dbc9d
f9eb932dbc9d
f9eb932dbc9d
f9eb932dbc9d
f9eb932dbc9d
af75453834dd
f9eb932dbc9d
f9eb932dbc9d
f9eb932dbc9d
8d64493eef2a
8d64493eef2a
8d64493eef2a
8d64493eef2a
8d64493eef2a
8d64493eef2a
8d64493eef2a
8d64493eef2a
8d64493eef2a
8d64493eef2a
8d64493eef2a
8d64493eef2a
8d64493eef2a
8d64493eef2a
8d64493eef2a
8d64493eef2a
8d64493eef2a
8d64493eef2a
8d64493eef2a
c82202f16bda
af75453834dd
c82202f16bda
eeda35442237
c82202f16bda
9e05a8dffbe8
9e05a8dffbe8
9e05a8dffbe8
9e05a8dffbe8
af75453834dd
c82202f16bda
36b444536cb0
c82202f16bda
eeda35442237
9e05a8dffbe8
9e05a8dffbe8
9e05a8dffbe8
af75453834dd
c82202f16bda
c82202f16bda
9e05a8dffbe8
9e05a8dffbe8
eeda35442237
9e05a8dffbe8
9e05a8dffbe8
eeda35442237
eeda35442237
eeda35442237
eeda35442237
eeda35442237
eeda35442237
eeda35442237
eeda35442237
c82202f16bda
c82202f16bda
f57929c659c0
f57929c659c0
f57929c659c0
f57929c659c0
f57929c659c0
f57929c659c0
f57929c659c0
f57929c659c0
0cd6ed850207
0cd6ed850207
0cd6ed850207
0cd6ed850207
0cd6ed850207
0cd6ed850207
0cd6ed850207
0cd6ed850207
cb2dbb39379f
cb2dbb39379f
cb2dbb39379f
cb2dbb39379f
cb2dbb39379f
cb2dbb39379f
cb2dbb39379f
cb2dbb39379f
cb2dbb39379f
cb2dbb39379f
cb2dbb39379f
cb2dbb39379f
cb2dbb39379f
cb2dbb39379f
cb2dbb39379f
cb2dbb39379f
0cd6ed850207
0cd6ed850207
0cd6ed850207
0cd6ed850207
0cd6ed850207
0cd6ed850207
0cd6ed850207
0cd6ed850207
0cd6ed850207
0cd6ed850207
0cd6ed850207
0cd6ed850207
0cd6ed850207
0cd6ed850207
0cd6ed850207
0cd6ed850207
0cd6ed850207
0cd6ed850207
f57929c659c0
f57929c659c0
31b80dbe76f2
af75453834dd
31b80dbe76f2
eeda35442237
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
af75453834dd
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
af75453834dd
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
af75453834dd
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
af75453834dd
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
af75453834dd
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
af75453834dd
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
af75453834dd
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
31b80dbe76f2
c82202f16bda
c82202f16bda
c82202f16bda
#include <cppunit/TestFixture.h>
#include <cppunit/extensions/HelperMacros.h>
#include <Swiften/Swiften.h>
#include <Swiften/EventLoop/DummyEventLoop.h>
#include <Swiften/Server/Server.h>
#include <Swiften/Network/DummyNetworkFactories.h>
#include <Swiften/Network/DummyConnectionServer.h>
#include "Swiften/Server/ServerStanzaChannel.h"
#include "Swiften/Server/ServerFromClientSession.h"
#include "Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.h"
#include "basictest.h"

using namespace Transport;

class RosterManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTest {
	CPPUNIT_TEST_SUITE(RosterManagerTest);
	CPPUNIT_TEST(setBuddy);
	CPPUNIT_TEST(setBuddyUTF8);
	CPPUNIT_TEST(setBuddyNoAlias);
	CPPUNIT_TEST(sendCurrentPresences);
	CPPUNIT_TEST(sendUnavailablePresences);
	CPPUNIT_TEST(sendCurrentPresence);
	CPPUNIT_TEST(sendBuddySubscribePresence);
	CPPUNIT_TEST(removeBuddy);
	CPPUNIT_TEST(subscribeExistingBuddy);
	CPPUNIT_TEST(subscribeNewBuddy);
	CPPUNIT_TEST(unsubscribeExistingBuddy);
	CPPUNIT_TEST(unsubscribeNewBuddy);
	CPPUNIT_TEST_SUITE_END();

	public:
		std::string m_buddy;

		void setUp (void) {
			m_buddy.clear();
			setMeUp();
			connectUser();
			User *user = userManager->getUser("user@localhost");
			user->getRosterManager()->onBuddyAdded.connect(boost::bind(&RosterManagerTest::handleBuddyAdded, this, _1));
			user->getRosterManager()->onBuddyRemoved.connect(boost::bind(&RosterManagerTest::handleBuddyRemoved, this, _1));
			received.clear();
		}

		void tearDown (void) {
			received.clear();
			disconnectUser();
			tearMeDown();
		}

	void handleBuddyAdded(Buddy *buddy) {
		m_buddy = buddy->getName();
	}

	void handleBuddyRemoved(Buddy *buddy) {
		m_buddy = buddy->getName();
	}

	void sendBuddySubscribePresence() {
		add2Buddies();
		received.clear();
		User *user = userManager->getUser("user@localhost");
		user->getRosterManager()->sendBuddySubscribePresence(user->getRosterManager()->getBuddy("buddy1"));
		CPPUNIT_ASSERT_EQUAL(1, (int) received.size());
		CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Nickname>());
		CPPUNIT_ASSERT_EQUAL(std::string("Buddy 1"), getStanza(received[0])->getPayload<Swift::Nickname>()->getNickname());
		CPPUNIT_ASSERT_EQUAL(std::string("buddy1@localhost"), getStanza(received[0])->getFrom().toString());
		
	}

	void setBuddyNoAlias() {
		User *user = userManager->getUser("user@localhost");
		CPPUNIT_ASSERT(user);

		std::vector<std::string> grp;
		grp.push_back("group1");
		LocalBuddy *buddy = new LocalBuddy(user->getRosterManager(), -1, "buddy1", "", grp, BUDDY_JID_ESCAPING);
		user->getRosterManager()->setBuddy(buddy);

		CPPUNIT_ASSERT_EQUAL(1, (int) received.size());

		Swift::RosterPayload::ref payload1 = getStanza(received[0])->getPayload<Swift::RosterPayload>();
		CPPUNIT_ASSERT(payload1);
		CPPUNIT_ASSERT_EQUAL(1, (int) payload1->getItems().size());
		Swift::RosterItemPayload item = payload1->getItems()[0];
		CPPUNIT_ASSERT_EQUAL(std::string("buddy1"), Buddy::JIDToLegacyName(item.getJID(), user));
		CPPUNIT_ASSERT_EQUAL(std::string(""), item.getName());
	}

	void setBuddyUTF8() {
		User *user = userManager->getUser("user@localhost");
		CPPUNIT_ASSERT(user);

		std::vector<std::string> grp;
		grp.push_back("group1");
		LocalBuddy *buddy = new LocalBuddy(user->getRosterManager(), -1, "Катя антонова", "", grp, BUDDY_JID_ESCAPING);
		user->getRosterManager()->setBuddy(buddy);

		CPPUNIT_ASSERT(user->getRosterManager()->getBuddy("катя антонова"));

		Swift::RosterPayload::ref payload1 = getStanza(received[0])->getPayload<Swift::RosterPayload>();
		CPPUNIT_ASSERT(payload1);
		CPPUNIT_ASSERT_EQUAL(1, (int) payload1->getItems().size());
		Swift::RosterItemPayload item = payload1->getItems()[0];
		CPPUNIT_ASSERT_EQUAL(std::string("Катя антонова"), Buddy::JIDToLegacyName(item.getJID(), user));
		CPPUNIT_ASSERT_EQUAL(std::string(""), item.getName());
	}

	void setBuddy() {
		User *user = userManager->getUser("user@localhost");
		add2Buddies();
		CPPUNIT_ASSERT_EQUAL(4, (int) received.size());

		Swift::RosterPayload::ref payload1 = getStanza(received[0])->getPayload<Swift::RosterPayload>();
		CPPUNIT_ASSERT(payload1);
		CPPUNIT_ASSERT_EQUAL(1, (int) payload1->getItems().size());
		Swift::RosterItemPayload item = payload1->getItems()[0];
		CPPUNIT_ASSERT_EQUAL(std::string("BuddY1"), Buddy::JIDToLegacyName(item.getJID(), user));
		CPPUNIT_ASSERT_EQUAL(std::string("Buddy 1"), item.getName());
		CPPUNIT_ASSERT_EQUAL(std::string("localhost"), getStanza(received[0])->getFrom().toString());

		Swift::RosterPayload::ref payload2 = getStanza(received[2])->getPayload<Swift::RosterPayload>();
		CPPUNIT_ASSERT(payload2);
		CPPUNIT_ASSERT_EQUAL(1, (int) payload2->getItems().size());
		item = payload2->getItems()[0];
		CPPUNIT_ASSERT_EQUAL(std::string("buddy2"), Buddy::JIDToLegacyName(item.getJID(), user));
		CPPUNIT_ASSERT_EQUAL(std::string("Buddy 2"), item.getName());

		// send responses back
		injectIQ(Swift::IQ::createResult(getStanza(received[0])->getFrom(), getStanza(received[0])->getTo(), getStanza(received[0])->getID()));
		injectIQ(Swift::IQ::createResult(getStanza(received[2])->getFrom(), getStanza(received[2])->getTo(), getStanza(received[2])->getID()));

		// we should get presences
		CPPUNIT_ASSERT_EQUAL(6, (int) received.size());
		CPPUNIT_ASSERT(dynamic_cast<Swift::Presence *>(getStanza(received[4])));
		CPPUNIT_ASSERT_EQUAL(Swift::StatusShow::Away, dynamic_cast<Swift::Presence *>(getStanza(received[4]))->getShow());
		CPPUNIT_ASSERT_EQUAL(std::string("status1"), dynamic_cast<Swift::Presence *>(getStanza(received[4]))->getStatus());

		CPPUNIT_ASSERT(dynamic_cast<Swift::Presence *>(getStanza(received[5])));
		CPPUNIT_ASSERT_EQUAL(Swift::StatusShow::Away, dynamic_cast<Swift::Presence *>(getStanza(received[5]))->getShow());
		CPPUNIT_ASSERT_EQUAL(std::string("status2"), dynamic_cast<Swift::Presence *>(getStanza(received[5]))->getStatus());
	}

	void sendCurrentPresences() {
		setBuddy();
		received.clear();

		User *user = userManager->getUser("user@localhost");
		user->getRosterManager()->sendCurrentPresences("user@localhost/resource");

		CPPUNIT_ASSERT_EQUAL(2, (int) received.size());

		for (int i = 0; i < 2; i++) {
			CPPUNIT_ASSERT(dynamic_cast<Swift::Presence *>(getStanza(received[i])));
			CPPUNIT_ASSERT_EQUAL(Swift::StatusShow::Away, dynamic_cast<Swift::Presence *>(getStanza(received[i]))->getShow());
			CPPUNIT_ASSERT_EQUAL(std::string("user@localhost/resource"), dynamic_cast<Swift::Presence *>(getStanza(received[i]))->getTo().toString());
		}
	}

	void sendUnavailablePresences() {
		setBuddy();
		received.clear();

		User *user = userManager->getUser("user@localhost");
		user->getRosterManager()->sendUnavailablePresences("user@localhost/resource");

		CPPUNIT_ASSERT_EQUAL(3, (int) received.size());

		for (int i = 0; i < 3; i++) {
			CPPUNIT_ASSERT(dynamic_cast<Swift::Presence *>(getStanza(received[i])));
			CPPUNIT_ASSERT_EQUAL(Swift::Presence::Unavailable, dynamic_cast<Swift::Presence *>(getStanza(received[i]))->getType());
			CPPUNIT_ASSERT_EQUAL(std::string("user@localhost/resource"), dynamic_cast<Swift::Presence *>(getStanza(received[i]))->getTo().toString());
		}
	}

	void sendCurrentPresence() {
		setBuddy();
		received.clear();

		User *user = userManager->getUser("user@localhost");
		user->getRosterManager()->sendCurrentPresence("buddy1@localhost", "user@localhost/resource");

		CPPUNIT_ASSERT_EQUAL(1, (int) received.size());
		CPPUNIT_ASSERT(dynamic_cast<Swift::Presence *>(getStanza(received[0])));
		CPPUNIT_ASSERT_EQUAL(Swift::StatusShow::Away, dynamic_cast<Swift::Presence *>(getStanza(received[0]))->getShow());
		CPPUNIT_ASSERT_EQUAL(std::string("user@localhost/resource"), dynamic_cast<Swift::Presence *>(getStanza(received[0]))->getTo().toString());

		received.clear();
		user->getRosterManager()->sendCurrentPresence("buddy_unknown@localhost", "user@localhost/resource");
		CPPUNIT_ASSERT_EQUAL(1, (int) received.size());
		CPPUNIT_ASSERT(dynamic_cast<Swift::Presence *>(getStanza(received[0])));
		CPPUNIT_ASSERT_EQUAL(Swift::Presence::Unavailable, dynamic_cast<Swift::Presence *>(getStanza(received[0]))->getType());
		CPPUNIT_ASSERT_EQUAL(std::string("user@localhost/resource"), dynamic_cast<Swift::Presence *>(getStanza(received[0]))->getTo().toString());
	}

	void removeBuddy() {
		User *user = userManager->getUser("user@localhost");
		add2Buddies();
		CPPUNIT_ASSERT_EQUAL(4, (int) received.size());

		received.clear();
		user->getRosterManager()->removeBuddy("buddy1");
		CPPUNIT_ASSERT_EQUAL(1, (int) received.size());

		Swift::RosterPayload::ref payload1 = getStanza(received[0])->getPayload<Swift::RosterPayload>();
		CPPUNIT_ASSERT(payload1);
		CPPUNIT_ASSERT_EQUAL(1, (int) payload1->getItems().size());
		Swift::RosterItemPayload item = payload1->getItems()[0];
		CPPUNIT_ASSERT_EQUAL(std::string("buddy1"), Buddy::JIDToLegacyName(item.getJID(), user));
		CPPUNIT_ASSERT_EQUAL(Swift::RosterItemPayload::Remove, item.getSubscription());
	}

	void subscribeExistingBuddy() {
		add2Buddies();
		received.clear();

		Swift::Presence::ref response = Swift::Presence::create();
		response->setTo("buddy1@localhost");
		response->setFrom("user@localhost/resource");
		response->setType(Swift::Presence::Subscribe);

		injectPresence(response);
		loop->processEvents();

		CPPUNIT_ASSERT_EQUAL(1, (int) received.size());
		CPPUNIT_ASSERT(dynamic_cast<Swift::Presence *>(getStanza(received[0])));
		CPPUNIT_ASSERT_EQUAL(Swift::Presence::Subscribed, dynamic_cast<Swift::Presence *>(getStanza(received[0]))->getType());
		CPPUNIT_ASSERT_EQUAL(std::string("BuddY1"), m_buddy);
	}

	void subscribeNewBuddy() {
		User *user = userManager->getUser("user@localhost");
		Swift::Presence::ref response = Swift::Presence::create();
		response->setTo("buddy1@localhost");
		response->setFrom("user@localhost/resource");
		response->setType(Swift::Presence::Subscribe);

		injectPresence(response);
		loop->processEvents();

		CPPUNIT_ASSERT_EQUAL(2, (int) received.size());

		Swift::RosterPayload::ref payload1 = getStanza(received[0])->getPayload<Swift::RosterPayload>();
		CPPUNIT_ASSERT_EQUAL(1, (int) payload1->getItems().size());
		Swift::RosterItemPayload item = payload1->getItems()[0];
		CPPUNIT_ASSERT_EQUAL(std::string("buddy1"), Buddy::JIDToLegacyName(item.getJID(), user));

		CPPUNIT_ASSERT(dynamic_cast<Swift::Presence *>(getStanza(received[1])));
		CPPUNIT_ASSERT_EQUAL(Swift::Presence::Subscribed, dynamic_cast<Swift::Presence *>(getStanza(received[1]))->getType());

		CPPUNIT_ASSERT_EQUAL(std::string("buddy1"), m_buddy);
	}

	void unsubscribeExistingBuddy() {
		User *user = userManager->getUser("user@localhost");
		add2Buddies();
		received.clear();

		Swift::Presence::ref response = Swift::Presence::create();
		response->setTo("buddy1@localhost");
		response->setFrom("user@localhost/resource");
		response->setType(Swift::Presence::Unsubscribe);

		injectPresence(response);
		loop->processEvents();

		CPPUNIT_ASSERT_EQUAL(2, (int) received.size());

		Swift::RosterPayload::ref payload1 = getStanza(received[0])->getPayload<Swift::RosterPayload>();
		CPPUNIT_ASSERT_EQUAL(1, (int) payload1->getItems().size());
		Swift::RosterItemPayload item = payload1->getItems()[0];
		CPPUNIT_ASSERT_EQUAL(std::string("buddy1"), Buddy::JIDToLegacyName(item.getJID(), user));


		CPPUNIT_ASSERT(dynamic_cast<Swift::Presence *>(getStanza(received[1])));
		CPPUNIT_ASSERT_EQUAL(Swift::Presence::Unsubscribed, dynamic_cast<Swift::Presence *>(getStanza(received[1]))->getType());

		CPPUNIT_ASSERT_EQUAL(std::string("BuddY1"), m_buddy);
	}

	void unsubscribeNewBuddy() {
		Swift::Presence::ref response = Swift::Presence::create();
		response->setTo("buddy1@localhost");
		response->setFrom("user@localhost/resource");
		response->setType(Swift::Presence::Unsubscribe);

		injectPresence(response);
		loop->processEvents();

		CPPUNIT_ASSERT_EQUAL(1, (int) received.size());

		CPPUNIT_ASSERT(dynamic_cast<Swift::Presence *>(getStanza(received[0])));
		CPPUNIT_ASSERT_EQUAL(Swift::Presence::Unsubscribed, dynamic_cast<Swift::Presence *>(getStanza(received[0]))->getType());

		CPPUNIT_ASSERT_EQUAL(std::string("buddy1"), m_buddy);
	}

};

CPPUNIT_TEST_SUITE_REGISTRATION (RosterManagerTest);