From 60167321a9460054b24fe59bf39f0daacbe1e135 Mon Sep 17 00:00:00 2001 From: Matt Broadstone Date: Fri, 6 Jun 2014 16:49:45 -0400 Subject: [PATCH] add test for incompatible authentication mechanisms --- src/amqp_client.cpp | 12 ++++++++++-- tests/auto/qamqpclient/tst_qamqpclient.cpp | 20 +++++++++++++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/src/amqp_client.cpp b/src/amqp_client.cpp index 535220a..f07ef7e 100644 --- a/src/amqp_client.cpp +++ b/src/amqp_client.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include using namespace QAMQP; @@ -243,6 +244,7 @@ bool ClientPrivate::_q_method(const Frame::Method &frame) void ClientPrivate::start(const Frame::Method &frame) { + Q_Q(Client); qAmqpDebug(">> Start"); QByteArray data = frame.arguments(); QDataStream stream(&data, QIODevice::ReadOnly); @@ -254,7 +256,7 @@ void ClientPrivate::start(const Frame::Method &frame) Frame::TableField table; Frame::deserialize(stream, table); - QString mechanisms = Frame::readField('S', stream).toString(); + QStringList mechanisms = Frame::readField('S', stream).toString().split(' '); QString locales = Frame::readField('S', stream).toString(); qAmqpDebug(">> version_major: %d", version_major); @@ -262,9 +264,15 @@ void ClientPrivate::start(const Frame::Method &frame) Frame::print(table); - qAmqpDebug(">> mechanisms: %s", qPrintable(mechanisms)); + qAmqpDebug() << ">> mechanisms: " << mechanisms; qAmqpDebug(">> locales: %s", qPrintable(locales)); + if (!mechanisms.contains(authenticator->type())) { + socket->disconnectFromHost(); + Q_EMIT q->disconnected(); + return; + } + startOk(); } diff --git a/tests/auto/qamqpclient/tst_qamqpclient.cpp b/tests/auto/qamqpclient/tst_qamqpclient.cpp index 5784e5c..c5e6404 100644 --- a/tests/auto/qamqpclient/tst_qamqpclient.cpp +++ b/tests/auto/qamqpclient/tst_qamqpclient.cpp @@ -3,6 +3,7 @@ #include #include "amqp_client.h" +#include "amqp_authenticator.h" using namespace QAMQP; class tst_QAMQPClient : public TestCase @@ -11,6 +12,7 @@ class tst_QAMQPClient : public TestCase private Q_SLOTS: void connect(); void connectDisconnect(); + void invalidAuthenticationMechanism(); private: void autoReconnect(); @@ -33,6 +35,23 @@ void tst_QAMQPClient::connectDisconnect() QVERIFY(waitForSignal(&client, SIGNAL(disconnected()))); } +class InvalidAuthenticator : public Authenticator +{ +public: + virtual QString type() const { return "CRAZYAUTH"; } + virtual void write(QDataStream &out) { + Q_UNUSED(out); + } +}; + +void tst_QAMQPClient::invalidAuthenticationMechanism() +{ + Client client; + client.setAuth(new InvalidAuthenticator); + client.connectToHost(); + QVERIFY(waitForSignal(&client, SIGNAL(disconnected()))); +} + void tst_QAMQPClient::autoReconnect() { // TODO: this is a fairly crude way of testing this, research @@ -46,7 +65,6 @@ void tst_QAMQPClient::autoReconnect() QVERIFY(waitForSignal(&client, SIGNAL(disconnected()))); QProcess::execute("rabbitmqctl", QStringList() << "start_app"); QVERIFY(waitForSignal(&client, SIGNAL(connected()), 2)); - } QTEST_MAIN(tst_QAMQPClient)