# 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 pprint

from autotest_lib.client.common_lib import error
from autotest_lib.client.common_lib.cros.network import xmlrpc_datatypes
from autotest_lib.server import test
from autotest_lib.server.cros.network import chaos_clique_utils

class network_WiFi_ChaosConnectDisconnect(test.test):
    """ Dynamic Chaos test to connect and disconnect to an AP. """

    version = 1


    def run_once(self, capturer, capturer_frequency, capturer_ht_type,
                 host, assoc_params, client, tries, debug_info=None):
        """ Main entry function for autotest.

        @param capturer: a packet capture device
        @param capturer_frequency: integer channel frequency in MHz.
        @param capturer_ht_type: string specifier of channel HT type.
        @param host: an Autotest host object, DUT.
        @param assoc_params: an AssociationParameters object.
        @param client: WiFiClient object
        @param tries: an integer, number of connection attempts.
        @param debug_info: a string of additional info to display on failure

        """

        results = []

        for i in range(1, tries + 1):
            client.shill.disconnect(assoc_params.ssid)
            if not client.shill.init_test_network_state():
                return 'Failed to set up isolated test context profile.'

            capturer.start_capture(capturer_frequency, ht_type=capturer_ht_type)
            try:
                success = False
                logging.info('Connection attempt %d', i)
                host.syslog('Connection attempt %d' % i)
                start_time = host.run("date '+%FT%T.%N%:z'").stdout.strip()
                assoc_result = xmlrpc_datatypes.deserialize(
                        client.shill.connect_wifi(assoc_params))
                end_time = host.run("date '+%FT%T.%N%:z'").stdout.strip()
                success = assoc_result.success
                if not success:
                    logging.info('Connection attempt %d failed; reason: %s',
                                 i, assoc_result.failure_reason)
                    results.append(
                            {'try' : i,
                             'error' : assoc_result.failure_reason,
                             'start_time': start_time,
                             'end_time': end_time})
                else:
                    logging.info('Connection attempt %d passed', i)
            finally:
                filename = str('connect_try_%d_%s.trc' % (i,
                               ('success' if success else 'fail')))
                capturer.stop_capture(save_dir=self.outputdir,
                                      save_filename=filename)
                if not success:
                    client.collect_debug_info('try_%d' % i)
                    chaos_clique_utils.collect_pcap_info(self.outputdir,
                                                         filename, i)
                client.shill.disconnect(assoc_params.ssid)
                client.shill.clean_profiles()

        if len(results) > 0:
            # error.TestError doesn't handle the formatting inline, doing it
            # here so it is clearer to read in the status.log file.
            msg = str('Failed on the following attempts:\n%s\n'
                      'With the assoc_params:\n%s\n'
                      'Debug info: %s\nDUT MAC:%s' %
                      (pprint.pformat(results), assoc_params, debug_info,
                       client.wifi_mac))
            raise error.TestFail(msg)
        logging.debug('Debug info: %s', debug_info)
