# Copyright (c) 2012 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

from autotest_lib.client.common_lib import error


class WifiSimpleConnector(object):
    """Simple class that uses pyauto calls to connected to a wifi network."""


    def __init__(self, pyauto_object):
        self.pyauto = pyauto_object


    def connect_to_wifi_network(self, ssid=None, ssid_visible=True,
                                wifi_security='SECURITY_NONE',
                                wifi_password=''):
        if not ssid:
            raise error.TestError(
                'Invalid configuration, a ssid must be specificed.')
        if wifi_security not in ('SECURITY_NONE', 'SECURITY_WEP',
                                 'SECURITY_WPA', 'SECURITY_RSN',
                                 'SECURITY_8021X'):
            raise error.TestError('Invalid security type.')

        device_path = None
        if ssid_visible:
            device_path = self.pyauto.GetServicePath(ssid)
            if not device_path:
                raise error.TestError('Unable to locate the visible ssid %s.' %
                                      ssid)
            err = self.pyauto.ConnectToWifiNetwork(device_path,
                                                   password=wifi_password)
            if err:
                msg = ('Failed to connect to wifi network %s. Reason: %s.'
                       % (ssid, err))
                raise error.TestError(msg)
        else:
            err = self.pyauto.ConnectToHiddenWifiNetwork(ssid, wifi_security,
                                                         password=wifi_password)
        if err:
            msg = ('Failed to connect to wifi network %s. Reason: %s.' %
                   (ssid, err))
            raise error.TestError(msg)
        self.pyauto.NavigateToURL('http://www.google.com')
        if self.pyauto.GetActiveTabTitle() != 'Google':
            msg = ('Unable to connect to google.com, network is mis-configured '
                   'or was unable to connect to wifi network. Error: %s' % e)
            raise error.TestError(msg)

        logging.debug('Connection successful.')
