10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*
20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle
30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2004, Google Inc.
40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without
60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met:
70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     this list of conditions and the following disclaimer.
100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     this list of conditions and the following disclaimer in the documentation
120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     and/or other materials provided with the distribution.
130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  3. The name of the author may not be used to endorse or promote products
140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     derived from this software without specific prior written permission.
150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */
270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <iostream>
29cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include <sstream>
30cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include <string>
310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "buzz/chatroommodule.h"
320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "buzz/constants.h"
33cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "buzz/xmlelement.h"
34cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "buzz/xmppengine.h"
35cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "common/common.h"
360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "engine/util_unittest.h"
370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "test/unittest-inl.h"
38cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "test/unittest.h"
390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define TEST_OK(x) TEST_EQ((x),XMPP_RETURN_OK)
410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define TEST_BADARGUMENT(x) TEST_EQ((x),XMPP_RETURN_BADARGUMENT)
420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace buzz {
440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass MultiUserChatModuleTest;
460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic void
480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgWriteEnteredStatus(std::ostream& os, XmppChatroomEnteredStatus status) {
490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  switch(status) {
500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    case XMPP_CHATROOM_ENTERED_SUCCESS:
510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      os<<"success";
520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      break;
530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    case XMPP_CHATROOM_ENTERED_FAILURE_NICKNAME_CONFLICT:
540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      os<<"failure(nickname conflict)";
550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      break;
560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    case XMPP_CHATROOM_ENTERED_FAILURE_PASSWORD_REQUIRED:
570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      os<<"failure(password required)";
580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      break;
590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    case XMPP_CHATROOM_ENTERED_FAILURE_PASSWORD_INCORRECT:
600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      os<<"failure(password incorrect)";
610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      break;
620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    case XMPP_CHATROOM_ENTERED_FAILURE_NOT_A_MEMBER:
630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      os<<"failure(not a member)";
640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      break;
650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    case XMPP_CHATROOM_ENTERED_FAILURE_MEMBER_BANNED:
660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      os<<"failure(member banned)";
670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      break;
680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    case XMPP_CHATROOM_ENTERED_FAILURE_MAX_USERS:
690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      os<<"failure(max users)";
700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      break;
710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    case XMPP_CHATROOM_ENTERED_FAILURE_ROOM_LOCKED:
720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      os<<"failure(room locked)";
730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      break;
740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    case XMPP_CHATROOM_ENTERED_FAILURE_UNSPECIFIED:
750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      os<<"failure(unspecified)";
760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      break;
770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    default:
780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      os<<"unknown";
790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      break;
800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic void
840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgWriteExitedStatus(std::ostream& os, XmppChatroomExitedStatus status) {
850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  switch (status) {
860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    case XMPP_CHATROOM_EXITED_REQUESTED:
870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      os<<"requested";
880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      break;
890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    case XMPP_CHATROOM_EXITED_BANNED:
900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      os<<"banned";
910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      break;
920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    case XMPP_CHATROOM_EXITED_KICKED:
930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      os<<"kicked";
940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      break;
950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    case XMPP_CHATROOM_EXITED_NOT_A_MEMBER:
960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      os<<"not member";
970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      break;
980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    case XMPP_CHATROOM_EXITED_SYSTEM_SHUTDOWN:
990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      os<<"system shutdown";
1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      break;
1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    case XMPP_CHATROOM_EXITED_UNSPECIFIED:
1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      os<<"unspecified";
1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      break;
1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    default:
1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      os<<"unknown";
1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      break;
1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//! This session handler saves all calls to a string.  These are events and
1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//! data delivered form the engine to application code.
1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass XmppTestChatroomHandler : public XmppChatroomHandler {
1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgpublic:
1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  XmppTestChatroomHandler() {}
1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual ~XmppTestChatroomHandler() {}
1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void ChatroomEnteredStatus(XmppChatroomModule* room,
1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                             XmppChatroomEnteredStatus status) {
1192a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    RTC_UNUSED(room);
1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ss_ <<"[ChatroomEnteredStatus status: ";
1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WriteEnteredStatus(ss_, status);
1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ss_ <<"]";
1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void ChatroomExitedStatus(XmppChatroomModule* room,
1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            XmppChatroomExitedStatus status) {
1282a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    RTC_UNUSED(room);
1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ss_ <<"[ChatroomExitedStatus status: ";
1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    WriteExitedStatus(ss_, status);
1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ss_ <<"]";
1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void MemberEntered(XmppChatroomModule* room,
1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                          const XmppChatroomMember* entered_member) {
1362a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    RTC_UNUSED(room);
1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ss_ << "[MemberEntered " << entered_member->member_jid().Str() << "]";
1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void MemberExited(XmppChatroomModule* room,
1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                         const XmppChatroomMember* exited_member) {
1422a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    RTC_UNUSED(room);
1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ss_ << "[MemberExited " << exited_member->member_jid().Str() << "]";
1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void MemberChanged(XmppChatroomModule* room,
1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      const XmppChatroomMember* changed_member) {
1482a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    RTC_UNUSED(room);
1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ss_ << "[MemberChanged " << changed_member->member_jid().Str() << "]";
1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  virtual void MessageReceived(XmppChatroomModule* room, const XmlElement& message) {
1532a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    RTC_UNUSED2(room, message);
1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string Str() {
1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return ss_.str();
1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::string StrClear() {
1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::string result = ss_.str();
1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ss_.str("");
1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return result;
1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgprivate:
1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::stringstream ss_;
1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//! This is the class that holds all of the unit test code for the
1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//! roster module
1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass XmppChatroomModuleTest : public UnitTest {
1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgpublic:
1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  XmppChatroomModuleTest() {}
1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestEnterExitChatroom() {
1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::stringstream dump;
1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Configure the engine
1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    scoped_ptr<XmppEngine> engine(XmppEngine::Create());
1820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    XmppTestHandler handler(engine.get());
1830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Configure the module and handler
1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    scoped_ptr<XmppChatroomModule> chatroom(XmppChatroomModule::Create());
1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Configure the module handler
1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    chatroom->RegisterEngine(engine.get());
1890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Set up callbacks
1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    engine->SetOutputHandler(&handler);
1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    engine->AddStanzaHandler(&handler);
1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    engine->SetSessionHandler(&handler);
1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Set up minimal login info
1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    engine->SetUser(Jid("david@my-server"));
1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    engine->SetPassword("david");
1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Do the whole login handshake
2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    RunLogin(this, engine.get(), &handler);
2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_EQ("", handler.OutputActivity());
2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Get the chatroom and set the handler
2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    XmppTestChatroomHandler chatroom_handler;
2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    chatroom->set_chatroom_handler(static_cast<XmppChatroomHandler*>(&chatroom_handler));
2060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // try to enter the chatroom
2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_EQ(chatroom->state(), XMPP_CHATROOM_STATE_NOT_IN_ROOM);
2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    chatroom->set_nickname("thirdwitch");
2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    chatroom->set_chatroom_jid(Jid("darkcave@my-server"));
2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    chatroom->RequestEnterChatroom("", XMPP_CONNECTION_STATUS_UNKNOWN, "en");
2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_EQ(chatroom_handler.StrClear(), "");
2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_EQ(handler.OutputActivity(),
2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "<presence to=\"darkcave@my-server/thirdwitch\">"
2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        "<muc:x xmlns:muc=\"http://jabber.org/protocol/muc\"/>"
2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "</presence>");
2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_EQ(chatroom->state(), XMPP_CHATROOM_STATE_REQUESTED_ENTER);
2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // simulate the server and test the client
2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::string input;
2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    input = "<presence from=\"darkcave@my-server/firstwitch\" to=\"david@my-server\">"
2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org             "<x xmlns=\"http://jabber.org/protocol/muc#user\">"
2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org              "<item affiliation=\"owner\" role=\"participant\"/>"
2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org             "</x>"
2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            "</presence>";
2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_OK(engine->HandleInput(input.c_str(), input.length()));
2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_EQ(chatroom_handler.StrClear(), "");
2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_EQ(chatroom->state(), XMPP_CHATROOM_STATE_REQUESTED_ENTER);
2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    input = "<presence from=\"darkcave@my-server/secondwitch\" to=\"david@my-server\">"
2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org             "<x xmlns=\"http://jabber.org/protocol/muc#user\">"
2320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org              "<item affiliation=\"member\" role=\"participant\"/>"
2330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org             "</x>"
2340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            "</presence>";
2350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_OK(engine->HandleInput(input.c_str(), input.length()));
2360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_EQ(chatroom_handler.StrClear(), "");
2370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_EQ(chatroom->state(), XMPP_CHATROOM_STATE_REQUESTED_ENTER);
2380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    input = "<presence from=\"darkcave@my-server/thirdwitch\" to=\"david@my-server\">"
2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org             "<x xmlns=\"http://jabber.org/protocol/muc#user\">"
2410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org              "<item affiliation=\"member\" role=\"participant\"/>"
2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org             "</x>"
2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            "</presence>";
2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_OK(engine->HandleInput(input.c_str(), input.length()));
2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_EQ(chatroom_handler.StrClear(),
2460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "[ChatroomEnteredStatus status: success]");
2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_EQ(chatroom->state(), XMPP_CHATROOM_STATE_IN_ROOM);
2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // simulate somebody else entering the room after we entered
2500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    input = "<presence from=\"darkcave@my-server/fourthwitch\" to=\"david@my-server\">"
2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org             "<x xmlns=\"http://jabber.org/protocol/muc#user\">"
2520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org              "<item affiliation=\"member\" role=\"participant\"/>"
2530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org             "</x>"
2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            "</presence>";
2550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_OK(engine->HandleInput(input.c_str(), input.length()));
2560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_EQ(chatroom_handler.StrClear(), "[MemberEntered darkcave@my-server/fourthwitch]");
2570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_EQ(chatroom->state(), XMPP_CHATROOM_STATE_IN_ROOM);
2580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // simulate somebody else leaving the room after we entered
2600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    input = "<presence from=\"darkcave@my-server/secondwitch\" to=\"david@my-server\" type=\"unavailable\">"
2610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org             "<x xmlns=\"http://jabber.org/protocol/muc#user\">"
2620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org              "<item affiliation=\"member\" role=\"participant\"/>"
2630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org             "</x>"
2640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            "</presence>";
2650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_OK(engine->HandleInput(input.c_str(), input.length()));
2660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_EQ(chatroom_handler.StrClear(), "[MemberExited darkcave@my-server/secondwitch]");
2670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_EQ(chatroom->state(), XMPP_CHATROOM_STATE_IN_ROOM);
2680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // try to leave the room
2700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    chatroom->RequestExitChatroom();
2710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_EQ(chatroom_handler.StrClear(), "");
2720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_EQ(handler.OutputActivity(),
2730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "<presence to=\"darkcave@my-server/thirdwitch\" type=\"unavailable\"/>");
2740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_EQ(chatroom->state(), XMPP_CHATROOM_STATE_REQUESTED_EXIT);
2750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // simulate the server and test the client
2770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    input = "<presence from=\"darkcave@my-server/thirdwitch\" to=\"david@my-server\" type=\"unavailable\">"
2780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org             "<x xmlns=\"http://jabber.org/protocol/muc#user\">"
2790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org              "<item affiliation=\"member\" role=\"participant\"/>"
2800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org             "</x>"
2810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            "</presence>";
2820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_OK(engine->HandleInput(input.c_str(), input.length()));
2830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_EQ(chatroom_handler.StrClear(),
2840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      "[ChatroomExitedStatus status: requested]");
2850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TEST_EQ(chatroom->state(), XMPP_CHATROOM_STATE_NOT_IN_ROOM);
2860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
2890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// A global function that creates the test suite for this set of tests.
2910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTestBase* ChatroomModuleTest_Create() {
2920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  TestSuite* suite = new TestSuite("ChatroomModuleTest");
2930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ADD_TEST(suite, XmppChatroomModuleTest, TestEnterExitChatroom);
2940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  return suite;
2950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
2960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
298