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

from autotest_lib.client.bin import test
from autotest_lib.client.common_lib import error
from autotest_lib.client.cros import flimflam_test_path
from autotest_lib.client.cros import hostapd_server
from autotest_lib.client.cros import virtual_ethernet_pair

import shill_proxy

class network_8021xEapDetection(test.test):
    """The 802.1x EAP detection class.

    Runs hostapd on one side of an ethernet pair, and shill on the other.
    Ensures that shill detects an EAP request frame sent by hostapd.

    """
    INTERFACE_NAME = 'pseudoethernet0'
    DETECTION_FLAG = 'EapAuthenticatorDetected'
    version = 1

    def get_detection_flag(self, interface_name):
        """Checks the interface for the EAP detection flag.

        @param interface_name: The name of the interface to check

        @return true if the "EAP detected" flag is set, false otherwise.

        """
        device = self._shill_proxy.find_object('Device',
                                               {'Name' : interface_name})
        if device is None:
            raise error.TestFail('Device was not found.')
        device_properties = device.GetProperties(utf8_strings=True)
        logging.info('Device properties are %r', device_properties)
        return shill_proxy.dbus2primitive(
                device_properties[self.DETECTION_FLAG])


    def run_once(self):
        """Test main loop."""
        self._shill_proxy = shill_proxy.ShillProxy()
        with virtual_ethernet_pair.VirtualEthernetPair(
                peer_interface_name=self.INTERFACE_NAME,
                peer_interface_ip=None) as ethernet_pair:
            if not ethernet_pair.is_healthy:
                raise error.TestFail('Could not create virtual ethernet pair.')

            if self.get_detection_flag(self.INTERFACE_NAME):
                raise error.TestFail('EAP detection flag is already set.')

            with hostapd_server.HostapdServer(
                    interface=ethernet_pair.interface_name) as hostapd:
                # Wait for hostapd to initialize.
                time.sleep(1)
                if not hostapd.running():
                    raise error.TestFail('hostapd process exited.')

                hostapd.send_eap_packets()
                if not self.get_detection_flag(self.INTERFACE_NAME):
                    raise error.TestFail('EAP detection flag is not set.')
