]> Cypherpunks.ru repositories - goircd.git/blob - room_test.go
Increase maximum nickname length for convenience
[goircd.git] / room_test.go
1 /*
2 goircd -- minimalistic simple Internet Relay Chat (IRC) server
3 Copyright (C) 2014-2015 Sergey Matveev <stargrave@stargrave.org>
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 */
18
19 package main
20
21 import (
22         "strings"
23         "testing"
24 )
25
26 func noNickchan(t *testing.T, c *TestingConn) {
27         if r := <-c.outbound; !strings.HasPrefix(r, ":foohost 401") {
28                 t.Fatal("no nick/channel", r)
29         }
30 }
31
32 func noChan(t *testing.T, c *TestingConn) {
33         if r := <-c.outbound; !strings.HasPrefix(r, ":foohost 403") {
34                 t.Fatal("no channel", r)
35         }
36 }
37
38 func notEnoughParams(t *testing.T, c *TestingConn) {
39         if r := <-c.outbound; !strings.HasPrefix(r, ":foohost 461") {
40                 t.Fatal("not enough params", r)
41         }
42 }
43
44 func TestTwoUsers(t *testing.T) {
45         logSink := make(chan LogEvent, 8)
46         stateSink := make(chan StateEvent, 8)
47         host := "foohost"
48         daemon := NewDaemon("ver1", &host, nil, nil, logSink, stateSink)
49         events := make(chan ClientEvent)
50         go daemon.Processor(events)
51
52         conn1 := NewTestingConn()
53         conn2 := NewTestingConn()
54         client1 := NewClient(&host, conn1)
55         client2 := NewClient(&host, conn2)
56         go client1.Processor(events)
57         go client2.Processor(events)
58
59         conn1.inbound <- "NICK nick1\r\nUSER foo1 bar1 baz1 :Long name1"
60         conn2.inbound <- "NICK nick2\r\nUSER foo2 bar2 baz2 :Long name2"
61         for i := 0; i < 6; i++ {
62                 <-conn1.outbound
63                 <-conn2.outbound
64         }
65
66         daemon.SendLusers(client1)
67         if r := <-conn1.outbound; !strings.Contains(r, "There are 2 users") {
68                 t.Fatal("LUSERS", r)
69         }
70
71         conn1.inbound <- "WHOIS"
72         notEnoughParams(t, conn1)
73         conn1.inbound <- "WHOIS nick3"
74         noNickchan(t, conn1)
75         conn1.inbound <- "WHOIS nick2"
76         if r := <-conn1.outbound; r != ":foohost 311 nick1 nick2 foo2 Unknown * :Long name2\r\n" {
77                 t.Fatal("first WHOIS 311", r)
78         }
79         if r := <-conn1.outbound; r != ":foohost 312 nick1 nick2 foohost :foohost\r\n" {
80                 t.Fatal("first WHOIS 312", r)
81         }
82         if r := <-conn1.outbound; r != ":foohost 319 nick1 nick2 :\r\n" {
83                 t.Fatal("first WHOIS 319", r)
84         }
85         if r := <-conn1.outbound; r != ":foohost 318 nick1 nick2 :End of /WHOIS list\r\n" {
86                 t.Fatal("first WHOIS 318", r)
87         }
88
89         conn1.inbound <- "LIST"
90         if r := <-conn1.outbound; r != ":foohost 323 nick1 :End of /LIST\r\n" {
91                 t.Fatal("first LIST", r)
92         }
93
94         conn1.inbound <- "WHO"
95         notEnoughParams(t, conn1)
96         conn1.inbound <- "WHO #fooroom"
97         noChan(t, conn1)
98
99         conn1.inbound <- "JOIN #foo"
100         conn2.inbound <- "JOIN #foo"
101         for i := 0; i < 4; i++ {
102                 <-conn1.outbound
103                 <-conn2.outbound
104         }
105         conn1.inbound <- "PRIVMSG nick2 :Hello"
106         conn1.inbound <- "PRIVMSG #foo :world"
107         conn1.inbound <- "NOTICE #foo :world"
108         <-conn2.outbound
109         if r := <-conn2.outbound; r != ":nick1!foo1@someclient PRIVMSG nick2 :Hello\r\n" {
110                 t.Fatal("first message", r)
111         }
112         if r := <-conn2.outbound; r != ":nick1!foo1@someclient PRIVMSG #foo :world\r\n" {
113                 t.Fatal("second message", r)
114         }
115         if r := <-conn2.outbound; r != ":nick1!foo1@someclient NOTICE #foo :world\r\n" {
116                 t.Fatal("third message", r)
117         }
118 }
119
120 func TestJoin(t *testing.T) {
121         logSink := make(chan LogEvent, 8)
122         stateSink := make(chan StateEvent, 8)
123         host := "foohost"
124         daemon := NewDaemon("ver1", &host, nil, nil, logSink, stateSink)
125         events := make(chan ClientEvent)
126         go daemon.Processor(events)
127         conn := NewTestingConn()
128         client := NewClient(&host, conn)
129         go client.Processor(events)
130
131         conn.inbound <- "NICK nick2\r\nUSER foo2 bar2 baz2 :Long name2"
132         for i := 0; i < 6; i++ {
133                 <-conn.outbound
134         }
135
136         conn.inbound <- "JOIN"
137         notEnoughParams(t, conn)
138         conn.inbound <- "JOIN bla/bla/bla"
139         noChan(t, conn)
140         conn.inbound <- "JOIN bla:bla:bla"
141         noChan(t, conn)
142
143         conn.inbound <- "JOIN #foo"
144         if r := <-conn.outbound; r != ":foohost 331 nick2 #foo :No topic is set\r\n" {
145                 t.Fatal("no topic is set", r)
146         }
147         if r := <-conn.outbound; r != ":nick2!foo2@someclient JOIN #foo\r\n" {
148                 t.Fatal("no JOIN message", r)
149         }
150         if r := <-conn.outbound; r != ":foohost 353 nick2 = #foo :nick2\r\n" {
151                 t.Fatal("no NAMES list", r)
152         }
153         if r := <-conn.outbound; r != ":foohost 366 nick2 #foo :End of NAMES list\r\n" {
154                 t.Fatal("no end of NAMES list", r)
155         }
156         if r := <-logSink; (r.what != "joined") || (r.where != "#foo") || (r.who != "nick2") || (r.meta != true) {
157                 t.Fatal("invalid join log event", r)
158         }
159
160         conn.inbound <- "JOIN #bar,#baz"
161         for i := 0; i < 4*2; i++ {
162                 <-conn.outbound
163         }
164         if _, ok := daemon.rooms["#bar"]; !ok {
165                 t.Fatal("#bar does not exist")
166         }
167         if _, ok := daemon.rooms["#baz"]; !ok {
168                 t.Fatal("#baz does not exist")
169         }
170         if r := <-logSink; (r.what != "joined") || (r.where != "#bar") || (r.who != "nick2") || (r.meta != true) {
171                 t.Fatal("invalid join log event #bar", r)
172         }
173         if r := <-logSink; (r.what != "joined") || (r.where != "#baz") || (r.who != "nick2") || (r.meta != true) {
174                 t.Fatal("invalid join log event #baz", r)
175         }
176
177         conn.inbound <- "JOIN #barenc,#bazenc key1,key2"
178         for i := 0; i < 4*2; i++ {
179                 <-conn.outbound
180         }
181         if daemon.rooms["#barenc"].key != "key1" {
182                 t.Fatal("no room with key1")
183         }
184         if daemon.rooms["#bazenc"].key != "key2" {
185                 t.Fatal("no room with key2")
186         }
187         if r := <-logSink; (r.what != "joined") || (r.where != "#barenc") || (r.who != "nick2") || (r.meta != true) {
188                 t.Fatal("invalid join log event #barenc", r)
189         }
190         if r := <-logSink; (r.what != "joined") || (r.where != "#bazenc") || (r.who != "nick2") || (r.meta != true) {
191                 t.Fatal("invalid join log event #bazenc", r)
192         }
193         if r := <-stateSink; (r.topic != "") || (r.where != "#barenc") || (r.key != "key1") {
194                 t.Fatal("set channel key1 state", r)
195         }
196         if r := <-stateSink; (r.topic != "") || (r.where != "#bazenc") || (r.key != "key2") {
197                 t.Fatal("set channel key2 state", r)
198         }
199
200         conn.inbound <- "MODE #barenc -k"
201         if r := <-conn.outbound; r != ":nick2!foo2@someclient MODE #barenc -k\r\n" {
202                 t.Fatal("remove #barenc key", r)
203         }
204         if daemon.rooms["#barenc"].key != "" {
205                 t.Fatal("removing key from #barenc")
206         }
207         if r := <-logSink; (r.what != "removed channel key") || (r.where != "#barenc") || (r.who != "nick2") || (r.meta != true) {
208                 t.Fatal("removed channel key log", r)
209         }
210         if r := <-stateSink; (r.topic != "") || (r.where != "#barenc") || (r.key != "") {
211                 t.Fatal("removed channel key state", r)
212         }
213
214         conn.inbound <- "PART #bazenc\r\nMODE #bazenc -k"
215         if r := <-conn.outbound; r != ":foohost 442 #bazenc :You are not on that channel\r\n" {
216                 t.Fatal("not on that channel", r)
217         }
218         if r := <-logSink; (r.what != "left") || (r.where != "#bazenc") || (r.who != "nick2") || (r.meta != true) {
219                 t.Fatal("left #bazenc log", r)
220         }
221
222         conn.inbound <- "MODE #barenc +i"
223         if r := <-conn.outbound; r != ":foohost 472 nick2 +i :Unknown MODE flag\r\n" {
224                 t.Fatal("unknown MODE flag", r)
225         }
226
227         conn.inbound <- "MODE #barenc +k newkey"
228         if r := <-conn.outbound; r != ":nick2!foo2@someclient MODE #barenc +k newkey\r\n" {
229                 t.Fatal("+k MODE setting", r)
230         }
231         if r := <-logSink; (r.what != "set channel key to newkey") || (r.where != "#barenc") || (r.who != "nick2") || (r.meta != true) {
232                 t.Fatal("set channel key", r)
233         }
234         if r := <-stateSink; (r.topic != "") || (r.where != "#barenc") || (r.key != "newkey") {
235                 t.Fatal("set channel newkey state", r)
236         }
237
238         conn.inbound <- "TOPIC #barenc :New topic"
239         if r := <-conn.outbound; r != ":nick2!foo2@someclient TOPIC #barenc :New topic\r\n" {
240                 t.Fatal("set TOPIC", r)
241         }
242         if r := <-logSink; (r.what != "set topic to New topic") || (r.where != "#barenc") || (r.who != "nick2") || (r.meta != true) {
243                 t.Fatal("set TOPIC log", r)
244         }
245         if r := <-stateSink; (r.topic != "New topic") || (r.where != "#barenc") || (r.key != "newkey") {
246                 t.Fatal("set channel TOPIC state", r)
247         }
248
249         conn.inbound <- "WHO #barenc"
250         if r := <-conn.outbound; r != ":foohost 352 nick2 #barenc foo2 someclient foohost nick2 H :0 Long name2\r\n" {
251                 t.Fatal("WHO", r)
252         }
253         if r := <-conn.outbound; r != ":foohost 315 nick2 #barenc :End of /WHO list\r\n" {
254                 t.Fatal("end of WHO", r)
255         }
256
257 }