# This is used directly by server/tests/barriertest/control.srv

import logging, time
from autotest_lib.client.bin import test
from autotest_lib.client.common_lib import barrier, error


class barriertest(test.test):
    version = 2


    def run_once(self, our_addr, hostnames, main, timeout=120):
        # A reusable local server as we're using multiple barriers in one test.
        server = barrier.listen_server()

        # Basic barrier rendezvous test.
        self.job.barrier(our_addr, 'First', timeout=timeout,
                         listen_server=server).rendezvous(*hostnames)
        logging.info('1. rendezvous "First" complete.')
        time.sleep(2)

        # A rendezvous_servers using a different main than the default.
        self.job.barrier(our_addr, 'Second', timeout=timeout,
                         listen_server=server
                         ).rendezvous_servers(hostnames[-1], *hostnames[:-1])
        logging.info('2. rendezvous_servers "Second" complete.')
        time.sleep(2)

        # A regular rendezvous, this time testing the abort functionality.
        try:
            self.job.barrier(our_addr, 'WillAbort', timeout=timeout,
                             listen_server=server
                             ).rendezvous(abort=True, *hostnames)
        except error.BarrierAbortError:
            pass
        except error.BarrierError, e:
            # We did get an error from the barrier, but was is acceptable or
            # not?  Site code may not be able to indicate an explicit abort.
            self.job.record('WARN', None, 'barriertest',
                            'BarrierError %s instead of BarrierAbortError.' % e)
        else:
            raise error.TestFail('Explicit barrier rendezvous abort failed.')
        logging.info('3. rendezvous(abort=True) complete.')
        time.sleep(2)

        # Now attempt a rendezvous_servers that also includes the server.
        self.job.barrier(our_addr, 'FinalSync', timeout=timeout,
                         listen_server=server
                         ).rendezvous_servers(main, *hostnames)
        logging.info('4. rendezvous_servers "FinalSync" complete.')
        time.sleep(2)

        # rendezvous_servers, aborted from the main.
        try:
            self.job.barrier(our_addr, 'WillAbortServers', timeout=timeout,
                             listen_server=server
                             ).rendezvous_servers(main, *hostnames)
        except error.BarrierAbortError:
            pass
        except error.BarrierError, e:
            # We did get an error from the barrier, but was is acceptable or
            # not?  Site code may not be able to indicate an explicit abort.
            self.job.record('WARN', None, 'barriertest',
                            'BarrierError %s instead of BarrierAbortError.' % e)
        else:
            raise error.TestFail('Explicit barrier rendezvous abort failed.')
        logging.info('5. rendezvous_servers(abort=True) complete.')
        time.sleep(2)

        server.close()
