• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
5import os
6import dynamic_ap_configurator
7import ap_spec
8
9
10class Keeboxw150nrAPConfigurator(
11        dynamic_ap_configurator.DynamicAPConfigurator):
12    """Derived class to control the Keeboxw150nr AP."""
13
14
15    def navigate_to_page(self, page_number):
16        """
17        Navigate to the required page.
18        """
19        if page_number == 1:
20            page_url = os.path.join(self.admin_interface_url ,'wlan2_basic.php')
21        elif page_number == 2:
22            page_url = os.path.join(self.admin_interface_url ,
23                                    'wlan2_security.php')
24        else:
25            raise RuntimeError('Invalid page number passed.  Number of pages is'
26                               '%d, page value sent was %d' %
27                               (self.get_number_of_pages(), page_number))
28        self.get_url(page_url, page_title='HOME')
29        # Check if we have to login
30        if self.admin_login_needed(page_url):
31            self.ap_login()
32
33
34    def admin_login_needed(self, page_url):
35        """
36        Check if we are on the admin login page.
37
38        @param page_url: string, the page to open.
39
40        @return True if login needed False otherwise.
41        """
42        login_element = '//input[@value="Login"]'
43        apply_element = '//input[@value="Apply"]'
44        login_displayed = self.wait_for_objects_by_xpath([login_element,
45                                                          apply_element])
46        if login_displayed == login_element:
47            return True
48        elif login_displayed == apply_element:
49            return False
50        else:
51            raise Exception('The page %s did not load' % page_url)
52
53
54    def ap_login(self):
55        """
56        Login as admin before configuring settings.
57        """
58        self.set_content_of_text_field_by_id('admin', 'loginusr',
59                                             abort_check=True)
60        self.set_content_of_text_field_by_id('password', 'loginpwd',
61                                             abort_check=True)
62        self.click_button_by_xpath('//input[@value="Login"]')
63        self.wait_for_object_by_id('content')
64
65
66    def save_page(self,page_number):
67        xpath_apply = ('//input[@type="button" and @value="Apply"]')
68        xpath_continue = ('//input[@type="button" and @value="Continue"]')
69        self.click_button_by_xpath(xpath_apply,
70                                   alert_handler=self._alert_handler)
71        try:
72            element = self.wait_for_object_by_xpath(xpath_continue)
73            self.click_button_by_xpath(xpath_continue,
74                                       alert_handler=self._alert_handler)
75        except:
76            self._handle_alert(xpath_apply, self._alert_handler)
77        self.wait_for_object_by_xpath(xpath_apply)
78
79
80    def get_number_of_pages(self):
81        return 2
82
83
84    def set_ssid(self, ssid):
85        self.add_item_to_command_list(self._set_ssid, (ssid,), 1, 1000)
86
87
88    def _set_ssid(self, ssid):
89        self.set_content_of_text_field_by_id(ssid, 'ssid')
90        self._ssid = ssid
91
92
93    def set_radio(self, enabled=True):
94        self.add_item_to_command_list(self._set_radio, (enabled, ), 1, 1000)
95
96
97    def _set_radio(self, enabled=True):
98        # value=1 is ON; value=0 is OFF
99        int_value = int(enabled)
100        xpath = ('//input[@value="%d" and @name="en_wifi"]' %
101                 int_value)
102        self.click_button_by_xpath(xpath, alert_handler=self._alert_handler)
103
104
105    def is_update_interval_supported(self):
106        """
107        Returns True if setting the PSK refresh interval is supported.
108
109        @return True is supported; False otherwise
110        """
111        return False
112
113
114    def set_band(self, band):
115        return None
116
117
118    def is_security_mode_supported(self, security_mode):
119        return security_mode in (ap_spec.SECURITY_TYPE_DISABLED,
120                                 ap_spec.SECURITY_TYPE_WEP,
121                                 ap_spec.SECURITY_TYPE_WPAPSK,
122                                 ap_spec.SECURITY_TYPE_WPA2PSK)
123
124
125    def get_supported_bands(self):
126        return [{'band': ap_spec.BAND_2GHZ, 'channels': range(1, 12)}]
127
128
129    def set_security_disabled(self):
130        self.add_item_to_command_list(self._set_security_disabled, (), 2, 1000)
131
132
133    def _set_security_disabled(self):
134        self.wait_for_object_by_id('security_type')
135        self.select_item_from_popup_by_id('Disable', 'security_type')
136
137    def get_supported_modes(self):
138        return [{'band': ap_spec.BAND_2GHZ,
139                 'modes': [ap_spec.MODE_B,
140                           ap_spec.MODE_G,
141                           ap_spec.MODE_N,
142                           ap_spec.MODE_B | ap_spec.MODE_G,
143                           ap_spec.MODE_B | ap_spec.MODE_G | ap_spec.MODE_N]}]
144
145
146    def set_mode(self, mode, band=None):
147        self.add_item_to_command_list(self._set_mode, (mode,), 1, 1000)
148
149
150    def _set_mode(self, mode, band=None):
151        # Different bands are not supported so we ignore.
152        # Create the mode to popup item mapping
153        mode_mapping = {ap_spec.MODE_B | ap_spec.MODE_G | ap_spec.MODE_N:
154                        '2.4 GHz (802.11b/g/n)',
155                        ap_spec.MODE_N: '2.4 GHz (802.11n)',
156                        ap_spec.MODE_B: '2.4 GHz (802.11b)',
157                        ap_spec.MODE_G: '2.4 GHz (802.11g)',
158                        ap_spec.MODE_B | ap_spec.MODE_G:
159                        '2.4 GHz (802.11b/g)'}
160        mode_name = ''
161        if mode in mode_mapping.keys():
162            mode_name = mode_mapping[mode]
163        else:
164            raise RuntimeError('The mode selected %d is not supported by router'
165                               ' %s.', hex(mode), self.name)
166        self.select_item_from_popup_by_id(mode_name, 'wlan_mode')
167
168
169    def get_supported_bands(self):
170        return [{'band': ap_spec.BAND_2GHZ, 'channels': range(1, 11)}]
171
172
173    def set_channel(self, channel):
174        self.add_item_to_command_list(self._set_channel, (channel,), 1, 900)
175
176
177    def _set_channel(self, channel):
178        position = self._get_channel_popup_position(channel)
179        channel_choices = ['1', '2', '3', '4', '5',
180                           '6', '7', '8', '9', '10', '11']
181        self.select_item_from_popup_by_id(channel_choices[position],
182                                          'channel')
183
184
185    def set_visibility(self, visible=True):
186        self.add_item_to_command_list(self._set_visibility, (visible,), 2, 1000)
187
188
189    def _set_visibility(self, visible=True):
190        # value=1 is visible; value=0 is invisible
191        if visible == True:
192           self.select_item_from_popup_by_id('Enable', 'suppress')
193        else:
194           self.select_item_from_popup_by_id('Disable', 'suppress')
195
196
197    def set_security_wep(self, key_value, authentication):
198        self.add_item_to_command_list(self._set_security_wep,
199                                      (key_value, authentication), 2, 900)
200
201
202    def _set_security_wep(self, key_value, authentication):
203        # This AP does not allow selecting Shared Key. Open System is default.
204        self.wait_for_object_by_id('security_type')
205        self.select_item_from_popup_by_id('WEP', 'security_type')
206        self.select_item_from_popup_by_id('64-bit', 'wep_key_len')
207        self.select_item_from_popup_by_id('ASCII (5 characters)',
208                                          'key_str_type')
209        self.set_content_of_text_field_by_id(key_value, 'wep_key_1')
210
211
212    def set_security_wpapsk(self, security, shared_key, update_interval=None):
213        self.add_item_to_command_list(self._set_security_wpapsk,
214                                      (security,shared_key, update_interval),
215                                       2, 900)
216
217
218    def _set_security_wpapsk(self, security, shared_key, update_interval=None):
219        self.wait_for_object_by_id('security_type')
220        if security == ap_spec.SECURITY_TYPE_WPAPSK:
221            self.select_item_from_popup_by_id('WPA Only', 'security_type')
222        else:
223            self.select_item_from_popup_by_id('WPA2 Only', 'security_type')
224        self.select_item_from_popup_by_id('Passphrase', 'id_shared_keytype')
225        self.set_content_of_text_field_by_id(shared_key, 'wpapsk')
226
227
228    def _alert_handler(self, alert):
229        """Checks for any modal dialogs which popup to alert the user and
230        either raises a RuntimeError or ignores the alert.
231
232        Args:
233          alert: The modal dialog's contents.
234        """
235        text = alert.text
236        if 'Your wireless settings have changed' in text:
237            alert.accept()
238        elif 'Settings have not changed' in text:
239            alert.accept()
240        else:
241            raise RuntimeError('We have an unhandled alert: %s' % text)
242
243