diff --git a/tests/libtransport/settingsadhoccommand.cpp b/tests/libtransport/settingsadhoccommand.cpp new file mode 100644 index 0000000000000000000000000000000000000000..3ac54dd9579be64e08f90fed8ea92c825d72052c --- /dev/null +++ b/tests/libtransport/settingsadhoccommand.cpp @@ -0,0 +1,402 @@ +#include "settingsadhoccommand.h" +#include "adhocmanager.h" +#include +#include +#include +#include +#include +#include +#include +#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 payload(new Swift::DiscoItems()); + payload->setNode("http://jabber.org/protocol/commands"); + boost::shared_ptr 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(getStanza(received[0]))); + CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast(getStanza(received[0]))->getType()); + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); + CPPUNIT_ASSERT_EQUAL(std::string("settings"), getStanza(received[0])->getPayload()->getItems()[0].getNode()); + } + + void getInfo() { + boost::shared_ptr payload(new Swift::DiscoInfo()); + payload->setNode("settings"); + boost::shared_ptr 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(getStanza(received[0]))); + CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast(getStanza(received[0]))->getType()); + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); + CPPUNIT_ASSERT_EQUAL(std::string("automation"), getStanza(received[0])->getPayload()->getIdentities()[0].getCategory()); + CPPUNIT_ASSERT_EQUAL(std::string("command-node"), getStanza(received[0])->getPayload()->getIdentities()[0].getType()); + } + + void getInfoBare() { + boost::shared_ptr payload(new Swift::DiscoInfo()); + payload->setNode("http://jabber.org/protocol/commands"); + boost::shared_ptr 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(getStanza(received[0]))); + CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast(getStanza(received[0]))->getType()); + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); + CPPUNIT_ASSERT_EQUAL(std::string("automation"), getStanza(received[0])->getPayload()->getIdentities()[0].getCategory()); + CPPUNIT_ASSERT_EQUAL(std::string("command-list"), getStanza(received[0])->getPayload()->getIdentities()[0].getType()); + } + + void executeNotRegistered() { + boost::shared_ptr payload(new Swift::Command("settings")); + boost::shared_ptr 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(getStanza(received[0]))); + CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast(getStanza(received[0]))->getType()); + + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); + CPPUNIT_ASSERT_EQUAL(std::string("settings"), getStanza(received[0])->getPayload()->getNode()); + CPPUNIT_ASSERT_EQUAL(Swift::Command::Completed, getStanza(received[0])->getPayload()->getStatus()); + } + + void execute() { + addUser(); + boost::shared_ptr payload(new Swift::Command("settings")); + boost::shared_ptr 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(getStanza(received[0]))); + CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast(getStanza(received[0]))->getType()); + + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); + CPPUNIT_ASSERT_EQUAL(std::string("settings"), getStanza(received[0])->getPayload()->getNode()); + CPPUNIT_ASSERT_EQUAL(Swift::Command::Executing, getStanza(received[0])->getPayload()->getStatus()); + + // form element + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()->getForm()); + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()->getForm()->getField("enable_transport")); + + // set enabled_transport = 0 + Swift::FormField::ref f = getStanza(received[0])->getPayload()->getForm()->getField("enable_transport"); +#if (SWIFTEN_VERSION >= 0x030000) + f->setBoolValue(false); +#else + boost::dynamic_pointer_cast(f)->setValue(false); +#endif + + std::string sessionId = getStanza(received[0])->getPayload()->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(new Swift::Command("settings")); + payload->setSessionID(sessionId); + payload->setForm(getStanza(received[0])->getPayload()->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(getStanza(received[0]))); + CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast(getStanza(received[0]))->getType()); + + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); + CPPUNIT_ASSERT_EQUAL(std::string("settings"), getStanza(received[0])->getPayload()->getNode()); + CPPUNIT_ASSERT_EQUAL(Swift::Command::Completed, getStanza(received[0])->getPayload()->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(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(getStanza(received[0]))); + CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast(getStanza(received[0]))->getType()); + + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); + CPPUNIT_ASSERT_EQUAL(std::string("settings"), getStanza(received[0])->getPayload()->getNode()); + CPPUNIT_ASSERT_EQUAL(Swift::Command::Executing, getStanza(received[0])->getPayload()->getStatus()); + + // form element + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()->getForm()); + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()->getForm()->getField("enable_transport")); + + // set enabled_transport = 0 + f = getStanza(received[0])->getPayload()->getForm()->getField("enable_transport"); +#if (SWIFTEN_VERSION >= 0x030000) + CPPUNIT_ASSERT_EQUAL(false, f->getBoolValue()); +#else + CPPUNIT_ASSERT_EQUAL(false, boost::dynamic_pointer_cast(f)->getValue()); +#endif + } + + void executeTwoCommands() { + addUser(); + boost::shared_ptr payload(new Swift::Command("settings")); + boost::shared_ptr 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(getStanza(received[0]))); + CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast(getStanza(received[0]))->getType()); + + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); + CPPUNIT_ASSERT_EQUAL(std::string("settings"), getStanza(received[0])->getPayload()->getNode()); + CPPUNIT_ASSERT_EQUAL(Swift::Command::Executing, getStanza(received[0])->getPayload()->getStatus()); + + // form element + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()->getForm()); + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()->getForm()->getField("enable_transport")); + + received.clear(); + payload = boost::shared_ptr(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(getStanza(received[0]))); + CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast(getStanza(received[0]))->getType()); + + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); + CPPUNIT_ASSERT_EQUAL(std::string("settings"), getStanza(received[0])->getPayload()->getNode()); + CPPUNIT_ASSERT_EQUAL(Swift::Command::Executing, getStanza(received[0])->getPayload()->getStatus()); + + // form element + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()->getForm()); + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()->getForm()->getField("enable_transport")); + } + + void executeBadSessionID() { + addUser(); + boost::shared_ptr payload(new Swift::Command("settings")); + boost::shared_ptr 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(getStanza(received[0]))); + CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast(getStanza(received[0]))->getType()); + + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); + CPPUNIT_ASSERT_EQUAL(std::string("settings"), getStanza(received[0])->getPayload()->getNode()); + CPPUNIT_ASSERT_EQUAL(Swift::Command::Executing, getStanza(received[0])->getPayload()->getStatus()); + + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()->getForm()); + + std::string sessionId = "somethingwrong"; + + // finish the command + payload = boost::shared_ptr(new Swift::Command("settings")); + payload->setSessionID(sessionId); + payload->setForm(getStanza(received[0])->getPayload()->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(getStanza(received[0]))); + CPPUNIT_ASSERT_EQUAL(Swift::IQ::Error, dynamic_cast(getStanza(received[0]))->getType()); + } + + void cancel() { + addUser(); + boost::shared_ptr payload(new Swift::Command("settings")); + boost::shared_ptr 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(getStanza(received[0]))); + CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast(getStanza(received[0]))->getType()); + + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); + CPPUNIT_ASSERT_EQUAL(std::string("settings"), getStanza(received[0])->getPayload()->getNode()); + CPPUNIT_ASSERT_EQUAL(Swift::Command::Executing, getStanza(received[0])->getPayload()->getStatus()); + + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()->getForm()); + + std::string sessionId = getStanza(received[0])->getPayload()->getSessionID(); + + // cancel the command + payload = boost::shared_ptr(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(getStanza(received[0]))); + CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast(getStanza(received[0]))->getType()); + + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); + CPPUNIT_ASSERT_EQUAL(std::string("settings"), getStanza(received[0])->getPayload()->getNode()); + CPPUNIT_ASSERT_EQUAL(Swift::Command::Canceled, getStanza(received[0])->getPayload()->getStatus()); + } + + void propagateUserSetting() { + connectUser(); + User *user = userManager->getUser("user@localhost"); + CPPUNIT_ASSERT_EQUAL(std::string("0"), user->getUserSetting("send_headlines")); + + boost::shared_ptr payload(new Swift::Command("settings")); + boost::shared_ptr 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(getStanza(received[0]))); + CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast(getStanza(received[0]))->getType()); + + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); + CPPUNIT_ASSERT_EQUAL(std::string("settings"), getStanza(received[0])->getPayload()->getNode()); + CPPUNIT_ASSERT_EQUAL(Swift::Command::Executing, getStanza(received[0])->getPayload()->getStatus()); + + // form element + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()->getForm()); + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()->getForm()->getField("send_headlines")); + + // set enabled_transport = 0 + Swift::FormField::ref f = getStanza(received[0])->getPayload()->getForm()->getField("send_headlines"); +#if (SWIFTEN_VERSION >= 0x030000) + f->setBoolValue(true); +#else + boost::dynamic_pointer_cast(f)->setValue(true); +#endif + + std::string sessionId = getStanza(received[0])->getPayload()->getSessionID(); + + // finish the command + payload = boost::shared_ptr(new Swift::Command("settings")); + payload->setSessionID(sessionId); + payload->setForm(getStanza(received[0])->getPayload()->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 payload(new Swift::Command("settings")); + boost::shared_ptr 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(getStanza(received[0]))); + CPPUNIT_ASSERT_EQUAL(Swift::IQ::Result, dynamic_cast(getStanza(received[0]))->getType()); + + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); + CPPUNIT_ASSERT_EQUAL(std::string("settings"), getStanza(received[0])->getPayload()->getNode()); + CPPUNIT_ASSERT_EQUAL(Swift::Command::Executing, getStanza(received[0])->getPayload()->getStatus()); + + // form element + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()->getForm()); + CPPUNIT_ASSERT(getStanza(received[0])->getPayload()->getForm()->getField("send_headlines")); + Swift::FormField::ref f = getStanza(received[0])->getPayload()->getForm()->getField("send_headlines"); +#if (SWIFTEN_VERSION >= 0x030000) + CPPUNIT_ASSERT_EQUAL(true, f->getBoolValue()); +#else + CPPUNIT_ASSERT_EQUAL(true, boost::dynamic_pointer_cast(f)->getValue()); +#endif + } + +}; + +CPPUNIT_TEST_SUITE_REGISTRATION (SettingsAdHocCommandTest);