# -*- coding: utf-8 -*-
#
# 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.


# DESCRIPTION :
#
# Basic wifi test -- succeeds if it can see any AP (optionally from a set).


import sys

from autotest_lib.client.bin import test
from autotest_lib.client.common_lib import error
from autotest_lib.client.cros import factory
from autotest_lib.client.cros import flimflam_test_path
import flimflam


class factory_BasicWifi(test.test):
    version = 1

    def run_once(self, target_ssids=None):
        """Try to find at least one wifi SSID."""

        factory.log('%s run_once' % self.__class__)

        flim = flimflam.FlimFlam()

        found_ssids = set([])
        for service in flim.GetObjectList('Service'):
            properties = service.GetProperties(utf8_strings=True)
            if properties.get('Type', None) != 'wifi':
                continue
            if 'Name' not in properties:
                continue
            found_ssids.add(properties['Name'])
        if not found_ssids:
            raise error.TestFail("No SSIDs found.")
        factory.log('found SSIDs: %s' % ', '.join(found_ssids))
        if target_ssids:
            if not (target_ssids & found_ssids):
                raise error.TestFail("None of the target SSIDs found.")

        factory.log('%s run_once finished' % self.__class__)
