source: .tests/btlib.py @ d347470

Last change on this file since d347470 was d347470, checked in by / <>, at 2021-03-29T12:08:32Z

rf9

  • Property mode set to 100644
File size: 8.3 KB
Line 
1import socket
2import sys
3import time
4import select
5
6SEPARATOR = "="*60
7SMOLPARATOR = "-"*60
8
9class IrcClient:
10    def __init__(self, nick, pwd):
11        self.nick = nick
12        self.pwd = pwd
13        self.log = ''
14        self.tmplog = ''
15        self.sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
16
17    def send_raw(self, msg, loud = False, log = True):
18        self.receive()
19        if loud:
20            print('FROM '+ self.nick + '|| ' + msg)
21        if log:
22            self.log += msg+'\r\n'
23            self.tmplog += msg+'\r\n'
24        self.sck.send((msg+'\r\n').encode())
25
26    def send_priv_msg(self, recip, msg, loud = False):
27        self.send_raw('PRIVMSG '+recip+' :'+msg, loud)
28
29    def connect(self):
30        try:
31            self.sck.connect(('127.0.0.1', 6667))
32        except:
33            print("IRC connection failed for " + self.nick)
34            sys.exit(1)
35       
36        print("IRC connection established for " + self.nick)
37
38        self.send_raw('USER ' + (self.nick + " ")*3)
39        self.send_raw('NICK ' + self.nick)
40        self.send_raw('JOIN &bitlbee')
41
42    def jabber_login(self):
43        self.send_priv_msg("&bitlbee", "account add jabber "+self.nick+"@localhost "+self.pwd)
44        time.sleep(0.3)
45        self.send_priv_msg("&bitlbee", "account on")
46        time.sleep(1)
47        self.receive()
48        if self.log.find('Logged in') == -1:
49            print("Jabber login failed for " + self.nick)
50            sys.exit(1)
51        else:
52            print("Jabber login successful for " + self.nick)
53
54    def receive(self):
55        text = ''
56        while True:
57            readable, _, _ = select.select([self.sck], [], [], 5)
58            if self.sck in readable:
59                text += self.sck.recv(2040).decode()
60                for line in text.split('\n'):
61                    if line.find('PING') != -1:
62                        self.send_raw('PONG ' + line.split()[1])
63            else:
64                break
65        self.log += text
66        self.tmplog += text
67        return text
68
69    def add_jabber_buddy(self, nick):
70        self.send_priv_msg("&bitlbee", "add 0 " + nick+"@localhost")
71   
72    def block_jabber_buddy(self, nick):
73        self.send_priv_msg("&bitlbee", "block " + nick)
74
75    def unblock_jabber_buddy(self, nick):
76        self.send_priv_msg("&bitlbee", "allow " + nick)
77
78    def rename_jabber_buddy(self, oldnick, newnick):
79        self.send_priv_msg("&bitlbee", "rename " + oldnick + " " + newnick)
80       
81def msg_comes_thru(sender, receiver, message):
82    sender.send_priv_msg(receiver.nick, message)
83    received = receiver.receive().find(message) != -1
84    return received
85
86
87def perform_test(test_function):
88    time.sleep(5)
89    clis = []
90    clis += [IrcClient('test1', 'asd')]
91    clis += [IrcClient('test2', 'asd')]
92    for cli in clis:
93        cli.connect()
94
95    fail = not test_function(clis)
96
97    for cli in clis:
98        cli.receive()
99        print(SEPARATOR)
100        print("Test Log "+ cli.nick+":")
101        print(cli.tmplog)
102    print(SEPARATOR)
103   
104
105    if fail:
106        sys.exit(1)
107
108
109def yes_test(clis):
110    ret = False
111    clis[0].send_priv_msg("&bitlbee", "yes")
112    clis[0].receive()
113    for x, fun in enumerate(FUN):
114        if (clis[0].log.find(fun) != -1):
115            ret = True
116            if x:
117                print("The RNG gods smile upon us")
118            break
119    return ret
120
121def add_buddy_test(clis):
122    clis[0].add_jabber_buddy(clis[1].nick)
123    clis[1].send_priv_msg("&bitlbee", "yes")
124
125    clis[1].add_jabber_buddy(clis[0].nick)
126    clis[0].send_priv_msg("&bitlbee", "yes")
127
128    clis[0].send_priv_msg("&bitlbee", "blist")
129    junk = clis[0].receive()
130    ret = junk.find(clis[1].nick) != -1
131    ret = ret & (junk.find("1 available") != -1)
132    '''
133    clis[0].send_priv_msg("&bitlbee", "remove " +clis[1].nick)
134    clis[0].send_priv_msg("&bitlbee", "blist")
135    ret = ret & (clis[0].receive().find(clis[1].nick) == -1)
136
137    clis[0].add_jabber_buddy(clis[1].nick)
138    clis[1].send_priv_msg("&bitlbee", "yes")
139    time.sleep(1)
140    clis[0].send_priv_msg("&bitlbee", "blist")
141    junk = clis[0].receive()
142    ret = ret & (junk.find("1 available") != -1)
143    ret = ret & (junk.find(clis[1].nick) != -1)
144    '''
145    return ret
146
147def message_test(clis):
148    ret = msg_comes_thru(clis[0], clis[1], 'ohai <3')
149    ret = ret & msg_comes_thru(clis[1], clis[0], 'uwu *pounces*')
150    return ret
151
152def block_test(clis):
153    clis[0].block_jabber_buddy(clis[1].nick)
154    ret = not msg_comes_thru(clis[1], clis[0], 'm-meow?')
155    clis[0].unblock_jabber_buddy(clis[1].nick)
156    ret = ret & msg_comes_thru(clis[1], clis[0], '*purrs*')
157    return ret
158
159def rename_test(clis):
160    newname = "xXx_pup_LINKENPARK4EVA"
161    message = "rawr meanmz i luv<3 u in dinosaur"
162
163    clis[0].rename_jabber_buddy(clis[1].nick, newname)
164    clis[0].send_priv_msg(newname, message)
165    ret = clis[1].receive().find(message) != -1
166
167    clis[0].rename_jabber_buddy("-del", newname)
168    ret = ret & msg_comes_thru(clis[0], clis[1], "rawr")
169    return ret
170
171def status_test(clis):
172    status = "get out of my room mom"
173    clis[1].send_priv_msg("&bitlbee", "set status '"+status+"'")
174    clis[0].send_priv_msg("&bitlbee", "info "+clis[1].nick)
175    ret = (clis[0].receive().find("jabber - Status message: "+status) != -1)
176
177    clis[1].send_priv_msg("&bitlbee", "set")
178    ret = ret & (clis[1].receive().find(status) != -1)
179
180    clis[1].send_priv_msg("&bitlbee", "set -del status")
181    clis[0].send_priv_msg("&bitlbee", "info "+clis[1].nick)
182    ret = ret & (clis[0].receive().find("jabber - Status message: (none)") != -1)
183    return ret
184
185def offline_test(clis):
186    clis[0].send_priv_msg("&bitlbee", "account off")
187
188    junk = clis[0].receive()
189    ret = (junk.find(clis[1].nick) != -1)
190    ret = ret & (junk.find("QUIT") != -1)
191
192    junk = clis[1].receive()
193    ret = ret & (junk.find(clis[0].nick) != -1)
194    ret = ret & (junk.find("QUIT") != -1)
195
196    clis[0].send_priv_msg(clis[1].nick, "i'm not ur mom")
197    ret = ret & (clis[0].receive().find("No such nick/channel") != -1)
198
199    clis[0].send_priv_msg("&bitlbee", "account on")
200
201    junk = clis[0].receive()
202    ret = ret & (junk.find(clis[1].nick) != -1)
203    ret = ret & (junk.find("JOIN") != -1)
204
205    junk = clis[1].receive()
206    ret = ret & (junk.find(clis[0].nick) != -1)
207    ret = ret & (junk.find("JOIN") != -1)
208
209    return ret
210
211def default_target_test(clis):
212    clis[0].send_priv_msg("&bitlbee", "set default_target last")
213    clis[0].send_priv_msg("&bitlbee", "test2: ur mah default now")
214   
215    ret = (clis[1].receive().find("ur mah default now") != -1)
216
217    clis[0].send_priv_msg("&bitlbee", "mrow")
218    ret = ret & (clis[1].receive().find("mrow") != -1)
219
220    clis[0].send_priv_msg("root", "set default_target root")
221    junk = clis[0].receive()
222    ret = ret & (junk.find("default_target") != -1)
223    ret = ret & (junk.find("root") != -1)
224
225    clis[0].send_priv_msg("&bitlbee", "yes")
226    ret = ret & (clis[1].receive().find("yes") == -1)
227    return ret
228
229def help_test(clis):
230    clis[0].send_priv_msg("&bitlbee", "help")
231    ret = (clis[0].receive().find("identify_methods") != -1)
232    clis[0].send_priv_msg("&bitlbee", "help commands")
233    ret = ret & (clis[0].receive().find("qlist") != -1)
234    return ret
235   
236def run_tests(failed):
237    clis = []
238    clis += [IrcClient('test1', 'asd')]
239    clis += [IrcClient('test2', 'asd')]
240    for cli in clis:
241        cli.connect()
242
243    perform_test(failed, clis, yes_test, "Yes", debug_file)
244
245    print("")
246    for cli in clis:
247        cli.jabber_login()
248
249    perform_test(failed, clis, add_buddy_test, "Add/remove buddy")
250    perform_test(failed, clis, message_test, "Send message")
251    #perform_test(failed, clis, block_test, "Block user", debug_file)
252    perform_test(failed, clis, rename_test, "Rename user")
253    perform_test(failed, clis, status_test, "Change status")
254    perform_test(failed, clis, offline_test, "Go offline")
255    perform_test(failed, clis, default_target_test, "Change default target")
256    perform_test(failed, clis, help_test, "Ask for help")
257
258    if failed or SHOWLOG:
259        print("")
260        for cli in clis:
261            print(SMOLPARATOR)
262            print("Log "+ cli.nick+":")
263            print(cli.log)
264        print(SMOLPARATOR)
265
266    if failed:
267        print("\n" + SEPARATOR + "\nSome test have failed:")
268        for fail in failed:
269            print(fail)
270    else:
271        print("\n" + SEPARATOR + "\nAll tests have passed")
272   
273if __name__ == "__main__":
274    failed = []
275    run_tests(failed)
276    if failed:
277        sys.exit(1)
Note: See TracBrowser for help on using the repository browser.