Files @ 78e71f9345c7
Branch filter:

Location: libtransport.git/src/tests/usermanager.cpp - annotation

Jan Kaluza
Cleanup the includes, rename source code files to match the class name exactly
225a246407f7
225a246407f7
225a246407f7
225a246407f7
225a246407f7
225a246407f7
225a246407f7
225a246407f7
225a246407f7
225a246407f7
848f672b07e5
225a246407f7
225a246407f7
225a246407f7
848f672b07e5
225a246407f7
225a246407f7
2f542b507719
a28e64cfe426
cb6af593b6a6
cb6af593b6a6
e0f560a64814
25642926dd9d
25642926dd9d
7e9ea5150d9c
225a246407f7
225a246407f7
225a246407f7
e1c00a8a105d
e1c00a8a105d
225a246407f7
848f672b07e5
225a246407f7
225a246407f7
225a246407f7
848f672b07e5
225a246407f7
225a246407f7
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
cb6af593b6a6
cb6af593b6a6
cb6af593b6a6
cb6af593b6a6
cb6af593b6a6
cb6af593b6a6
cb6af593b6a6
cb6af593b6a6
cb6af593b6a6
cb6af593b6a6
cb6af593b6a6
cb6af593b6a6
cb6af593b6a6
cb6af593b6a6
cb6af593b6a6
cb6af593b6a6
cb6af593b6a6
cb6af593b6a6
25642926dd9d
e0f560a64814
e0f560a64814
e0f560a64814
e0f560a64814
e0f560a64814
e0f560a64814
e0f560a64814
e0f560a64814
e0f560a64814
e0f560a64814
e0f560a64814
e0f560a64814
e0f560a64814
e0f560a64814
e0f560a64814
e0f560a64814
e0f560a64814
e0f560a64814
e0f560a64814
e0f560a64814
25642926dd9d
3aff761db678
3aff761db678
3aff761db678
3aff761db678
3aff761db678
25642926dd9d
25642926dd9d
25642926dd9d
25642926dd9d
fe47e0979be9
25642926dd9d
25642926dd9d
dc1cc4170e4a
25642926dd9d
9b03ad3f309f
9b03ad3f309f
9b03ad3f309f
9b03ad3f309f
4055180802ab
4055180802ab
4055180802ab
3aff761db678
3aff761db678
3aff761db678
3aff761db678
3aff761db678
3aff761db678
3aff761db678
fe47e0979be9
3aff761db678
3aff761db678
3aff761db678
3aff761db678
3aff761db678
3aff761db678
3aff761db678
3aff761db678
3aff761db678
3aff761db678
3aff761db678
3aff761db678
fe47e0979be9
3aff761db678
3aff761db678
f16af993ce28
f16af993ce28
f16af993ce28
f16af993ce28
f16af993ce28
f16af993ce28
f16af993ce28
fe47e0979be9
f16af993ce28
f16af993ce28
3aff761db678
3aff761db678
3aff761db678
4055180802ab
4055180802ab
3aff761db678
3aff761db678
3aff761db678
3aff761db678
3aff761db678
3aff761db678
fe47e0979be9
3aff761db678
3aff761db678
3aff761db678
25642926dd9d
225a246407f7
e1c00a8a105d
e1c00a8a105d
e1c00a8a105d
e1c00a8a105d
2f542b507719
2f542b507719
2f542b507719
2f542b507719
2f542b507719
e1c00a8a105d
e1c00a8a105d
e1c00a8a105d
2f542b507719
2f542b507719
2f542b507719
2f542b507719
2f542b507719
2f542b507719
2f542b507719
2f542b507719
2f542b507719
e1c00a8a105d
e1c00a8a105d
e1c00a8a105d
e1c00a8a105d
e1c00a8a105d
e1c00a8a105d
e1c00a8a105d
e1c00a8a105d
e1c00a8a105d
e1c00a8a105d
e1c00a8a105d
e1c00a8a105d
e1c00a8a105d
e1c00a8a105d
e1c00a8a105d
e1c00a8a105d
2f542b507719
2f542b507719
7e9ea5150d9c
7e9ea5150d9c
7e9ea5150d9c
7e9ea5150d9c
7e9ea5150d9c
7e9ea5150d9c
7e9ea5150d9c
7e9ea5150d9c
7e9ea5150d9c
7e9ea5150d9c
7e9ea5150d9c
7e9ea5150d9c
7e9ea5150d9c
7e9ea5150d9c
7e9ea5150d9c
7e9ea5150d9c
7e9ea5150d9c
7e9ea5150d9c
225a246407f7
225a246407f7
225a246407f7
#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 UserManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTest {
	CPPUNIT_TEST_SUITE(UserManagerTest);
	CPPUNIT_TEST(connectUser);
	CPPUNIT_TEST(connectTwoResources);
	CPPUNIT_TEST(connectUserTransportDisabled);
	CPPUNIT_TEST(connectUserRegistrationNeeded);
	CPPUNIT_TEST(connectUserRegistrationNeededRegistered);
	CPPUNIT_TEST(connectUserVipOnlyNonVip);
	CPPUNIT_TEST(handleProbePresence);
	CPPUNIT_TEST(disconnectUser);
	CPPUNIT_TEST(disconnectUserBouncer);
	CPPUNIT_TEST_SUITE_END();

	public:
		Swift::Presence::ref changedPresence;

		void setUp (void) {
			setMeUp();
		}

		void tearDown (void) {
			tearMeDown();
		}

	void connectUserTransportDisabled() {
		addUser();
		storage->updateUserSetting(1, "enable_transport", "0");
		CPPUNIT_ASSERT_EQUAL(0, userManager->getUserCount());
		userRegistry->isValidUserPassword(Swift::JID("user@localhost/resource"), serverFromClientSession.get(), Swift::createSafeByteArray("password"));
		loop->processEvents();
		CPPUNIT_ASSERT_EQUAL(0, userManager->getUserCount());

		User *user = userManager->getUser("user@localhost");
		CPPUNIT_ASSERT(!user);
	}

	void connectUserRegistrationNeeded() {
		cfg->updateBackendConfig("[registration]\nneedRegistration=1\n");
		CPPUNIT_ASSERT_EQUAL(0, userManager->getUserCount());
		userRegistry->isValidUserPassword(Swift::JID("user@localhost/resource"), serverFromClientSession.get(), Swift::createSafeByteArray("password"));
		loop->processEvents();
		CPPUNIT_ASSERT_EQUAL(0, userManager->getUserCount());
		CPPUNIT_ASSERT(streamEnded);
	}

	void connectUserRegistrationNeededRegistered() {
		addUser();
		cfg->updateBackendConfig("[registration]\nneedRegistration=1\n");
		CPPUNIT_ASSERT_EQUAL(0, userManager->getUserCount());
		userRegistry->isValidUserPassword(Swift::JID("user@localhost/resource"), serverFromClientSession.get(), Swift::createSafeByteArray("password"));
		loop->processEvents();
		CPPUNIT_ASSERT_EQUAL(1, userManager->getUserCount());
		CPPUNIT_ASSERT(!streamEnded);
	}

	void connectUserVipOnlyNonVip() {
		addUser();
		std::istringstream ifs("service.server_mode = 1\nservice.jid_escaping=0\nservice.jid=localhost\nservice.vip_only=1\nservice.vip_message=Ahoj\n");
		cfg->load(ifs);
		CPPUNIT_ASSERT_EQUAL(0, userManager->getUserCount());
		userRegistry->isValidUserPassword(Swift::JID("user@localhost/resource"), serverFromClientSession.get(), Swift::createSafeByteArray("password"));
		loop->processEvents();

		CPPUNIT_ASSERT_EQUAL(3, (int) received.size());
		CPPUNIT_ASSERT(dynamic_cast<Swift::Message *>(getStanza(received[1])));
		CPPUNIT_ASSERT_EQUAL(std::string("Ahoj"), dynamic_cast<Swift::Message *>(getStanza(received[1]))->getBody());
		CPPUNIT_ASSERT_EQUAL(std::string("user@localhost/resource"), dynamic_cast<Swift::Message *>(getStanza(received[1]))->getTo().toString());
		CPPUNIT_ASSERT_EQUAL(std::string("localhost"), dynamic_cast<Swift::Message *>(getStanza(received[1]))->getFrom().toString());

		CPPUNIT_ASSERT_EQUAL(0, userManager->getUserCount());
		CPPUNIT_ASSERT(streamEnded);
		std::istringstream ifs2("service.server_mode = 1\nservice.jid_escaping=1\nservice.jid=localhost\nservice.more_resources=1\n");
		cfg->load(ifs2);
	}

	void handleProbePresence() {
		UserInfo info;
		info.id = 1;
		info.jid = "user@localhost";
		storage->setUser(info);

		Swift::Presence::ref response = Swift::Presence::create();
		response->setTo("localhost");
		response->setFrom("user@localhost/resource");
		response->setType(Swift::Presence::Probe);
		dynamic_cast<Swift::ServerStanzaChannel *>(static_cast<XMPPFrontend *>(component->getFrontend())->getStanzaChannel())->onPresenceReceived(response);
		loop->processEvents();

		CPPUNIT_ASSERT_EQUAL(3, (int) received.size());
		CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::DiscoInfo>());

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

		presence = dynamic_cast<Swift::Presence *>(getStanza(received[2]));
		CPPUNIT_ASSERT(presence);
		CPPUNIT_ASSERT_EQUAL(Swift::Presence::Probe, presence->getType());

		received.clear();
		response = Swift::Presence::create();
		response->setTo("localhost");
		response->setFrom("user@localhost");
		response->setType(Swift::Presence::Unsubscribed);
		dynamic_cast<Swift::ServerStanzaChannel *>(static_cast<XMPPFrontend *>(component->getFrontend())->getStanzaChannel())->onPresenceReceived(response);
		loop->processEvents();

		CPPUNIT_ASSERT_EQUAL(2, (int) received.size());
		presence = dynamic_cast<Swift::Presence *>(getStanza(received[1]));
		CPPUNIT_ASSERT(presence);
		CPPUNIT_ASSERT_EQUAL(Swift::Presence::Subscribe, presence->getType());

		received.clear();
		response = Swift::Presence::create();
		response->setTo("localhost");
		response->setFrom("user@localhost");
		response->setType(Swift::Presence::Error);
		dynamic_cast<Swift::ServerStanzaChannel *>(static_cast<XMPPFrontend *>(component->getFrontend())->getStanzaChannel())->onPresenceReceived(response);
		loop->processEvents();

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

		response = Swift::Presence::create();
		response->setTo("localhost");
		response->setFrom("user@localhost");
		response->setType(Swift::Presence::Error);
		response->addPayload(boost::shared_ptr<Swift::ErrorPayload>(new Swift::ErrorPayload(Swift::ErrorPayload::SubscriptionRequired)));
		dynamic_cast<Swift::ServerStanzaChannel *>(static_cast<XMPPFrontend *>(component->getFrontend())->getStanzaChannel())->onPresenceReceived(response);
		loop->processEvents();

		CPPUNIT_ASSERT_EQUAL(1, (int) received.size());
		presence = dynamic_cast<Swift::Presence *>(getStanza(received[0]));
		CPPUNIT_ASSERT(presence);
		CPPUNIT_ASSERT_EQUAL(Swift::Presence::Subscribe, presence->getType());

		storage->removeUser(1);
		received.clear();
		response = Swift::Presence::create();
		response->setTo("localhost");
		response->setFrom("user@localhost");
		response->setType(Swift::Presence::Unsubscribed);
		dynamic_cast<Swift::ServerStanzaChannel *>(static_cast<XMPPFrontend *>(component->getFrontend())->getStanzaChannel())->onPresenceReceived(response);
		loop->processEvents();

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

	void handleUserPresenceChanged(User *user, Swift::Presence::ref presence) {
		changedPresence = presence;
	}

	void connectTwoResources() {
		connectUser();
		add2Buddies();
		connectSecondResource();

		User *user = userManager->getUser("user@localhost");
		user->onPresenceChanged.connect(boost::bind(&UserManagerTest::handleUserPresenceChanged, this, user, _1));

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

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

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

		CPPUNIT_ASSERT_EQUAL(Swift::Presence::Available, changedPresence->getType());

		Swift::Presence::ref response2 = Swift::Presence::create();
		response2->setTo("localhost");
		response2->setFrom("user@localhost/resource2");
		response2->setType(Swift::Presence::Unavailable);
		injectPresence(response2);

		CPPUNIT_ASSERT_EQUAL(Swift::Presence::Unavailable, changedPresence->getType());
	}

	void disconnectUserBouncer() {
		connectUser();
		User *user = userManager->getUser("user@localhost");
		user->addUserSetting("stay_connected", "1");
		received.clear();
		userManager->disconnectUser("user@localhost");
		dynamic_cast<Swift::DummyTimerFactory *>(factories->getTimerFactory())->setTime(10);
		loop->processEvents();

		CPPUNIT_ASSERT_EQUAL(1, userManager->getUserCount());
		CPPUNIT_ASSERT_EQUAL(0, (int) received.size());
		CPPUNIT_ASSERT(userManager->getUser("user@localhost"));

		userManager->removeAllUsers();
		loop->processEvents();
		CPPUNIT_ASSERT_EQUAL(0, userManager->getUserCount());
	}

};

CPPUNIT_TEST_SUITE_REGISTRATION (UserManagerTest);