# P2P_SET test cases
# Copyright (c) 2014, Jouni Malinen <j@w1.fi>
#
# This software may be distributed under the terms of the BSD license.
# See README for more details.

def test_p2p_set(dev):
    """P2P_SET commands"""
    for cmd in [ "",
                 "foo bar",
                 "noa 1",
                 "noa 1,2",
                 "noa 1,2,3",
                 "noa -1,0,0",
                 "noa 256,0,0",
                 "noa 0,-1,0",
                 "noa 0,0,-1",
                 "noa 0,0,1",
                 "noa 255,10,20",
                 "ps 1",
                 "ps 2",
                 "oppps 1",
                 "ctwindow 1",
                 "conc_pref foo",
                 "peer_filter foo",
                 "client_apsd 0",
                 "client_apsd 0,0",
                 "client_apsd 0,0,0",
                 "disc_int 1",
                 "disc_int 1 2",
                 "disc_int 2 1 10",
                 "disc_int -1 0 10",
                 "disc_int 0 -1 10",
                 "ssid_postfix 123456789012345678901234" ]:
        if "FAIL" not in dev[0].request("P2P_SET " + cmd):
            raise Exception("Invalid P2P_SET accepted: " + cmd)

def test_p2p_set_discoverability(dev):
    """P2P_SET discoverability"""
    addr0 = dev[0].p2p_dev_addr()
    addr1 = dev[1].p2p_dev_addr()

    dev[0].p2p_start_go(freq="2412")
    if "OK" not in dev[1].request("P2P_SET discoverability 0"):
        raise Exception("P2P_SET discoverability 0 failed")
    pin = dev[1].wps_read_pin()
    dev[0].p2p_go_authorize_client(pin)
    dev[1].p2p_connect_group(addr0, pin, timeout=20, social=True, freq="2412")

    if not dev[2].discover_peer(addr1, timeout=10):
        if not dev[2].discover_peer(addr1, timeout=10):
            if not dev[2].discover_peer(addr1, timeout=10):
                raise Exception("Could not discover group client")

    peer = dev[2].get_peer(addr1)
    if int(peer['dev_capab'], 16) & 0x02 != 0:
        raise Exception("Discoverability dev_capab reported: " + peer['dev_capab'])
    dev[2].p2p_stop_find()

    if "OK" not in dev[1].request("P2P_SET discoverability 1"):
        raise Exception("P2P_SET discoverability 1 failed")
    dev[1].dump_monitor()
    dev[1].group_request("REASSOCIATE")
    dev[1].wait_connected(timeout=20)

    dev[2].request("P2P_FLUSH")
    if not dev[2].discover_peer(addr1, timeout=10):
        if not dev[2].discover_peer(addr1, timeout=10):
            if not dev[2].discover_peer(addr1, timeout=10):
                raise Exception("Could not discover group client")

    peer = dev[2].get_peer(addr1)
    if int(peer['dev_capab'], 16) & 0x02 != 0x02:
        raise Exception("Discoverability dev_capab reported: " + peer['dev_capab'])
    dev[2].p2p_stop_find()

def test_p2p_set_managed(dev):
    """P2P_SET managed"""
    addr0 = dev[0].p2p_dev_addr()

    if "OK" not in dev[0].request("P2P_SET managed 1"):
        raise Exception("P2P_SET managed 1 failed")

    dev[0].p2p_listen()
    if not dev[1].discover_peer(addr0):
        raise Exception("Could not discover peer")
    peer = dev[1].get_peer(addr0)
    if int(peer['dev_capab'], 16) & 0x08 != 0x08:
        raise Exception("Managed dev_capab not reported: " + peer['dev_capab'])
    dev[1].p2p_stop_find()

    if "OK" not in dev[0].request("P2P_SET managed 0"):
        raise Exception("P2P_SET managed 0 failed")

    if not dev[2].discover_peer(addr0):
        raise Exception("Could not discover peer")
    peer = dev[2].get_peer(addr0)
    if int(peer['dev_capab'], 16) & 0x08 != 0:
        raise Exception("Managed dev_capab reported: " + peer['dev_capab'])
    dev[2].p2p_stop_find()
    dev[0].p2p_stop_find()

def test_p2p_set_ssid_postfix(dev):
    """P2P_SET ssid_postfix"""
    addr0 = dev[0].p2p_dev_addr()
    addr1 = dev[1].p2p_dev_addr()
    postfix = "12345678901234567890123"

    try:
        if "OK" not in dev[0].request("P2P_SET ssid_postfix " + postfix):
            raise Exception("P2P_SET ssid_postfix failed")
        dev[0].p2p_start_go(freq="2412")
        pin = dev[1].wps_read_pin()
        dev[0].p2p_go_authorize_client(pin)
        dev[1].p2p_connect_group(addr0, pin, timeout=20, social=True, freq="2412")
        if postfix not in dev[1].get_status_field("ssid"):
            raise Exception("SSID postfix missing from status")
        if postfix not in dev[1].request("SCAN_RESULTS"):
            raise Exception("SSID postfix missing from scan results")
    finally:
        dev[0].request("P2P_SET ssid_postfix ")
