diff --git a/include/transport/user.h b/include/transport/user.h index 4e98c4a8..11c253b0 100644 --- a/include/transport/user.h +++ b/include/transport/user.h @@ -110,6 +110,10 @@ class User : public Swift::EntityCapsProvider { return m_connected; } + int getResourceCount() { + return m_resources; + } + boost::signal onReadyToConnect; boost::signal onPresenceChanged; boost::signal onRoomJoined; diff --git a/src/tests/basictest.cpp b/src/tests/basictest.cpp index e9779f9c..9a893e7d 100644 --- a/src/tests/basictest.cpp +++ b/src/tests/basictest.cpp @@ -41,7 +41,7 @@ using namespace Transport; void BasicTest::setMeUp (void) { streamEnded = false; - std::istringstream ifs("service.server_mode = 1\nservice.jid=localhost"); + std::istringstream ifs("service.server_mode = 1\nservice.jid=localhost\nservice.more_resources=1\n"); cfg = new Config(); cfg->load(ifs); @@ -86,6 +86,7 @@ void BasicTest::setMeUp (void) { payloadSerializers->addSerializer(new Swift::GatewayPayloadSerializer()); parser = new Swift::XMPPParser(this, payloadParserFactories, factories->getXMLParserFactory()); + parser2 = new Swift::XMPPParser(this, payloadParserFactories, factories->getXMLParserFactory()); serverFromClientSession = boost::shared_ptr(new Swift::ServerFromClientSession("id", factories->getConnectionFactory()->createConnection(), payloadParserFactories, payloadSerializers, userRegistry, factories->getXMLParserFactory(), Swift::JID("user@localhost/resource"))); @@ -95,13 +96,19 @@ void BasicTest::setMeUp (void) { dynamic_cast(component->getStanzaChannel())->addSession(serverFromClientSession); parser->parse(""); + parser2->parse(""); received.clear(); + received2.clear(); receivedData.clear(); loop->processEvents(); } void BasicTest::tearMeDown (void) { dynamic_cast(component->getStanzaChannel())->removeSession(serverFromClientSession); + if (serverFromClientSession2) { + dynamic_cast(component->getStanzaChannel())->removeSession(serverFromClientSession2); + serverFromClientSession2.reset(); + } delete component; delete userRegistry; delete factories; @@ -109,29 +116,48 @@ void BasicTest::tearMeDown (void) { delete loop; delete cfg; delete parser; + delete parser2; delete storage; delete userRegistration; delete itemsResponder; received.clear(); + received2.clear(); receivedData.clear(); + receivedData2.clear(); } void BasicTest::handleDataReceived(const Swift::SafeByteArray &data) { // std::cout << safeByteArrayToString(data) << "\n"; + stream1_active = true; receivedData += safeByteArrayToString(data) + "\n"; parser->parse(safeByteArrayToString(data)); } +void BasicTest::handleDataReceived2(const Swift::SafeByteArray &data) { +// std::cout << safeByteArrayToString(data) << "\n"; + stream1_active = false; + receivedData2 += safeByteArrayToString(data) + "\n"; + parser2->parse(safeByteArrayToString(data)); +} + void BasicTest::handleStreamStart(const Swift::ProtocolHeader&) { } void BasicTest::dumpReceived() { + std::cout << "\nStream1:\n"; std::cout << receivedData << "\n"; + std::cout << "Stream2:\n"; + std::cout << receivedData2 << "\n"; } void BasicTest::handleElement(boost::shared_ptr element) { - received.push_back(element); + if (stream1_active) { + received.push_back(element); + } + else { + received2.push_back(element); + } } void BasicTest::handleStreamEnd() { @@ -159,6 +185,7 @@ Swift::Stanza *BasicTest::getStanza(boost::shared_ptr element) { void BasicTest::connectUser() { CPPUNIT_ASSERT_EQUAL(0, userManager->getUserCount()); userRegistry->isValidUserPassword(Swift::JID("user@localhost/resource"), serverFromClientSession.get(), Swift::createSafeByteArray("password")); + userRegistry->onPasswordValid(Swift::JID("user@localhost/resource")); loop->processEvents(); CPPUNIT_ASSERT_EQUAL(1, userManager->getUserCount()); @@ -173,9 +200,39 @@ void BasicTest::connectUser() { user->setConnected(true); CPPUNIT_ASSERT(user->isConnected() == true); - CPPUNIT_ASSERT_EQUAL(1, (int) received.size()); + CPPUNIT_ASSERT_EQUAL(2, (int) received.size()); CPPUNIT_ASSERT(getStanza(received[0])->getPayload()); received.clear(); + receivedData.clear(); +} + +void BasicTest::connectSecondResource() { + serverFromClientSession2 = boost::shared_ptr(new Swift::ServerFromClientSession("id", factories->getConnectionFactory()->createConnection(), + payloadParserFactories, payloadSerializers, userRegistry, factories->getXMLParserFactory(), Swift::JID("user@localhost/resource2"))); + serverFromClientSession2->startSession(); + + serverFromClientSession2->onDataWritten.connect(boost::bind(&BasicTest::handleDataReceived2, this, _1)); + + dynamic_cast(component->getStanzaChannel())->addSession(serverFromClientSession2); + + userRegistry->isValidUserPassword(Swift::JID("user@localhost/resource2"), serverFromClientSession2.get(), Swift::createSafeByteArray("password")); + userRegistry->onPasswordValid(Swift::JID("user@localhost/resource2")); + + loop->processEvents(); + + Swift::Presence::ref response = Swift::Presence::create(); + response->setTo("localhost"); + response->setFrom("user@localhost/resource2"); + injectPresence(response); + loop->processEvents(); + + CPPUNIT_ASSERT_EQUAL(1, userManager->getUserCount()); + + User *user = userManager->getUser("user@localhost"); + CPPUNIT_ASSERT(user); + CPPUNIT_ASSERT_EQUAL(2, user->getResourceCount()); + + CPPUNIT_ASSERT(getStanza(received2[1])->getPayload()); } void BasicTest::disconnectUser() { diff --git a/src/tests/basictest.h b/src/tests/basictest.h index ee4415cd..554ab5b6 100644 --- a/src/tests/basictest.h +++ b/src/tests/basictest.h @@ -205,6 +205,7 @@ class BasicTest : public Swift::XMPPParserClient { void tearMeDown (void); void handleDataReceived(const Swift::SafeByteArray &data); + void handleDataReceived2(const Swift::SafeByteArray &data); void handleStreamStart(const Swift::ProtocolHeader&); @@ -228,6 +229,7 @@ class BasicTest : public Swift::XMPPParserClient { } void connectUser(); + void connectSecondResource(); void disconnectUser(); void add2Buddies(); @@ -237,9 +239,11 @@ class BasicTest : public Swift::XMPPParserClient { bool streamEnded; UserManager *userManager; boost::shared_ptr serverFromClientSession; + boost::shared_ptr serverFromClientSession2; Swift::FullPayloadSerializerCollection* payloadSerializers; Swift::FullPayloadParserFactoryCollection* payloadParserFactories; Swift::XMPPParser *parser; + Swift::XMPPParser *parser2; UserRegistry *userRegistry; Config *cfg; Swift::Server *server; @@ -248,9 +252,12 @@ class BasicTest : public Swift::XMPPParserClient { TestingFactory *factory; Component *component; std::vector > received; + std::vector > received2; std::string receivedData; + std::string receivedData2; StorageBackend *storage; UserRegistration *userRegistration; DiscoItemsResponder *itemsResponder; + bool stream1_active; }; diff --git a/src/tests/usermanager.cpp b/src/tests/usermanager.cpp index 80a78cf7..1f03575d 100644 --- a/src/tests/usermanager.cpp +++ b/src/tests/usermanager.cpp @@ -23,6 +23,7 @@ using namespace Transport; class UserManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTest { CPPUNIT_TEST_SUITE(UserManagerTest); CPPUNIT_TEST(connectUser); + CPPUNIT_TEST(connectTwoResources); CPPUNIT_TEST(connectUserTransportDisabled); CPPUNIT_TEST(connectUserRegistrationNeeded); CPPUNIT_TEST(connectUserRegistrationNeededRegistered); @@ -86,6 +87,22 @@ class UserManagerTest : public CPPUNIT_NS :: TestFixture, public BasicTest { CPPUNIT_ASSERT_EQUAL(Swift::Presence::Unavailable, presence->getType()); } + void connectTwoResources() { + connectUser(); + add2Buddies(); + connectSecondResource(); + + // we should get presences + CPPUNIT_ASSERT_EQUAL(4, (int) received2.size()); + CPPUNIT_ASSERT(dynamic_cast(getStanza(received2[2]))); + CPPUNIT_ASSERT_EQUAL(Swift::StatusShow::Away, dynamic_cast(getStanza(received2[2]))->getShow()); + CPPUNIT_ASSERT_EQUAL(std::string("status1"), dynamic_cast(getStanza(received2[2]))->getStatus()); + + CPPUNIT_ASSERT(dynamic_cast(getStanza(received2[3]))); + CPPUNIT_ASSERT_EQUAL(Swift::StatusShow::Away, dynamic_cast(getStanza(received2[3]))->getShow()); + CPPUNIT_ASSERT_EQUAL(std::string("status2"), dynamic_cast(getStanza(received2[3]))->getStatus()); + } + }; CPPUNIT_TEST_SUITE_REGISTRATION (UserManagerTest); diff --git a/src/user.cpp b/src/user.cpp index 56f53f72..242afbba 100644 --- a/src/user.cpp +++ b/src/user.cpp @@ -266,13 +266,14 @@ void User::handlePresence(Swift::Presence::ref presence) { } else { sendCurrentPresence(); - // This resource is new, so we have to send buddies presences - if (currentResourcesCount != m_resources) { - m_rosterManager->sendCurrentPresences(presence->getFrom()); - } } } + // This resource is new, so we have to send buddies presences + if (presence->getType() != Swift::Presence::Unavailable && currentResourcesCount != m_resources) { + m_rosterManager->sendCurrentPresences(presence->getFrom()); + } + m_resources = currentResourcesCount;