Home | History | Annotate | Download | only in ap_configurators
      1 # Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import os
      6 
      7 import ap_spec
      8 import trendnet_ap_configurator
      9 
     10 from selenium.common.exceptions import WebDriverException
     11 
     12 class Trendnet692grAPConfigurator(trendnet_ap_configurator.
     13                                   TrendnetAPConfigurator):
     14     """Derived class to control the Trendnet TEW-692GR."""
     15 
     16 
     17     def _alert_handler(self, alert):
     18         """Checks for any modal dialogs which popup to alert the user and
     19         either raises a RuntimeError or ignores the alert.
     20 
     21         @param alert: The modal dialog's contents.
     22         """
     23         text = alert.text
     24         if 'Please input 5 or 13 characters of WEP key1' in text:
     25             alert.accept()
     26             raise RuntimeError(text)
     27 
     28 
     29     def get_number_of_pages(self):
     30         return 2
     31 
     32 
     33     def save_page(self, page_number):
     34         """Save the given page.
     35 
     36         @param page_number: the page to save.
     37         """
     38         xpath = ('//input[@class="button_submit" and @value="Apply"]')
     39         element = self.wait_for_object_by_xpath(xpath)
     40         if element and element.is_displayed():
     41             self.click_button_by_xpath(xpath, alert_handler=self._alert_handler)
     42             # Reboot the device.
     43             reboot_button = '//input[@value="Reboot the Device"]'
     44             if self.object_by_xpath_exist(reboot_button):
     45                 self.click_button_by_xpath(reboot_button)
     46                 self.wait_for_progress_bar()
     47         else:
     48             pass
     49 
     50 
     51     def get_supported_bands(self):
     52         return [{'band': ap_spec.BAND_2GHZ,
     53                  'channels': range(1, 12)},
     54                 {'band': ap_spec.BAND_5GHZ,
     55                  'channels':[36, 40, 44, 48, 149, 153, 157, 161]}]
     56 
     57 
     58     def get_supported_modes(self):
     59         return [{'band': ap_spec.BAND_2GHZ,
     60                  'modes': [ap_spec.MODE_N,
     61                            ap_spec.MODE_B | ap_spec.MODE_G,
     62                            ap_spec.MODE_B | ap_spec.MODE_G | ap_spec.MODE_N]},
     63                 {'band': ap_spec.BAND_5GHZ,
     64                  'modes': [ap_spec.MODE_A | ap_spec.MODE_N, ap_spec.MODE_A]}]
     65 
     66 
     67     def navigate_to_page(self, page_number):
     68         """Navigates to the given page.
     69 
     70         @param page_number: the page to navigate to.
     71         """
     72         # All settings are on the same page, so we always open the config page
     73         if self.current_band == ap_spec.BAND_2GHZ:
     74             if page_number == 1:
     75                 page_url = os.path.join(self.admin_interface_url ,
     76                                         'wireless/basic.asp')
     77             elif page_number == 2:
     78                 page_url = os.path.join(self.admin_interface_url ,
     79                                         'wireless/security.asp')
     80             else:
     81                 raise RuntimeError('Invalid page number passed. Number of pages'
     82                                    '%d, page value sent was %d' %
     83                                    (self.get_number_of_pages(), page_number))
     84         elif self.current_band == ap_spec.BAND_5GHZ:
     85             if page_number == 1:
     86                 page_url = os.path.join(self.admin_interface_url ,
     87                                         'wireless2/basic.asp')
     88             elif page_number == 2:
     89                 page_url = os.path.join(self.admin_interface_url ,
     90                                         'wireless2/security.asp')
     91             else:
     92                 raise RuntimeError('Invalid page number passed. Number of pages'
     93                                    '%d, page value sent was %d' %
     94                                     (self.get_number_of_pages(), page_number))
     95         else:
     96             raise RuntimeError('Incorrect band band = %s' % self.current_band)
     97         try:
     98             self.get_url(page_url, page_title='TEW-692GR')
     99         except WebDriverException, e:
    100             if "unexpected alert open" in str(e):
    101                 alert = self.driver.switch_to_alert()
    102                 self._alert_handler(alert)
    103             else:
    104                 raise WebDriverException(str(e))
    105 
    106 
    107     def is_update_interval_supported(self):
    108         """
    109         Returns True if setting the PSK refresh interval is supported.
    110 
    111         @return True is supported; False otherwise
    112         """
    113         return True
    114 
    115 
    116     def _set_mode(self, mode, band=None):
    117         # Create the mode to popup item mapping
    118         mode_mapping = {ap_spec.MODE_B | ap_spec.MODE_G | ap_spec.MODE_N:
    119                         '2.4GHz 802.11 b/g/n mixed mode',
    120                         ap_spec.MODE_B | ap_spec.MODE_G:
    121                         '2.4GHz 802.11 b/g mixed mode',
    122                         ap_spec.MODE_N: '2.4GHz 802.11 n only'}
    123 
    124         if self.current_band == ap_spec.BAND_5GHZ:
    125             mode_mapping = {ap_spec.MODE_A: '5GHz 802.11 a only',
    126                             ap_spec.MODE_A | ap_spec.MODE_N:
    127                             '5GHz 802.11 a/n mixed mode'}
    128         mode_name = ''
    129         if mode in mode_mapping.keys():
    130             mode_name = mode_mapping[mode]
    131         else:
    132             raise RuntimeError('The mode selected %d is not supported by router'
    133                                ' %s.', hex(mode), self.name)
    134         self.select_item_from_popup_by_id(mode_name, 'wirelessmode',
    135                                           wait_for_xpath='id("wds_mode")')
    136 
    137 
    138     def set_band(self, band):
    139         if band == ap_spec.BAND_5GHZ:
    140             self.current_band = ap_spec.BAND_5GHZ
    141         elif band == ap_spec.BAND_2GHZ:
    142             self.current_band = ap_spec.BAND_2GHZ
    143         else:
    144             raise RuntimeError('Invalid band sent %s' % band)
    145 
    146 
    147     def set_radio(self, enabled=True):
    148         # TODO: Implement the RADIO button for this AP
    149         return None
    150 
    151 
    152     def _set_channel(self, channel):
    153         position = self._get_channel_popup_position(channel)
    154         channel_choices_2GHZ = ['2412MHz (Channel 1)', '2417MHz (Channel 2)',
    155                                 '2422MHz (Channel 3)', '2427MHz (Channel 4)',
    156                                 '2432MHz (Channel 5)', '2437MHz (Channel 6)',
    157                                 '2442MHz (Channel 7)', '2447MHz (Channel 8)',
    158                                 '2452MHz (Channel 9)', '2457MHz (Channel 10)',
    159                                 '2462MHz (Channel 11)']
    160         channel_choices_5GHZ = ['5180MHz (Channel 36)', '5200MHz (Channel 40)',
    161                                 '5220MHz (Channel 44)', '5240MHz (Channel 48)',
    162                                 '5745MHz (Channel 149)',
    163                                 '5765MHz (Channel 153)',
    164                                 '5785MHz (Channel 157)',
    165                                 '5805MHz (Channel 161)']
    166         if self.current_band == ap_spec.BAND_2GHZ:
    167             self.select_item_from_popup_by_id(channel_choices_2GHZ[position],
    168                                               'sz11gChannel')
    169         else:
    170             self.select_item_from_popup_by_id(channel_choices_5GHZ[position],
    171                                               'sz11aChannel')
    172 
    173 
    174     def set_security_disabled(self):
    175         self.add_item_to_command_list(self._set_security_disabled, (), 2, 1000)
    176 
    177 
    178     def _set_security_disabled(self):
    179         self.wait_for_object_by_id('security_mode')
    180         self.select_item_from_popup_by_id('Disable', 'security_mode')
    181 
    182 
    183     def _set_security_wpapsk(self, security, shared_key, update_interval=1800):
    184         self.wait_for_object_by_id('security_mode')
    185         if security == ap_spec.SECURITY_TYPE_WPAPSK:
    186             wpa_item = 'WPA-PSK'
    187         else:
    188             wpa_item = 'WPA2-PSK'
    189         self.select_item_from_popup_by_id(wpa_item, 'security_mode',
    190                                           wait_for_xpath='id("passphrase")')
    191         self.set_content_of_text_field_by_id(shared_key, 'passphrase')
    192         self.set_content_of_text_field_by_id(update_interval,
    193                                              'keyRenewalInterval')
    194 
    195 
    196     def set_security_wep(self, key_value, authentication):
    197         self.add_item_to_command_list(self._set_security_wep,
    198                                       (key_value, authentication), 2, 900)
    199 
    200 
    201     def _set_security_wep(self, key_value, authentication):
    202         self.wait_for_object_by_id('security_mode')
    203         self.select_item_from_popup_by_id('WEP-OPEN', 'security_mode')
    204         self.select_item_from_popup_by_id('ASCII', 'WEP1Select')
    205         self.set_content_of_text_field_by_id(key_value, 'WEP1',
    206                                              abort_check=True)
    207