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