Files @ 7ba8909d719f
Branch filter:

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

Jan Kaluza
Use value_or instead of get_value_or
fe47e0979be9
fe47e0979be9
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
90ef6e3128f2
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
389f066d9e2d
69023fc025f5
741cffa44f6f
a82c4403b7e4
974bf2de0a2c
a28e64cfe426
974bf2de0a2c
0b0e020cdf91
0b0e020cdf91
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
389f066d9e2d
389f066d9e2d
389f066d9e2d
389f066d9e2d
389f066d9e2d
389f066d9e2d
389f066d9e2d
389f066d9e2d
389f066d9e2d
389f066d9e2d
389f066d9e2d
389f066d9e2d
389f066d9e2d
389f066d9e2d
389f066d9e2d
389f066d9e2d
69023fc025f5
69023fc025f5
69023fc025f5
69023fc025f5
69023fc025f5
69023fc025f5
69023fc025f5
69023fc025f5
69023fc025f5
69023fc025f5
69023fc025f5
69023fc025f5
69023fc025f5
69023fc025f5
69023fc025f5
69023fc025f5
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
741cffa44f6f
a28e64cfe426
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
741cffa44f6f
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
a28e64cfe426
974bf2de0a2c
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
90ef6e3128f2
20d8dd690e21
90ef6e3128f2
90ef6e3128f2
90ef6e3128f2
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
a28e64cfe426
1ebd04184881
1ebd04184881
1ebd04184881
1ebd04184881
1ebd04184881
1ebd04184881
1ebd04184881
1ebd04184881
1ebd04184881
1ebd04184881
1ebd04184881
1ebd04184881
1ebd04184881
1ebd04184881
1ebd04184881
1ebd04184881
1ebd04184881
1ebd04184881
1ebd04184881
1ebd04184881
1ebd04184881
1ebd04184881
1ebd04184881
1ebd04184881
90ef6e3128f2
20d8dd690e21
90ef6e3128f2
90ef6e3128f2
90ef6e3128f2
974bf2de0a2c
974bf2de0a2c
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
a82c4403b7e4
974bf2de0a2c
a28e64cfe426
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
a28e64cfe426
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
974bf2de0a2c
741cffa44f6f
741cffa44f6f
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
90ef6e3128f2
20d8dd690e21
90ef6e3128f2
90ef6e3128f2
90ef6e3128f2
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
0b0e020cdf91
90ef6e3128f2
20d8dd690e21
90ef6e3128f2
90ef6e3128f2
90ef6e3128f2
0b0e020cdf91
0b0e020cdf91
741cffa44f6f
741cffa44f6f
741cffa44f6f
#include "settingsadhoccommand.h"
#include "adhocmanager.h"
#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 "Swiften/Version.h"
#include "basictest.h"

using namespace Transport;

class SettingsAdHocCommandTest : public CPPUNIT_NS :: TestFixture, public BasicTest {
	CPPUNIT_TEST_SUITE(SettingsAdHocCommandTest);
	CPPUNIT_TEST(getItems);
	CPPUNIT_TEST(getInfo);
	CPPUNIT_TEST(getInfoBare);
	CPPUNIT_TEST(execute);
	CPPUNIT_TEST(executeTwoCommands);
	CPPUNIT_TEST(executeBadSessionID);
	CPPUNIT_TEST(executeNotRegistered);
	CPPUNIT_TEST(cancel);
	CPPUNIT_TEST(propagateUserSetting);
	CPPUNIT_TEST(defaultAccordingToConfig);
	CPPUNIT_TEST_SUITE_END();

	public:
		void setUp (void) {
			setMeUp();
			received.clear();
		}

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

		void getItems() {
			boost::shared_ptr<Swift::DiscoItems> payload(new Swift::DiscoItems());
			payload->setNode("http://jabber.org/protocol/commands");
			boost::shared_ptr<Swift::IQ> iq = Swift::IQ::createRequest(Swift::IQ::Get, Swift::JID("localhost"), "id", payload);
			iq->setFrom("user@localhost");
			injectIQ(iq);
			loop->processEvents();

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

			CPPUNIT_ASSERT(dynamic_cast<Swift::IQ *>(getStanza(received[0])));
			CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast<Swift::IQ *>(getStanza(received[0]))->getType());
			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::DiscoItems>());
			CPPUNIT_ASSERT_EQUAL(std::string("settings"), getStanza(received[0])->getPayload<Swift::DiscoItems>()->getItems()[0].getNode());
		}

		void getInfo() {
			boost::shared_ptr<Swift::DiscoInfo> payload(new Swift::DiscoInfo());
			payload->setNode("settings");
			boost::shared_ptr<Swift::IQ> iq = Swift::IQ::createRequest(Swift::IQ::Get, Swift::JID("localhost"), "id", payload);
			iq->setFrom("user@localhost");
			injectIQ(iq);
			loop->processEvents();

			CPPUNIT_ASSERT_EQUAL(1, (int) received.size());
			CPPUNIT_ASSERT(dynamic_cast<Swift::IQ *>(getStanza(received[0])));
			CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast<Swift::IQ *>(getStanza(received[0]))->getType());
			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::DiscoInfo>());
			CPPUNIT_ASSERT_EQUAL(std::string("automation"), getStanza(received[0])->getPayload<Swift::DiscoInfo>()->getIdentities()[0].getCategory());
			CPPUNIT_ASSERT_EQUAL(std::string("command-node"), getStanza(received[0])->getPayload<Swift::DiscoInfo>()->getIdentities()[0].getType());
		}

		void getInfoBare() {
			boost::shared_ptr<Swift::DiscoInfo> payload(new Swift::DiscoInfo());
			payload->setNode("http://jabber.org/protocol/commands");
			boost::shared_ptr<Swift::IQ> iq = Swift::IQ::createRequest(Swift::IQ::Get, Swift::JID("localhost"), "id", payload);
			iq->setFrom("user@localhost");
			injectIQ(iq);
			loop->processEvents();

			CPPUNIT_ASSERT_EQUAL(1, (int) received.size());
			CPPUNIT_ASSERT(dynamic_cast<Swift::IQ *>(getStanza(received[0])));
			CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast<Swift::IQ *>(getStanza(received[0]))->getType());
			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::DiscoInfo>());
			CPPUNIT_ASSERT_EQUAL(std::string("automation"), getStanza(received[0])->getPayload<Swift::DiscoInfo>()->getIdentities()[0].getCategory());
			CPPUNIT_ASSERT_EQUAL(std::string("command-list"), getStanza(received[0])->getPayload<Swift::DiscoInfo>()->getIdentities()[0].getType());
		}

		void executeNotRegistered() {
			boost::shared_ptr<Swift::Command> payload(new Swift::Command("settings"));
			boost::shared_ptr<Swift::IQ> iq = Swift::IQ::createRequest(Swift::IQ::Set, Swift::JID("localhost"), "id", payload);
			iq->setFrom("user@localhost");
			injectIQ(iq);
			loop->processEvents();

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

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

			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Command>());
			CPPUNIT_ASSERT_EQUAL(std::string("settings"), getStanza(received[0])->getPayload<Swift::Command>()->getNode());
			CPPUNIT_ASSERT_EQUAL(Swift::Command::Completed, getStanza(received[0])->getPayload<Swift::Command>()->getStatus());
		}

		void execute() {
			addUser();
			boost::shared_ptr<Swift::Command> payload(new Swift::Command("settings"));
			boost::shared_ptr<Swift::IQ> iq = Swift::IQ::createRequest(Swift::IQ::Set, Swift::JID("localhost"), "id", payload);
			iq->setFrom("user@localhost");
			injectIQ(iq);
			loop->processEvents();

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

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

			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Command>());
			CPPUNIT_ASSERT_EQUAL(std::string("settings"), getStanza(received[0])->getPayload<Swift::Command>()->getNode());
			CPPUNIT_ASSERT_EQUAL(Swift::Command::Executing, getStanza(received[0])->getPayload<Swift::Command>()->getStatus());

			// form element
			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Command>()->getForm());
			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Command>()->getForm()->getField("enable_transport"));

			// set enabled_transport = 0
			Swift::FormField::ref f = getStanza(received[0])->getPayload<Swift:: Command>()->getForm()->getField("enable_transport");
#if (SWIFTEN_VERSION >= 0x030000)
			f->setBoolValue(false);
#else
			boost::dynamic_pointer_cast<Swift::BooleanFormField>(f)->setValue(false);
#endif

			std::string sessionId = getStanza(received[0])->getPayload<Swift::Command>()->getSessionID();

			{
			std::string value = "0";
			int type;
			storage->getUserSetting(1, "enable_transport", type, value);
			CPPUNIT_ASSERT_EQUAL(std::string("1"), value);
			}

			// finish the command
			payload = boost::shared_ptr<Swift::Command>(new Swift::Command("settings"));
			payload->setSessionID(sessionId);
			payload->setForm(getStanza(received[0])->getPayload<Swift::Command>()->getForm());
			iq = Swift::IQ::createRequest(Swift::IQ::Set, Swift::JID("localhost"), "id", payload);
			iq->setFrom("user@localhost");
			received.clear();
			injectIQ(iq);
			loop->processEvents();

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

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

			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Command>());
			CPPUNIT_ASSERT_EQUAL(std::string("settings"), getStanza(received[0])->getPayload<Swift::Command>()->getNode());
			CPPUNIT_ASSERT_EQUAL(Swift::Command::Completed, getStanza(received[0])->getPayload<Swift::Command>()->getStatus());

			{
			std::string value = "1";
			int type;
			storage->getUserSetting(1, "enable_transport", type, value);
			CPPUNIT_ASSERT_EQUAL(std::string("0"), value);
			}

			received.clear();

			payload = boost::shared_ptr<Swift::Command>(new Swift::Command("settings"));
			iq = Swift::IQ::createRequest(Swift::IQ::Set, Swift::JID("localhost"), "id", payload);
			iq->setFrom("user@localhost");
			injectIQ(iq);
			loop->processEvents();

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

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

			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Command>());
			CPPUNIT_ASSERT_EQUAL(std::string("settings"), getStanza(received[0])->getPayload<Swift::Command>()->getNode());
			CPPUNIT_ASSERT_EQUAL(Swift::Command::Executing, getStanza(received[0])->getPayload<Swift::Command>()->getStatus());

			// form element
			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Command>()->getForm());
			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Command>()->getForm()->getField("enable_transport"));

			// set enabled_transport = 0
			f = getStanza(received[0])->getPayload<Swift:: Command>()->getForm()->getField("enable_transport");
#if (SWIFTEN_VERSION >= 0x030000)
			CPPUNIT_ASSERT_EQUAL(false, f->getBoolValue());
#else
			CPPUNIT_ASSERT_EQUAL(false, boost::dynamic_pointer_cast<Swift::BooleanFormField>(f)->getValue());
#endif
		}

		void executeTwoCommands() {
			addUser();
			boost::shared_ptr<Swift::Command> payload(new Swift::Command("settings"));
			boost::shared_ptr<Swift::IQ> iq = Swift::IQ::createRequest(Swift::IQ::Set, Swift::JID("localhost"), "id", payload);
			iq->setFrom("user@localhost");
			injectIQ(iq);
			loop->processEvents();

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

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

			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Command>());
			CPPUNIT_ASSERT_EQUAL(std::string("settings"), getStanza(received[0])->getPayload<Swift::Command>()->getNode());
			CPPUNIT_ASSERT_EQUAL(Swift::Command::Executing, getStanza(received[0])->getPayload<Swift::Command>()->getStatus());

			// form element
			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Command>()->getForm());
			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Command>()->getForm()->getField("enable_transport"));

			received.clear();
			payload = boost::shared_ptr<Swift::Command>(new Swift::Command("settings"));
			iq = Swift::IQ::createRequest(Swift::IQ::Set, Swift::JID("localhost"), "id", payload);
			iq->setFrom("user@localhost");
			injectIQ(iq);
			loop->processEvents();

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

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

			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Command>());
			CPPUNIT_ASSERT_EQUAL(std::string("settings"), getStanza(received[0])->getPayload<Swift::Command>()->getNode());
			CPPUNIT_ASSERT_EQUAL(Swift::Command::Executing, getStanza(received[0])->getPayload<Swift::Command>()->getStatus());

			// form element
			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Command>()->getForm());
			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Command>()->getForm()->getField("enable_transport"));
		}

		void executeBadSessionID() {
			addUser();
			boost::shared_ptr<Swift::Command> payload(new Swift::Command("settings"));
			boost::shared_ptr<Swift::IQ> iq = Swift::IQ::createRequest(Swift::IQ::Set, Swift::JID("localhost"), "id", payload);
			iq->setFrom("user@localhost");
			injectIQ(iq);
			loop->processEvents();

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

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

			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Command>());
			CPPUNIT_ASSERT_EQUAL(std::string("settings"), getStanza(received[0])->getPayload<Swift::Command>()->getNode());
			CPPUNIT_ASSERT_EQUAL(Swift::Command::Executing, getStanza(received[0])->getPayload<Swift::Command>()->getStatus());

			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Command>()->getForm());

			std::string sessionId = "somethingwrong";

			// finish the command
			payload = boost::shared_ptr<Swift::Command>(new Swift::Command("settings"));
			payload->setSessionID(sessionId);
			payload->setForm(getStanza(received[0])->getPayload<Swift::Command>()->getForm());
			iq = Swift::IQ::createRequest(Swift::IQ::Set, Swift::JID("localhost"), "id", payload);
			iq->setFrom("user@localhost");
			received.clear();
			injectIQ(iq);
			loop->processEvents();

			CPPUNIT_ASSERT_EQUAL(1, (int) received.size());
			CPPUNIT_ASSERT(dynamic_cast<Swift::IQ *>(getStanza(received[0])));
			CPPUNIT_ASSERT_EQUAL(Swift::IQ::Error, dynamic_cast<Swift::IQ *>(getStanza(received[0]))->getType());
		}

		void cancel() {
			addUser();
			boost::shared_ptr<Swift::Command> payload(new Swift::Command("settings"));
			boost::shared_ptr<Swift::IQ> iq = Swift::IQ::createRequest(Swift::IQ::Set, Swift::JID("localhost"), "id", payload);
			iq->setFrom("user@localhost");
			injectIQ(iq);
			loop->processEvents();

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

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

			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Command>());
			CPPUNIT_ASSERT_EQUAL(std::string("settings"), getStanza(received[0])->getPayload<Swift::Command>()->getNode());
			CPPUNIT_ASSERT_EQUAL(Swift::Command::Executing, getStanza(received[0])->getPayload<Swift::Command>()->getStatus());

			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Command>()->getForm());

			std::string sessionId = getStanza(received[0])->getPayload<Swift::Command>()->getSessionID();

			// cancel the command
			payload = boost::shared_ptr<Swift::Command>(new Swift::Command("settings"));
			payload->setSessionID(sessionId);
			payload->setAction(Swift::Command::Cancel);
			iq = Swift::IQ::createRequest(Swift::IQ::Set, Swift::JID("localhost"), "id", payload);
			iq->setFrom("user@localhost");
			received.clear();
			injectIQ(iq);
			loop->processEvents();

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

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

			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Command>());
			CPPUNIT_ASSERT_EQUAL(std::string("settings"), getStanza(received[0])->getPayload<Swift::Command>()->getNode());
			CPPUNIT_ASSERT_EQUAL(Swift::Command::Canceled, getStanza(received[0])->getPayload<Swift::Command>()->getStatus());
		}

		void propagateUserSetting() {
			connectUser();
			User *user = userManager->getUser("user@localhost");
			CPPUNIT_ASSERT_EQUAL(std::string("0"), user->getUserSetting("send_headlines"));

			boost::shared_ptr<Swift::Command> payload(new Swift::Command("settings"));
			boost::shared_ptr<Swift::IQ> iq = Swift::IQ::createRequest(Swift::IQ::Set, Swift::JID("localhost"), "id", payload);
			iq->setFrom("user@localhost");
			injectIQ(iq);
			loop->processEvents();

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

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

			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Command>());
			CPPUNIT_ASSERT_EQUAL(std::string("settings"), getStanza(received[0])->getPayload<Swift::Command>()->getNode());
			CPPUNIT_ASSERT_EQUAL(Swift::Command::Executing, getStanza(received[0])->getPayload<Swift::Command>()->getStatus());

			// form element
			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Command>()->getForm());
			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Command>()->getForm()->getField("send_headlines"));

			// set enabled_transport = 0
			Swift::FormField::ref f = getStanza(received[0])->getPayload<Swift:: Command>()->getForm()->getField("send_headlines");
#if (SWIFTEN_VERSION >= 0x030000)
			f->setBoolValue(true);
#else
			boost::dynamic_pointer_cast<Swift::BooleanFormField>(f)->setValue(true);
#endif

			std::string sessionId = getStanza(received[0])->getPayload<Swift::Command>()->getSessionID();

			// finish the command
			payload = boost::shared_ptr<Swift::Command>(new Swift::Command("settings"));
			payload->setSessionID(sessionId);
			payload->setForm(getStanza(received[0])->getPayload<Swift::Command>()->getForm());
			iq = Swift::IQ::createRequest(Swift::IQ::Set, Swift::JID("localhost"), "id", payload);
			iq->setFrom("user@localhost");
			received.clear();
			injectIQ(iq);
			loop->processEvents();

			CPPUNIT_ASSERT_EQUAL(std::string("1"), user->getUserSetting("send_headlines"));
		}

		void defaultAccordingToConfig() {
			std::istringstream ifs("service.server_mode = 1\nservice.jid_escaping=0\nservice.jid=localhost\nsettings.send_headlines=1\n");
			cfg->load(ifs);
			connectUser();
			User *user = userManager->getUser("user@localhost");
			CPPUNIT_ASSERT_EQUAL(std::string("1"), user->getUserSetting("send_headlines"));
			boost::shared_ptr<Swift::Command> payload(new Swift::Command("settings"));
			boost::shared_ptr<Swift::IQ> iq = Swift::IQ::createRequest(Swift::IQ::Set, Swift::JID("localhost"), "id", payload);
			iq->setFrom("user@localhost");
			injectIQ(iq);
			loop->processEvents();

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

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

			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Command>());
			CPPUNIT_ASSERT_EQUAL(std::string("settings"), getStanza(received[0])->getPayload<Swift::Command>()->getNode());
			CPPUNIT_ASSERT_EQUAL(Swift::Command::Executing, getStanza(received[0])->getPayload<Swift::Command>()->getStatus());

			// form element
			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Command>()->getForm());
			CPPUNIT_ASSERT(getStanza(received[0])->getPayload<Swift::Command>()->getForm()->getField("send_headlines"));
			Swift::FormField::ref f = getStanza(received[0])->getPayload<Swift:: Command>()->getForm()->getField("send_headlines");
#if (SWIFTEN_VERSION >= 0x030000)
			CPPUNIT_ASSERT_EQUAL(true, f->getBoolValue());
#else
			CPPUNIT_ASSERT_EQUAL(true, boost::dynamic_pointer_cast<Swift::BooleanFormField>(f)->getValue());
#endif
		}

};

CPPUNIT_TEST_SUITE_REGISTRATION (SettingsAdHocCommandTest);