• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/python
2#
3# Copyright (c) 2013 The Chromium Authors. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
7import unittest
8
9import common
10
11from autotest_lib.client.common_lib.cros.network import iw_runner
12
13class IwRunnerTest(unittest.TestCase):
14    """Unit test for the IWRunner object."""
15
16
17    class host_cmd(object):
18        """Mock host command class."""
19
20        def __init__(self, stdout, stderr, exit_status):
21            self._stdout = stdout
22            self._stderr = stderr
23            self._exit_status = exit_status
24
25
26        @property
27        def stdout(self):
28            """Returns stdout."""
29            return self._stdout
30
31
32        @property
33        def stderr(self):
34            """Returns stderr."""
35            return self._stderr
36
37
38        @property
39        def exit_status(self):
40            """Returns the exit status."""
41            return self._exit_status
42
43
44    class host(object):
45        """Mock host class."""
46
47        def __init__(self, host_cmd):
48            self._host_cmd = IwRunnerTest.host_cmd(host_cmd, 1.0, 0)
49
50
51        def run(self, cmd, ignore_status=False):
52            """Returns the mocked output.
53
54            @param cmd: a stub input ignore
55            @param ignore_status: a stub input ignore
56
57            """
58            return self._host_cmd
59
60
61    HT20 = str('BSS aa:aa:aa:aa:aa:aa (on wlan0)\n'
62        '    freq: 2412\n'
63        '    signal: -50.00 dBm\n'
64        '    SSID: support_ht20\n'
65        '    HT operation:\n'
66        '         * secondary channel offset: no secondary\n')
67
68    HT20_IW_BSS = iw_runner.IwBss('aa:aa:aa:aa:aa:aa', 2412,
69                                  'support_ht20', iw_runner.SECURITY_OPEN,
70                                  iw_runner.HT20, -50.00)
71
72    HT20_2 = str('BSS 11:11:11:11:11:11 (on wlan0)\n'
73        '     freq: 2462\n'
74        '     signal: -42.00 dBm\n'
75        '     SSID: support_ht20\n'
76        '     WPA:          * Version: 1\n'
77        '     HT operation:\n'
78        '          * secondary channel offset: below\n')
79
80    HT20_2_IW_BSS = iw_runner.IwBss('11:11:11:11:11:11', 2462,
81                                    'support_ht20', iw_runner.SECURITY_WPA,
82                                    iw_runner.HT40_BELOW, -42.00)
83
84    HT40_ABOVE = str('BSS bb:bb:bb:bb:bb:bb (on wlan0)\n'
85        '    freq: 5180\n'
86        '    signal: -55.00 dBm\n'
87        '    SSID: support_ht40_above\n'
88        '    RSN:          * Version: 1\n'
89        '    HT operation:\n'
90        '         * secondary channel offset: above\n')
91
92    HT40_ABOVE_IW_BSS = iw_runner.IwBss('bb:bb:bb:bb:bb:bb', 5180,
93                                        'support_ht40_above',
94                                        iw_runner.SECURITY_WPA2,
95                                        iw_runner.HT40_ABOVE, -55.00)
96
97    HT40_BELOW = str('BSS cc:cc:cc:cc:cc:cc (on wlan0)\n'
98        '    freq: 2462\n'
99        '    signal: -44.00 dBm\n'
100        '    SSID: support_ht40_below\n'
101        '    RSN:          * Version: 1\n'
102        '    WPA:          * Version: 1\n'
103        '    HT operation:\n'
104        '        * secondary channel offset: below\n')
105
106    HT40_BELOW_IW_BSS = iw_runner.IwBss('cc:cc:cc:cc:cc:cc', 2462,
107                                        'support_ht40_below',
108                                        iw_runner.SECURITY_MIXED,
109                                        iw_runner.HT40_BELOW, -44.00)
110
111    NO_HT = str('BSS dd:dd:dd:dd:dd:dd (on wlan0)\n'
112        '    freq: 2412\n'
113        '    signal: -45.00 dBm\n'
114        '    SSID: no_ht_support\n')
115
116    NO_HT_IW_BSS = iw_runner.IwBss('dd:dd:dd:dd:dd:dd', 2412,
117                                   'no_ht_support', iw_runner.SECURITY_OPEN,
118                                   None, -45.00)
119
120    HIDDEN_SSID = str('BSS ee:ee:ee:ee:ee:ee (on wlan0)\n'
121        '    freq: 2462\n'
122        '    signal: -70.00 dBm\n'
123        '    SSID: \n'
124        '    HT operation:\n'
125        '         * secondary channel offset: no secondary\n')
126
127    SCAN_TIME_OUTPUT = str('real 4.5\n'
128        'user 2.1\n'
129        'system 3.1\n')
130
131    HIDDEN_SSID_IW_BSS = iw_runner.IwBss('ee:ee:ee:ee:ee:ee', 2462,
132                                         None, iw_runner.SECURITY_OPEN,
133                                         iw_runner.HT20, -70.00)
134
135
136    def verify_values(self, iw_bss_1, iw_bss_2):
137        """Checks all of the IWBss values
138
139        @param iw_bss_1: an IWBss object
140        @param iw_bss_2: an IWBss object
141
142        """
143        self.assertEquals(iw_bss_1.bss, iw_bss_2[0].bss)
144        self.assertEquals(iw_bss_1.ssid, iw_bss_2[0].ssid)
145        self.assertEquals(iw_bss_1.frequency, iw_bss_2[0].frequency)
146        self.assertEquals(iw_bss_1.security, iw_bss_2[0].security)
147        self.assertEquals(iw_bss_1.ht, iw_bss_2[0].ht)
148        self.assertEquals(iw_bss_1.signal, iw_bss_2[0].signal)
149
150
151    def search_by_bss(self, scan_output, test_iw_bss):
152        """
153
154        @param scan_output: the output of the scan as a string
155        @param test_iw_bss: an IWBss object
156
157        Uses the runner to search for a network by bss.
158        """
159        host = self.host(scan_output + self.SCAN_TIME_OUTPUT)
160        runner = iw_runner.IwRunner(remote_host=host)
161        network = runner.wait_for_scan_result('wlan0', bsses=[test_iw_bss.bss])
162        self.verify_values(test_iw_bss, network)
163
164
165    def test_find_first(self):
166        """Test with the first item in the list."""
167        scan_output = self.HT20 + self.HT40_ABOVE
168        self.search_by_bss(scan_output, self.HT20_IW_BSS)
169
170
171    def test_find_last(self):
172        """Test with the last item in the list."""
173        scan_output = self.HT40_ABOVE + self.HT20
174        self.search_by_bss(scan_output, self.HT20_IW_BSS)
175
176
177    def test_find_middle(self):
178        """Test with the middle item in the list."""
179        scan_output = self.HT40_ABOVE + self.HT20 + self.NO_HT
180        self.search_by_bss(scan_output, self.HT20_IW_BSS)
181
182
183    def test_ht40_above(self):
184        """Test with a HT40+ network."""
185        scan_output = self.HT20 + self.HT40_ABOVE + self.NO_HT
186        self.search_by_bss(scan_output, self.HT40_ABOVE_IW_BSS)
187
188
189    def test_ht40_below(self):
190        """Test with a HT40- network."""
191        scan_output = self.HT20 + self.HT40_BELOW + self.NO_HT
192        self.search_by_bss(scan_output, self.HT40_BELOW_IW_BSS)
193
194
195    def test_no_ht(self):
196        """Test with a network that doesn't have ht."""
197        scan_output = self.HT20 + self.NO_HT + self.HT40_ABOVE
198        self.search_by_bss(scan_output, self.NO_HT_IW_BSS)
199
200
201    def test_hidden_ssid(self):
202        """Test with a network with a hidden ssid."""
203        scan_output = self.HT20 + self.HIDDEN_SSID + self.NO_HT
204        self.search_by_bss(scan_output, self.HIDDEN_SSID_IW_BSS)
205
206
207    def test_multiple_ssids(self):
208        """Test with multiple networks with the same ssids."""
209        return
210        scan_output = self.HT40_ABOVE + self.HT20 + self.NO_HT + self.HT20_2
211        host = self.host(scan_output)
212        runner = iw_runner.IwRunner(remote_host=host)
213        networks = runner.wait_for_scan_result('wlan 0',
214                                               ssids=[self.HT20_2_IW_BSS.ssid])
215        for iw_bss_1, iw_bss_2 in zip([self.HT20_IW_BSS, self.HT20_2_IW_BSS],
216                                      networks):
217            self.verify_values(iw_bss_1, iw_bss_2)
218
219
220if __name__ == '__main__':
221    unittest.main()
222