aboutsummaryrefslogtreecommitdiffstats
path: root/tests/worker.py
blob: cf121f38a6c28a89a143a7f91af63a67c1659fa5 (plain) (blame)
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#!/usr/bin/env python

import unittest
import pexpect

from re import search, escape
from os import kill
from signal import SIGINT, SIGUSR1

class WorkerTests(unittest.TestCase):

    __exec_echo_lol_output__ = '0\r\n4\r\nlol\r\n\r\n0\r\n\r\n'

    def prompt(self, n):
        return ('#%i#\r\n' % n)

    def interrupted(self, n):
        return ('#%i# INTERRUPTED\r\n' % n)

    def setUp(self):
        self.worker = pexpect.spawn('python ../worker/worker.py')
        # worker should always be very fast to span
        self.expect(self.prompt(0))

    def sig(self, sig):
        kill(self.worker.pid, sig)

    def lose_expect(self, v, timeout = 3):
        self.worker.expect(v, timeout)

    def expect(self, v, timeout = 3):
        self.lose_expect(v, timeout)
        self.assertEqual(self.worker.before, '')

    def send(self, text):
        self.worker.send(text)
        self.expect(escape(text))

    def sendlines(self, lines):
        for line in lines:
            self.worker.send(line+'\n')
        for line in lines:
            self.expect(escape(line)+'\r\n')

    def __finishes_ok__(self):
        self.expect(pexpect.EOF)
        self.worker.close()
        self.assertEqual(self.worker.exitstatus, 0)

    def test_exit(self):
        self.sendlines(['exit'])
        self.__finishes_ok__()

    def test_ctrlc_when_running(self):
        self.sendlines(['exec', 'sleep 1; exec echo lol'])
        self.sig(SIGINT)
        self.expect(self.interrupted(0)+self.prompt(1))
        self.test_exit()

    def test_ctrlc_on_cmd_prompt(self):
        self.sig(SIGINT)
        self.expect(self.interrupted(0)+self.prompt(1))
        self.test_exit()

    def test_ctrlc_when_entering_command(self):
        # "Mon clavier se blo" -- French reference
        self.send('glo')
        self.sig(SIGINT)
        self.expect(self.interrupted(0)+self.prompt(1))
        self.test_exit()

    def test_ctrlc_on_readparms_drops(self):
        self.sendlines(['exec'])
        self.sig(SIGINT)
        self.expect(self.interrupted(0)+self.prompt(1))
        self.sendlines(['glob'])
        self.sig(SIGINT)
        self.expect(self.interrupted(1)+self.prompt(2))
        self.test_exit()

    def test_basic_noop(self):
        self.sendlines(['noop'])
        self.expect(self.prompt(1))
        self.test_exit()
    
    def test_basic_ping(self):
        self.sendlines(['ping'])
        self.expect('ALIVE\r\n' + self.prompt(1))
        self.test_exit()

    def test_basic_glob(self):
        self.sendlines(['glob', '/*bin'])
        self.expect('2\r\n(/bin\r\n/sbin|/sbin\r\n/bin)\r\n'+self.prompt(1))
        self.test_exit()

    def test_empty_glob(self):
        self.sendlines(['glob', '/?kyzh?'])
        self.expect('0\r\n'+self.prompt(1))
        self.test_exit()

    def test_basic_sigusr1(self):
        self.sig(SIGUSR1)
        self.expect('ALIVE\r\n')
        self.test_exit()

    def test_sigusr1_when_entering_command(self):
        self.worker.send('pin')
        self.sig(SIGUSR1)
        self.expect('pinALIVE\r\n')
        self.sendlines(['g'])
        self.expect('ALIVE\r\n' + self.prompt(1))
        self.test_exit()

    def test_sigusr1_on_readparms(self):
        self.worker.send('exec\nech')
        self.sig(SIGUSR1)
        self.worker.send('o lol\n')
        self.expect('exec\r\nechALIVE\r\no lol\r\n'+
            self.__exec_echo_lol_output__ + self.prompt(1))
        self.test_exit()

    def test_exec_continues_after_sigusr1(self):
        self.worker.send('exec\nsleep 0.1; exec echo lol\n')
        self.sig(SIGUSR1)
        self.expect('exec\r\nsleep 0.1; exec echo lol\r\nALIVE\r\n'+
            self.__exec_echo_lol_output__ + self.prompt(1))
        self.test_exit()

    def test_increasing_counter(self):
        for req_counter in range(1, 5):
            self.sendlines(['noop'])
            self.expect(self.prompt(req_counter))
        for req_counter in range(5, 10):
            self.sendlines(['ping'])
            self.expect('ALIVE\r\n'+self.prompt(req_counter))
        self.test_exit()

    def test_queuecommands(self):
        self.worker.send('ping\n'*5)
        self.worker.send('exec\necho lol\n'*5)
        for req_counter in range(1,6):
            self.lose_expect('ALIVE\r\n'+self.prompt(req_counter))
        for req_counter in range(6,11):
            self.lose_expect(self.__exec_echo_lol_output__+self.prompt(req_counter))
        self.test_exit()

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