#!/usr/bin/env python3
#
#   Copyright 2021 - The Android secure Source Project
#
#   Licensed under the Apache License, Version 2.0 (the "License");
#   you may not use this file except in compliance with the License.
#   You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#   Unless required by applicable law or agreed to in writing, software
#   distributed under the License is distributed on an "AS IS" BASIS,
#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#   See the License for the specific language governing permissions and
#   limitations under the License.

from acts import asserts
from acts import utils
from acts.controllers.access_point import setup_ap
from acts.controllers.ap_lib import hostapd_constants
from acts.controllers.ap_lib.hostapd_utils import generate_random_password
from acts.controllers.ap_lib.hostapd_security import Security
from acts_contrib.test_utils.abstract_devices.wlan_device import create_wlan_device
from acts_contrib.test_utils.abstract_devices.wlan_device_lib.AbstractDeviceWlanDeviceBaseTest import AbstractDeviceWlanDeviceBaseTest


class WlanMiscScenarioTest(AbstractDeviceWlanDeviceBaseTest):
    """Random scenario tests, usually to reproduce certain bugs, that do not
    fit into a specific test category, but should still be run in CI to catch
    regressions.
    """

    def setup_class(self):
        super().setup_class()
        dut = self.user_params.get('dut', None)
        if dut:
            if dut == 'fuchsia_devices':
                self.dut = create_wlan_device(self.fuchsia_devices[0])
            elif dut == 'android_devices':
                self.dut = create_wlan_device(self.android_devices[0])
            else:
                raise ValueError('Invalid DUT specified in config. (%s)' %
                                 self.user_params['dut'])
        else:
            # Default is an Fuchsia device
            self.dut = create_wlan_device(self.fuchsia_devices[0])
        self.access_point = self.access_points[0]

    def teardown_class(self):
        self.dut.disconnect()
        self.access_point.stop_all_aps()

    def teardown_test(self):
        self.dut.disconnect()
        self.download_ap_logs()
        self.access_point.stop_all_aps()

    def on_fail(self, test_name, begin_time):
        super().on_fail(test_name, begin_time)
        self.access_point.stop_all_aps()

    def on_exception(self, test_name, begin_time):
        super().on_exception(test_name, begin_time)
        self.dut.disconnect()
        self.access_point.stop_all_aps()

    def test_connect_to_wpa2_after_wpa3_rejection(self):
        """Test association to non-WPA3 network after receiving a WPA3
        rejection, which was triggering a firmware hang.

        Bug: https://bugs.fuchsia.dev/p/fuchsia/issues/detail?id=71233
        """
        # Setup a WPA3 network
        wpa3_ssid = utils.rand_ascii_str(hostapd_constants.AP_SSID_LENGTH_5G)
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=wpa3_ssid,
                 security=Security(security_mode='wpa3',
                                   password=generate_random_password('wpa3')))
        # Attempt to associate with wrong password, expecting failure
        self.log.info('Attempting to associate WPA3 with wrong password.')
        asserts.assert_false(
            self.dut.associate(wpa3_ssid,
                               target_pwd='wrongpass',
                               target_security='wpa3'),
            'Associated with WPA3 network using the wrong password')

        self.access_point.stop_all_aps()

        # Setup a WPA2 Network
        wpa2_ssid = utils.rand_ascii_str(hostapd_constants.AP_SSID_LENGTH_5G)
        wpa2_password = generate_random_password('wpa2')
        setup_ap(access_point=self.access_point,
                 profile_name='whirlwind',
                 channel=hostapd_constants.AP_DEFAULT_CHANNEL_5G,
                 ssid=wpa2_ssid,
                 security=Security(security_mode='wpa2',
                                   password=wpa2_password))

        # Attempt to associate, expecting success
        self.log.info('Attempting to associate with WPA2 network.')
        asserts.assert_true(
            self.dut.associate(wpa2_ssid,
                               target_pwd=wpa2_password,
                               target_security='wpa2'),
            'Failed to associate with WPA2 network after a WPA3 rejection.')
