summaryrefslogtreecommitdiffstats
blob: e010656b3c780f89ec753d8d8c1bb1ca54457198 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
/*
 * Copyright (c) 2018 Isode Limited.
 * All rights reserved.
 * See the COPYING file for more information.
 */

#include <memory>
#include <string>

#include <gtest/gtest.h>
#include <hippomocks.h>

#include <Swiften/Avatars/NullAvatarManager.h>
#include <Swiften/Client/ClientBlockListManager.h>
#include <Swiften/Client/DummyStanzaChannel.h>
#include <Swiften/Client/NickResolver.h>
#include <Swiften/Disco/DummyEntityCapsProvider.h>
#include <Swiften/Network/DummyTimerFactory.h>
#include <Swiften/Queries/DummyIQChannel.h>
#include <Swiften/Roster/XMPPRoster.h>
#include <Swiften/Roster/XMPPRosterImpl.h>
#include <Swiften/VCards/VCardManager.h>
#include <Swiften/VCards/VCardMemoryStorage.h>

#include <Swift/Controllers/Chat/AutoAcceptMUCInviteDecider.h>
#include <Swift/Controllers/Chat/ChatController.h>
#include <Swift/Controllers/Chat/ChatMessageParser.h>
#include <Swift/Controllers/Chat/Chattables.h>
#include <Swift/Controllers/Settings/DummySettingsProvider.h>
#include <Swift/Controllers/UIEvents/UIEventStream.h>
#include <Swift/Controllers/UIInterfaces/ChatWindowFactory.h>
#include <Swift/Controllers/UnitTest/MockChatWindow.h>
#include <Swift/Controllers/XMPPEvents/EventController.h>

using namespace Swift;

/**
 * Most of the ChatController tests are in ChatsManagerTest.
 * New tests related with ChatController should be added here,
 * and old tests should be migrated when possible.
 */

class ExtendedChatController : public ChatController {
public:
    ExtendedChatController(const JID& self, StanzaChannel* stanzaChannel, IQRouter* iqRouter, ChatWindowFactory* chatWindowFactory, const JID &contact, NickResolver* nickResolver, PresenceOracle* presenceOracle, AvatarManager* avatarManager, bool isInMUC, bool useDelayForLatency, UIEventStream* eventStream, TimerFactory* timerFactory, EventController* eventController, EntityCapsProvider* entityCapsProvider, bool userWantsReceipts, HistoryController* historyController, MUCRegistry* mucRegistry, HighlightManager* highlightManager, ClientBlockListManager* clientBlockListManager, std::shared_ptr<ChatMessageParser> chatMessageParser, AutoAcceptMUCInviteDecider* autoAcceptMUCInviteDecider, SettingsProvider* settings, Chattables& chattables) :
        ChatController(self, stanzaChannel, iqRouter, chatWindowFactory, contact, nickResolver, presenceOracle, avatarManager, isInMUC, useDelayForLatency, eventStream, timerFactory, eventController, entityCapsProvider, userWantsReceipts, historyController, mucRegistry, highlightManager, clientBlockListManager, chatMessageParser, autoAcceptMUCInviteDecider, settings, chattables) {
    }

    std::map<std::shared_ptr<Stanza>, std::string> getUnackedStanzas() { return unackedStanzas_; }
    std::map<std::string, std::shared_ptr<Stanza>> getFailedStanzas() { return failedStanzas_; }
};

class ChatControllerTest : public ::testing::Test {
protected:
    virtual void SetUp() {
        self_ = JID("alice@wonderland.lit");
        other_ = JID("whiterabbit@wonderland.lit");
        stanzaChannel_ = new DummyStanzaChannel();
        iqChannel_ = new DummyIQChannel();
        iqRouter_ = new IQRouter(iqChannel_);
        eventController_ = new EventController();
        xmppRoster_ = new XMPPRosterImpl();
        vCardManager_ = new VCardManager(self_, iqRouter_, vCardMemoryStorage_);
        mucRegistry_ = new MUCRegistry();
        nickResolver_ = new NickResolver(self_, xmppRoster_, vCardManager_, mucRegistry_);
        presenceOracle_ = new PresenceOracle(stanzaChannel_, xmppRoster_);
        avatarManager_ = new NullAvatarManager();
        uiEventStream_ = new UIEventStream();
        timerFactory_ = new DummyTimerFactory();
        entityCapsProvider_ = new DummyEntityCapsProvider();
        settings_ = new DummySettingsProvider();
        highlightManager_ = new HighlightManager(settings_);
        highlightManager_->resetToDefaultConfiguration();
        clientBlockListManager_ = new ClientBlockListManager(iqRouter_);
        autoAcceptMUCInviteDecider_ = new AutoAcceptMUCInviteDecider(self_.getDomain(), xmppRoster_, settings_);
        chatMessageParser_ = std::make_shared<ChatMessageParser>(std::map<std::string, std::string>(), highlightManager_->getConfiguration(), ChatMessageParser::Mode::GroupChat);
        mocks_ = new MockRepository();
        window_ = new MockChatWindow();
        chatWindowFactory_ = mocks_->InterfaceMock<ChatWindowFactory>();
        mocks_->ExpectCall(chatWindowFactory_, ChatWindowFactory::createChatWindow).With(other_, uiEventStream_).Return(window_);
        chattables_ = std::make_unique<Chattables>();

        controller_ = new  ExtendedChatController(self_, stanzaChannel_, iqRouter_, chatWindowFactory_, other_, nickResolver_, presenceOracle_, avatarManager_, false, false, uiEventStream_, timerFactory_, eventController_, entityCapsProvider_, false, nullptr, mucRegistry_, highlightManager_, clientBlockListManager_, chatMessageParser_, nullptr, settings_, *chattables_);
    }
    virtual void TearDown() {
        delete controller_;
        chattables_.reset();
        chatMessageParser_.reset();
        delete autoAcceptMUCInviteDecider_;
        delete clientBlockListManager_;
        delete highlightManager_;
        delete settings_;
        delete entityCapsProvider_;
        delete timerFactory_;
        delete uiEventStream_;
        delete avatarManager_;
        delete presenceOracle_;
        delete nickResolver_;
        delete mucRegistry_;
        delete vCardManager_;
        delete xmppRoster_;
        delete eventController_;
        delete iqRouter_;
        delete iqChannel_;
        delete stanzaChannel_;
    }

    JID self_, other_;
    AvatarManager* avatarManager_ = nullptr;
    ExtendedChatController* controller_ = nullptr;
    ChatWindowFactory* chatWindowFactory_;
    ClientBlockListManager* clientBlockListManager_;
    EventController* eventController_ = nullptr;
    EntityCapsProvider* entityCapsProvider_ = nullptr;
    IQChannel* iqChannel_ = nullptr;
    IQRouter* iqRouter_ = nullptr;
    MockRepository* mocks_;
    MockChatWindow* window_;
    MUCRegistry* mucRegistry_ = nullptr;
    NickResolver* nickResolver_ = nullptr;
    PresenceOracle* presenceOracle_ = nullptr;
    DummyStanzaChannel* stanzaChannel_ = nullptr;
    TimerFactory* timerFactory_;
    XMPPRosterImpl* xmppRoster_ = nullptr;
    UIEventStream* uiEventStream_;
    VCardManager* vCardManager_ = nullptr;
    VCardMemoryStorage* vCardMemoryStorage_ = nullptr;
    DummySettingsProvider* settings_;
    HighlightManager* highlightManager_;
    std::shared_ptr<ChatMessageParser> chatMessageParser_;
    AutoAcceptMUCInviteDecider* autoAcceptMUCInviteDecider_;
    std::unique_ptr<Chattables> chattables_;

};

TEST_F(ChatControllerTest, testResendMessage) {
    std::string msgBody("TestMsg");
    stanzaChannel_->setStreamManagementEnabled(true);
    window_->onSendMessageRequest(msgBody, false);
    {
        auto failedStanzas = controller_->getFailedStanzas();
        auto unackedStanzas = controller_->getUnackedStanzas();
        ASSERT_EQ(failedStanzas.size(), 0);
        ASSERT_EQ(unackedStanzas.size(), 1);
    }
    //Disconnecting to fail the stanza
    controller_->setOnline(false);
    controller_->setOnline(true);
    {
        auto failedStanzas = controller_->getFailedStanzas();
        auto unackedStanzas = controller_->getUnackedStanzas();
        ASSERT_EQ(failedStanzas.size(), 1);
        ASSERT_EQ(unackedStanzas.size(), 0);
    }
    window_->onResendMessageRequest("id");
    {
        auto failedStanzas = controller_->getFailedStanzas();
        auto unackedStanzas = controller_->getUnackedStanzas();
        ASSERT_EQ(failedStanzas.size(), 0);
        ASSERT_EQ(unackedStanzas.size(), 1);
    }
}