source: .tests/test1.py @ 04d7229

Last change on this file since 04d7229 was 04d7229, checked in by / <>, at 2021-03-17T14:45:46Z

listings

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