blob: df57b603aa694c078cf5bcd93e5aae1a3dd25cf6 [file] [log] [blame]
#!/usr/bin/env python3
#
# Copyright 2020 - The Android Open 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.
import acts_contrib.test_utils.wifi.wifi_test_utils as wutils
import acts.utils
import time
from acts import asserts
from acts import utils
from acts.test_decorators import test_tracker_info
from acts_contrib.test_utils.wifi import wifi_test_utils as wutils
from acts_contrib.test_utils.wifi.p2p.WifiP2pBaseTest import WifiP2pBaseTest
from acts_contrib.test_utils.wifi.p2p import wifi_p2p_test_utils as wp2putils
from acts_contrib.test_utils.wifi.p2p import wifi_p2p_const as p2pconsts
WPS_PBC = wp2putils.WifiP2PEnums.WpsInfo.WIFI_WPS_INFO_PBC
WPS_DISPLAY = wp2putils.WifiP2PEnums.WpsInfo.WIFI_WPS_INFO_DISPLAY
WPS_KEYPAD = wp2putils.WifiP2PEnums.WpsInfo.WIFI_WPS_INFO_KEYPAD
WifiEnums = wutils.WifiEnums
class WifiP2pMultiPeersTest(WifiP2pBaseTest):
"""Tests for multiple clients.
Test Bed Requirement:
* 3 Android devices for each test in this class.
"""
def __init__(self, controllers):
WifiP2pBaseTest.__init__(self, controllers)
def setup_test(self):
WifiP2pBaseTest.setup_test(self)
asserts.skip_if(
len(self.android_devices) < 3,
"No enough android devices. Skip this test")
def form_group(self, dut1, dut2, isReconnect=False, wpsType=WPS_PBC):
# Request the connection to create a group
wp2putils.p2p_connect(dut1, dut2, isReconnect, wpsType)
if wp2putils.is_go(dut1):
go_dut = dut1
gc_dut = dut2
elif wp2putils.is_go(dut2):
go_dut = dut2
gc_dut = dut1
return (go_dut, gc_dut)
def verify_group_connection(self, group_clients):
for gc in group_clients:
go_ip = wp2putils.p2p_go_ip(gc)
wp2putils.p2p_connection_ping_test(gc, go_ip)
def clear_all_events(self, duts):
for dut in duts:
dut.ed.clear_all_events()
def check_disconnection(self, duts):
for dut in duts:
wp2putils.check_disconnect(dut)
"""Test Cases"""
@test_tracker_info(uuid="20cd4f4d-fe7d-4ee2-a832-33caa5b9700b")
def test_p2p_multi_clients_group_removal_behavior(self):
"""Verify the p2p group removal behavior
Steps:
1. form a group between 3 peers
2. verify their connection
3. disconnect
4. form a group between 3 peers
5. trigger disconnect from GO
6. check the group is removed
7. form a group between 3 peers
8. trigger disconnect from a GC
9. check the group is still alive
10. disconnect
"""
all_duts = [self.dut1, self.dut2, self.dut3]
# the 1st round
(go_dut, gc_dut) = self.form_group(self.dut1, self.dut2)
gc2_dut = self.dut3
wp2putils.p2p_connect(gc2_dut,
go_dut,
False,
WPS_PBC,
p2p_connect_type=p2pconsts.P2P_CONNECT_JOIN)
self.verify_group_connection([gc_dut, gc2_dut])
go_dut.log.info("Trigger disconnection")
wp2putils.p2p_disconnect(go_dut)
self.check_disconnection([gc_dut, gc2_dut])
time.sleep(p2pconsts.DEFAULT_FUNCTION_SWITCH_TIME)
# the 2nd round
self.log.info("Reconnect test, triggered by GO")
self.clear_all_events(all_duts)
self.form_group(go_dut, gc_dut, isReconnect=True)
wp2putils.p2p_connect(gc2_dut,
go_dut,
True,
WPS_PBC,
p2p_connect_type=p2pconsts.P2P_CONNECT_JOIN)
# trigger disconnect from GO, the group is destroyed and all
# client are disconnected.
go_dut.log.info("Trigger disconnection")
wp2putils.p2p_disconnect(go_dut)
self.check_disconnection([gc_dut, gc2_dut])
time.sleep(p2pconsts.DEFAULT_FUNCTION_SWITCH_TIME)
# the 3rd round
self.log.info("Reconnect test, triggered by GC")
self.clear_all_events(all_duts)
self.form_group(go_dut, gc_dut, isReconnect=True)
wp2putils.p2p_connect(gc2_dut,
go_dut,
True,
WPS_PBC,
p2p_connect_type=p2pconsts.P2P_CONNECT_JOIN)
# trigger disconnect from GC, the group is still there.
gc_dut.log.info("Trigger disconnection")
wp2putils.p2p_disconnect(gc_dut)
self.verify_group_connection([
gc2_dut,
])
# all clients are disconnected, the group is removed.
wp2putils.p2p_disconnect(gc2_dut)
self.check_disconnection([
go_dut,
])
time.sleep(p2pconsts.DEFAULT_FUNCTION_SWITCH_TIME)
@test_tracker_info(uuid="6ea6e802-df62-4ae2-aa15-44c3267fd99b")
def test_p2p_connect_with_p2p_and_join_go(self):
"""Verify the invitation from GC
Steps:
1. form a group between 2 peers
2. gc joins the group via go
2. verify their connection
3. disconnect
"""
all_duts = [self.dut1, self.dut2, self.dut3]
(go_dut, gc_dut) = self.form_group(self.dut1, self.dut2)
gc2_dut = self.dut3
wp2putils.p2p_connect(gc2_dut,
go_dut,
False,
WPS_PBC,
p2p_connect_type=p2pconsts.P2P_CONNECT_JOIN)
self.verify_group_connection([gc_dut, gc2_dut])
go_dut.log.info("Trigger disconnection")
wp2putils.p2p_disconnect(go_dut)
self.check_disconnection([gc_dut, gc2_dut])
time.sleep(p2pconsts.DEFAULT_FUNCTION_SWITCH_TIME)
@test_tracker_info(uuid="e00469a4-93b7-44dd-8a5e-5d317e0e9333")
def test_p2p_connect_with_p2p_and_legacy_client(self):
"""Verify the invitation from GC
Steps:
1. form a group between 2 peers
2. gc joins the group via go
2. verify their connection
3. disconnect
"""
all_duts = [self.dut1, self.dut2, self.dut3]
(go_dut, gc_dut) = self.form_group(self.dut1, self.dut2)
gc2_dut = self.dut3
group = wp2putils.p2p_get_current_group(go_dut)
network = {
WifiEnums.SSID_KEY: group['NetworkName'],
WifiEnums.PWD_KEY: group['Passphrase']
}
wutils.start_wifi_connection_scan_and_ensure_network_found(
gc2_dut, group['NetworkName'])
wutils.wifi_connect(gc2_dut, network, num_of_tries=3)
go_dut.log.info("Trigger disconnection")
wp2putils.p2p_disconnect(go_dut)
time.sleep(p2pconsts.DEFAULT_FUNCTION_SWITCH_TIME)
@test_tracker_info(uuid="bd53cc18-bcc7-4e27-b78b-1506f5c098c5")
def test_p2p_connect_with_p2p_and_go_invite_peer(self):
"""Verify the invitation from GC
Steps:
1. form a group between 2 peers
2. gc joins the group via go
2. verify their connection
3. disconnect
"""
all_duts = [self.dut1, self.dut2, self.dut3]
(go_dut, gc_dut) = self.form_group(self.dut1, self.dut2)
gc2_dut = self.dut3
wp2putils.p2p_connect(
go_dut,
gc2_dut,
False,
WPS_PBC,
p2p_connect_type=p2pconsts.P2P_CONNECT_INVITATION,
go_ad=go_dut)
self.verify_group_connection([gc_dut, gc2_dut])
go_dut.log.info("Trigger disconnection")
wp2putils.p2p_disconnect(go_dut)
self.check_disconnection([gc_dut, gc2_dut])
time.sleep(p2pconsts.DEFAULT_FUNCTION_SWITCH_TIME)
@test_tracker_info(uuid="4d6e666d-dc48-4881-86c1-5d7cec5e2571")
def test_p2p_connect_with_p2p_and_gc_invite_peer(self):
"""Verify the invitation from GC
Steps:
1. form a group between 2 peers
2. gc joins the group via go
2. verify their connection
3. disconnect
"""
all_duts = [self.dut1, self.dut2, self.dut3]
(go_dut, gc_dut) = self.form_group(self.dut1, self.dut2)
gc2_dut = self.dut3
wp2putils.p2p_connect(
gc_dut,
gc2_dut,
False,
WPS_PBC,
p2p_connect_type=p2pconsts.P2P_CONNECT_INVITATION,
go_ad=go_dut)
self.verify_group_connection([gc_dut, gc2_dut])
go_dut.log.info("Trigger disconnection")
wp2putils.p2p_disconnect(go_dut)
self.check_disconnection([gc_dut, gc2_dut])
time.sleep(p2pconsts.DEFAULT_FUNCTION_SWITCH_TIME)