# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import logging
import os
import sys
import tempfile

from autotest_lib.client.bin import test, utils
from autotest_lib.client.common_lib import error, utils
from autotest_lib.client.cros import service_stopper, avahi_utils
from autotest_lib.client.cros.netprotos import cros_p2p, zeroconf


P2P_CLIENT = '/usr/sbin/p2p-client'


class p2p_ConsumeFiles(test.test):
    """The P2P Client class tester.

    Creates a fake network of peers with lansim and tests if p2p-client can
    discover files on that network.
    """
    version = 1

    def setup(self):
        self.job.setup_dep(['lansim'])


    def initialize(self):
        dep = 'lansim'
        dep_dir = os.path.join(self.autodir, 'deps', dep)
        logging.info('lansim is at %s', dep_dir)
        self.job.install_pkg(dep, 'dep', dep_dir)

        # Import the lansim modules installed on lansim/build/
        sys.path.append(os.path.join(dep_dir, 'build'))

        self._services = None
        self._tap = None


    def cleanup(self):
        avahi_utils.avahi_stop()

        if self._tap:
            self._tap.down()

        if self._services:
            self._services.restore_services()


    def _setup_avahi(self):
        """Initializes avahi daemon on a new tap interface."""
        from lansim import tuntap
        # Ensure p2p and avahi aren't running.
        self._services = service_stopper.ServiceStopper(['p2p', 'avahi'])
        self._services.stop_services()

        # Initialize avahi-daemon listenning only on the fake TAP interface.
        self._tap = tuntap.TunTap(tuntap.IFF_TAP, name='faketap')

        # The network 169.254/16 shouldn't clash with other real services. We
        # use a /24 subnet of it here.
        self._tap.set_addr('169.254.10.1', mask=24)
        self._tap.up()

        # Re-launch avahi-daemon on the tap interface.
        avahi_utils.avahi_start_on_iface(self._tap.name)


    def _run_p2p_client(self, args, timeout=10., ignore_status=False):
        """Run p2p-client with the provided arguments.

        @param args: list of strings, each one representing an argument.
        @param timeout: Timeout for p2p-client in seconds before it's killed.
        @return: the return value of the process and the stdout content.
        """
        fd, tempfn = tempfile.mkstemp(prefix='p2p-output')
        ret = utils.run(
                P2P_CLIENT, args=['-v=1'] + list(args), timeout=timeout,
                ignore_timeout=True, ignore_status=True,
                stdout_tee=open(tempfn, 'w'), stderr_tee=sys.stdout)
        url = os.fdopen(fd).read()
        os.unlink(tempfn)

        if not ignore_status and ret is None:
            self._join_simulator()
            raise error.TestFail('p2p-client %s timeout.' % ' '.join(args))

        if not ignore_status and ret.exit_status != 0:
            self._join_simulator()
            raise error.TestFail('p2p-client %s finished with value: %d' % (
                                 ' '.join(args), ret.exit_status))

        return None if ret is None else ret.exit_status, url


    def _join_simulator(self):
        """Stops the simulator and logs any exception generated there."""
        self._sim.stop()
        self._sim.join()
        if self._sim.error:
            logging.error('SimulatorThread exception: %r', self._sim.error)
            logging.error(self._sim.traceback)


    def run_once(self):
        from lansim import simulator, host

        # Setup the environment where avahi-daemon runs during the test.
        self._setup_avahi()

        self._sim = simulator.SimulatorThread(self._tap)
        # Create three peers host-a, host-b and host-c sharing a set of files.
        # This first block creates the fake host on the simulator. For clarity
        # and easier debug, note that the last octect on the IPv4 address is the
        # ASCII for a, b and c respectively.
        peer_a = host.SimpleHost(self._sim, '94:EB:2C:00:00:61',
                                 '169.254.10.97')
        peer_b = host.SimpleHost(self._sim, '94:EB:2C:00:00:62',
                                 '169.254.10.98')
        peer_c = host.SimpleHost(self._sim, '94:EB:2C:00:00:63',
                                 '169.254.10.99')

        # Run a userspace implementation of avahi + p2p-server on the fake
        # hosts. This announces the P2P service on each fake host.
        zero_a = zeroconf.ZeroconfDaemon(peer_a, 'host-a')
        zero_b = zeroconf.ZeroconfDaemon(peer_b, 'host-b')
        zero_c = zeroconf.ZeroconfDaemon(peer_c, 'host-c')

        cros_a = cros_p2p.CrosP2PDaemon(zero_a)
        cros_b = cros_p2p.CrosP2PDaemon(zero_b)
        cros_c = cros_p2p.CrosP2PDaemon(zero_c)

        # Add files to each host. All the three hosts share the file "everyone"
        # with different size, used to test the minimum-size argument.
        # host-a and host-b share another file only-a and only-b respectively,
        # used to check that the p2p-client picks the right peer.
        cros_a.add_file('everyone', 1000)
        cros_b.add_file('everyone', 10000)
        cros_c.add_file('everyone', 20000)

        cros_a.add_file('only-a', 5000)

        cros_b.add_file('only-b', 8000)

        # Initially set the number of connections on the network to a low number
        # (two) that later will be increased to test if p2p-client hangs when
        # there are too many connections.
        cros_a.set_num_connections(1)
        cros_c.set_num_connections(1)

        self._sim.start()

        ### Request a file shared from only one peer.
        _ret, url = self._run_p2p_client(
                args=('--get-url=only-a',), timeout=10.)

        if url.strip() != 'http://169.254.10.97:16725/only-a':
            self._join_simulator()
            raise error.TestFail('Received unknown url: "%s"' % url)

        ### Check that the num_connections is reported properly.
        _ret, conns = self._run_p2p_client(args=('--num-connections',),
                                          timeout=10.)
        if conns.strip() != '2':
            self._join_simulator()
            raise error.TestFail('Wrong number of connections reported: %s' %
                                 conns)

        ### Request a file shared from a peer with enough of the file.
        _ret, url = self._run_p2p_client(
                args=('--get-url=everyone', '--minimum-size=15000'),
                timeout=10.)

        if url.strip() != 'http://169.254.10.99:16725/everyone':
            self._join_simulator()
            raise error.TestFail('Received unknown url: "%s"' % url)

        ### Request too much bytes of an existing file.
        ret, url = self._run_p2p_client(
                args=('--get-url=only-b', '--minimum-size=10000'),
                timeout=10., ignore_status=True)

        if url:
            self._join_simulator()
            raise error.TestFail('Received url but expected none: "%s"' % url)
        if ret == 0:
            raise error.TestFail('p2p-client returned no URL, but without an '
                                 'error.')

        ### Check that p2p-client hangs while waiting for a peer when there are
        ### too many connections.
        self._sim.run_on_simulator(
                lambda: cros_a.set_num_connections(99, announce=True))

        # For a query on the DUT to check that the new information is received.
        for attempt in range(5):
            _ret, conns = self._run_p2p_client(args=('--num-connections',),
                                               timeout=10.)
            conns = conns.strip()
            if conns == '100':
                break
        if conns != '100':
            self._join_simulator()
            raise error.TestFail("p2p-client --num-connections doesn't reflect "
                                 "the current number of connections on the "
                                 "network, returned %s" % conns)

        ret, url = self._run_p2p_client(
                args=('--get-url=only-b',), timeout=5., ignore_status=True)
        if not ret is None:
            self._join_simulator()
            raise error.TestFail('p2p-client finished but should have waited '
                                 'for num_connections to drop.')

        self._sim.stop()
        self._sim.join()

        if self._sim.error:
            raise error.TestError('SimulatorThread ended with an exception: %r'
                                  % self._sim.error)
