# -*- coding: utf-8 -*-
# SSID contents and encoding tests
# Copyright (c) 2013-2014, Jouni Malinen <j@w1.fi>
#
# This software may be distributed under the terms of the BSD license.
# See README for more details.

import logging
logger = logging.getLogger()

import hostapd

def test_ssid_hex_encoded(dev, apdev):
    """SSID configuration using hex encoded version"""
    hostapd.add_ap(apdev[0]['ifname'], { "ssid2": '68656c6c6f' })
    dev[0].connect("hello", key_mgmt="NONE", scan_freq="2412")
    dev[1].connect(ssid2="68656c6c6f", key_mgmt="NONE", scan_freq="2412")

def test_ssid_printf_encoded(dev, apdev):
    """SSID configuration using printf encoded version"""
    hostapd.add_ap(apdev[0]['ifname'], { "ssid2": 'P"\\0hello\\nthere"' })
    dev[0].connect(ssid2="0068656c6c6f0a7468657265", key_mgmt="NONE",
                   scan_freq="2412")
    dev[1].connect(ssid2='P"\\x00hello\\nthere"', key_mgmt="NONE",
                   scan_freq="2412")
    ssid = dev[0].get_status_field("ssid")
    bss = dev[1].get_bss(apdev[0]['bssid'])
    if ssid != bss['ssid']:
        raise Exception("Unexpected difference in SSID")
    dev[2].connect(ssid2='P"' + ssid + '"', key_mgmt="NONE", scan_freq="2412")

def test_ssid_1_octet(dev, apdev):
    """SSID with one octet"""
    hostapd.add_ap(apdev[0]['ifname'], { "ssid": '1' })
    dev[0].connect("1", key_mgmt="NONE", scan_freq="2412")

def test_ssid_32_octets(dev, apdev):
    """SSID with 32 octets"""
    hostapd.add_ap(apdev[0]['ifname'],
                   { "ssid": '1234567890abcdef1234567890ABCDEF' })
    dev[0].connect("1234567890abcdef1234567890ABCDEF", key_mgmt="NONE",
                   scan_freq="2412")

def test_ssid_utf8(dev, apdev):
    """SSID with UTF8 encoding"""
    hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": 'testi-åäöÅÄÖ-testi',
                                                "utf8_ssid": "1" })
    dev[0].connect("testi-åäöÅÄÖ-testi", key_mgmt="NONE", scan_freq="2412")
    dev[1].connect(ssid2="74657374692dc3a5c3a4c3b6c385c384c3962d7465737469",
                   key_mgmt="NONE", scan_freq="2412")
    # verify ctrl_iface for coverage
    addrs = [ dev[0].p2p_interface_addr(), dev[1].p2p_interface_addr() ]
    sta = hapd.get_sta(None)
    if sta['addr'] not in addrs:
        raise Exception("Unexpected STA address")
    sta2 = hapd.get_sta(sta['addr'], next=True)
    if sta2['addr'] not in addrs:
        raise Exception("Unexpected STA2 address")
    sta3 = hapd.get_sta(sta2['addr'], next=True)
    if len(sta3) != 0:
        raise Exception("Unexpected STA iteration result (did not stop)")

def test_ssid_hidden(dev, apdev):
    """Hidden SSID"""
    hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": 'secret',
                                                "ignore_broadcast_ssid": "1" })
    dev[1].connect("secret", key_mgmt="NONE", scan_freq="2412",
                   wait_connect=False)
    dev[0].connect("secret", key_mgmt="NONE", scan_freq="2412", scan_ssid="1")
    ev = dev[1].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1)
    if ev is not None:
        raise Exception("Unexpected connection")
    dev[0].request("DISCONNECT")
    dev[1].request("DISCONNECT")
    # clear BSS table to avoid issues in following test cases
    hapd.disable()
    dev[0].request("BSS_FLUSH 0")
    dev[0].request("SCAN freq=2412 only_new=1")
    dev[1].request("BSS_FLUSH 0")
    dev[1].request("SCAN freq=2412 only_new=1")

def test_ssid_hidden2(dev, apdev):
    """Hidden SSID using zero octets as payload"""
    hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": 'secret2',
                                                "ignore_broadcast_ssid": "2" })
    dev[1].connect("secret2", key_mgmt="NONE", scan_freq="2412",
                   wait_connect=False)
    dev[0].connect("secret2", key_mgmt="NONE", scan_freq="2412", scan_ssid="1")
    ev = dev[1].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1)
    if ev is not None:
        raise Exception("Unexpected connection")
    dev[0].request("DISCONNECT")
    dev[1].request("DISCONNECT")
    # clear BSS table to avoid issues in following test cases
    hapd.disable()
    dev[0].request("BSS_FLUSH 0")
    dev[0].request("SCAN freq=2412 only_new=1")
    dev[1].request("BSS_FLUSH 0")
    dev[1].request("SCAN freq=2412 only_new=1")

def test_ssid_hidden_wpa2(dev, apdev):
    """Hidden SSID with WPA2-PSK"""
    params = hostapd.wpa2_params(ssid="secret", passphrase="12345678")
    params["ignore_broadcast_ssid"] = "1"
    hapd = hostapd.add_ap(apdev[0]['ifname'], params)
    dev[1].connect("secret", psk="12345678", scan_freq="2412",
                   wait_connect=False)
    dev[0].connect("secret", psk="12345678", scan_freq="2412", scan_ssid="1")
    ev = dev[1].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1)
    if ev is not None:
        raise Exception("Unexpected connection")
    dev[0].request("DISCONNECT")
    dev[1].request("DISCONNECT")
    # clear BSS table to avoid issues in following test cases
    hapd.disable()
    dev[0].request("BSS_FLUSH 0")
    dev[0].request("SCAN freq=2412 only_new=1")
    dev[1].request("BSS_FLUSH 0")
    dev[1].request("SCAN freq=2412 only_new=1")
