| Index: webrtc/libjingle/xmpp/chatroommodule_unittest.cc
|
| diff --git a/webrtc/libjingle/xmpp/chatroommodule_unittest.cc b/webrtc/libjingle/xmpp/chatroommodule_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..65d28273cf3994fb4e67ea2e0062239a42dad594
|
| --- /dev/null
|
| +++ b/webrtc/libjingle/xmpp/chatroommodule_unittest.cc
|
| @@ -0,0 +1,280 @@
|
| +/*
|
| + * Copyright 2004 The WebRTC Project Authors. All rights reserved.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license
|
| + * that can be found in the LICENSE file in the root of the source
|
| + * tree. An additional intellectual property rights grant can be found
|
| + * in the file PATENTS. All contributing project authors may
|
| + * be found in the AUTHORS file in the root of the source tree.
|
| + */
|
| +
|
| +#include <iostream>
|
| +#include <sstream>
|
| +#include <string>
|
| +#include "buzz/chatroommodule.h"
|
| +#include "buzz/constants.h"
|
| +#include "buzz/xmlelement.h"
|
| +#include "buzz/xmppengine.h"
|
| +#include "common/common.h"
|
| +#include "engine/util_unittest.h"
|
| +#include "test/unittest-inl.h"
|
| +#include "test/unittest.h"
|
| +
|
| +#define TEST_OK(x) TEST_EQ((x),XMPP_RETURN_OK)
|
| +#define TEST_BADARGUMENT(x) TEST_EQ((x),XMPP_RETURN_BADARGUMENT)
|
| +
|
| +namespace buzz {
|
| +
|
| +class MultiUserChatModuleTest;
|
| +
|
| +static void
|
| +WriteEnteredStatus(std::ostream& os, XmppChatroomEnteredStatus status) {
|
| + switch(status) {
|
| + case XMPP_CHATROOM_ENTERED_SUCCESS:
|
| + os<<"success";
|
| + break;
|
| + case XMPP_CHATROOM_ENTERED_FAILURE_NICKNAME_CONFLICT:
|
| + os<<"failure(nickname conflict)";
|
| + break;
|
| + case XMPP_CHATROOM_ENTERED_FAILURE_PASSWORD_REQUIRED:
|
| + os<<"failure(password required)";
|
| + break;
|
| + case XMPP_CHATROOM_ENTERED_FAILURE_PASSWORD_INCORRECT:
|
| + os<<"failure(password incorrect)";
|
| + break;
|
| + case XMPP_CHATROOM_ENTERED_FAILURE_NOT_A_MEMBER:
|
| + os<<"failure(not a member)";
|
| + break;
|
| + case XMPP_CHATROOM_ENTERED_FAILURE_MEMBER_BANNED:
|
| + os<<"failure(member banned)";
|
| + break;
|
| + case XMPP_CHATROOM_ENTERED_FAILURE_MAX_USERS:
|
| + os<<"failure(max users)";
|
| + break;
|
| + case XMPP_CHATROOM_ENTERED_FAILURE_ROOM_LOCKED:
|
| + os<<"failure(room locked)";
|
| + break;
|
| + case XMPP_CHATROOM_ENTERED_FAILURE_UNSPECIFIED:
|
| + os<<"failure(unspecified)";
|
| + break;
|
| + default:
|
| + os<<"unknown";
|
| + break;
|
| + }
|
| +}
|
| +
|
| +static void
|
| +WriteExitedStatus(std::ostream& os, XmppChatroomExitedStatus status) {
|
| + switch (status) {
|
| + case XMPP_CHATROOM_EXITED_REQUESTED:
|
| + os<<"requested";
|
| + break;
|
| + case XMPP_CHATROOM_EXITED_BANNED:
|
| + os<<"banned";
|
| + break;
|
| + case XMPP_CHATROOM_EXITED_KICKED:
|
| + os<<"kicked";
|
| + break;
|
| + case XMPP_CHATROOM_EXITED_NOT_A_MEMBER:
|
| + os<<"not member";
|
| + break;
|
| + case XMPP_CHATROOM_EXITED_SYSTEM_SHUTDOWN:
|
| + os<<"system shutdown";
|
| + break;
|
| + case XMPP_CHATROOM_EXITED_UNSPECIFIED:
|
| + os<<"unspecified";
|
| + break;
|
| + default:
|
| + os<<"unknown";
|
| + break;
|
| + }
|
| +}
|
| +
|
| +//! This session handler saves all calls to a string. These are events and
|
| +//! data delivered form the engine to application code.
|
| +class XmppTestChatroomHandler : public XmppChatroomHandler {
|
| +public:
|
| + XmppTestChatroomHandler() {}
|
| + virtual ~XmppTestChatroomHandler() {}
|
| +
|
| + void ChatroomEnteredStatus(XmppChatroomModule* room,
|
| + XmppChatroomEnteredStatus status) {
|
| + RTC_UNUSED(room);
|
| + ss_ <<"[ChatroomEnteredStatus status: ";
|
| + WriteEnteredStatus(ss_, status);
|
| + ss_ <<"]";
|
| + }
|
| +
|
| +
|
| + void ChatroomExitedStatus(XmppChatroomModule* room,
|
| + XmppChatroomExitedStatus status) {
|
| + RTC_UNUSED(room);
|
| + ss_ <<"[ChatroomExitedStatus status: ";
|
| + WriteExitedStatus(ss_, status);
|
| + ss_ <<"]";
|
| + }
|
| +
|
| + void MemberEntered(XmppChatroomModule* room,
|
| + const XmppChatroomMember* entered_member) {
|
| + RTC_UNUSED(room);
|
| + ss_ << "[MemberEntered " << entered_member->member_jid().Str() << "]";
|
| + }
|
| +
|
| + void MemberExited(XmppChatroomModule* room,
|
| + const XmppChatroomMember* exited_member) {
|
| + RTC_UNUSED(room);
|
| + ss_ << "[MemberExited " << exited_member->member_jid().Str() << "]";
|
| + }
|
| +
|
| + void MemberChanged(XmppChatroomModule* room,
|
| + const XmppChatroomMember* changed_member) {
|
| + RTC_UNUSED(room);
|
| + ss_ << "[MemberChanged " << changed_member->member_jid().Str() << "]";
|
| + }
|
| +
|
| + virtual void MessageReceived(XmppChatroomModule* room, const XmlElement& message) {
|
| + RTC_UNUSED2(room, message);
|
| + }
|
| +
|
| +
|
| + std::string Str() {
|
| + return ss_.str();
|
| + }
|
| +
|
| + std::string StrClear() {
|
| + std::string result = ss_.str();
|
| + ss_.str("");
|
| + return result;
|
| + }
|
| +
|
| +private:
|
| + std::stringstream ss_;
|
| +};
|
| +
|
| +//! This is the class that holds all of the unit test code for the
|
| +//! roster module
|
| +class XmppChatroomModuleTest : public UnitTest {
|
| +public:
|
| + XmppChatroomModuleTest() {}
|
| +
|
| + void TestEnterExitChatroom() {
|
| + std::stringstream dump;
|
| +
|
| + // Configure the engine
|
| + rtc::scoped_ptr<XmppEngine> engine(XmppEngine::Create());
|
| + XmppTestHandler handler(engine.get());
|
| +
|
| + // Configure the module and handler
|
| + rtc::scoped_ptr<XmppChatroomModule> chatroom(XmppChatroomModule::Create());
|
| +
|
| + // Configure the module handler
|
| + chatroom->RegisterEngine(engine.get());
|
| +
|
| + // Set up callbacks
|
| + engine->SetOutputHandler(&handler);
|
| + engine->AddStanzaHandler(&handler);
|
| + engine->SetSessionHandler(&handler);
|
| +
|
| + // Set up minimal login info
|
| + engine->SetUser(Jid("david@my-server"));
|
| + engine->SetPassword("david");
|
| +
|
| + // Do the whole login handshake
|
| + RunLogin(this, engine.get(), &handler);
|
| + TEST_EQ("", handler.OutputActivity());
|
| +
|
| + // Get the chatroom and set the handler
|
| + XmppTestChatroomHandler chatroom_handler;
|
| + chatroom->set_chatroom_handler(static_cast<XmppChatroomHandler*>(&chatroom_handler));
|
| +
|
| + // try to enter the chatroom
|
| + TEST_EQ(chatroom->state(), XMPP_CHATROOM_STATE_NOT_IN_ROOM);
|
| + chatroom->set_nickname("thirdwitch");
|
| + chatroom->set_chatroom_jid(Jid("darkcave@my-server"));
|
| + chatroom->RequestEnterChatroom("", XMPP_CONNECTION_STATUS_UNKNOWN, "en");
|
| + TEST_EQ(chatroom_handler.StrClear(), "");
|
| + TEST_EQ(handler.OutputActivity(),
|
| + "<presence to=\"darkcave@my-server/thirdwitch\">"
|
| + "<muc:x xmlns:muc=\"http://jabber.org/protocol/muc\"/>"
|
| + "</presence>");
|
| + TEST_EQ(chatroom->state(), XMPP_CHATROOM_STATE_REQUESTED_ENTER);
|
| +
|
| + // simulate the server and test the client
|
| + std::string input;
|
| + input = "<presence from=\"darkcave@my-server/firstwitch\" to=\"david@my-server\">"
|
| + "<x xmlns=\"http://jabber.org/protocol/muc#user\">"
|
| + "<item affiliation=\"owner\" role=\"participant\"/>"
|
| + "</x>"
|
| + "</presence>";
|
| + TEST_OK(engine->HandleInput(input.c_str(), input.length()));
|
| + TEST_EQ(chatroom_handler.StrClear(), "");
|
| + TEST_EQ(chatroom->state(), XMPP_CHATROOM_STATE_REQUESTED_ENTER);
|
| +
|
| + input = "<presence from=\"darkcave@my-server/secondwitch\" to=\"david@my-server\">"
|
| + "<x xmlns=\"http://jabber.org/protocol/muc#user\">"
|
| + "<item affiliation=\"member\" role=\"participant\"/>"
|
| + "</x>"
|
| + "</presence>";
|
| + TEST_OK(engine->HandleInput(input.c_str(), input.length()));
|
| + TEST_EQ(chatroom_handler.StrClear(), "");
|
| + TEST_EQ(chatroom->state(), XMPP_CHATROOM_STATE_REQUESTED_ENTER);
|
| +
|
| + input = "<presence from=\"darkcave@my-server/thirdwitch\" to=\"david@my-server\">"
|
| + "<x xmlns=\"http://jabber.org/protocol/muc#user\">"
|
| + "<item affiliation=\"member\" role=\"participant\"/>"
|
| + "</x>"
|
| + "</presence>";
|
| + TEST_OK(engine->HandleInput(input.c_str(), input.length()));
|
| + TEST_EQ(chatroom_handler.StrClear(),
|
| + "[ChatroomEnteredStatus status: success]");
|
| + TEST_EQ(chatroom->state(), XMPP_CHATROOM_STATE_IN_ROOM);
|
| +
|
| + // simulate somebody else entering the room after we entered
|
| + input = "<presence from=\"darkcave@my-server/fourthwitch\" to=\"david@my-server\">"
|
| + "<x xmlns=\"http://jabber.org/protocol/muc#user\">"
|
| + "<item affiliation=\"member\" role=\"participant\"/>"
|
| + "</x>"
|
| + "</presence>";
|
| + TEST_OK(engine->HandleInput(input.c_str(), input.length()));
|
| + TEST_EQ(chatroom_handler.StrClear(), "[MemberEntered darkcave@my-server/fourthwitch]");
|
| + TEST_EQ(chatroom->state(), XMPP_CHATROOM_STATE_IN_ROOM);
|
| +
|
| + // simulate somebody else leaving the room after we entered
|
| + input = "<presence from=\"darkcave@my-server/secondwitch\" to=\"david@my-server\" type=\"unavailable\">"
|
| + "<x xmlns=\"http://jabber.org/protocol/muc#user\">"
|
| + "<item affiliation=\"member\" role=\"participant\"/>"
|
| + "</x>"
|
| + "</presence>";
|
| + TEST_OK(engine->HandleInput(input.c_str(), input.length()));
|
| + TEST_EQ(chatroom_handler.StrClear(), "[MemberExited darkcave@my-server/secondwitch]");
|
| + TEST_EQ(chatroom->state(), XMPP_CHATROOM_STATE_IN_ROOM);
|
| +
|
| + // try to leave the room
|
| + chatroom->RequestExitChatroom();
|
| + TEST_EQ(chatroom_handler.StrClear(), "");
|
| + TEST_EQ(handler.OutputActivity(),
|
| + "<presence to=\"darkcave@my-server/thirdwitch\" type=\"unavailable\"/>");
|
| + TEST_EQ(chatroom->state(), XMPP_CHATROOM_STATE_REQUESTED_EXIT);
|
| +
|
| + // simulate the server and test the client
|
| + input = "<presence from=\"darkcave@my-server/thirdwitch\" to=\"david@my-server\" type=\"unavailable\">"
|
| + "<x xmlns=\"http://jabber.org/protocol/muc#user\">"
|
| + "<item affiliation=\"member\" role=\"participant\"/>"
|
| + "</x>"
|
| + "</presence>";
|
| + TEST_OK(engine->HandleInput(input.c_str(), input.length()));
|
| + TEST_EQ(chatroom_handler.StrClear(),
|
| + "[ChatroomExitedStatus status: requested]");
|
| + TEST_EQ(chatroom->state(), XMPP_CHATROOM_STATE_NOT_IN_ROOM);
|
| + }
|
| +
|
| +};
|
| +
|
| +// A global function that creates the test suite for this set of tests.
|
| +TestBase* ChatroomModuleTest_Create() {
|
| + TestSuite* suite = new TestSuite("ChatroomModuleTest");
|
| + ADD_TEST(suite, XmppChatroomModuleTest, TestEnterExitChatroom);
|
| + return suite;
|
| +}
|
| +
|
| +}
|
|
|