source: .tests/test1.py @ a4623f4

Last change on this file since a4623f4 was a4623f4, checked in by / <>, at 2021-03-16T14:23:56Z

more loud

  • Property mode set to 100644
File size: 5.5 KB
Line 
1import socket
2import sys
3import time
4import select
5
6YESTEST = True
7MESSAGETEST = True
8BLOCKTEST = True
9OFFLINETEST = False
10RENAMETEST = True
11SHOWLOG = True
12
13FAILED = []
14
15SEPARATOR = "================================"
16SMOLPARATOR = "--------------------------------"
17
18class IrcClient:
19    def __init__(self, nick, pwd):
20        self.nick = nick
21        self.pwd = pwd
22        self.log = ''
23        self.tmplog = ''
24        self.sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
25
26    def send_raw(self, msg, loud = True):
27        self.receive()
28        if loud:
29            print('FROM '+ self.nick + '|| ' + msg)
30        self.log += msg+'\r\n'
31        self.tmplog += msg+'\r\n'
32        self.sck.send((msg+'\r\n').encode())
33
34    def send_priv_msg(self, recip, msg, loud = True):
35        self.send_raw('PRIVMSG '+recip+' :'+msg, loud)
36
37    def connect(self):
38        try:
39            self.sck.connect(('127.0.0.1', 6667))
40        except:
41            print("IRC connection failed for " + self.nick)
42            sys.exit(1)
43       
44        print("IRC connection established for " + self.nick)
45
46        self.send_raw('USER ' + (self.nick + " ")*3)
47        self.send_raw('NICK ' + self.nick)
48        self.send_raw('JOIN &bitlbee')
49
50    def jabber_login(self):
51        self.send_priv_msg("&bitlbee", "account add jabber "+self.nick+"@localhost "+self.pwd)
52        time.sleep(0.3)
53        self.send_priv_msg("&bitlbee", "account on")
54        time.sleep(1)
55        self.receive()
56        if self.log.find('Logged in') == -1:
57            print("Jabber login failed for " + self.nick)
58            sys.exit(1)
59        else:
60            print("Jabber login successful for " + self.nick)
61
62    def receive(self):
63        text = ''
64        while True:
65            readable, _, _ = select.select([self.sck], [], [], 5)
66            if self.sck in readable:
67                text += self.sck.recv(2040).decode()
68                for line in text.split('\n'):
69                    if line.find('PING') != -1:
70                        self.send_raw('PONG ' + line.split()[1])
71            else:
72                break
73        self.log += text
74        self.tmplog += text
75        return text
76
77    def add_jabber_buddy(self, nick):
78        self.send_priv_msg("&bitlbee", "add 0 " + nick+"@localhost")
79   
80    def block_jabber_buddy(self, nick):
81        self.send_priv_msg("&bitlbee", "block " + nick)
82
83    def unblock_jabber_buddy(self, nick):
84        self.send_priv_msg("&bitlbee", "allow " + nick)
85
86    def rename_jabber_buddy(self, oldnick, newnick):
87        self.send_priv_msg("&bitlbee", "rename " + oldnick + " " + newnick)
88       
89def msg_comes_thru(sender, receiver, message):
90    sender.send_priv_msg(receiver.nick, message)
91    received = receiver.receive().find(message) != -1
92    return received
93
94def perform_test(clis, test_function, test_name):
95    global FAILED
96    for cli in clis:
97        cli.tmplog=""
98
99    print("\n"+SEPARATOR)
100    print("Test: "+test_name)
101
102    if test_function(clis):
103        print("Test passed")
104    else:
105        print("Test failed")
106        FAILED += [test_name]
107
108        flag = False
109        for cli in clis:
110            if cli.tmplog != "":
111                print(SMOLPARATOR)
112                print("Test Log "+ cli.nick+":")
113                print(cli.tmplog)
114                flag = True
115        if flag:
116            print(SMOLPARATOR)
117
118    print(SEPARATOR+"\n")
119
120def yes_test(clis):
121    ret = False
122    for _ in range(100):
123        clis[0].send_raw("yes", loud = False)
124        clis[0].receive()
125        if (not ret) and clis[0].log.find("Did I ask you something?"):
126            ret = True
127        if clis[0].log.find("Buuuuuuuuuuuuuuuurp"):
128            print("The RNG gods smile upon us")
129            break
130    return ret
131
132def message_test(clis):
133    print("Test: Send message")
134    ret = msg_comes_thru(clis[0], clis[1], 'ohai <3')
135    ret = ret & msg_comes_thru(clis[1], clis[0], 'uwu *pounces*')
136    return ret
137
138def block_test(clis):
139    clis[0].block_jabber_buddy(clis[1].nick)
140    ret = not msg_comes_thru(clis[1], clis[0], 'm-meow?')
141    clis[0].unblock_jabber_buddy(clis[1].nick)
142    ret = ret & msg_comes_thru(clis[1], clis[0], '*purrs*')
143    return ret
144
145def rename_test(clis):
146    newname = "xXx_pup_LINKENPARK4EVA"
147    message = "rawr meanmz i luv<3 u in dinosaur"
148
149    clis[0].rename_jabber_buddy(clis[1].nick, newname)
150    clis[0].send_priv_msg(newname, message)
151    ret = clis[1].receive().find(message) != -1
152
153    clis[0].rename_jabber_buddy("-del", newname)
154    ret = ret & msg_comes_thru(clis[0], clis[1], "rawr")
155    return ret
156
157def run_tests():
158    global FAILED
159    clis = []
160    clis += [IrcClient('test1', 'asd')]
161    clis += [IrcClient('test2', 'asd')]
162    for cli in clis:
163        cli.connect()
164
165    if YESTEST:
166        perform_test(clis, yes_test, "Yes")
167
168    for cli in clis:
169        cli.jabber_login()
170    clis[0].add_jabber_buddy(clis[1].nick)
171
172    if MESSAGETEST:
173        perform_test(clis, message_test, "Send message")
174
175    if BLOCKTEST:
176        perform_test(clis, block_test, "Block user")
177
178    if RENAMETEST:
179        perform_test(clis, rename_test, "Rename user")
180
181    if FAILED or SHOWLOG:
182        print("")
183        for cli in clis:
184            print(SMOLPARATOR)
185            print("Log "+ cli.nick+":")
186            print(cli.log)
187        print(SMOLPARATOR)
188
189    if len(FAILED) != 0:
190        print("\n" + SEPARATOR + "\nSome test have failed:")
191        for fail in FAILED:
192            print(fail)
193    else:
194        print("\n" + SEPARATOR + "\nAll tests have passed")
195   
196if __name__ == "__main__":
197    run_tests()
198    if FAILED:
199        sys.exit(1)
Note: See TracBrowser for help on using the repository browser.