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 <gmock/gmock.h>
19 #include <znc/Buffer.h>
20 #include <znc/znc.h>
21
22 using ::testing::SizeIs;
23 using ::testing::ContainerEq;
24
25 class BufferTest : public ::testing::Test {
26 protected:
SetUp()27 void SetUp() override { CZNC::CreateInstance(); }
TearDown()28 void TearDown() override { CZNC::DestroyInstance(); }
29 };
30
TEST_F(BufferTest,BufLine)31 TEST_F(BufferTest, BufLine) {
32 CBuffer buffer(1);
33 buffer.AddLine(CMessage("@key=value :nick PRIVMSG {target} {text}"),
34 "hello there");
35 const CBufLine& line = buffer.GetBufLine(0);
36 EXPECT_THAT(line.GetTags(), ContainerEq(MCString{{"key", "value"}}));
37 EXPECT_EQ(line.GetFormat(), ":nick PRIVMSG {target} {text}");
38 EXPECT_EQ(line.GetText(), "hello there");
39 EXPECT_EQ(line.GetCommand(), "PRIVMSG");
40 }
41
TEST_F(BufferTest,LineCount)42 TEST_F(BufferTest, LineCount) {
43 CBuffer buffer(123);
44 EXPECT_EQ(buffer.GetLineCount(), 123u);
45
46 EXPECT_EQ(CZNC::Get().GetMaxBufferSize(), 500u);
47 EXPECT_FALSE(buffer.SetLineCount(1000, false));
48 EXPECT_EQ(buffer.GetLineCount(), 123u);
49 EXPECT_TRUE(buffer.SetLineCount(500, false));
50 EXPECT_EQ(buffer.GetLineCount(), 500u);
51 EXPECT_TRUE(buffer.SetLineCount(1000, true));
52 EXPECT_EQ(buffer.GetLineCount(), 1000u);
53 }
54
TEST_F(BufferTest,AddLine)55 TEST_F(BufferTest, AddLine) {
56 CBuffer buffer(2);
57 EXPECT_TRUE(buffer.IsEmpty());
58 EXPECT_EQ(buffer.Size(), 0u);
59
60 EXPECT_EQ(buffer.AddLine(CMessage("PRIVMSG nick :msg1")), 1u);
61 EXPECT_FALSE(buffer.IsEmpty());
62 EXPECT_EQ(buffer.Size(), 1u);
63 EXPECT_EQ(buffer.GetBufLine(0).GetFormat(), "PRIVMSG nick :msg1");
64
65 EXPECT_EQ(buffer.AddLine(CMessage("PRIVMSG nick :msg2")), 2u);
66 EXPECT_FALSE(buffer.IsEmpty());
67 EXPECT_EQ(buffer.Size(), 2u);
68 EXPECT_EQ(buffer.GetBufLine(0).GetFormat(), "PRIVMSG nick :msg1");
69 EXPECT_EQ(buffer.GetBufLine(1).GetFormat(), "PRIVMSG nick :msg2");
70
71 EXPECT_EQ(buffer.AddLine(CMessage("PRIVMSG nick :msg3")), 2u);
72 EXPECT_FALSE(buffer.IsEmpty());
73 EXPECT_EQ(buffer.Size(), 2u);
74 EXPECT_EQ(buffer.GetBufLine(0).GetFormat(), "PRIVMSG nick :msg2");
75 EXPECT_EQ(buffer.GetBufLine(1).GetFormat(), "PRIVMSG nick :msg3");
76
77 buffer.SetLineCount(1);
78 EXPECT_FALSE(buffer.IsEmpty());
79 EXPECT_EQ(buffer.Size(), 1u);
80 EXPECT_EQ(buffer.GetBufLine(0).GetFormat(), "PRIVMSG nick :msg3");
81
82 buffer.Clear();
83 EXPECT_TRUE(buffer.IsEmpty());
84 EXPECT_EQ(buffer.Size(), 0u);
85
86 buffer.SetLineCount(0);
87 buffer.AddLine(CMessage("TEST"));
88 EXPECT_TRUE(buffer.IsEmpty());
89 EXPECT_EQ(buffer.Size(), 0u);
90 }
91
TEST_F(BufferTest,UpdateLine)92 TEST_F(BufferTest, UpdateLine) {
93 // clang-format off
94 CBuffer buffer(50);
95
96 VCString lines = {
97 ":irc.server.com 001 nick :Welcome to the fake Internet Relay Chat Network nick",
98 ":irc.server.com 002 nick :Your host is irc.server.com[12.34.56.78/6697], running version ircd-fake-1.2.3",
99 ":irc.server.com 003 nick :This server was created Mon Jul 6 2015 at 16:53:49 UTC",
100 ":irc.server.com 004 nick irc.server.com ircd-fake-1.2.3 DOQRSZaghilopswz CFILMPQSbcefgijklmnopqrstvz bkloveqjfI",
101 ":irc.server.com 005 nick CHANTYPES=# EXCEPTS INVEX CHANMODES=eIbq,k,flj,CFLMPQScgimnprstz CHANLIMIT=#:120 PREFIX=(ov)@+ MAXLIST=bqeI:100 MODES=4 NETWORK=fake KNOCK STATUSMSG=@+ CALLERID=g :are supported by this server",
102 ":irc.server.com 005 nick CASEMAPPING=rfc1459 CHARSET=ascii NICKLEN=16 CHANNELLEN=50 TOPICLEN=390 ETRACE CPRIVMSG CNOTICE DEAF=D MONITOR=100 FNC TARGMAX=NAMES:1,LIST:1,KICK:1,WHOIS:1,PRIVMSG:4,NOTICE:4,ACCEPT:,MONITOR: :are supported by this server",
103 ":irc.server.com 005 nick EXTBAN=$,ajrxz WHOX CLIENTVER=3.0 SAFELIST ELIST=CTU :are supported by this server",
104 ":irc.server.com 251 nick :There are 160 users and 92457 invisible on 26 servers",
105 ":irc.server.com 252 nick 25 :IRC Operators online",
106 ":irc.server.com 253 nick 10 :unknown connection(s)",
107 ":irc.server.com 254 nick 63434 :channels formed",
108 ":irc.server.com 255 nick :I have 9455 clients and 1 servers",
109 ":irc.server.com 265 nick 9455 9682 :Current local users 9455, max 9682",
110 ":irc.server.com 266 nick 92617 96692 :Current global users 92617, max 96692",
111 ":irc.server.com 250 nick :Highest connection count: 9683 (9682 clients) (854623 connections received)"
112 };
113 EXPECT_THAT(lines, SizeIs(15));
114
115 for (const CString& line : lines) {
116 buffer.AddLine(line);
117 }
118 EXPECT_EQ(buffer.Size(), 15u);
119
120 EXPECT_EQ(buffer.UpdateLine("002", CMessage(":irc.server.net 002 nick :Your host is irc.server.net[11.22.33.44/6697], running version ircd-fake-3.2.1")), 15u);
121 EXPECT_EQ(buffer.GetBufLine(1).GetFormat(), ":irc.server.net 002 nick :Your host is irc.server.net[11.22.33.44/6697], running version ircd-fake-3.2.1");
122
123 EXPECT_EQ(buffer.UpdateLine("252", CMessage(":irc.server.com 252 nick 100 :IRC Operators online")), 15u);
124 EXPECT_EQ(buffer.GetBufLine(8).GetFormat(), ":irc.server.com 252 nick 100 :IRC Operators online");
125
126 EXPECT_EQ(buffer.UpdateLine("123", CMessage(":irc.server.com 123 nick foo bar")), 16u);
127 EXPECT_EQ(buffer.GetBufLine(15).GetFormat(), ":irc.server.com 123 nick foo bar");
128
129 EXPECT_EQ(buffer.UpdateExactLine(CMessage(":irc.server.com 005 nick EXTBAN=$,ajrxz WHOX CLIENTVER=3.0 SAFELIST ELIST=CTU :are supported by this server")), 16u);
130 EXPECT_EQ(buffer.GetBufLine(6).GetFormat(), ":irc.server.com 005 nick EXTBAN=$,ajrxz WHOX CLIENTVER=3.0 SAFELIST ELIST=CTU :are supported by this server");
131
132 EXPECT_EQ(buffer.UpdateExactLine(CMessage(":irc.server.com 005 nick FOO=bar :are supported by this server")), 17u);
133 EXPECT_EQ(buffer.GetBufLine(16).GetFormat(), ":irc.server.com 005 nick FOO=bar :are supported by this server");
134 // clang-format on
135 }
136