diff options
Diffstat (limited to 'Swift/Controllers/Chat/UnitTest')
| -rw-r--r-- | Swift/Controllers/Chat/UnitTest/ChatListWindowChatTest.cpp | 292 | ||||
| -rw-r--r-- | Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp | 105 | 
2 files changed, 394 insertions, 3 deletions
| diff --git a/Swift/Controllers/Chat/UnitTest/ChatListWindowChatTest.cpp b/Swift/Controllers/Chat/UnitTest/ChatListWindowChatTest.cpp new file mode 100644 index 0000000..9561e2b --- /dev/null +++ b/Swift/Controllers/Chat/UnitTest/ChatListWindowChatTest.cpp @@ -0,0 +1,292 @@ +/* + * Copyright (c) 2017 Isode Limited. + * All rights reserved. + * See the COPYING file for more information. + */ + +#include <memory> +#include <string> +#include <vector> + +#include <boost/algorithm/string.hpp> +#include <boost/version.hpp> + +#include <gtest/gtest.h> + +#include <Swiften/Base/ByteArray.h> +#include <Swiften/StringCodecs/Base64.h> + +#include <Swift/Controllers/Chat/ChatListWindowChatBoostSerialize.h> +#include <Swift/Controllers/UIInterfaces/ChatListWindow.h> + +using namespace Swift; + +class ChatListWindowChatTest : public ::testing::Test { +protected: +    virtual void SetUp() {} +    virtual void TearDown() {} + +    void testOptionalPasswordValue(const boost::optional<std::string>& value1, const std::string& value2) { +        auto archiveLibraryVersion = boost::archive::BOOST_ARCHIVE_VERSION(); +        if (archiveLibraryVersion != Swift::BoostArchiveSkipVersion) { +            EXPECT_EQ(value1.get_value_or(""), value2); +        } +        else { +            EXPECT_EQ(value1.get_value_or(""), ""); +        } +    } + +    std::string chatsSerialise(const std::vector<ChatListWindow::Chat>& chats) { +        std::stringstream serializeStream; +        boost::archive::text_oarchive oa(serializeStream); +        oa & chats; +        std::string serializedStr = Base64::encode(createByteArray(serializeStream.str())); +        return serializedStr; +    } + +    std::vector<ChatListWindow::Chat> chatsDeserialise(const std::string& b64chats) { +        ByteArray debase64 = Base64::decode(b64chats); +        std::vector<ChatListWindow::Chat> recentChats; +        std::stringstream deserializeStream(std::string(reinterpret_cast<const char*>(vecptr(debase64)), debase64.size())); +        try { +            boost::archive::text_iarchive ia(deserializeStream); +            ia >> recentChats; +        } +        catch (const boost::archive::archive_exception& e) { +            EXPECT_TRUE(false) << "Archive Version:" << boost::archive::BOOST_ARCHIVE_VERSION() << " " << e.what() << std::endl; +            recentChats.clear(); +            return recentChats; +        } +        recentChats.erase(std::remove(recentChats.begin(), recentChats.end(), ChatListWindow::Chat()), recentChats.end()); +        return recentChats; +    } +}; + +TEST_F(ChatListWindowChatTest, testNormalSerialization) { +    ChatListWindow::Chat chat1("swift@rooms.swift.im", "swift@rooms.swift.im", "Some text 0", 0, StatusShow::None, "", false, false, "Nick Name"); +    ChatListWindow::Chat chat2("testuser1@domain.com", "swift@rooms2.swift.im", "Some text 1", 0, StatusShow::None, "", false, false, "Nick Name", std::string("pass")); +    ChatListWindow::Chat chat3("testuser2@domain.com", "room 2", "Some text 2", 0, StatusShow::None, "", true, false, "Nick Name"); +    ChatListWindow::Chat chat4("testuser3@domain.com", "room 3", "Some text 2", 0, StatusShow::None, "", true, false, "Nick Name", std::string("pass")); + +    std::map<std::string, JID> impromptuJIDs; +    impromptuJIDs["testuser1@domain.com"] = "testuser1@domain.com"; +    impromptuJIDs["testuser2@domain.com"] = "testuser2@domain.com"; +    std::map<JID, std::string> inviteesNames; +    inviteesNames["user1@domain.com"] = "user1@domain.com"; + +    chat3.impromptuJIDs = impromptuJIDs; +    chat3.inviteesNames = inviteesNames; +    chat4.impromptuJIDs = impromptuJIDs; +    chat4.inviteesNames = inviteesNames; + +    std::vector<ChatListWindow::Chat> chats; +    chats.push_back(chat1); +    chats.push_back(chat2); +    chats.push_back(chat3); +    chats.push_back(chat4); + +    auto base64 = chatsSerialise(chats); +    ASSERT_TRUE(base64.size() > 0); +    auto restoredChats = chatsDeserialise(base64); +    ASSERT_EQ(restoredChats.size(), 4); + +    EXPECT_FALSE(restoredChats[0].isMUC); +    EXPECT_EQ(restoredChats[0].jid, "swift@rooms.swift.im"); +    EXPECT_EQ(restoredChats[0].chatName, "swift@rooms.swift.im"); +    EXPECT_EQ(restoredChats[0].activity, "Some text 0"); +    EXPECT_EQ(restoredChats[0].nick, "Nick Name"); +    EXPECT_EQ(restoredChats[0].impromptuJIDs.size(), 0); +    testOptionalPasswordValue(restoredChats[0].password, ""); +    EXPECT_EQ(restoredChats[0].inviteesNames.size(), 0); + +    EXPECT_FALSE(restoredChats[1].isMUC); +    EXPECT_EQ(restoredChats[1].jid, "testuser1@domain.com"); +    EXPECT_EQ(restoredChats[1].chatName, "swift@rooms2.swift.im"); +    EXPECT_EQ(restoredChats[1].activity, "Some text 1"); +    EXPECT_EQ(restoredChats[1].nick, "Nick Name"); +    EXPECT_EQ(restoredChats[1].impromptuJIDs.size(), 0); +    testOptionalPasswordValue(restoredChats[1].password, "pass"); +    EXPECT_EQ(restoredChats[1].inviteesNames.size(), 0); + +    EXPECT_TRUE(restoredChats[2].isMUC); +    EXPECT_EQ(restoredChats[2].jid, "testuser2@domain.com"); +    EXPECT_EQ(restoredChats[2].chatName, "room 2"); +    EXPECT_EQ(restoredChats[2].activity, "Some text 2"); +    EXPECT_EQ(restoredChats[2].nick, "Nick Name"); +    ASSERT_EQ(restoredChats[2].impromptuJIDs.size(), 2); +    EXPECT_EQ(restoredChats[2].impromptuJIDs["testuser1@domain.com"], "testuser1@domain.com"); +    EXPECT_EQ(restoredChats[2].impromptuJIDs["testuser2@domain.com"], "testuser2@domain.com"); +    testOptionalPasswordValue(restoredChats[2].password, ""); +    ASSERT_EQ(restoredChats[2].inviteesNames.size(), 1); +    EXPECT_EQ(restoredChats[2].inviteesNames["user1@domain.com"], "user1@domain.com"); + +    EXPECT_TRUE(restoredChats[3].isMUC); +    EXPECT_EQ(restoredChats[3].jid, "testuser3@domain.com"); +    EXPECT_EQ(restoredChats[3].chatName, "room 3"); +    EXPECT_EQ(restoredChats[3].activity, "Some text 2"); +    EXPECT_EQ(restoredChats[3].nick, "Nick Name"); +    ASSERT_EQ(restoredChats[3].impromptuJIDs.size(), 2); +    EXPECT_EQ(restoredChats[3].impromptuJIDs["testuser1@domain.com"], "testuser1@domain.com"); +    EXPECT_EQ(restoredChats[3].impromptuJIDs["testuser2@domain.com"], "testuser2@domain.com"); +    testOptionalPasswordValue(restoredChats[3].password, "pass"); +    ASSERT_EQ(restoredChats[3].inviteesNames.size(), 1); +    EXPECT_EQ(restoredChats[3].inviteesNames["user1@domain.com"], "user1@domain.com"); +} + +TEST_F(ChatListWindowChatTest, testVersionsSerialization) { +    auto archiveLibraryVersion = boost::archive::BOOST_ARCHIVE_VERSION(); +    /* +    The following strings are base64 serialised vectors with these Swift::ChatListWindow::Chat elements: + +    Chat1: Jid = "swift@rooms.swift.im", ChatName = "swift@rooms.swift.im", Activity = "Some text 0", isMUC = false, nick="Nick Name" +    Chat2: Jid = "testuser1@domain.com", ChatName = "swift@rooms2.swift.im", Activity = "Some text 1", isMUC = false, nick="Nick Name", password = "pass" +    Chat3: Jid = "testuser2@domain.com", ChatName = "room2", Activity = "Some text 2", isMUC = true, nick="Nick Name", impromptuJIDs, inviteesNames +    Chat4: Jid = "testuser3@domain.com", ChatName = "room3", Activity = "Some text 2", isMUC = true, nick="Nick Name", impromptuJIDs, password = "pass", inviteesNames + +    impromptuJIDs = {("testuser1@domain.com","testuser1@domain.com"), ("testuser2@domain.com", "testuser2@domain.com")} +    inviteesNames = {("user1@domain.com","user1@domain.com")} +    */ +    std::string serializedChats_BoostArchiveV10_ClassVersion_0 = "MjIgc2VyaWFsaXphdGlvbjo6YXJjaGl2ZSAxMCAwIDAgNCAwIDAgMCAwIDAgMjAgc3dpZnRAcm9vbXMuc3dpZnQuaW0gMjAgc3dpZnRAcm9vbXMuc3dpZnQuaW0gMTEgU29tZSB0ZXh0IDAgMCA5IE5pY2sgTmFtZSAwIDAgMCAwIDIwIHRlc3R1c2VyMUBkb21haW4uY29tIDIxIHN3aWZ0QHJvb21zMi5zd2lmdC5pbSAxMSBTb21lIHRleHQgMSAwIDkgTmljayBOYW1lIDAgMCAyMCB0ZXN0dXNlcjJAZG9tYWluLmNvbSA2IHJvb20gMiAxMSBTb21lIHRleHQgMiAxIDkgTmljayBOYW1lIDIgMCAwIDAgMjAgdGVzdHVzZXIxQGRvbWFpbi5jb20gMjAgdGVzdHVzZXIxQGRvbWFpbi5jb20gMjAgdGVzdHVzZXIyQGRvbWFpbi5jb20gMjAgdGVzdHVzZXIyQGRvbWFpbi5jb20gMjAgdGVzdHVzZXIzQGRvbWFpbi5jb20gNiByb29tIDMgMTEgU29tZSB0ZXh0IDIgMSA5IE5pY2sgTmFtZSAyIDAgMjAgdGVzdHVzZXIxQGRvbWFpbi5jb20gMjAgdGVzdHVzZXIxQGRvbWFpbi5jb20gMjAgdGVzdHVzZXIyQGRvbWFpbi5jb20gMjAgdGVzdHVzZXIyQGRvbWFpbi5jb20="; +    { +        auto restoredChats = chatsDeserialise(serializedChats_BoostArchiveV10_ClassVersion_0); +        if (archiveLibraryVersion == Swift::BoostArchiveSkipVersion) { +            ASSERT_EQ(restoredChats.size(), 0); +        } +        else { +            ASSERT_EQ(restoredChats.size(), 4); + +            EXPECT_FALSE(restoredChats[0].isMUC); +            EXPECT_EQ(restoredChats[0].jid, "swift@rooms.swift.im"); +            EXPECT_EQ(restoredChats[0].chatName, "swift@rooms.swift.im"); +            EXPECT_EQ(restoredChats[0].activity, "Some text 0"); +            EXPECT_EQ(restoredChats[0].nick, "Nick Name"); +            EXPECT_EQ(restoredChats[0].impromptuJIDs.size(), 0); + +            EXPECT_FALSE(restoredChats[1].isMUC); +            EXPECT_EQ(restoredChats[1].jid, "testuser1@domain.com"); +            EXPECT_EQ(restoredChats[1].chatName, "swift@rooms2.swift.im"); +            EXPECT_EQ(restoredChats[1].activity, "Some text 1"); +            EXPECT_EQ(restoredChats[1].nick, "Nick Name"); +            EXPECT_EQ(restoredChats[1].impromptuJIDs.size(), 0); + +            EXPECT_TRUE(restoredChats[2].isMUC); +            EXPECT_EQ(restoredChats[2].jid, "testuser2@domain.com"); +            EXPECT_EQ(restoredChats[2].chatName, "room 2"); +            EXPECT_EQ(restoredChats[2].activity, "Some text 2"); +            EXPECT_EQ(restoredChats[2].nick, "Nick Name"); +            ASSERT_EQ(restoredChats[2].impromptuJIDs.size(), 2); +            EXPECT_EQ(restoredChats[2].impromptuJIDs["testuser1@domain.com"], "testuser1@domain.com"); +            EXPECT_EQ(restoredChats[2].impromptuJIDs["testuser2@domain.com"], "testuser2@domain.com"); + +            EXPECT_TRUE(restoredChats[3].isMUC); +            EXPECT_EQ(restoredChats[3].jid, "testuser3@domain.com"); +            EXPECT_EQ(restoredChats[3].chatName, "room 3"); +            EXPECT_EQ(restoredChats[3].activity, "Some text 2"); +            EXPECT_EQ(restoredChats[3].nick, "Nick Name"); +            ASSERT_EQ(restoredChats[3].impromptuJIDs.size(), 2); +            EXPECT_EQ(restoredChats[3].impromptuJIDs["testuser1@domain.com"], "testuser1@domain.com"); +            EXPECT_EQ(restoredChats[3].impromptuJIDs["testuser2@domain.com"], "testuser2@domain.com"); +        } +    } + +    std::string serializedChats_BoostArchiveV10_ClassVersion_1 = "MjIgc2VyaWFsaXphdGlvbjo6YXJjaGl2ZSAxMCAwIDAgNCAxIDAgMSAwIDAgMjAgc3dpZnRAcm9vbXMuc3dpZnQuaW0gMjAgc3dpZnRAcm9vbXMuc3dpZnQuaW0gMTEgU29tZSB0ZXh0IDAgMCA5IE5pY2sgTmFtZSAwIDAgMCAwIDAgMCAwIDIwIHRlc3R1c2VyMUBkb21haW4uY29tIDIxIHN3aWZ0QHJvb21zMi5zd2lmdC5pbSAxMSBTb21lIHRleHQgMSAwIDkgTmljayBOYW1lIDAgMCAxIDAgNCBwYXNzIDIwIHRlc3R1c2VyMkBkb21haW4uY29tIDYgcm9vbSAyIDExIFNvbWUgdGV4dCAyIDEgOSBOaWNrIE5hbWUgMiAwIDAgMCAyMCB0ZXN0dXNlcjFAZG9tYWluLmNvbSAyMCB0ZXN0dXNlcjFAZG9tYWluLmNvbSAyMCB0ZXN0dXNlcjJAZG9tYWluLmNvbSAyMCB0ZXN0dXNlcjJAZG9tYWluLmNvbSAwIDIwIHRlc3R1c2VyM0Bkb21haW4uY29tIDYgcm9vbSAzIDExIFNvbWUgdGV4dCAyIDEgOSBOaWNrIE5hbWUgMiAwIDIwIHRlc3R1c2VyMUBkb21haW4uY29tIDIwIHRlc3R1c2VyMUBkb21haW4uY29tIDIwIHRlc3R1c2VyMkBkb21haW4uY29tIDIwIHRlc3R1c2VyMkBkb21haW4uY29tIDEgMCA0IHBhc3M="; +    { +        auto restoredChats = chatsDeserialise(serializedChats_BoostArchiveV10_ClassVersion_1); +        if (archiveLibraryVersion == Swift::BoostArchiveSkipVersion) { +            ASSERT_EQ(restoredChats.size(), 0); +        } +        else { +            ASSERT_EQ(restoredChats.size(), 4); + +            EXPECT_FALSE(restoredChats[0].isMUC); +            EXPECT_EQ(restoredChats[0].jid, "swift@rooms.swift.im"); +            EXPECT_EQ(restoredChats[0].chatName, "swift@rooms.swift.im"); +            EXPECT_EQ(restoredChats[0].activity, "Some text 0"); +            EXPECT_EQ(restoredChats[0].nick, "Nick Name"); +            EXPECT_EQ(restoredChats[0].impromptuJIDs.size(), 0); +            EXPECT_EQ(restoredChats[0].password.get_value_or(""), ""); + +            EXPECT_FALSE(restoredChats[1].isMUC); +            EXPECT_EQ(restoredChats[1].jid, "testuser1@domain.com"); +            EXPECT_EQ(restoredChats[1].chatName, "swift@rooms2.swift.im"); +            EXPECT_EQ(restoredChats[1].activity, "Some text 1"); +            EXPECT_EQ(restoredChats[1].nick, "Nick Name"); +            EXPECT_EQ(restoredChats[1].impromptuJIDs.size(), 0); +            EXPECT_EQ(restoredChats[1].password.get_value_or(""), "pass"); + +            EXPECT_TRUE(restoredChats[2].isMUC); +            EXPECT_EQ(restoredChats[2].jid, "testuser2@domain.com"); +            EXPECT_EQ(restoredChats[2].chatName, "room 2"); +            EXPECT_EQ(restoredChats[2].activity, "Some text 2"); +            EXPECT_EQ(restoredChats[2].nick, "Nick Name"); +            ASSERT_EQ(restoredChats[2].impromptuJIDs.size(), 2); +            EXPECT_EQ(restoredChats[2].impromptuJIDs["testuser1@domain.com"], "testuser1@domain.com"); +            EXPECT_EQ(restoredChats[2].impromptuJIDs["testuser2@domain.com"], "testuser2@domain.com"); +            EXPECT_EQ(restoredChats[2].password.get_value_or(""), ""); + +            EXPECT_TRUE(restoredChats[3].isMUC); +            EXPECT_EQ(restoredChats[3].jid, "testuser3@domain.com"); +            EXPECT_EQ(restoredChats[3].chatName, "room 3"); +            EXPECT_EQ(restoredChats[3].activity, "Some text 2"); +            EXPECT_EQ(restoredChats[3].nick, "Nick Name"); +            ASSERT_EQ(restoredChats[3].impromptuJIDs.size(), 2); +            EXPECT_EQ(restoredChats[3].impromptuJIDs["testuser1@domain.com"], "testuser1@domain.com"); +            EXPECT_EQ(restoredChats[3].impromptuJIDs["testuser2@domain.com"], "testuser2@domain.com"); +            EXPECT_EQ(restoredChats[3].password.get_value_or(""), "pass"); +        } +    } + +    std::string serializedChats_BoostArchiveV10_ClassVersion_2 = "MjIgc2VyaWFsaXphdGlvbjo6YXJjaGl2ZSAxMCAwIDAgNCAyIDAgMiAwIDAgMjAgc3dpZnRAcm9vbXMuc3dpZnQuaW0gMjAgc3dpZnRAcm9vbXMuc3dpZnQuaW0gMTEgU29tZSB0ZXh0IDAgMCA5IE5pY2sgTmFtZSAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMjAgdGVzdHVzZXIxQGRvbWFpbi5jb20gMjEgc3dpZnRAcm9vbXMyLnN3aWZ0LmltIDExIFNvbWUgdGV4dCAxIDAgOSBOaWNrIE5hbWUgMCAwIDEgMCA0IHBhc3MgMCAwIDIwIHRlc3R1c2VyMkBkb21haW4uY29tIDYgcm9vbSAyIDExIFNvbWUgdGV4dCAyIDEgOSBOaWNrIE5hbWUgMiAwIDAgMCAyMCB0ZXN0dXNlcjFAZG9tYWluLmNvbSAyMCB0ZXN0dXNlcjFAZG9tYWluLmNvbSAyMCB0ZXN0dXNlcjJAZG9tYWluLmNvbSAyMCB0ZXN0dXNlcjJAZG9tYWluLmNvbSAwIDEgMCAwIDAgMTYgdXNlcjFAZG9tYWluLmNvbSAxNiB1c2VyMUBkb21haW4uY29tIDIwIHRlc3R1c2VyM0Bkb21haW4uY29tIDYgcm9vbSAzIDExIFNvbWUgdGV4dCAyIDEgOSBOaWNrIE5hbWUgMiAwIDIwIHRlc3R1c2VyMUBkb21haW4uY29tIDIwIHRlc3R1c2VyMUBkb21haW4uY29tIDIwIHRlc3R1c2VyMkBkb21haW4uY29tIDIwIHRlc3R1c2VyMkBkb21haW4uY29tIDEgMCA0IHBhc3MgMSAwIDE2IHVzZXIxQGRvbWFpbi5jb20gMTYgdXNlcjFAZG9tYWluLmNvbQ=="; +    { +        auto restoredChats = chatsDeserialise(serializedChats_BoostArchiveV10_ClassVersion_2); +        if (archiveLibraryVersion == Swift::BoostArchiveSkipVersion) { +            ASSERT_EQ(restoredChats.size(), 0); +        } +        else { +            ASSERT_EQ(restoredChats.size(), 4); + +            EXPECT_FALSE(restoredChats[0].isMUC); +            EXPECT_EQ(restoredChats[0].jid, "swift@rooms.swift.im"); +            EXPECT_EQ(restoredChats[0].chatName, "swift@rooms.swift.im"); +            EXPECT_EQ(restoredChats[0].activity, "Some text 0"); +            EXPECT_EQ(restoredChats[0].nick, "Nick Name"); +            EXPECT_EQ(restoredChats[0].impromptuJIDs.size(), 0); +            EXPECT_EQ(restoredChats[0].password.get_value_or(""), ""); +            EXPECT_EQ(restoredChats[0].inviteesNames.size(), 0); + +            EXPECT_FALSE(restoredChats[1].isMUC); +            EXPECT_EQ(restoredChats[1].jid, "testuser1@domain.com"); +            EXPECT_EQ(restoredChats[1].chatName, "swift@rooms2.swift.im"); +            EXPECT_EQ(restoredChats[1].activity, "Some text 1"); +            EXPECT_EQ(restoredChats[1].nick, "Nick Name"); +            EXPECT_EQ(restoredChats[1].impromptuJIDs.size(), 0); +            EXPECT_EQ(restoredChats[1].password.get_value_or(""), "pass"); +            EXPECT_EQ(restoredChats[1].inviteesNames.size(), 0); + +            EXPECT_TRUE(restoredChats[2].isMUC); +            EXPECT_EQ(restoredChats[2].jid, "testuser2@domain.com"); +            EXPECT_EQ(restoredChats[2].chatName, "room 2"); +            EXPECT_EQ(restoredChats[2].activity, "Some text 2"); +            EXPECT_EQ(restoredChats[2].nick, "Nick Name"); +            ASSERT_EQ(restoredChats[2].impromptuJIDs.size(), 2); +            EXPECT_EQ(restoredChats[2].impromptuJIDs["testuser1@domain.com"], "testuser1@domain.com"); +            EXPECT_EQ(restoredChats[2].impromptuJIDs["testuser2@domain.com"], "testuser2@domain.com"); +            EXPECT_EQ(restoredChats[2].password.get_value_or(""), ""); +            ASSERT_EQ(restoredChats[2].inviteesNames.size(), 1); +            EXPECT_EQ(restoredChats[2].inviteesNames["user1@domain.com"], "user1@domain.com"); + +            EXPECT_TRUE(restoredChats[3].isMUC); +            EXPECT_EQ(restoredChats[3].jid, "testuser3@domain.com"); +            EXPECT_EQ(restoredChats[3].chatName, "room 3"); +            EXPECT_EQ(restoredChats[3].activity, "Some text 2"); +            EXPECT_EQ(restoredChats[3].nick, "Nick Name"); +            ASSERT_EQ(restoredChats[3].impromptuJIDs.size(), 2); +            EXPECT_EQ(restoredChats[3].impromptuJIDs["testuser1@domain.com"], "testuser1@domain.com"); +            EXPECT_EQ(restoredChats[3].impromptuJIDs["testuser2@domain.com"], "testuser2@domain.com"); +            EXPECT_EQ(restoredChats[3].password.get_value_or(""), "pass"); +            ASSERT_EQ(restoredChats[3].inviteesNames.size(), 1); +            EXPECT_EQ(restoredChats[3].inviteesNames["user1@domain.com"], "user1@domain.com"); +        } +    } +} + diff --git a/Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp b/Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp index e06a3c7..4a46b32 100644 --- a/Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp +++ b/Swift/Controllers/Chat/UnitTest/ChatsManagerTest.cpp @@ -1,5 +1,5 @@  /* - * Copyright (c) 2010-2017 Isode Limited. + * Copyright (c) 2010-2018 Isode Limited.   * All rights reserved.   * See the COPYING file for more information.   */ @@ -32,9 +32,12 @@  #include <Swiften/Elements/Forwarded.h>  #include <Swiften/Elements/MUCInvitationPayload.h>  #include <Swiften/Elements/MUCUserPayload.h> +#include <Swiften/Elements/PrivateStorage.h> +#include <Swiften/Elements/Storage.h>  #include <Swiften/FileTransfer/UnitTest/DummyFileTransferManager.h>  #include <Swiften/Jingle/JingleSessionManager.h>  #include <Swiften/MUC/MUCManager.h> +#include <Swiften/MUC/UnitTest/MockMUC.h>  #include <Swiften/Network/DummyTimerFactory.h>  #include <Swiften/Presence/DirectedPresenceSender.h>  #include <Swiften/Presence/PresenceOracle.h> @@ -71,7 +74,6 @@  #include <SwifTools/Notifier/Notifier.h>  #include <Swift/QtUI/QtSwiftUtil.h> -#include <Swiften/MUC/UnitTest/MockMUC.h>  using namespace Swift; @@ -155,6 +157,11 @@ class ChatsManagerTest : public CppUnit::TestFixture {      CPPUNIT_TEST(testImpromptuChatWindowTitle);      CPPUNIT_TEST(testStandardMUCChatWindowTitle); +    // Bookmark tests +    CPPUNIT_TEST(testReceivingBookmarksWithDomainJID); +    CPPUNIT_TEST(testReceivingBookmarksWithBareJID); +    CPPUNIT_TEST(testReceivingBookmarksWithFullJID); +      CPPUNIT_TEST_SUITE_END();  public: @@ -1228,6 +1235,11 @@ public:              CPPUNIT_ASSERT_EQUAL(forwardedBody, MockChatWindow::bodyFromMessage(window->lastAddedMessage_));              CPPUNIT_ASSERT_EQUAL(false, window->lastAddedMessageSenderIsSelf_); + +            auto recentChats = manager_->getRecentChats(); +            CPPUNIT_ASSERT_EQUAL(recentChats.size(), size_t(1)); +            CPPUNIT_ASSERT_EQUAL(recentChats[0].jid, originalMessage->getFrom().toBare()); +            CPPUNIT_ASSERT_EQUAL(recentChats[0].activity, std::string("Some further text."));          }      } @@ -1264,6 +1276,11 @@ public:              CPPUNIT_ASSERT_EQUAL(true, window->lastAddedMessageSenderIsSelf_);              CPPUNIT_ASSERT_EQUAL(size_t(1), window->receiptChanges_.size());              CPPUNIT_ASSERT_EQUAL(ChatWindow::ReceiptRequested, window->receiptChanges_[0].second); + +            auto recentChats = manager_->getRecentChats(); +            CPPUNIT_ASSERT_EQUAL(recentChats.size(), size_t(1)); +            CPPUNIT_ASSERT_EQUAL(recentChats[0].jid, originalMessage->getTo().toBare()); +            CPPUNIT_ASSERT_EQUAL(recentChats[0].activity, std::string("Some text my other resource sent."));          }          // incoming carbons message for the received delivery receipt to the other resource @@ -1280,6 +1297,12 @@ public:              CPPUNIT_ASSERT_EQUAL(size_t(2), window->receiptChanges_.size());              CPPUNIT_ASSERT_EQUAL(ChatWindow::ReceiptReceived, window->receiptChanges_[1].second); + +            //Delivery receipt should not change the latest recent entry. Checking for the original message. +            auto recentChats = manager_->getRecentChats(); +            CPPUNIT_ASSERT_EQUAL(recentChats.size(), size_t(1)); +            CPPUNIT_ASSERT_EQUAL(recentChats[0].jid, messageJID.toBare()); +            CPPUNIT_ASSERT_EQUAL(recentChats[0].activity, std::string("Some text my other resource sent."));          }      } @@ -1319,6 +1342,11 @@ public:              manager_->handleIncomingMessage(messageWrapper);              CPPUNIT_ASSERT_EQUAL(std::string(), MockChatWindow::bodyFromMessage(window->lastAddedMessage_));              CPPUNIT_ASSERT_EQUAL(false, window->lastAddedMessageSenderIsSelf_); + +            auto recentChats = manager_->getRecentChats(); +            CPPUNIT_ASSERT_EQUAL(recentChats.size(), size_t(1)); +            CPPUNIT_ASSERT_EQUAL(recentChats[0].jid, originalMessage->getFrom().toBare()); +            CPPUNIT_ASSERT_EQUAL(recentChats[0].activity, std::string("Some further text."));          }      } @@ -1602,6 +1630,78 @@ public:          CPPUNIT_ASSERT_EQUAL(std::string("mucroom"), window->name_);      } +    static std::shared_ptr<Storage> createBookmarkStorageWithJID(const JID& jid) { +        auto storage = std::make_shared<Storage>(); +        auto room = Storage::Room(); +        room.jid = jid; +        room.autoJoin = true; +        storage->addRoom(room); +        return storage; +    } + +    void testReceivingBookmarksWithDomainJID() { +        auto bookmarkRequest = std::dynamic_pointer_cast<IQ>(stanzaChannel_->sentStanzas[0]); +        CPPUNIT_ASSERT(bookmarkRequest); +        CPPUNIT_ASSERT_EQUAL(IQ::Get, bookmarkRequest->getType()); + +        auto privateStorage = bookmarkRequest->getPayload<PrivateStorage>(); +        CPPUNIT_ASSERT(privateStorage); + +        auto storage = std::dynamic_pointer_cast<Storage>(privateStorage->getPayload()); +        CPPUNIT_ASSERT(storage); + +        auto response = IQ::createResult( +            bookmarkRequest->getFrom(), +            bookmarkRequest->getTo(), +            bookmarkRequest->getID(), +            std::make_shared<PrivateStorage>(createBookmarkStorageWithJID("montague.lit")) +        ); +        stanzaChannel_->onIQReceived(response); +    } + +    void testReceivingBookmarksWithBareJID() { +        auto bookmarkRequest = std::dynamic_pointer_cast<IQ>(stanzaChannel_->sentStanzas[0]); +        CPPUNIT_ASSERT(bookmarkRequest); +        CPPUNIT_ASSERT_EQUAL(IQ::Get, bookmarkRequest->getType()); + +        auto privateStorage = bookmarkRequest->getPayload<PrivateStorage>(); +        CPPUNIT_ASSERT(privateStorage); + +        auto storage = std::dynamic_pointer_cast<Storage>(privateStorage->getPayload()); +        CPPUNIT_ASSERT(storage); + +        MockChatWindow* window = new MockChatWindow(); +        mocks_->ExpectCall(chatWindowFactory_, ChatWindowFactory::createChatWindow).With(JID("example@montague.lit"), uiEventStream_).Return(window); + +        auto response = IQ::createResult( +            bookmarkRequest->getFrom(), +            bookmarkRequest->getTo(), +            bookmarkRequest->getID(), +            std::make_shared<PrivateStorage>(createBookmarkStorageWithJID("example@montague.lit")) +        ); +        stanzaChannel_->onIQReceived(response); +    } + +    void testReceivingBookmarksWithFullJID() { +        auto bookmarkRequest = std::dynamic_pointer_cast<IQ>(stanzaChannel_->sentStanzas[0]); +        CPPUNIT_ASSERT(bookmarkRequest); +        CPPUNIT_ASSERT_EQUAL(IQ::Get, bookmarkRequest->getType()); + +        auto privateStorage = bookmarkRequest->getPayload<PrivateStorage>(); +        CPPUNIT_ASSERT(privateStorage); + +        auto storage = std::dynamic_pointer_cast<Storage>(privateStorage->getPayload()); +        CPPUNIT_ASSERT(storage); + +        auto response = IQ::createResult( +            bookmarkRequest->getFrom(), +            bookmarkRequest->getTo(), +            bookmarkRequest->getID(), +            std::make_shared<PrivateStorage>(createBookmarkStorageWithJID("example@montague.lit/someresource")) +        ); +        stanzaChannel_->onIQReceived(response); +    } +  private:      std::shared_ptr<Message> makeDeliveryReceiptTestMessage(const JID& from, const std::string& id) {          std::shared_ptr<Message> message = std::make_shared<Message>(); @@ -1668,4 +1768,3 @@ private:  };  CPPUNIT_TEST_SUITE_REGISTRATION(ChatsManagerTest); - | 
 Swift
 Swift