xref: /aosp_15_r20/external/autotest/client/common_lib/barrier_unittest.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li#!/usr/bin/python3
2*9c5db199SXin Li
3*9c5db199SXin Li__author__ = """Ashwin Ganti ([email protected])"""
4*9c5db199SXin Li
5*9c5db199SXin Liimport os, sys, socket, errno, unittest, threading
6*9c5db199SXin Lifrom time import time, sleep
7*9c5db199SXin Liimport common
8*9c5db199SXin Lifrom autotest_lib.client.common_lib import error, barrier, base_barrier
9*9c5db199SXin Lifrom autotest_lib.client.common_lib.test_utils import mock
10*9c5db199SXin Li
11*9c5db199SXin Li
12*9c5db199SXin Liclass listen_server_test(unittest.TestCase):
13*9c5db199SXin Li
14*9c5db199SXin Li    def test_init(self):
15*9c5db199SXin Li        server = barrier.listen_server()
16*9c5db199SXin Li        server.close()
17*9c5db199SXin Li
18*9c5db199SXin Li
19*9c5db199SXin Li    def test_close(self):
20*9c5db199SXin Li        server = barrier.listen_server()
21*9c5db199SXin Li        # cannot bind on the same port again
22*9c5db199SXin Li        self.assertRaises(socket.error, barrier.listen_server)
23*9c5db199SXin Li        server.close()
24*9c5db199SXin Li        # now we can
25*9c5db199SXin Li        server = barrier.listen_server()
26*9c5db199SXin Li        server.close()
27*9c5db199SXin Li
28*9c5db199SXin Li
29*9c5db199SXin Liclass barrier_test(unittest.TestCase):
30*9c5db199SXin Li
31*9c5db199SXin Li    def setUp(self):
32*9c5db199SXin Li        self.god = mock.mock_god()
33*9c5db199SXin Li        self.god.mock_io()
34*9c5db199SXin Li
35*9c5db199SXin Li
36*9c5db199SXin Li    def tearDown(self):
37*9c5db199SXin Li        self.god.unmock_io()
38*9c5db199SXin Li
39*9c5db199SXin Li
40*9c5db199SXin Li    def test_initialize(self):
41*9c5db199SXin Li        b = barrier.barrier('127.0.0.1#', 'testtag', 100, 11921)
42*9c5db199SXin Li        self.assertEqual(b._hostid, '127.0.0.1#')
43*9c5db199SXin Li        self.assertEqual(b._tag, 'testtag')
44*9c5db199SXin Li        self.assertEqual(b._timeout_secs, 100)
45*9c5db199SXin Li        self.assertEqual(b._port, 11921)
46*9c5db199SXin Li
47*9c5db199SXin Li
48*9c5db199SXin Li    def test__get_host_from_id(self):
49*9c5db199SXin Li        hostname = base_barrier._get_host_from_id('my_host')
50*9c5db199SXin Li        self.assertEqual(hostname, 'my_host')
51*9c5db199SXin Li
52*9c5db199SXin Li        hostname = base_barrier._get_host_from_id('my_host#')
53*9c5db199SXin Li        self.assertEqual(hostname, 'my_host')
54*9c5db199SXin Li
55*9c5db199SXin Li        self.assertRaises(error.BarrierError,
56*9c5db199SXin Li                          base_barrier._get_host_from_id, '#my_host')
57*9c5db199SXin Li
58*9c5db199SXin Li
59*9c5db199SXin Li    def test_update_timeout(self):
60*9c5db199SXin Li        b = barrier.barrier('127.0.0.1#', 'update', 100)
61*9c5db199SXin Li        b._update_timeout(120)
62*9c5db199SXin Li        self.assertEqual(b._timeout_secs, 120)
63*9c5db199SXin Li
64*9c5db199SXin Li
65*9c5db199SXin Li    def test_remaining(self):
66*9c5db199SXin Li        b = barrier.barrier('127.0.0.1#', 'remain', 100)
67*9c5db199SXin Li        remain = b._remaining()
68*9c5db199SXin Li        self.assertEqual(remain, 100)
69*9c5db199SXin Li
70*9c5db199SXin Li
71*9c5db199SXin Li    def test_main_welcome_garbage(self):
72*9c5db199SXin Li        b = barrier.barrier('127.0.0.1#', 'garbage', 100)
73*9c5db199SXin Li        waiting_before = dict(b._waiting)
74*9c5db199SXin Li        seen_before = b._seen
75*9c5db199SXin Li
76*9c5db199SXin Li        sender, receiver = socket.socketpair()
77*9c5db199SXin Li        try:
78*9c5db199SXin Li            sender.send('GET /foobar?p=-1 HTTP/1.0\r\n\r\n')
79*9c5db199SXin Li            # This should not raise an exception.
80*9c5db199SXin Li            b._main_welcome((receiver, 'fakeaddr'))
81*9c5db199SXin Li
82*9c5db199SXin Li            self.assertEqual(waiting_before, b._waiting)
83*9c5db199SXin Li            self.assertEqual(seen_before, b._seen)
84*9c5db199SXin Li
85*9c5db199SXin Li            sender, receiver = socket.socketpair()
86*9c5db199SXin Li            sender.send('abcdefg\x00\x01\x02\n'*5)
87*9c5db199SXin Li            # This should not raise an exception.
88*9c5db199SXin Li            b._main_welcome((receiver, 'fakeaddr'))
89*9c5db199SXin Li
90*9c5db199SXin Li            self.assertEqual(waiting_before, b._waiting)
91*9c5db199SXin Li            self.assertEqual(seen_before, b._seen)
92*9c5db199SXin Li        finally:
93*9c5db199SXin Li            sender.close()
94*9c5db199SXin Li            receiver.close()
95*9c5db199SXin Li
96*9c5db199SXin Li
97*9c5db199SXin Li    def test_rendezvous_basic(self):
98*9c5db199SXin Li        # Basic rendezvous testing
99*9c5db199SXin Li        self.rendezvous_test(60, port=11920)
100*9c5db199SXin Li
101*9c5db199SXin Li
102*9c5db199SXin Li    def test_rendezvous_timeout(self):
103*9c5db199SXin Li        # The rendezvous should time out here and throw a
104*9c5db199SXin Li        # BarrierError since we are specifying a timeout of 0
105*9c5db199SXin Li        self.assertRaises(error.BarrierError,
106*9c5db199SXin Li                          self.rendezvous_test, 0, port=11921)
107*9c5db199SXin Li
108*9c5db199SXin Li
109*9c5db199SXin Li    def test_rendezvous_abort_ok(self):
110*9c5db199SXin Li        # Test with abort flag set to not abort.
111*9c5db199SXin Li        self.rendezvous_test(60, port=11920,
112*9c5db199SXin Li                             test_abort=True, abort=False)
113*9c5db199SXin Li
114*9c5db199SXin Li
115*9c5db199SXin Li    def test_rendezvous_abort(self):
116*9c5db199SXin Li        # The rendezvous should abort here and throw a
117*9c5db199SXin Li        # BarrierError since we are asking to abort
118*9c5db199SXin Li        self.assertRaises(error.BarrierError,
119*9c5db199SXin Li                          self.rendezvous_test, 0, port=11921,
120*9c5db199SXin Li                          test_abort=True, abort=True)
121*9c5db199SXin Li
122*9c5db199SXin Li
123*9c5db199SXin Li    def test_rendezvous_servers_basic(self):
124*9c5db199SXin Li        # The rendezvous should time out here and throw a
125*9c5db199SXin Li        # BarrierError since we are specifying a timeout of 0
126*9c5db199SXin Li        self.rendezvous_test(60, port=11921,
127*9c5db199SXin Li                             rendezvous_servers=True)
128*9c5db199SXin Li
129*9c5db199SXin Li
130*9c5db199SXin Li    def test_rendezvous_servers_timeout(self):
131*9c5db199SXin Li        # The rendezvous should time out here and throw a
132*9c5db199SXin Li        # BarrierError since we are specifying a timeout of 0
133*9c5db199SXin Li        self.assertRaises(error.BarrierError,
134*9c5db199SXin Li                          self.rendezvous_test, 0, port=11922,
135*9c5db199SXin Li                          rendezvous_servers=True)
136*9c5db199SXin Li
137*9c5db199SXin Li
138*9c5db199SXin Li    def test_rendezvous_servers_abort_ok(self):
139*9c5db199SXin Li        # Test with abort flag set to not abort.
140*9c5db199SXin Li        self.rendezvous_test(60, port=11920, rendezvous_servers=True,
141*9c5db199SXin Li                             test_abort=True, abort=False)
142*9c5db199SXin Li
143*9c5db199SXin Li
144*9c5db199SXin Li    def test_rendezvous_servers_abort(self):
145*9c5db199SXin Li        # The rendezvous should abort here and throw a
146*9c5db199SXin Li        # BarrierError since we are asking to abort
147*9c5db199SXin Li        self.assertRaises(error.BarrierError,
148*9c5db199SXin Li                          self.rendezvous_test, 0, port=11922,
149*9c5db199SXin Li                          rendezvous_servers=True,
150*9c5db199SXin Li                          test_abort=True, abort=True)
151*9c5db199SXin Li
152*9c5db199SXin Li
153*9c5db199SXin Li    # Internal utility function (not a unit test)
154*9c5db199SXin Li    def rendezvous_test(self, timeout, port=11922,
155*9c5db199SXin Li                        rendezvous_servers=False, test_abort=False,
156*9c5db199SXin Li                        abort=False, listen_server=None):
157*9c5db199SXin Li        if listen_server:
158*9c5db199SXin Li            port = None
159*9c5db199SXin Li
160*9c5db199SXin Li        def _rdv(addr):
161*9c5db199SXin Li            b1 = barrier.barrier(addr, "test_meeting", timeout, port,
162*9c5db199SXin Li                                 listen_server=listen_server)
163*9c5db199SXin Li            if not rendezvous_servers:
164*9c5db199SXin Li                if test_abort:
165*9c5db199SXin Li                    b1.rendezvous('127.0.0.1#0', '127.0.0.1#1', abort=abort)
166*9c5db199SXin Li                else:
167*9c5db199SXin Li                    b1.rendezvous('127.0.0.1#0', '127.0.0.1#1')
168*9c5db199SXin Li            else:
169*9c5db199SXin Li                if test_abort:
170*9c5db199SXin Li                    b1.rendezvous_servers('127.0.0.1#0', '127.0.0.1#1',
171*9c5db199SXin Li                                          abort=abort)
172*9c5db199SXin Li                else:
173*9c5db199SXin Li                    b1.rendezvous_servers('127.0.0.1#0', '127.0.0.1#1')
174*9c5db199SXin Li
175*9c5db199SXin Li
176*9c5db199SXin Li        def _thread_rdv(addr):
177*9c5db199SXin Li            # We need to ignore the exception on one side.
178*9c5db199SXin Li            try:
179*9c5db199SXin Li                _rdv(addr)
180*9c5db199SXin Li            except error.BarrierError:
181*9c5db199SXin Li                pass
182*9c5db199SXin Li
183*9c5db199SXin Li        client = threading.Thread(target=_thread_rdv,
184*9c5db199SXin Li                                  args=('127.0.0.1#0',))
185*9c5db199SXin Li        client.start()
186*9c5db199SXin Li        _rdv('127.0.0.1#1')
187*9c5db199SXin Li        client.join()
188*9c5db199SXin Li
189*9c5db199SXin Li
190*9c5db199SXin Li    def test_reusing_listen_server(self):
191*9c5db199SXin Li        """
192*9c5db199SXin Li        Test that reusing the same listen server object works.
193*9c5db199SXin Li        """
194*9c5db199SXin Li        server = barrier.listen_server()
195*9c5db199SXin Li        self.rendezvous_test(10, listen_server=server)
196*9c5db199SXin Li        self.rendezvous_test(10, listen_server=server)
197*9c5db199SXin Li        self.rendezvous_test(10, listen_server=server)
198*9c5db199SXin Li
199*9c5db199SXin Li
200*9c5db199SXin Liif __name__ == "__main__":
201*9c5db199SXin Li    unittest.main()
202