1 /*
2  * Copyright (C) 2004-2020 ZNC, see the NOTICE file for details.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <gtest/gtest.h>
18 #include <znc/Modules.h>
19 #include <znc/znc.h>
20 
21 class ModulesTest : public ::testing::Test {
22   protected:
SetUp()23     void SetUp() override { CZNC::CreateInstance(); }
TearDown()24     void TearDown() override { CZNC::DestroyInstance(); }
25 };
26 
27 class CLegacyModule : public CModule {
28   public:
CLegacyModule()29     CLegacyModule()
30         : CModule(nullptr, nullptr, nullptr, "legacy", "",
31                   CModInfo::NetworkModule) {}
32 
OnUserCTCPReply(CString & sTarget,CString & sMessage)33     EModRet OnUserCTCPReply(CString& sTarget, CString& sMessage) override {
34         sTarget = "#legacy";
35         sMessage = "CLegacyModule::OnUserCTCPReply";
36         return eAction;
37     }
OnUserCTCP(CString & sTarget,CString & sMessage)38     EModRet OnUserCTCP(CString& sTarget, CString& sMessage) override {
39         sTarget = "#legacy";
40         sMessage = "CLegacyModule::OnUserCTCP";
41         return eAction;
42     }
OnUserAction(CString & sTarget,CString & sMessage)43     EModRet OnUserAction(CString& sTarget, CString& sMessage) override {
44         sTarget = "#legacy";
45         sMessage = "CLegacyModule::OnUserAction";
46         return eAction;
47     }
OnUserMsg(CString & sTarget,CString & sMessage)48     EModRet OnUserMsg(CString& sTarget, CString& sMessage) override {
49         sTarget = "#legacy";
50         sMessage = "CLegacyModule::OnUserMsg";
51         return eAction;
52     }
OnUserNotice(CString & sTarget,CString & sMessage)53     EModRet OnUserNotice(CString& sTarget, CString& sMessage) override {
54         sTarget = "#legacy";
55         sMessage = "CLegacyModule::OnUserNotice";
56         return eAction;
57     }
OnUserJoin(CString & sChannel,CString & sKey)58     EModRet OnUserJoin(CString& sChannel, CString& sKey) override {
59         sChannel = "#legacy";
60         sKey = "CLegacyModule::OnUserJoin";
61         return eAction;
62     }
OnUserPart(CString & sChannel,CString & sMessage)63     EModRet OnUserPart(CString& sChannel, CString& sMessage) override {
64         sChannel = "#legacy";
65         sMessage = "CLegacyModule::OnUserPart";
66         return eAction;
67     }
OnUserTopic(CString & sChannel,CString & sTopic)68     EModRet OnUserTopic(CString& sChannel, CString& sTopic) override {
69         sChannel = "#legacy";
70         sTopic = "CLegacyModule::OnUserTopic";
71         return eAction;
72     }
OnUserQuit(CString & sMessage)73     EModRet OnUserQuit(CString& sMessage) override {
74         sMessage = "CLegacyModule::OnUserQuit";
75         return eAction;
76     }
77 
OnCTCPReply(CNick & Nick,CString & sMessage)78     EModRet OnCTCPReply(CNick& Nick, CString& sMessage) override {
79         Nick.Parse("legacy!znc@znc.in");
80         sMessage = "CLegacyModule::OnCTCPReply";
81         return eAction;
82     }
OnPrivCTCP(CNick & Nick,CString & sMessage)83     EModRet OnPrivCTCP(CNick& Nick, CString& sMessage) override {
84         Nick.Parse("legacy!znc@znc.in");
85         sMessage = "CLegacyModule::OnPrivCTCP";
86         return eAction;
87     }
OnChanCTCP(CNick & Nick,CChan & Channel,CString & sMessage)88     EModRet OnChanCTCP(CNick& Nick, CChan& Channel,
89                        CString& sMessage) override {
90         Nick.Parse("legacy!znc@znc.in");
91         sMessage = "CLegacyModule::OnChanCTCP";
92         return eAction;
93     }
OnPrivAction(CNick & Nick,CString & sMessage)94     EModRet OnPrivAction(CNick& Nick, CString& sMessage) override {
95         Nick.Parse("legacy!znc@znc.in");
96         sMessage = "CLegacyModule::OnPrivAction";
97         return eAction;
98     }
OnChanAction(CNick & Nick,CChan & Channel,CString & sMessage)99     EModRet OnChanAction(CNick& Nick, CChan& Channel,
100                          CString& sMessage) override {
101         Nick.Parse("legacy!znc@znc.in");
102         sMessage = "CLegacyModule::OnChanAction";
103         return eAction;
104     }
OnPrivMsg(CNick & Nick,CString & sMessage)105     EModRet OnPrivMsg(CNick& Nick, CString& sMessage) override {
106         Nick.Parse("legacy!znc@znc.in");
107         sMessage = "CLegacyModule::OnPrivMsg";
108         return eAction;
109     }
OnChanMsg(CNick & Nick,CChan & Channel,CString & sMessage)110     EModRet OnChanMsg(CNick& Nick, CChan& Channel, CString& sMessage) override {
111         Nick.Parse("legacy!znc@znc.in");
112         sMessage = "CLegacyModule::OnChanMsg";
113         return eAction;
114     }
OnPrivNotice(CNick & Nick,CString & sMessage)115     EModRet OnPrivNotice(CNick& Nick, CString& sMessage) override {
116         Nick.Parse("legacy!znc@znc.in");
117         sMessage = "CLegacyModule::OnPrivNotice";
118         return eAction;
119     }
OnChanNotice(CNick & Nick,CChan & Channel,CString & sMessage)120     EModRet OnChanNotice(CNick& Nick, CChan& Channel,
121                          CString& sMessage) override {
122         Nick.Parse("legacy!znc@znc.in");
123         sMessage = "CLegacyModule::OnChanNotice";
124         return eAction;
125     }
OnTopic(CNick & Nick,CChan & Channel,CString & sTopic)126     EModRet OnTopic(CNick& Nick, CChan& Channel, CString& sTopic) override {
127         Nick.Parse("legacy!znc@znc.in");
128         sTopic = "CLegacyModule::OnTopic";
129         return eAction;
130     }
131 
132     EModRet eAction = CONTINUE;
133 };
134 
135 class CMessageModule : public CModule {
136   public:
CMessageModule()137     CMessageModule()
138         : CModule(nullptr, nullptr, nullptr, "CMessage", "",
139                   CModInfo::NetworkModule) {}
140 
OnUserCTCPReplyMessage(CCTCPMessage & Message)141     EModRet OnUserCTCPReplyMessage(CCTCPMessage& Message) override {
142         Message.SetTarget("#target");
143         Message.SetText("CMessageModule::OnUserCTCPReplyMessage");
144         return eAction;
145     }
OnUserCTCPMessage(CCTCPMessage & Message)146     EModRet OnUserCTCPMessage(CCTCPMessage& Message) override {
147         Message.SetTarget("#target");
148         Message.SetText("CMessageModule::OnUserCTCPMessage");
149         return eAction;
150     }
OnUserActionMessage(CActionMessage & Message)151     EModRet OnUserActionMessage(CActionMessage& Message) override {
152         Message.SetTarget("#target");
153         Message.SetText("CMessageModule::OnUserActionMessage");
154         return eAction;
155     }
OnUserTextMessage(CTextMessage & Message)156     EModRet OnUserTextMessage(CTextMessage& Message) override {
157         Message.SetTarget("#target");
158         Message.SetText("CMessageModule::OnUserTextMessage");
159         return eAction;
160     }
OnUserNoticeMessage(CNoticeMessage & Message)161     EModRet OnUserNoticeMessage(CNoticeMessage& Message) override {
162         Message.SetTarget("#target");
163         Message.SetText("CMessageModule::OnUserNoticeMessage");
164         return eAction;
165     }
OnUserJoinMessage(CJoinMessage & Message)166     EModRet OnUserJoinMessage(CJoinMessage& Message) override {
167         Message.SetTarget("#target");
168         Message.SetKey("CMessageModule::OnUserJoinMessage");
169         return eAction;
170     }
OnUserPartMessage(CPartMessage & Message)171     EModRet OnUserPartMessage(CPartMessage& Message) override {
172         Message.SetTarget("#target");
173         Message.SetReason("CMessageModule::OnUserPartMessage");
174         return eAction;
175     }
OnUserTopicMessage(CTopicMessage & Message)176     EModRet OnUserTopicMessage(CTopicMessage& Message) override {
177         Message.SetTarget("#target");
178         Message.SetTopic("CMessageModule::OnUserTopicMessage");
179         return eAction;
180     }
OnUserQuitMessage(CQuitMessage & Message)181     EModRet OnUserQuitMessage(CQuitMessage& Message) override {
182         Message.SetReason("CMessageModule::OnUserQuitMessage");
183         return eAction;
184     }
185 
OnCTCPReplyMessage(CCTCPMessage & Message)186     EModRet OnCTCPReplyMessage(CCTCPMessage& Message) override {
187         Message.GetNick().SetNick("nick");
188         Message.SetText("CMessageModule::OnCTCPReplyMessage");
189         return eAction;
190     }
OnPrivCTCPMessage(CCTCPMessage & Message)191     EModRet OnPrivCTCPMessage(CCTCPMessage& Message) override {
192         Message.GetNick().SetNick("nick");
193         Message.SetText("CMessageModule::OnPrivCTCPMessage");
194         return eAction;
195     }
OnChanCTCPMessage(CCTCPMessage & Message)196     EModRet OnChanCTCPMessage(CCTCPMessage& Message) override {
197         Message.GetNick().SetNick("nick");
198         Message.SetText("CMessageModule::OnChanCTCPMessage");
199         return eAction;
200     }
OnPrivActionMessage(CActionMessage & Message)201     EModRet OnPrivActionMessage(CActionMessage& Message) override {
202         Message.GetNick().SetNick("nick");
203         Message.SetText("CMessageModule::OnPrivActionMessage");
204         return eAction;
205     }
OnChanActionMessage(CActionMessage & Message)206     EModRet OnChanActionMessage(CActionMessage& Message) override {
207         Message.GetNick().SetNick("nick");
208         Message.SetText("CMessageModule::OnChanActionMessage");
209         return eAction;
210     }
OnPrivTextMessage(CTextMessage & Message)211     EModRet OnPrivTextMessage(CTextMessage& Message) override {
212         Message.GetNick().SetNick("nick");
213         Message.SetText("CMessageModule::OnPrivTextMessage");
214         return eAction;
215     }
OnChanTextMessage(CTextMessage & Message)216     EModRet OnChanTextMessage(CTextMessage& Message) override {
217         Message.GetNick().SetNick("nick");
218         Message.SetText("CMessageModule::OnChanTextMessage");
219         return eAction;
220     }
OnPrivNoticeMessage(CNoticeMessage & Message)221     EModRet OnPrivNoticeMessage(CNoticeMessage& Message) override {
222         Message.GetNick().SetNick("nick");
223         Message.SetText("CMessageModule::OnPrivNoticeMessage");
224         return eAction;
225     }
OnChanNoticeMessage(CNoticeMessage & Message)226     EModRet OnChanNoticeMessage(CNoticeMessage& Message) override {
227         Message.GetNick().SetNick("nick");
228         Message.SetText("CMessageModule::OnChanNoticeMessage");
229         return eAction;
230     }
OnTopicMessage(CTopicMessage & Message)231     EModRet OnTopicMessage(CTopicMessage& Message) override {
232         Message.GetNick().SetNick("nick");
233         Message.SetTopic("CMessageModule::OnTopicMessage");
234         return eAction;
235     }
OnNumericMessage(CNumericMessage & Message)236     EModRet OnNumericMessage(CNumericMessage& Message) override {
237         Message.GetNick().SetNick("nick");
238         Message.SetCommand("123");
239         return eAction;
240     }
241 
242     EModRet eAction = CONTINUE;
243 };
244 
TEST_F(ModulesTest,Hooks)245 TEST_F(ModulesTest, Hooks) {
246     CModules& Modules = CZNC::Get().GetModules();
247 
248     CLegacyModule LegacyMod;
249     Modules.push_back(&LegacyMod);
250 
251     CMessageModule MessageMod;
252     Modules.push_back(&MessageMod);
253 
254     CCTCPMessage UserCTCPReply;
255     LegacyMod.eAction = CModule::HALT;
256     Modules.OnUserCTCPReplyMessage(UserCTCPReply);
257     EXPECT_EQ(UserCTCPReply.GetTarget(), "#legacy");
258     EXPECT_EQ(UserCTCPReply.GetText(), "CLegacyModule::OnUserCTCPReply");
259     LegacyMod.eAction = CModule::CONTINUE;
260     Modules.OnUserCTCPReplyMessage(UserCTCPReply);
261     EXPECT_EQ(UserCTCPReply.GetTarget(), "#target");
262     EXPECT_EQ(UserCTCPReply.GetText(),
263               "CMessageModule::OnUserCTCPReplyMessage");
264 
265     CCTCPMessage UserCTCPMsg;
266     LegacyMod.eAction = CModule::HALT;
267     Modules.OnUserCTCPMessage(UserCTCPMsg);
268     EXPECT_EQ(UserCTCPMsg.GetTarget(), "#legacy");
269     EXPECT_EQ(UserCTCPMsg.GetText(), "CLegacyModule::OnUserCTCP");
270     LegacyMod.eAction = CModule::CONTINUE;
271     Modules.OnUserCTCPMessage(UserCTCPMsg);
272     EXPECT_EQ(UserCTCPMsg.GetTarget(), "#target");
273     EXPECT_EQ(UserCTCPMsg.GetText(), "CMessageModule::OnUserCTCPMessage");
274 
275     CActionMessage UserActionMsg;
276     LegacyMod.eAction = CModule::HALT;
277     Modules.OnUserActionMessage(UserActionMsg);
278     EXPECT_EQ(UserActionMsg.GetTarget(), "#legacy");
279     EXPECT_EQ(UserActionMsg.GetText(), "CLegacyModule::OnUserAction");
280     LegacyMod.eAction = CModule::CONTINUE;
281     Modules.OnUserActionMessage(UserActionMsg);
282     EXPECT_EQ(UserActionMsg.GetTarget(), "#target");
283     EXPECT_EQ(UserActionMsg.GetText(), "CMessageModule::OnUserActionMessage");
284 
285     CTextMessage UserTextMsg;
286     LegacyMod.eAction = CModule::HALT;
287     Modules.OnUserTextMessage(UserTextMsg);
288     EXPECT_EQ(UserTextMsg.GetTarget(), "#legacy");
289     EXPECT_EQ(UserTextMsg.GetText(), "CLegacyModule::OnUserMsg");
290     LegacyMod.eAction = CModule::CONTINUE;
291     Modules.OnUserTextMessage(UserTextMsg);
292     EXPECT_EQ(UserTextMsg.GetTarget(), "#target");
293     EXPECT_EQ(UserTextMsg.GetText(), "CMessageModule::OnUserTextMessage");
294 
295     CNoticeMessage UserNoticeMsg;
296     LegacyMod.eAction = CModule::HALT;
297     Modules.OnUserNoticeMessage(UserNoticeMsg);
298     EXPECT_EQ(UserNoticeMsg.GetTarget(), "#legacy");
299     EXPECT_EQ(UserNoticeMsg.GetText(), "CLegacyModule::OnUserNotice");
300     LegacyMod.eAction = CModule::CONTINUE;
301     Modules.OnUserNoticeMessage(UserNoticeMsg);
302     EXPECT_EQ(UserNoticeMsg.GetTarget(), "#target");
303     EXPECT_EQ(UserNoticeMsg.GetText(), "CMessageModule::OnUserNoticeMessage");
304 
305     CJoinMessage UserJoinMsg;
306     LegacyMod.eAction = CModule::HALT;
307     Modules.OnUserJoinMessage(UserJoinMsg);
308     EXPECT_EQ(UserJoinMsg.GetTarget(), "#legacy");
309     EXPECT_EQ(UserJoinMsg.GetKey(), "CLegacyModule::OnUserJoin");
310     LegacyMod.eAction = CModule::CONTINUE;
311     Modules.OnUserJoinMessage(UserJoinMsg);
312     EXPECT_EQ(UserJoinMsg.GetTarget(), "#target");
313     EXPECT_EQ(UserJoinMsg.GetKey(), "CMessageModule::OnUserJoinMessage");
314 
315     CPartMessage UserPartMsg;
316     LegacyMod.eAction = CModule::HALT;
317     Modules.OnUserPartMessage(UserPartMsg);
318     EXPECT_EQ(UserPartMsg.GetTarget(), "#legacy");
319     EXPECT_EQ(UserPartMsg.GetReason(), "CLegacyModule::OnUserPart");
320     LegacyMod.eAction = CModule::CONTINUE;
321     Modules.OnUserPartMessage(UserPartMsg);
322     EXPECT_EQ(UserPartMsg.GetTarget(), "#target");
323     EXPECT_EQ(UserPartMsg.GetReason(), "CMessageModule::OnUserPartMessage");
324 
325     CTopicMessage UserTopicMsg;
326     LegacyMod.eAction = CModule::HALT;
327     Modules.OnUserTopicMessage(UserTopicMsg);
328     EXPECT_EQ(UserTopicMsg.GetTarget(), "#legacy");
329     EXPECT_EQ(UserTopicMsg.GetTopic(), "CLegacyModule::OnUserTopic");
330     LegacyMod.eAction = CModule::CONTINUE;
331     Modules.OnUserTopicMessage(UserTopicMsg);
332     EXPECT_EQ(UserTopicMsg.GetTarget(), "#target");
333     EXPECT_EQ(UserTopicMsg.GetTopic(), "CMessageModule::OnUserTopicMessage");
334 
335     CQuitMessage UserQuitMsg;
336     LegacyMod.eAction = CModule::HALT;
337     Modules.OnUserQuitMessage(UserQuitMsg);
338     EXPECT_EQ(UserQuitMsg.GetReason(), "CLegacyModule::OnUserQuit");
339     LegacyMod.eAction = CModule::CONTINUE;
340     Modules.OnUserQuitMessage(UserQuitMsg);
341     EXPECT_EQ(UserQuitMsg.GetReason(), "CMessageModule::OnUserQuitMessage");
342 
343     CCTCPMessage CTCPReply;
344     LegacyMod.eAction = CModule::HALT;
345     Modules.OnCTCPReplyMessage(CTCPReply);
346     EXPECT_EQ(CTCPReply.GetNick().GetNick(), "legacy");
347     EXPECT_EQ(CTCPReply.GetText(), "CLegacyModule::OnCTCPReply");
348     LegacyMod.eAction = CModule::CONTINUE;
349     Modules.OnCTCPReplyMessage(CTCPReply);
350     EXPECT_EQ(CTCPReply.GetNick().GetNick(), "nick");
351     EXPECT_EQ(CTCPReply.GetText(), "CMessageModule::OnCTCPReplyMessage");
352 
353     CCTCPMessage PrivCTCP;
354     LegacyMod.eAction = CModule::HALT;
355     Modules.OnPrivCTCPMessage(PrivCTCP);
356     EXPECT_EQ(PrivCTCP.GetNick().GetNick(), "legacy");
357     EXPECT_EQ(PrivCTCP.GetText(), "CLegacyModule::OnPrivCTCP");
358     LegacyMod.eAction = CModule::CONTINUE;
359     Modules.OnPrivCTCPMessage(PrivCTCP);
360     EXPECT_EQ(PrivCTCP.GetNick().GetNick(), "nick");
361     EXPECT_EQ(PrivCTCP.GetText(), "CMessageModule::OnPrivCTCPMessage");
362 
363     CCTCPMessage ChanCTCP;
364     LegacyMod.eAction = CModule::HALT;
365     Modules.OnChanCTCPMessage(ChanCTCP);
366     EXPECT_EQ(ChanCTCP.GetNick().GetNick(), "legacy");
367     EXPECT_EQ(ChanCTCP.GetText(), "CLegacyModule::OnChanCTCP");
368     LegacyMod.eAction = CModule::CONTINUE;
369     Modules.OnChanCTCPMessage(ChanCTCP);
370     EXPECT_EQ(ChanCTCP.GetNick().GetNick(), "nick");
371     EXPECT_EQ(ChanCTCP.GetText(), "CMessageModule::OnChanCTCPMessage");
372 
373     CActionMessage PrivAction;
374     LegacyMod.eAction = CModule::HALT;
375     Modules.OnPrivActionMessage(PrivAction);
376     EXPECT_EQ(PrivAction.GetNick().GetNick(), "legacy");
377     EXPECT_EQ(PrivAction.GetText(), "CLegacyModule::OnPrivAction");
378     LegacyMod.eAction = CModule::CONTINUE;
379     Modules.OnPrivActionMessage(PrivAction);
380     EXPECT_EQ(PrivAction.GetNick().GetNick(), "nick");
381     EXPECT_EQ(PrivAction.GetText(), "CMessageModule::OnPrivActionMessage");
382 
383     CActionMessage ChanAction;
384     LegacyMod.eAction = CModule::HALT;
385     Modules.OnChanActionMessage(ChanAction);
386     EXPECT_EQ(ChanAction.GetNick().GetNick(), "legacy");
387     EXPECT_EQ(ChanAction.GetText(), "CLegacyModule::OnChanAction");
388     LegacyMod.eAction = CModule::CONTINUE;
389     Modules.OnChanActionMessage(ChanAction);
390     EXPECT_EQ(ChanAction.GetNick().GetNick(), "nick");
391     EXPECT_EQ(ChanAction.GetText(), "CMessageModule::OnChanActionMessage");
392 
393     CTextMessage PrivMsg;
394     LegacyMod.eAction = CModule::HALT;
395     Modules.OnPrivTextMessage(PrivMsg);
396     EXPECT_EQ(PrivMsg.GetNick().GetNick(), "legacy");
397     EXPECT_EQ(PrivMsg.GetText(), "CLegacyModule::OnPrivMsg");
398     LegacyMod.eAction = CModule::CONTINUE;
399     Modules.OnPrivTextMessage(PrivMsg);
400     EXPECT_EQ(PrivMsg.GetNick().GetNick(), "nick");
401     EXPECT_EQ(PrivMsg.GetText(), "CMessageModule::OnPrivTextMessage");
402 
403     CTextMessage ChanMsg;
404     LegacyMod.eAction = CModule::HALT;
405     Modules.OnChanTextMessage(ChanMsg);
406     EXPECT_EQ(ChanMsg.GetNick().GetNick(), "legacy");
407     EXPECT_EQ(ChanMsg.GetText(), "CLegacyModule::OnChanMsg");
408     LegacyMod.eAction = CModule::CONTINUE;
409     Modules.OnChanTextMessage(ChanMsg);
410     EXPECT_EQ(ChanMsg.GetNick().GetNick(), "nick");
411     EXPECT_EQ(ChanMsg.GetText(), "CMessageModule::OnChanTextMessage");
412 
413     CNoticeMessage PrivNotice;
414     LegacyMod.eAction = CModule::HALT;
415     Modules.OnPrivNoticeMessage(PrivNotice);
416     EXPECT_EQ(PrivNotice.GetNick().GetNick(), "legacy");
417     EXPECT_EQ(PrivNotice.GetText(), "CLegacyModule::OnPrivNotice");
418     LegacyMod.eAction = CModule::CONTINUE;
419     Modules.OnPrivNoticeMessage(PrivNotice);
420     EXPECT_EQ(PrivNotice.GetNick().GetNick(), "nick");
421     EXPECT_EQ(PrivNotice.GetText(), "CMessageModule::OnPrivNoticeMessage");
422 
423     CNoticeMessage ChanNotice;
424     LegacyMod.eAction = CModule::HALT;
425     Modules.OnChanNoticeMessage(ChanNotice);
426     EXPECT_EQ(ChanNotice.GetNick().GetNick(), "legacy");
427     EXPECT_EQ(ChanNotice.GetText(), "CLegacyModule::OnChanNotice");
428     LegacyMod.eAction = CModule::CONTINUE;
429     Modules.OnChanNoticeMessage(ChanNotice);
430     EXPECT_EQ(ChanNotice.GetNick().GetNick(), "nick");
431     EXPECT_EQ(ChanNotice.GetText(), "CMessageModule::OnChanNoticeMessage");
432 
433     CTopicMessage TopicMsg;
434     LegacyMod.eAction = CModule::HALT;
435     Modules.OnTopicMessage(TopicMsg);
436     EXPECT_EQ(TopicMsg.GetNick().GetNick(), "legacy");
437     EXPECT_EQ(TopicMsg.GetTopic(), "CLegacyModule::OnTopic");
438     LegacyMod.eAction = CModule::CONTINUE;
439     Modules.OnTopicMessage(TopicMsg);
440     EXPECT_EQ(TopicMsg.GetNick().GetNick(), "nick");
441     EXPECT_EQ(TopicMsg.GetTopic(), "CMessageModule::OnTopicMessage");
442 
443     CNumericMessage NumericMsg;
444     Modules.OnNumericMessage(NumericMsg);
445     EXPECT_EQ(TopicMsg.GetNick().GetNick(), "nick");
446     EXPECT_EQ(NumericMsg.GetCode(), 123u);
447 
448     Modules.clear();
449 }
450