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