From b74fb0544e32e5fb91d867fd6397dae091d37901 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Tue, 7 Jun 2011 15:31:52 +0200 Subject: [PATCH 1/8] Simple tests for basic usage --- CMakeLists.txt | 1 + tests/CMakeLists.txt | 3 +++ tests/login/CMakeLists.txt | 6 +++++ tests/login/main.cpp | 44 +++++++++++++++++++++++++++++++ tests/runtests.py | 53 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 107 insertions(+) create mode 100644 tests/CMakeLists.txt create mode 100644 tests/login/CMakeLists.txt create mode 100644 tests/login/main.cpp create mode 100644 tests/runtests.py diff --git a/CMakeLists.txt b/CMakeLists.txt index aa73cafe..9b67004d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -110,6 +110,7 @@ ADD_SUBDIRECTORY(include) ADD_SUBDIRECTORY(examples) ADD_SUBDIRECTORY(spectrum) ADD_SUBDIRECTORY(backends) +ADD_SUBDIRECTORY(tests) if(DOXYGEN_FOUND) message("Docs : yes") diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 00000000..bdbd3c65 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,3 @@ +ADD_SUBDIRECTORY(login) + +add_custom_target(tests python runtests.py WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/tests/login/CMakeLists.txt b/tests/login/CMakeLists.txt new file mode 100644 index 00000000..9c129973 --- /dev/null +++ b/tests/login/CMakeLists.txt @@ -0,0 +1,6 @@ +FILE(GLOB SRC *.cpp) + +ADD_EXECUTABLE(login_test ${SRC}) + +TARGET_LINK_LIBRARIES(login_test transport ${SWIFTEN_LIBRARIES}) + diff --git a/tests/login/main.cpp b/tests/login/main.cpp new file mode 100644 index 00000000..d303b6fe --- /dev/null +++ b/tests/login/main.cpp @@ -0,0 +1,44 @@ +#include +#include + +#include + +using namespace Swift; +using namespace boost; + +Client* client; + +static void handleDisconnected(const boost::optional &) { + std::cout << "Disconnected..." << std::endl; + exit(1); +} + +static void handleConnected() { + std::cout << "Connected..." << std::endl; + exit(0); +} + +static void handleMessageReceived(Message::ref message) { + // Echo back the incoming message + message->setTo(message->getFrom()); + message->setFrom(JID()); + client->sendMessage(message); +} + +int main(int, char **argv) { + SimpleEventLoop eventLoop; + BoostNetworkFactories networkFactories(&eventLoop); + + client = new Client(argv[1], argv[2], &networkFactories); + client->setAlwaysTrustCertificates(); + client->setAllowPLAINOverNonTLS(true); + client->onConnected.connect(&handleConnected); + client->onDisconnected.connect(bind(&handleDisconnected, _1)); + client->onMessageReceived.connect(bind(&handleMessageReceived, _1)); + client->connect(); + + eventLoop.run(); + + delete client; + return 0; +} diff --git a/tests/runtests.py b/tests/runtests.py new file mode 100644 index 00000000..014a45e5 --- /dev/null +++ b/tests/runtests.py @@ -0,0 +1,53 @@ +import os +import sys +from subprocess import * +import time + +def run_spectrum(backend): + f = open("sample.cfg", "w") + f.write("\ + [service]\n\ + jid = localhost\n\ + password = secret\n\ + server = 127.0.0.1\n\ + port = 5222\n\ + server_mode = 1\n\ + backend=../backends/%s/%s_backend\n\ + protocol=prpl-jabber\n\ +\ + [database]\n\ + database = test.sql\n\ + prefix=icq\n\ + " % (backend, backend) + ) + f.close() + p = Popen("../spectrum/src/spectrum sample.cfg > /dev/null 2> /dev/null", shell=True) + time.sleep(1) + return p + + +os.system("killall spectrum 2> /dev/null") + +for backend in os.listdir("../backends"): + if not os.path.isdir("../backends/" + backend) or backend == "CMakeFiles": + continue + + for d in os.listdir("."): + binary = d + "/" + d + "_test" + if not os.path.exists(binary): + continue + + p = run_spectrum(backend); + + if backend.find("purple") >= 0: + ret = os.system(binary + " pyjim%jabber.cz@localhost test") + else: + ret = os.system(binary + " testnickname%irc.freenode.net@localhost test") + if ret == 0: + print "[ PASS ]", backend, binary + else: + print "[ FAIL ]", backend, binary + + os.system("killall spectrum 2> /dev/null") + + From a9fbe73b80257c3d3814e0a118e95f6554a76312 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Wed, 8 Jun 2011 13:17:09 +0200 Subject: [PATCH 2/8] Tests tweaking --- include/transport/transport.h | 1 + tests/login/CMakeLists.txt | 2 +- tests/login/main.cpp | 10 ++++++---- tests/runtests.py | 16 +++++++++++----- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/include/transport/transport.h b/include/transport/transport.h index 5c91442b..62e644ac 100644 --- a/include/transport/transport.h +++ b/include/transport/transport.h @@ -31,6 +31,7 @@ #include "Swiften/Network/BoostTimerFactory.h" #include "Swiften/Network/BoostIOServiceThread.h" #include "Swiften/Server/UserRegistry.h" +#include "Swiften/Base/SafeByteArray.h" #include #include "transport/config.h" #include "transport/factory.h" diff --git a/tests/login/CMakeLists.txt b/tests/login/CMakeLists.txt index 9c129973..d0468bd6 100644 --- a/tests/login/CMakeLists.txt +++ b/tests/login/CMakeLists.txt @@ -2,5 +2,5 @@ FILE(GLOB SRC *.cpp) ADD_EXECUTABLE(login_test ${SRC}) -TARGET_LINK_LIBRARIES(login_test transport ${SWIFTEN_LIBRARIES}) +TARGET_LINK_LIBRARIES(login_test transport ${SWIFTEN_LIBRARIES} -lgconf-2 -lgobject-2.0 -lglib-2.0) diff --git a/tests/login/main.cpp b/tests/login/main.cpp index d303b6fe..77ab9a44 100644 --- a/tests/login/main.cpp +++ b/tests/login/main.cpp @@ -2,6 +2,7 @@ #include #include +#include using namespace Swift; using namespace boost; @@ -9,12 +10,12 @@ using namespace boost; Client* client; static void handleDisconnected(const boost::optional &) { - std::cout << "Disconnected..." << std::endl; +// std::cout << "Disconnected..." << std::endl; exit(1); } static void handleConnected() { - std::cout << "Connected..." << std::endl; +// std::cout << "Connected..." << std::endl; exit(0); } @@ -31,11 +32,12 @@ int main(int, char **argv) { client = new Client(argv[1], argv[2], &networkFactories); client->setAlwaysTrustCertificates(); - client->setAllowPLAINOverNonTLS(true); client->onConnected.connect(&handleConnected); client->onDisconnected.connect(bind(&handleDisconnected, _1)); client->onMessageReceived.connect(bind(&handleMessageReceived, _1)); - client->connect(); + ClientOptions opt; + opt.allowPLAINOverNonTLS = true; + client->connect(opt); eventLoop.run(); diff --git a/tests/runtests.py b/tests/runtests.py index 014a45e5..cfd08614 100644 --- a/tests/runtests.py +++ b/tests/runtests.py @@ -21,12 +21,13 @@ def run_spectrum(backend): " % (backend, backend) ) f.close() - p = Popen("../spectrum/src/spectrum sample.cfg > /dev/null 2> /dev/null", shell=True) - time.sleep(1) + p = Popen("../spectrum/src/spectrum sample.cfg >> test.log 2> /dev/null", shell=True) + time.sleep(2) return p os.system("killall spectrum 2> /dev/null") +os.system("rm test.log") for backend in os.listdir("../backends"): if not os.path.isdir("../backends/" + backend) or backend == "CMakeFiles": @@ -40,10 +41,15 @@ for backend in os.listdir("../backends"): p = run_spectrum(backend); if backend.find("purple") >= 0: - ret = os.system(binary + " pyjim%jabber.cz@localhost test") + p = Popen(binary + " pyjim%jabber.cz@localhost test", shell=True) + else: - ret = os.system(binary + " testnickname%irc.freenode.net@localhost test") - if ret == 0: + p = Popen(binary + " testnickname%irc.freenode.net@localhost test", shell=True) + + time.sleep(5) + + p.poll() + if p.returncode == 0: print "[ PASS ]", backend, binary else: print "[ FAIL ]", backend, binary From 2a40419b2bc417c0e2a5b82efe5fc8d77493d02b Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Wed, 8 Jun 2011 14:21:20 +0200 Subject: [PATCH 3/8] Fixed crash in handleDisconnect handler --- backends/libircclient-qt/session.cpp | 2 ++ src/networkpluginserver.cpp | 4 +++ tests/CMakeLists.txt | 1 + tests/login/main.cpp | 2 -- tests/login_bad_name/CMakeLists.txt | 6 ++++ tests/login_bad_name/main.cpp | 45 ++++++++++++++++++++++++++++ tests/runtests.py | 20 ++++++++----- 7 files changed, 71 insertions(+), 9 deletions(-) create mode 100644 tests/login_bad_name/CMakeLists.txt create mode 100644 tests/login_bad_name/main.cpp diff --git a/backends/libircclient-qt/session.cpp b/backends/libircclient-qt/session.cpp index 64e87962..e8e5b9e8 100644 --- a/backends/libircclient-qt/session.cpp +++ b/backends/libircclient-qt/session.cpp @@ -17,6 +17,7 @@ MyIrcSession::MyIrcSession(const std::string &user, NetworkPlugin *np, QObject* { this->np = np; this->user = user; + connect(this, SIGNAL(disconnected()), SLOT(on_disconnected())); } void MyIrcSession::on_connected(){ @@ -26,6 +27,7 @@ void MyIrcSession::on_connected(){ void MyIrcSession::on_disconnected() { std::cout << "disconnected:\n"; + np->handleDisconnected(user, "", 0, ""); } void MyIrcSession::on_bufferAdded(Irc::Buffer* buffer) diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 2e635fcb..ce39caa3 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -201,6 +201,10 @@ void NetworkPluginServer::handleDisconnectedPayload(const std::string &data) { } m_component->m_userRegistry->onPasswordInvalid(payload.user()); + user = m_userManager->getUser(payload.user()); + if (!user) { + return; + } user->handleDisconnected(payload.message()); } diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index bdbd3c65..2151b4c6 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,3 +1,4 @@ ADD_SUBDIRECTORY(login) +ADD_SUBDIRECTORY(login_bad_name) add_custom_target(tests python runtests.py WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/tests/login/main.cpp b/tests/login/main.cpp index 77ab9a44..3e55d9db 100644 --- a/tests/login/main.cpp +++ b/tests/login/main.cpp @@ -10,12 +10,10 @@ using namespace boost; Client* client; static void handleDisconnected(const boost::optional &) { -// std::cout << "Disconnected..." << std::endl; exit(1); } static void handleConnected() { -// std::cout << "Connected..." << std::endl; exit(0); } diff --git a/tests/login_bad_name/CMakeLists.txt b/tests/login_bad_name/CMakeLists.txt new file mode 100644 index 00000000..7801614f --- /dev/null +++ b/tests/login_bad_name/CMakeLists.txt @@ -0,0 +1,6 @@ +FILE(GLOB SRC *.cpp) + +ADD_EXECUTABLE(login_bad_name_test ${SRC}) + +TARGET_LINK_LIBRARIES(login_bad_name_test transport ${SWIFTEN_LIBRARIES} -lgconf-2 -lgobject-2.0 -lglib-2.0) + diff --git a/tests/login_bad_name/main.cpp b/tests/login_bad_name/main.cpp new file mode 100644 index 00000000..4df61cdb --- /dev/null +++ b/tests/login_bad_name/main.cpp @@ -0,0 +1,45 @@ +#include +#include + +#include +#include + +using namespace Swift; +using namespace boost; + +Client* client; + +static void handleDisconnected(const boost::optional &error) { + exit(error->getType() != ClientError::AuthenticationFailedError); +} + +static void handleConnected() { + exit(1); +} + +static void handleMessageReceived(Message::ref message) { + // Echo back the incoming message + message->setTo(message->getFrom()); + message->setFrom(JID()); + client->sendMessage(message); +} + +int main(int, char **argv) { + SimpleEventLoop eventLoop; + BoostNetworkFactories networkFactories(&eventLoop); + + JID jid(JID(argv[1]).getNode() + "something", JID(argv[1]).getDomain()); + client = new Client(jid, argv[2], &networkFactories); + client->setAlwaysTrustCertificates(); + client->onConnected.connect(&handleConnected); + client->onDisconnected.connect(bind(&handleDisconnected, _1)); + client->onMessageReceived.connect(bind(&handleMessageReceived, _1)); + ClientOptions opt; + opt.allowPLAINOverNonTLS = true; + client->connect(opt); + + eventLoop.run(); + + delete client; + return 0; +} diff --git a/tests/runtests.py b/tests/runtests.py index cfd08614..5386ff9e 100644 --- a/tests/runtests.py +++ b/tests/runtests.py @@ -3,7 +3,8 @@ import sys from subprocess import * import time -def run_spectrum(backend): +def run_spectrum(backend, test): + os.system("rm test.sql") f = open("sample.cfg", "w") f.write("\ [service]\n\ @@ -21,13 +22,13 @@ def run_spectrum(backend): " % (backend, backend) ) f.close() - p = Popen("../spectrum/src/spectrum sample.cfg >> test.log 2> /dev/null", shell=True) + p = Popen("../spectrum/src/spectrum sample.cfg > " + backend + "_" + test + ".log 2>&1", shell=True) time.sleep(2) return p os.system("killall spectrum 2> /dev/null") -os.system("rm test.log") +os.system("rm *.log") for backend in os.listdir("../backends"): if not os.path.isdir("../backends/" + backend) or backend == "CMakeFiles": @@ -38,7 +39,7 @@ for backend in os.listdir("../backends"): if not os.path.exists(binary): continue - p = run_spectrum(backend); + p = run_spectrum(backend, d) if backend.find("purple") >= 0: p = Popen(binary + " pyjim%jabber.cz@localhost test", shell=True) @@ -46,13 +47,18 @@ for backend in os.listdir("../backends"): else: p = Popen(binary + " testnickname%irc.freenode.net@localhost test", shell=True) - time.sleep(5) + seconds = 0 + while p.poll() is None and seconds < 20: + time.sleep(1) + seconds += 1 - p.poll() if p.returncode == 0: print "[ PASS ]", backend, binary else: - print "[ FAIL ]", backend, binary + if seconds == 20: + print "[ TIME ]", backend, binary + else: + print "[ FAIL ]", backend, binary os.system("killall spectrum 2> /dev/null") From 04f7a03780478562019a174aa23b6a9a1267b3c1 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Wed, 8 Jun 2011 16:36:30 +0200 Subject: [PATCH 4/8] Fixed some bad bugs + improved tests --- backends/libpurple/main.cpp | 3 ++ src/networkplugin.cpp | 2 +- src/networkpluginserver.cpp | 25 +++++++-------- tests/runtests.py | 61 +++++++++++++++++++------------------ 4 files changed, 49 insertions(+), 42 deletions(-) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index 026d8844..4be4e3a9 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -479,6 +479,9 @@ static PurpleCoreUiOps coreUiOps = }; static void signed_on(PurpleConnection *gc, gpointer unused) { + for (int i = 0; i<1500; i++) { + std::cout << "A\n"; + } PurpleAccount *account = purple_connection_get_account(gc); np->handleConnected(np->m_accounts[account]); } diff --git a/src/networkplugin.cpp b/src/networkplugin.cpp index fa393588..9f35885f 100644 --- a/src/networkplugin.cpp +++ b/src/networkplugin.cpp @@ -266,7 +266,7 @@ void NetworkPlugin::handleVCardPayload(const std::string &data) { } void NetworkPlugin::handleDataRead(const Swift::SafeByteArray &data) { - m_data.insert(m_data.begin(), data.begin(), data.end()); + m_data.insert(m_data.end(), data.begin(), data.end()); while (m_data.size() != 0) { unsigned int expected_size; diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index ce39caa3..0ccd6167 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -90,7 +90,7 @@ static int exec_(const char *path, const char *host, const char *port, const cha if ( pid == 0 ) { // child process execlp(path, path, "--host", host, "--port", port, config, NULL); - exit(1); + abort(); } else if ( pid < 0 ) { // fork failed status = -1; @@ -195,13 +195,9 @@ void NetworkPluginServer::handleDisconnectedPayload(const std::string &data) { return; } - User *user = m_userManager->getUser(payload.user()); - if (!user) { - return; - } - m_component->m_userRegistry->onPasswordInvalid(payload.user()); - user = m_userManager->getUser(payload.user()); + + User *user = m_userManager->getUser(payload.user()); if (!user) { return; } @@ -230,7 +226,7 @@ void NetworkPluginServer::handleBuddyChangedPayload(const std::string &data) { // TODO: ERROR return; } - + std::cout << payload.buddyname() << "\n"; User *user = m_userManager->getUser(payload.username()); if (!user) return; @@ -326,8 +322,8 @@ void NetworkPluginServer::handleConvMessagePayload(const std::string &data, bool } void NetworkPluginServer::handleDataRead(Client *c, const Swift::SafeByteArray &data) { - c->data.insert(c->data.begin(), data.begin(), data.end()); - + c->data.insert(c->data.end(), data.begin(), data.end()); + std::cout << "READ\n"; while (c->data.size() != 0) { unsigned int expected_size; @@ -343,11 +339,12 @@ void NetworkPluginServer::handleDataRead(Client *c, const Swift::SafeByteArray & pbnetwork::WrapperMessage wrapper; if (wrapper.ParseFromArray(&c->data[4], expected_size) == false) { + std::cout << "PARSING ERROR " << expected_size << "\n"; c->data.erase(c->data.begin(), c->data.begin() + 4 + expected_size); - return; + continue; } c->data.erase(c->data.begin(), c->data.begin() + 4 + expected_size); - + std::cout << "TYPE " << wrapper.type() << " " << (int) pbnetwork::WrapperMessage_Type_TYPE_CONNECTED << " " << c->data.size() << "\n"; switch(wrapper.type()) { case pbnetwork::WrapperMessage_Type_TYPE_CONNECTED: handleConnectedPayload(wrapper.payload()); @@ -403,6 +400,10 @@ void NetworkPluginServer::pingTimeout() { void NetworkPluginServer::handleUserCreated(User *user) { Client *c = getFreeClient(); + if (!c) { + user->handleDisconnected("Internal Server Error, please reconnect."); + return; + } user->setData(c); c->users.push_back(user); diff --git a/tests/runtests.py b/tests/runtests.py index 5386ff9e..653a9d1e 100644 --- a/tests/runtests.py +++ b/tests/runtests.py @@ -23,43 +23,46 @@ def run_spectrum(backend, test): ) f.close() p = Popen("../spectrum/src/spectrum sample.cfg > " + backend + "_" + test + ".log 2>&1", shell=True) - time.sleep(2) + time.sleep(3) return p +def one_test_run(): + os.system("killall spectrum 2> /dev/null") + os.system("rm *.log") -os.system("killall spectrum 2> /dev/null") -os.system("rm *.log") - -for backend in os.listdir("../backends"): - if not os.path.isdir("../backends/" + backend) or backend == "CMakeFiles": - continue - - for d in os.listdir("."): - binary = d + "/" + d + "_test" - if not os.path.exists(binary): + for backend in os.listdir("../backends"): + if not os.path.isdir("../backends/" + backend) or backend == "CMakeFiles" or backend.startswith("libirc"): continue - p = run_spectrum(backend, d) + for d in os.listdir("."): + binary = d + "/" + d + "_test" + if not os.path.exists(binary) or d.find("bad") != -1: + continue - if backend.find("purple") >= 0: - p = Popen(binary + " pyjim%jabber.cz@localhost test", shell=True) - - else: - p = Popen(binary + " testnickname%irc.freenode.net@localhost test", shell=True) + p = run_spectrum(backend, d) - seconds = 0 - while p.poll() is None and seconds < 20: - time.sleep(1) - seconds += 1 - - if p.returncode == 0: - print "[ PASS ]", backend, binary - else: - if seconds == 20: - print "[ TIME ]", backend, binary + if backend.find("purple") >= 0: + p = Popen(binary + " pyjim%jabber.cz@localhost test", shell=True) + else: - print "[ FAIL ]", backend, binary + p = Popen(binary + " testnickname%irc.freenode.net@localhost test", shell=True) - os.system("killall spectrum 2> /dev/null") + seconds = 0 + while p.poll() is None and seconds < 20: + time.sleep(1) + seconds += 1 + + if p.returncode == 0 and seconds < 20: + print "[ PASS ]", backend, binary + else: + if seconds == 20: + print "[ TIME ]", backend, binary + else: + print "[ FAIL ]", backend, binary + + os.system("killall spectrum 2> /dev/null") + +while True: + one_test_run() From 568d2e62b7e777df799cb9183b8ea16cdebd4ce6 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Thu, 9 Jun 2011 08:30:41 +0200 Subject: [PATCH 5/8] Allow all tests --- tests/runtests.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/runtests.py b/tests/runtests.py index 653a9d1e..4a908ff1 100644 --- a/tests/runtests.py +++ b/tests/runtests.py @@ -23,7 +23,7 @@ def run_spectrum(backend, test): ) f.close() p = Popen("../spectrum/src/spectrum sample.cfg > " + backend + "_" + test + ".log 2>&1", shell=True) - time.sleep(3) + time.sleep(4) return p def one_test_run(): @@ -31,19 +31,18 @@ def one_test_run(): os.system("rm *.log") for backend in os.listdir("../backends"): - if not os.path.isdir("../backends/" + backend) or backend == "CMakeFiles" or backend.startswith("libirc"): + if not os.path.isdir("../backends/" + backend) or backend == "CMakeFiles": continue for d in os.listdir("."): binary = d + "/" + d + "_test" - if not os.path.exists(binary) or d.find("bad") != -1: + if not os.path.exists(binary): continue p = run_spectrum(backend, d) if backend.find("purple") >= 0: p = Popen(binary + " pyjim%jabber.cz@localhost test", shell=True) - else: p = Popen(binary + " testnickname%irc.freenode.net@localhost test", shell=True) @@ -54,6 +53,7 @@ def one_test_run(): if p.returncode == 0 and seconds < 20: print "[ PASS ]", backend, binary + else: if seconds == 20: print "[ TIME ]", backend, binary From f8d3089f4e3a6ba77fcebbaa4a9fcce207e69a30 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Thu, 9 Jun 2011 08:36:43 +0200 Subject: [PATCH 6/8] login_bad_name2 test --- tests/CMakeLists.txt | 1 + tests/login_bad_name2/.nolibircclient-qt | 0 tests/login_bad_name2/CMakeLists.txt | 6 ++++ tests/login_bad_name2/main.cpp | 45 ++++++++++++++++++++++++ tests/runtests.py | 6 ++-- 5 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 tests/login_bad_name2/.nolibircclient-qt create mode 100644 tests/login_bad_name2/CMakeLists.txt create mode 100644 tests/login_bad_name2/main.cpp diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 2151b4c6..0688a10f 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,4 +1,5 @@ ADD_SUBDIRECTORY(login) ADD_SUBDIRECTORY(login_bad_name) +ADD_SUBDIRECTORY(login_bad_name2) add_custom_target(tests python runtests.py WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/tests/login_bad_name2/.nolibircclient-qt b/tests/login_bad_name2/.nolibircclient-qt new file mode 100644 index 00000000..e69de29b diff --git a/tests/login_bad_name2/CMakeLists.txt b/tests/login_bad_name2/CMakeLists.txt new file mode 100644 index 00000000..c4370922 --- /dev/null +++ b/tests/login_bad_name2/CMakeLists.txt @@ -0,0 +1,6 @@ +FILE(GLOB SRC *.cpp) + +ADD_EXECUTABLE(login_bad_name2_test ${SRC}) + +TARGET_LINK_LIBRARIES(login_bad_name2_test transport ${SWIFTEN_LIBRARIES} -lgconf-2 -lgobject-2.0 -lglib-2.0) + diff --git a/tests/login_bad_name2/main.cpp b/tests/login_bad_name2/main.cpp new file mode 100644 index 00000000..ad210a65 --- /dev/null +++ b/tests/login_bad_name2/main.cpp @@ -0,0 +1,45 @@ +#include +#include + +#include +#include + +using namespace Swift; +using namespace boost; + +Client* client; + +static void handleDisconnected(const boost::optional &error) { + exit(error->getType() != ClientError::AuthenticationFailedError); +} + +static void handleConnected() { + exit(1); +} + +static void handleMessageReceived(Message::ref message) { + // Echo back the incoming message + message->setTo(message->getFrom()); + message->setFrom(JID()); + client->sendMessage(message); +} + +int main(int, char **argv) { + SimpleEventLoop eventLoop; + BoostNetworkFactories networkFactories(&eventLoop); + + JID jid(std::string("something") + JID(argv[1]).getNode(), JID(argv[1]).getDomain()); + client = new Client(jid, argv[2], &networkFactories); + client->setAlwaysTrustCertificates(); + client->onConnected.connect(&handleConnected); + client->onDisconnected.connect(bind(&handleDisconnected, _1)); + client->onMessageReceived.connect(bind(&handleMessageReceived, _1)); + ClientOptions opt; + opt.allowPLAINOverNonTLS = true; + client->connect(opt); + + eventLoop.run(); + + delete client; + return 0; +} diff --git a/tests/runtests.py b/tests/runtests.py index 4a908ff1..391a1497 100644 --- a/tests/runtests.py +++ b/tests/runtests.py @@ -39,6 +39,9 @@ def one_test_run(): if not os.path.exists(binary): continue + if os.path.exists(d + "/.no" + backend): + continue + p = run_spectrum(backend, d) if backend.find("purple") >= 0: @@ -62,7 +65,6 @@ def one_test_run(): os.system("killall spectrum 2> /dev/null") -while True: - one_test_run() +one_test_run() From ac7bbb6cccf337902176d25bb345fc3f5f9c5343 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Thu, 9 Jun 2011 12:46:49 +0200 Subject: [PATCH 7/8] Handle jabber:iq:roster sets --- src/localbuddy.cpp | 1 + src/rosterresponder.cpp | 36 ++++++++++++++++++++++++++++++++++++ src/sqlite3backend.cpp | 2 +- 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/localbuddy.cpp b/src/localbuddy.cpp index d79e0b72..55deeec9 100644 --- a/src/localbuddy.cpp +++ b/src/localbuddy.cpp @@ -24,6 +24,7 @@ namespace Transport { LocalBuddy::LocalBuddy(RosterManager *rosterManager, long id) : Buddy(rosterManager, id) { + m_status = Swift::StatusShow::None; } LocalBuddy::~LocalBuddy() { diff --git a/src/rosterresponder.cpp b/src/rosterresponder.cpp index 3c8554f3..d99e84fd 100644 --- a/src/rosterresponder.cpp +++ b/src/rosterresponder.cpp @@ -27,6 +27,7 @@ #include "transport/user.h" #include "transport/usermanager.h" #include "transport/rostermanager.h" +#include "transport/buddy.h" using namespace Swift; using namespace boost; @@ -67,6 +68,41 @@ bool RosterResponder::handleGetRequest(const Swift::JID& from, const Swift::JID& bool RosterResponder::handleSetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr payload) { sendResponse(from, id, boost::shared_ptr(new RosterPayload())); + + User *user = m_userManager->getUser(from.toBare().toString()); + if (!user) { + return true; + } + + if (payload->getItems().size() == 0) { + return true; + } + + Swift::RosterItemPayload item = payload->getItems()[0]; + + Buddy *buddy = user->getRosterManager()->getBuddy(Buddy::JIDToLegacyName(item.getJID())); + if (buddy) { + if (item.getSubscription() == Swift::RosterItemPayload::Remove) { + std::cout << "BUDDY REMOVED\n"; + } + else { + std::cout << "BUDDY UPDATED\n"; + } + } + else if (item.getSubscription() != Swift::RosterItemPayload::Remove) { + // Roster push for this new buddy is sent by RosterManager + BuddyInfo buddyInfo; + buddyInfo.id = -1; + buddyInfo.alias = item.getName(); + buddyInfo.legacyName = Buddy::JIDToLegacyName(item.getJID()); + buddyInfo.subscription = "both"; + buddyInfo.flags = 0; + + buddy = user->getComponent()->getFactory()->createBuddy(user->getRosterManager(), buddyInfo); + user->getRosterManager()->setBuddy(buddy); + std::cout << "BUDDY ADDED\n"; + } + return true; } diff --git a/src/sqlite3backend.cpp b/src/sqlite3backend.cpp index 128921a7..565a5f84 100644 --- a/src/sqlite3backend.cpp +++ b/src/sqlite3backend.cpp @@ -240,7 +240,7 @@ long SQLite3Backend::addBuddy(long userId, const BuddyInfo &buddyInfo) { BIND_INT(m_addBuddy, userId); BIND_STR(m_addBuddy, buddyInfo.legacyName); BIND_STR(m_addBuddy, buddyInfo.subscription); - BIND_STR(m_addBuddy, buddyInfo.groups[0]); // TODO: serialize groups + BIND_STR(m_addBuddy, buddyInfo.groups.size() == 0 ? "" : buddyInfo.groups[0]); // TODO: serialize groups BIND_STR(m_addBuddy, buddyInfo.alias); BIND_INT(m_addBuddy, buddyInfo.flags); From a6781df77f76d02451bf8df7bbadcc1674edcc02 Mon Sep 17 00:00:00 2001 From: Jan Kaluza Date: Thu, 9 Jun 2011 13:54:09 +0200 Subject: [PATCH 8/8] Working buddy rename --- backends/libpurple/main.cpp | 14 ++++++++- include/transport/networkplugin.h | 2 ++ include/transport/networkpluginserver.h | 4 +++ include/transport/rostermanager.h | 2 ++ include/transport/rosterresponder.h | 7 +++++ src/networkplugin.cpp | 13 +++++++++ src/networkpluginserver.cpp | 38 +++++++++++++++++++++++-- src/rostermanager.cpp | 6 ++++ src/rosterresponder.cpp | 6 ++-- 9 files changed, 85 insertions(+), 7 deletions(-) diff --git a/backends/libpurple/main.cpp b/backends/libpurple/main.cpp index 4be4e3a9..b1cfa9da 100644 --- a/backends/libpurple/main.cpp +++ b/backends/libpurple/main.cpp @@ -118,7 +118,7 @@ class SpectrumNetworkPlugin : public NetworkPlugin { } } - virtual void handleVCardRequest(const std::string &user, const std::string &legacyName, unsigned int id) { + void handleVCardRequest(const std::string &user, const std::string &legacyName, unsigned int id) { PurpleAccount *account = m_sessions[user]; if (account) { serv_get_info(purple_account_get_connection(account), legacyName.c_str()); @@ -126,6 +126,18 @@ class SpectrumNetworkPlugin : public NetworkPlugin { } } + void handleBuddyUpdatedRequest(const std::string &user, const std::string &buddyName, const std::string &alias, const std::string &groups) { + PurpleAccount *account = m_sessions[user]; + if (account) { + PurpleBuddy *buddy = purple_find_buddy(account, buddyName.c_str()); + if (buddy) { + purple_blist_alias_buddy(buddy, alias.c_str()); + purple_blist_server_alias_buddy(buddy, alias.c_str()); + serv_alias_buddy(buddy); + } + } + } + std::map m_sessions; std::map m_accounts; std::map m_vcards; diff --git a/include/transport/networkplugin.h b/include/transport/networkplugin.h index c6125be8..2dd7e29e 100644 --- a/include/transport/networkplugin.h +++ b/include/transport/networkplugin.h @@ -64,6 +64,7 @@ class NetworkPlugin { virtual void handleVCardRequest(const std::string &/*user*/, const std::string &/*legacyName*/, unsigned int /*id*/) {} virtual void handleJoinRoomRequest(const std::string &/*user*/, const std::string &/*room*/, const std::string &/*nickname*/, const std::string &/*pasword*/) {} virtual void handleLeaveRoomRequest(const std::string &/*user*/, const std::string &/*room*/) {} + virtual void handleBuddyUpdatedRequest(const std::string &/*user*/, const std::string &/*buddyName*/, const std::string &/*alias*/, const std::string &/*groups*/) {} private: @@ -74,6 +75,7 @@ class NetworkPlugin { void handleJoinRoomPayload(const std::string &payload); void handleLeaveRoomPayload(const std::string &payload); void handleVCardPayload(const std::string &payload); + void handleBuddyChangedPayload(const std::string &payload); void handleDataRead(const Swift::SafeByteArray&); void _handleConnected(bool error); void handleDisconnected(); diff --git a/include/transport/networkpluginserver.h b/include/transport/networkpluginserver.h index c1edda8f..1d1bff73 100644 --- a/include/transport/networkpluginserver.h +++ b/include/transport/networkpluginserver.h @@ -74,6 +74,10 @@ class NetworkPluginServer { void handleUserReadyToConnect(User *user); void handleUserDestroyed(User *user); + void handleBuddyUpdated(Buddy *buddy, const Swift::RosterItemPayload &item); + void handleBuddyRemoved(Buddy *buddy); + void handleBuddyAdded(Buddy *buddy, const Swift::RosterItemPayload &item); + void handleVCardRequired(User *user, const std::string &name, unsigned int id); void send(boost::shared_ptr &, const std::string &data); diff --git a/include/transport/rostermanager.h b/include/transport/rostermanager.h index 8ff033b5..4bd8ae4b 100644 --- a/include/transport/rostermanager.h +++ b/include/transport/rostermanager.h @@ -60,6 +60,8 @@ class RosterManager { void setStorageBackend(StorageBackend *storageBackend); + void storeBuddy(Buddy *buddy); + Swift::RosterPayload::ref generateRosterPayload(); /// Returns user associated with this roster. diff --git a/include/transport/rosterresponder.h b/include/transport/rosterresponder.h index 4fd3aebc..80e61b6b 100644 --- a/include/transport/rosterresponder.h +++ b/include/transport/rosterresponder.h @@ -28,12 +28,19 @@ namespace Transport { class UserManager; +class Buddy; class RosterResponder : public Swift::Responder { public: RosterResponder(Swift::IQRouter *router, UserManager *userManager); ~RosterResponder(); + boost::signal onBuddyUpdated; + + boost::signal onBuddyRemoved; + + boost::signal onBuddyAdded; + private: virtual bool handleGetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr payload); virtual bool handleSetRequest(const Swift::JID& from, const Swift::JID& to, const std::string& id, boost::shared_ptr payload); diff --git a/src/networkplugin.cpp b/src/networkplugin.cpp index 9f35885f..3b4fa4f1 100644 --- a/src/networkplugin.cpp +++ b/src/networkplugin.cpp @@ -265,6 +265,16 @@ void NetworkPlugin::handleVCardPayload(const std::string &data) { handleVCardRequest(payload.username(), payload.buddyname(), payload.id()); } +void NetworkPlugin::handleBuddyChangedPayload(const std::string &data) { + pbnetwork::Buddy payload; + if (payload.ParseFromString(data) == false) { + // TODO: ERROR + return; + } + + handleBuddyUpdatedRequest(payload.username(), payload.buddyname(), payload.alias(), payload.groups()); +} + void NetworkPlugin::handleDataRead(const Swift::SafeByteArray &data) { m_data.insert(m_data.end(), data.begin(), data.end()); @@ -310,6 +320,9 @@ void NetworkPlugin::handleDataRead(const Swift::SafeByteArray &data) { case pbnetwork::WrapperMessage_Type_TYPE_VCARD: handleVCardPayload(wrapper.payload()); break; + case pbnetwork::WrapperMessage_Type_TYPE_BUDDY_CHANGED: + handleBuddyChangedPayload(wrapper.payload()); + break; default: return; } diff --git a/src/networkpluginserver.cpp b/src/networkpluginserver.cpp index 0ccd6167..4126d404 100644 --- a/src/networkpluginserver.cpp +++ b/src/networkpluginserver.cpp @@ -128,6 +128,9 @@ NetworkPluginServer::NetworkPluginServer(Component *component, Config *config, U m_vcardResponder->start(); m_rosterResponder = new RosterResponder(component->getIQRouter(), userManager); + m_rosterResponder->onBuddyAdded.connect(boost::bind(&NetworkPluginServer::handleBuddyAdded, this, _1, _2)); + m_rosterResponder->onBuddyRemoved.connect(boost::bind(&NetworkPluginServer::handleBuddyRemoved, this, _1)); + m_rosterResponder->onBuddyUpdated.connect(boost::bind(&NetworkPluginServer::handleBuddyUpdated, this, _1, _2)); m_rosterResponder->start(); m_server = component->getFactories()->getConnectionFactory()->createConnectionServer(10000); @@ -226,7 +229,7 @@ void NetworkPluginServer::handleBuddyChangedPayload(const std::string &data) { // TODO: ERROR return; } - std::cout << payload.buddyname() << "\n"; + User *user = m_userManager->getUser(payload.username()); if (!user) return; @@ -323,7 +326,6 @@ void NetworkPluginServer::handleConvMessagePayload(const std::string &data, bool void NetworkPluginServer::handleDataRead(Client *c, const Swift::SafeByteArray &data) { c->data.insert(c->data.end(), data.begin(), data.end()); - std::cout << "READ\n"; while (c->data.size() != 0) { unsigned int expected_size; @@ -344,7 +346,7 @@ void NetworkPluginServer::handleDataRead(Client *c, const Swift::SafeByteArray & continue; } c->data.erase(c->data.begin(), c->data.begin() + 4 + expected_size); - std::cout << "TYPE " << wrapper.type() << " " << (int) pbnetwork::WrapperMessage_Type_TYPE_CONNECTED << " " << c->data.size() << "\n"; + switch(wrapper.type()) { case pbnetwork::WrapperMessage_Type_TYPE_CONNECTED: handleConnectedPayload(wrapper.payload()); @@ -518,6 +520,36 @@ void NetworkPluginServer::handleMessageReceived(NetworkConversation *conv, boost send(c->connection, message); } +void NetworkPluginServer::handleBuddyRemoved(Buddy *buddy) { + +} + +void NetworkPluginServer::handleBuddyUpdated(Buddy *b, const Swift::RosterItemPayload &item) { + User *user = b->getRosterManager()->getUser(); + + dynamic_cast(b)->setAlias(item.getName()); + user->getRosterManager()->storeBuddy(b); + + pbnetwork::Buddy buddy; + buddy.set_username(user->getJID().toBare()); + buddy.set_buddyname(b->getName()); + buddy.set_alias(b->getAlias()); + buddy.set_groups(b->getGroups().size() == 0 ? "" : b->getGroups()[0]); + buddy.set_status(Swift::StatusShow::None); + + std::string message; + buddy.SerializeToString(&message); + + WRAP(message, pbnetwork::WrapperMessage_Type_TYPE_BUDDY_CHANGED); + + Client *c = (Client *) user->getData(); + send(c->connection, message); +} + +void NetworkPluginServer::handleBuddyAdded(Buddy *buddy, const Swift::RosterItemPayload &item) { + handleBuddyUpdated(buddy, item); +} + void NetworkPluginServer::handleVCardRequired(User *user, const std::string &name, unsigned int id) { std::cout << "VCARD REQUIRED " << name << " " << id << "\n"; pbnetwork::VCard vcard; diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index 261b7b0c..0b04f49e 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -119,6 +119,12 @@ void RosterManager::unsetBuddy(Buddy *buddy) { onBuddyUnset(buddy); } +void RosterManager::storeBuddy(Buddy *buddy) { + if (m_rosterStorage) { + m_rosterStorage->storeBuddy(buddy); + } +} + void RosterManager::handleBuddyRosterPushResponse(Swift::ErrorPayload::ref error, const std::string &key) { if (m_buddies[key] != NULL) { m_buddies[key]->buddyChanged(); diff --git a/src/rosterresponder.cpp b/src/rosterresponder.cpp index d99e84fd..bb544673 100644 --- a/src/rosterresponder.cpp +++ b/src/rosterresponder.cpp @@ -83,10 +83,10 @@ bool RosterResponder::handleSetRequest(const Swift::JID& from, const Swift::JID& Buddy *buddy = user->getRosterManager()->getBuddy(Buddy::JIDToLegacyName(item.getJID())); if (buddy) { if (item.getSubscription() == Swift::RosterItemPayload::Remove) { - std::cout << "BUDDY REMOVED\n"; + onBuddyRemoved(buddy); } else { - std::cout << "BUDDY UPDATED\n"; + onBuddyUpdated(buddy, item); } } else if (item.getSubscription() != Swift::RosterItemPayload::Remove) { @@ -100,7 +100,7 @@ bool RosterResponder::handleSetRequest(const Swift::JID& from, const Swift::JID& buddy = user->getComponent()->getFactory()->createBuddy(user->getRosterManager(), buddyInfo); user->getRosterManager()->setBuddy(buddy); - std::cout << "BUDDY ADDED\n"; + onBuddyAdded(buddy, item); } return true;