import os import sys import unittest sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'payload', 'user', 'remote_access', 'pager-webui')) import server def setUpModule(): __import__('importlib').reload(server) class ChannelBandTest(unittest.TestCase): def test_2g_channels(self): for ch in (1, 6, 11, 14): self.assertEqual(server.channel_band(ch), server.BAND_2G) def test_5g_channels(self): for ch in (36, 48, 100, 149, 165, 177): self.assertEqual(server.channel_band(ch), server.BAND_5G) def test_6g_channels(self): for ch in (181, 189, 197, 205, 213, 225, 233): self.assertEqual(server.channel_band(ch), server.BAND_6G) def test_invalid(self): for ch in (0, 15, 35, 178, 234, None, 'x'): self.assertIsNone(server.channel_band(ch)) class ChannelBandsConsistencyTest(unittest.TestCase): def test_lists_match_channel_band(self): for band, channels in server.CHANNEL_BANDS.items(): for ch in channels: self.assertEqual(server.channel_band(ch), band, '%s should be %s' % (ch, band)) def test_boundaries(self): self.assertEqual(server.CHANNEL_BANDS[server.BAND_2G][-1], 14) self.assertEqual(server.CHANNEL_BANDS[server.BAND_5G][-1], 177) self.assertEqual(server.CHANNEL_BANDS[server.BAND_6G][0], 181) self.assertEqual(server.CHANNEL_BANDS[server.BAND_6G][-1], 233) class ChannelFreqTest(unittest.TestCase): def test_freqs(self): self.assertEqual(server.channel_freq(server.BAND_2G, 1), 2412) self.assertEqual(server.channel_freq(server.BAND_2G, 11), 2462) self.assertEqual(server.channel_freq(server.BAND_5G, 36), 5180) self.assertEqual(server.channel_freq(server.BAND_5G, 165), 5825) self.assertEqual(server.channel_freq(server.BAND_6G, 1), 5955) self.assertEqual(server.channel_freq(server.BAND_6G, 233), 7115) class BandAuxTest(unittest.TestCase): def test_htmode(self): self.assertEqual(server.band_htmode(server.BAND_2G), 'HT20') self.assertEqual(server.band_htmode(server.BAND_5G), 'VHT80') self.assertEqual(server.band_htmode(server.BAND_6G), 'HE80') def test_radio(self): self.assertEqual(server.band_radio(server.BAND_2G), 'radio0') self.assertEqual(server.band_radio(server.BAND_5G), 'radio1') self.assertEqual(server.band_radio(server.BAND_6G), 'radio1') def test_dfs_marker(self): for ch in (52, 64, 100, 144): self.assertIn(ch, server.DFS_CHANNELS) for ch in (36, 48, 149): self.assertNotIn(ch, server.DFS_CHANNELS) self.assertEqual(set(server.DFS_CHANNELS), set(range(52, 65, 4)) | set(range(100, 145, 4))) def ctx(body=None): return type('C', (), {'body': body, 'args': (), 'query': {}})() class GetApRadio1Test(unittest.TestCase): def _uci(self, section): table = { 'radio0': {'type': 'wifi-device', 'band': '2g', 'channel': '11', 'htmode': 'HT20', 'country': 'US'}, 'radio1': {'type': 'wifi-device', 'band': '5g', 'channel': 'auto', 'htmode': 'VHT80', 'country': 'US'}, 'wlan0open': {'device': 'radio0', 'mode': 'ap', 'ssid': 'pager-open', 'disabled': '0', 'hidden': '0', 'encryption': 'none', 'channel': '11'}, 'wlan0wpa': {'device': 'radio0', 'mode': 'ap', 'ssid': 'Service', 'disabled': '0', 'hidden': '0', 'encryption': 'psk2', 'channel': '1', 'key': 'testpass123'}, 'wlan1open': {'device': 'radio1', 'mode': 'ap', 'ssid': 'CorpGuest', 'disabled': '0', 'hidden': '0', 'encryption': 'none', 'channel': '36'}, 'wlan1wpa': {'device': 'radio1', 'mode': 'ap', 'ssid': 'Corp', 'disabled': '0', 'hidden': '0', 'encryption': 'sae', 'channel': '1', 'key': 'secret123'}, } return dict(table.get(section, {})) def setUp(self): server._uci_wifi_iface = lambda name: self._uci(name) server.daemon_sock_call = lambda method, path, body=None, timeout=10: ( 404, {'error': 'not found'}) def test_open_reports_radio1_when_present(self): status, payload = server.h_pineap_wifi_get_ap(ctx()) self.assertEqual(status, 200) self.assertEqual(payload['open']['ssid'], 'CorpGuest') self.assertEqual(payload['open']['channel'], 36) self.assertEqual(payload['open']['country'], 'US') def test_wpa_reports_radio1_when_present(self): status, payload = server.h_pineap_wifi_get_ap(ctx()) self.assertEqual(status, 200) self.assertEqual(payload['wpa']['ssid'], 'Corp') self.assertEqual(payload['wpa']['enctype'], 'sae') self.assertEqual(payload['wpa']['channel'], 1) def test_radio1_info(self): status, payload = server.h_pineap_wifi_get_ap(ctx()) self.assertEqual(status, 200) self.assertEqual(payload['radio1']['band'], server.BAND_5G) self.assertEqual(payload['radio1']['channel'], 'auto') class GetApRadio1AbsentTest(unittest.TestCase): """Regression: no radio1 AP sections -> today's 2.4GHz behavior.""" def _uci(self, section): table = { 'radio0': {'type': 'wifi-device', 'band': '2g', 'channel': '11', 'htmode': 'HT20', 'country': 'US'}, 'radio1': {'type': 'wifi-device', 'band': '5g', 'channel': 'auto', 'htmode': 'VHT80', 'country': 'US'}, 'wlan0open': {'device': 'radio0', 'mode': 'ap', 'ssid': 'pager-open', 'disabled': '0', 'hidden': '0', 'encryption': 'none', 'channel': '11'}, 'wlan0wpa': {'device': 'radio0', 'mode': 'ap', 'ssid': 'Service', 'disabled': '0', 'hidden': '0', 'encryption': 'psk2', 'channel': '1', 'key': 'testpass123'}, } return dict(table.get(section, {})) def setUp(self): server._uci_wifi_iface = lambda name: self._uci(name) server.daemon_sock_call = lambda method, path, body=None, timeout=10: ( 404, {'error': 'not found'}) def test_open_uses_wlan0open(self): status, payload = server.h_pineap_wifi_get_ap(ctx()) self.assertEqual(status, 200) self.assertEqual(payload['open']['ssid'], 'pager-open') self.assertEqual(payload['open']['channel'], 11) def test_wpa_uses_wlan0wpa(self): status, payload = server.h_pineap_wifi_get_ap(ctx()) self.assertEqual(status, 200) self.assertEqual(payload['wpa']['ssid'], 'Service') self.assertEqual(payload['wpa']['channel'], 1) class GetApRadioChannelFallbackTest(unittest.TestCase): """Regression: iface without a channel option inherits the radio channel.""" def _uci(self, section): table = { 'radio0': {'type': 'wifi-device', 'band': '2g', 'channel': '11', 'htmode': 'HT20', 'country': 'US'}, 'radio1': {'type': 'wifi-device', 'band': '5g', 'channel': 'auto', 'htmode': 'VHT80', 'country': 'US'}, 'wlan0open': {'device': 'radio0', 'mode': 'ap', 'ssid': 'pager-open', 'disabled': '0', 'hidden': '0', 'encryption': 'none'}, 'wlan0wpa': {'device': 'radio0', 'mode': 'ap', 'ssid': 'Service', 'disabled': '0', 'hidden': '0', 'encryption': 'psk2', 'key': 'testpass123'}, } return dict(table.get(section, {})) def setUp(self): server._uci_wifi_iface = lambda name: self._uci(name) server.daemon_sock_call = lambda method, path, body=None, timeout=10: ( 404, {'error': 'not found'}) def test_open_falls_back_to_radio_channel(self): status, payload = server.h_pineap_wifi_get_ap(ctx()) self.assertEqual(status, 200) self.assertEqual(payload['open']['channel'], 11) def test_wpa_falls_back_to_radio_channel(self): status, payload = server.h_pineap_wifi_get_ap(ctx()) self.assertEqual(status, 200) self.assertEqual(payload['wpa']['channel'], 11) if __name__ == '__main__': unittest.main()