blob: e9761ef7f52449829d3e3511b18e36983090fb09 [file] [log] [blame]
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Unit test for ap_configurator."""
import os
import sys
import unittest
# Define autotest_lib MAGIC!
sys.path.append(os.path.join(
os.path.dirname(os.path.abspath(__file__)), '..', '..', '..'))
from utils import common
from autotest_lib.server.cros import host_lock_manager
import ap_batch_locker
import ap_spec
class ConfiguratorTest(unittest.TestCase):
"""This test needs to be run against the UI interface of a real AP.
The purpose of this test is to act as a basic acceptance test when
developing a new AP configurator class. Use this to make sure all core
functionality is implemented.
This test does not verify that everything works for ALL APs. It only
tests against the AP specified below in AP_SPEC.
Launch this unit test from outside chroot:
$ cd ~/chromeos/src/third_party/autotest/files
$ python utils/unittest_suite.py \
server.cros.ap_configurators.ap_configurator_test --debug
To run a single test, from outside chroot, e.g.
$ cd ~/chromeos/src/third_party/autotest/files/\
server/cros/ap_configurators
$ python -m unittest ap_configurator_test.ConfiguratorTest.test_ssid
"""
# Enter the hostname of the AP to test against
AP_SPEC = ap_spec.APSpec(hostnames=['chromeos3-row4-rack1-host9'])
# Do not actually power up the AP, assume it is on.
OVERRIDE_POWER = True
@classmethod
def setUpClass(self):
lock_manager = host_lock_manager.HostLockManager()
self.batch_locker = ap_batch_locker.ApBatchLocker(lock_manager,
self.AP_SPEC, hostname_matching_only=True)
ap_batch = self.batch_locker.get_ap_batch(batch_size=1)
if not ap_batch:
raise RuntimeError('Unable to lock AP %r' % self.AP_SPEC)
self.ap = ap_batch[0]
# Use a development webdriver server
self.ap.webdriver_port = 9516
if not self.OVERRIDE_POWER:
print('Powering up the AP (this may take a minute...)')
self.ap._power_up_router()
else:
print('Assuming AP is not, skipping power on.')
self.ap.router_on = True
@classmethod
def tearDownClass(self):
if self.batch_locker:
self.batch_locker.unlock_aps()
if not self.OVERRIDE_POWER:
self.ap._power_down_router()
def setUp(self):
# All tests have to have a band pre-set.
bands = self.ap.get_supported_bands()
self.ap.set_band(bands[0]['band'])
self.ap.apply_settings()
def disabled_security_on_all_bands(self):
"""Disables security on all available bands."""
for band in self.ap.get_supported_bands():
self.ap.set_band(band['band'])
self.ap.set_security_disabled()
self.ap.apply_settings()
def return_non_n_mode_pair(self):
"""Returns a mode and band that do not contain wireless mode N.
Wireless N does not support several wifi security modes. In order
to test they can be configured that makes it easy to select an
available compatible mode.
"""
# Make this return something that does not contain N
return_dict = {}
for mode in self.ap.get_supported_modes():
return_dict['band'] = mode['band']
for mode_type in mode['modes']:
if (mode_type & ap_spec.MODE_N) != ap_spec.MODE_N:
return_dict['mode'] = mode_type
else:
raise RuntimeError('No modes without MODE_N')
return return_dict
def test_make_no_changes(self):
"""Test saving with no changes doesn't throw an error."""
# Set to a known state.
self.ap.set_radio(enabled=True)
self.ap.apply_settings()
# Set the same setting again.
self.ap.set_radio(enabled=True)
self.ap.apply_settings()
def test_radio(self):
"""Test we can adjust the radio setting."""
self.ap.set_radio(enabled=True)
self.ap.apply_settings()
self.ap.set_radio(enabled=False)
self.ap.apply_settings()
def test_channel(self):
"""Test adjusting the channel."""
supported_bands = self.ap.get_supported_bands()
for band in supported_bands:
self.ap.set_band(band['band'])
# Set to the second available channel
self.ap.set_channel(band['channels'][1])
self.ap.apply_settings()
def test_visibility(self):
"""Test adjusting the visibility."""
if not self.ap.is_visibility_supported():
return
self.ap.set_visibility(False)
self.ap.apply_settings()
self.ap.set_visibility(True)
self.ap.apply_settings()
def test_ssid(self):
"""Test setting the SSID."""
bands_info = self.ap.get_supported_bands()
self.assertTrue(bands_info, msg='Invalid band sent.')
ssid = 'ssid2'
for bands in bands_info:
band = bands['band']
if band == ap_spec.BAND_5GHZ:
ssid = 'ssid5'
self.ap.set_band(band)
self.ap.set_ssid(ssid)
self.ap.apply_settings()
self.assertEqual(ssid, self.ap.ssid)
def test_band(self):
"""Test switching the band."""
self.ap.set_band(ap_spec.BAND_2GHZ)
self.ap.apply_settings()
self.ap.set_band(ap_spec.BAND_5GHZ)
self.ap.apply_settings()
def test_switching_bands_and_change_settings(self):
"""Test switching between bands and change settings for each band."""
bands_info = self.ap.get_supported_bands()
self.assertTrue(bands_info, msg='Invalid band sent.')
bands_set = [d['band'] for d in bands_info]
for band in bands_set:
self.ap.set_band(band)
self.ap.set_ssid('pqrstu_' + band)
if self.ap.is_visibility_supported():
self.ap.set_visibility(True)
if self.ap.is_security_mode_supported(ap_spec.SECURITY_TYPE_WEP):
self.ap.set_security_wep('test2',
ap_spec.WEP_AUTHENTICATION_OPEN)
self.ap.apply_settings()
def test_invalid_security(self):
"""Test an exception is thrown for an invalid configuration."""
self.disabled_security_on_all_bands()
for mode in self.ap.get_supported_modes():
if not ap_spec.MODE_N in mode['modes']:
return
if not self.ap.is_security_mode_supported(ap_spec.SECURITY_TYPE_WEP):
return
self.ap.set_mode(ap_spec.MODE_N)
self.ap.set_security_wep('77777', ap_spec.WEP_AUTHENTICATION_OPEN)
try:
self.ap.apply_settings()
except RuntimeError, e:
self.ap.driver.close()
message = str(e)
if message.find('no handler was specified') != -1:
self.fail('Subclass did not handle an alert.')
return
self.fail('An exception should have been thrown but was not.')
def test_security_wep(self):
"""Test configuring WEP security."""
if not self.ap.is_security_mode_supported(ap_spec.SECURITY_TYPE_WEP):
return
for mode in self.ap.get_supported_modes():
self.ap.set_band(mode['band'])
for mode_type in mode['modes']:
if mode_type & ap_spec.MODE_N != ap_spec.MODE_N:
self.ap.set_mode(mode_type)
self.ap.set_security_wep('45678',
ap_spec.WEP_AUTHENTICATION_OPEN)
self.ap.apply_settings()
self.ap.set_security_wep('90123',
ap_spec.WEP_AUTHENTICATION_SHARED)
self.ap.apply_settings()
def test_priority_sets(self):
"""Test that commands are run in the right priority."""
self.ap.set_radio(enabled=False)
if self.ap.is_visibility_supported():
self.ap.set_visibility(True)
self.ap.set_ssid('prioritytest')
self.ap.apply_settings()
def test_security_and_general_settings(self):
"""Test updating settings that are general and security related."""
self.disabled_security_on_all_bands()
try:
good_pair = self.return_non_n_mode_pair()
self.ap.set_radio(enabled=False)
self.ap.set_band(good_pair['band'])
self.ap.set_mode(good_pair['mode'])
except RuntimeError:
# AP does not support modes without MODE_N
return
if self.ap.is_visibility_supported():
self.ap.set_visibility(True)
if self.ap.is_security_mode_supported(ap_spec.SECURITY_TYPE_WEP):
self.ap.set_security_wep('88888', ap_spec.WEP_AUTHENTICATION_OPEN)
self.ap.set_ssid('secgentest')
self.ap.apply_settings()
def test_modes(self):
"""Tests switching modes."""
# Some security settings won't work with some modes
self.ap.set_security_disabled()
self.ap.apply_settings()
modes_info = self.ap.get_supported_modes()
self.assertTrue(modes_info,
msg='Returned an invalid mode list. Is this method'
' implemented?')
for band_modes in modes_info:
self.ap.set_band(band_modes['band'])
for mode in band_modes['modes']:
self.ap.set_mode(mode)
self.ap.apply_settings()
def test_modes_with_band(self):
"""Tests switching modes that support adjusting the band."""
# Different bands and security options conflict. Disable security for
# this test.
self.disabled_security_on_all_bands()
# Check if we support self.kModeN across multiple bands
modes_info = self.ap.get_supported_modes()
n_bands = []
for band_modes in modes_info:
if ap_spec.MODE_N in band_modes['modes']:
n_bands.append(band_modes['band'])
if len(n_bands) > 1:
for n_band in n_bands:
self.ap.set_mode(ap_spec.MODE_N, band=n_band)
self.ap.apply_settings()
def test_fast_cycle_security(self):
"""Mini stress for changing security settings rapidly."""
self.disabled_security_on_all_bands()
self.ap.set_radio(enabled=True)
if self.ap.is_security_mode_supported(ap_spec.SECURITY_TYPE_WEP):
self.ap.set_security_wep('77777', ap_spec.WEP_AUTHENTICATION_OPEN)
if self.ap.is_security_mode_supported(ap_spec.SECURITY_TYPE_DISABLED):
self.ap.set_security_disabled()
if self.ap.is_security_mode_supported(ap_spec.SECURITY_TYPE_WPAPSK):
self.ap.set_security_wpapsk(ap_spec.SECURITY_TYPE_WPAPSK,
'qwertyuiolkjhgfsdfg')
self.ap.apply_settings()
def test_cycle_security(self):
"""Test switching between different security settings."""
self.disabled_security_on_all_bands()
try:
good_pair = self.return_non_n_mode_pair()
self.ap.set_radio(enabled=True)
self.ap.set_band(good_pair['band'])
self.ap.set_mode(good_pair['mode'])
except RuntimeError:
# AP does not support modes without MODE_N
return
if self.ap.is_security_mode_supported(ap_spec.SECURITY_TYPE_WEP):
self.ap.set_security_wep('77777', ap_spec.WEP_AUTHENTICATION_OPEN)
self.ap.apply_settings()
if self.ap.is_security_mode_supported(ap_spec.SECURITY_TYPE_DISABLED):
self.ap.set_security_disabled()
self.ap.apply_settings()
if self.ap.is_security_mode_supported(ap_spec.SECURITY_TYPE_WPA2PSK):
self.ap.set_security_wpapsk(ap_spec.SECURITY_TYPE_WPA2PSK,
'qwertyuiolkjhgfsdfg')
self.ap.apply_settings()
def test_actions_when_radio_disabled(self):
"""Test making changes when the radio is disabled."""
self.disabled_security_on_all_bands()
try:
good_pair = self.return_non_n_mode_pair()
self.ap.set_radio(enabled=False)
self.ap.set_band(good_pair['band'])
self.ap.set_mode(good_pair['mode'])
except RuntimeError:
# AP does not support modes without MODE_N
return
self.ap.apply_settings()
if self.ap.is_security_mode_supported(ap_spec.SECURITY_TYPE_WEP):
self.ap.set_security_wep('77777', ap_spec.WEP_AUTHENTICATION_OPEN)
self.ap.set_radio(enabled=False)
self.ap.apply_settings()
def test_configuring_with_ap_spec(self):
"""Test configuring the AP using an APSpec."""
spec = ap_spec.APSpec()
self.ap.set_using_ap_spec(spec)
self.ap.apply_settings()
def test_power_cycle_router(self):
"""Test powering the ap down and back up again."""
self.ap.power_cycle_router_up()
if __name__ == '__main__':
unittest.main()