summaryrefslogtreecommitdiff
path: root/test.py
blob: e1e30289c5c32d6d3d8985895a0752d09f39f98e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import ctypes
import socket
import threading
import time
import unittest

libpapo = ctypes.CDLL('./libpapo.so')

class PapoServerTest(unittest.TestCase):

    @classmethod
    def setUpClass(cls):
        server = papo_server();
        thread = threading.Thread(target=cls.run_papo_server, args=(server,))
        thread.start()
        time.sleep(2)

    @classmethod
    def tearDownClass(cls):
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
            s.connect(('localhost', 6667))
            s.sendall(b'exit')

    @classmethod
    def run_papo_server(cls, server):
        libpapo.server_init(ctypes.byref(server), 6667)
        libpapo.server_run(ctypes.byref(server))

    def test_server_run(self):
        with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
            s.connect(('localhost', 6667))
            s.sendall(b'A msg from client')
            data = s.recv(1024)
            self.assertIn(b':A msg from client', data)

class epoll_data(ctypes.Union):
    _fields_ = [('ptr', ctypes.c_void_p),
                ('fd', ctypes.c_int),
                ('u32', ctypes.c_uint),
                ('u64', ctypes.c_ulong)]

class epoll_event(ctypes.Structure):
    _fields_ = [('events', ctypes.c_uint),
                ('epoll_data_t', epoll_data)]


class papo_server(ctypes.Structure):
    _MAXEVENTS=64
    _fields_ = [('fd', ctypes.c_int),
                ('epoll_fd', ctypes.c_int),
                ('events', epoll_event * _MAXEVENTS),
                ('connected_clients', ctypes.c_int * _MAXEVENTS),
                ('running', ctypes.c_bool)]


if __name__ == '__main__':
    unittest.main()