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