mirror of
https://github.com/Telecominfraproject/wlan-testing.git
synced 2025-10-30 18:38:06 +00:00
Wifi 11148 (#981)
* Added External Captive Portal Test - Click to Continue Signed-off-by: jitendracandela <jitendra.kushavah@candelatech.com> * Modified directory name. Signed-off-by: jitendracandela <jitendra.kushavah@candelatech.com> * Added test_local_user_and_pass_bridge for External Captive Portal test. Signed-off-by: jitendracandela <jitendra.kushavah@candelatech.com> * Added speed check after authentication to external captive portal- user and pass test. Signed-off-by: jitendracandela <jitendra.kushavah@candelatech.com> * Increased expected throughput for External Captive Portal test using credentials. Signed-off-by: jitendracandela <jitendra.kushavah@candelatech.com> * Modified advanced_captive_portal_tests for allure reporting and added external_captive_portal_tests in the regression suit Signed-off-by: jitendracandela <jitendra.kushavah@candelatech.com> * Replaced wpa2 test cases with open in external_captive_portal_tests Signed-off-by: jitendracandela <jitendra.kushavah@candelatech.com> --------- Signed-off-by: jitendracandela <jitendra.kushavah@candelatech.com>
This commit is contained in:
committed by
GitHub
parent
c0c3387ac2
commit
4f23f4109b
@@ -9,7 +9,7 @@ import logging
|
||||
import allure
|
||||
import pytest
|
||||
|
||||
pytestmark = [pytest.mark.advanced_captive_portal_tests, pytest.mark.bridge]
|
||||
pytestmark = [pytest.mark.advanced_captive_portal_tests, pytest.mark.bridge, pytest.mark.internal_captive_portal_tests]
|
||||
|
||||
setup_params_general = {
|
||||
"mode": "BRIDGE",
|
||||
@@ -32,7 +32,7 @@ setup_params_general = {
|
||||
|
||||
@allure.feature("Advanced Captive Portal Test")
|
||||
@allure.parent_suite("Advanced Captive Portal Tests")
|
||||
@allure.suite(suite_name="BRIDGE Mode")
|
||||
@allure.suite(suite_name="Internal Captive Portal")
|
||||
@allure.sub_suite(sub_suite_name="Click-to-continue mode")
|
||||
@pytest.mark.parametrize(
|
||||
'setup_configuration',
|
||||
@@ -44,21 +44,21 @@ setup_params_general = {
|
||||
class TestBridgeModeadvancedcaptiveportal(object):
|
||||
"""
|
||||
Advanced Captive Portal Test: BRIDGE Mode
|
||||
pytest -m "advanced_captive_portal_tests and bridge"
|
||||
pytest -m "advanced_captive_portal_tests and bridge and internal_captive_portal_tests"
|
||||
"""
|
||||
|
||||
@pytest.mark.open
|
||||
@pytest.mark.twog
|
||||
@pytest.mark.click_to_continue
|
||||
@pytest.mark.ow_regression_lf
|
||||
@allure.title("Click-to-continue mode with open encryption 2.4 GHz Band")
|
||||
@allure.title("Click-to-continue mode with open encryption 2.4 GHz Band Bridge mode")
|
||||
@allure.testcase(url="https://telecominfraproject.atlassian.net/browse/WIFI-10977", name="WIFI-10977")
|
||||
def test_bridge_open_2g_click_to_continue(self, get_test_library, get_dut_logs_per_test_case,
|
||||
get_test_device_logs, num_stations, check_connectivity,
|
||||
setup_configuration, get_testbed_details, get_target_object):
|
||||
"""
|
||||
BRIDGE Mode Advanced Captive Portal Test with open encryption 2.4 GHz Band
|
||||
pytest -m "advanced_captive_portal_tests and open and twog and bridge and click_to_continue"
|
||||
pytest -m "advanced_captive_portal_tests and internal_captive_portal_tests and open and twog and bridge and click_to_continue"
|
||||
"""
|
||||
profile_data = {"ssid_name": "ssid_captive_portal_open_2g_br", "appliedRadios": ["2G"],
|
||||
"security_key": "something",
|
||||
|
||||
@@ -9,7 +9,7 @@ import logging
|
||||
import allure
|
||||
import pytest
|
||||
|
||||
pytestmark = [pytest.mark.advanced_captive_portal_tests, pytest.mark.bridge]
|
||||
pytestmark = [pytest.mark.advanced_captive_portal_tests, pytest.mark.bridge, pytest.mark.internal_captive_portal_tests]
|
||||
|
||||
setup_params_general = {
|
||||
"mode": "BRIDGE",
|
||||
@@ -38,7 +38,7 @@ setup_params_general = {
|
||||
|
||||
@allure.feature("Advanced Captive Portal Test")
|
||||
@allure.parent_suite("Advanced Captive Portal Tests")
|
||||
@allure.suite(suite_name="BRIDGE Mode")
|
||||
@allure.suite(suite_name="Internal Captive Portal")
|
||||
@allure.sub_suite(sub_suite_name="Local user/pass mode")
|
||||
@pytest.mark.parametrize(
|
||||
'setup_configuration',
|
||||
@@ -50,21 +50,21 @@ setup_params_general = {
|
||||
class TestBridgeModeadvancedcaptiveportal(object):
|
||||
"""
|
||||
Advanced Captive Portal Test: BRIDGE Mode
|
||||
pytest -m "advanced_captive_portal_tests and bridge"
|
||||
pytest -m "advanced_captive_portal_tests and bridge and internal_captive_portal_tests"
|
||||
"""
|
||||
|
||||
@pytest.mark.wpa2_personal
|
||||
@pytest.mark.twog
|
||||
@pytest.mark.local_user_and_pass
|
||||
@pytest.mark.ow_regression_lf
|
||||
@allure.title("Local user/pass mode with wpa2_personal encryption 2.4 GHz Band")
|
||||
@allure.title("Local user/pass mode with wpa2_personal encryption 2.4 GHz Band Bridge mode")
|
||||
@allure.testcase(url="https://telecominfraproject.atlassian.net/browse/WIFI-10991", name="WIFI-10991")
|
||||
def test_bridge_wpa2_2g_local_user_and_pass(self, get_test_library, get_dut_logs_per_test_case,
|
||||
get_test_device_logs, num_stations, check_connectivity,
|
||||
setup_configuration, get_testbed_details, get_target_object):
|
||||
"""
|
||||
BRIDGE Mode Advanced Captive Portal Test with wpa2_personal encryption 2.4 GHz Band
|
||||
pytest -m "advanced_captive_portal_tests and wpa2_personal and twog and bridge and local_user_and_pass"
|
||||
pytest -m "advanced_captive_portal_tests and internal_captive_portal_tests and wpa2_personal and twog and bridge and local_user_and_pass"
|
||||
"""
|
||||
profile_data = {"ssid_name": "ssid_captive_portal_wpa2_2g_br", "appliedRadios": ["2G"],
|
||||
"security_key": "something",
|
||||
|
||||
@@ -9,7 +9,7 @@ import logging
|
||||
import allure
|
||||
import pytest
|
||||
|
||||
pytestmark = [pytest.mark.advanced_captive_portal_tests, pytest.mark.bridge]
|
||||
pytestmark = [pytest.mark.advanced_captive_portal_tests, pytest.mark.bridge, pytest.mark.internal_captive_portal_tests]
|
||||
|
||||
setup_params_general = {
|
||||
"mode": "BRIDGE",
|
||||
@@ -35,7 +35,7 @@ setup_params_general = {
|
||||
|
||||
@allure.feature("Advanced Captive Portal Test")
|
||||
@allure.parent_suite("Advanced Captive Portal Tests")
|
||||
@allure.suite(suite_name="BRIDGE Mode")
|
||||
@allure.suite(suite_name="Internal Captive Portal")
|
||||
@allure.sub_suite(sub_suite_name="Radius user/pass mode")
|
||||
@pytest.mark.parametrize(
|
||||
'setup_configuration',
|
||||
@@ -47,14 +47,14 @@ setup_params_general = {
|
||||
class TestBridgeModeadvancedcaptiveportal(object):
|
||||
"""
|
||||
Advanced Captive Portal Test: BRIDGE Mode
|
||||
pytest -m "advanced_captive_portal_tests and bridge"
|
||||
pytest -m "advanced_captive_portal_tests and bridge and internal_captive_portal_tests"
|
||||
"""
|
||||
|
||||
@pytest.mark.wpa2_personal
|
||||
@pytest.mark.twog
|
||||
@pytest.mark.radius_user_and_pass
|
||||
@pytest.mark.ow_regression_lf
|
||||
@allure.title("Radius user/pass mode with wpa2_personal encryption 2.4 GHz Band")
|
||||
@allure.title("Radius user/pass mode with wpa2_personal encryption 2.4 GHz Band Bridge mode")
|
||||
@allure.testcase(url="https://telecominfraproject.atlassian.net/browse/WIFI-10996", name="WIFI-10996")
|
||||
def test_bridge_wpa2_2g_radius_user_and_pass(self, get_test_library, get_dut_logs_per_test_case,
|
||||
get_test_device_logs, num_stations, check_connectivity,
|
||||
@@ -62,7 +62,7 @@ class TestBridgeModeadvancedcaptiveportal(object):
|
||||
radius_info):
|
||||
"""
|
||||
BRIDGE Mode Advanced Captive Portal Test with wpa2_personal encryption 2.4 GHz Band
|
||||
pytest -m "advanced_captive_portal_tests and wpa2_personal and twog and bridge and radius_user_and_pass"
|
||||
pytest -m "advanced_captive_portal_tests and internal_captive_portal_tests and wpa2_personal and twog and bridge and radius_user_and_pass"
|
||||
"""
|
||||
profile_data = {"ssid_name": "ssid_captive_portal_wpa2_2g_br", "appliedRadios": ["2G"],
|
||||
"security_key": "something",
|
||||
|
||||
@@ -0,0 +1,219 @@
|
||||
"""
|
||||
|
||||
External Captive Portal Test: BRIDGE Mode
|
||||
pytest -m "external_captive_portal_tests and bridge"
|
||||
|
||||
"""
|
||||
import logging
|
||||
import re
|
||||
import time
|
||||
import allure
|
||||
import paramiko
|
||||
import pytest
|
||||
from tabulate import tabulate
|
||||
|
||||
pytestmark = [pytest.mark.external_captive_portal_tests, pytest.mark.bridge, pytest.mark.advanced_captive_portal_tests]
|
||||
|
||||
setup_params_general = {
|
||||
"mode": "BRIDGE",
|
||||
"ssid_modes": {
|
||||
"open": [
|
||||
{"ssid_name": "ssid_ext_cap_portal_open_2g_ctc", "appliedRadios": ["2G"], "security_key": "something",
|
||||
"captive": {
|
||||
"auth-mode": "uam",
|
||||
"uam-port": 3990,
|
||||
"uam-secret": "hotsys123",
|
||||
"uam-server": "https://customer.hotspotsystem.com/customer/hotspotlogin.php",
|
||||
"nasid": "AlmondLabs",
|
||||
"auth-server": "radius.hotspotsystem.com",
|
||||
"auth-port": 1812,
|
||||
"auth-secret": "hotsys123",
|
||||
"walled-garden-fqdn": [
|
||||
"*.google.com",
|
||||
"telecominfraproject.com",
|
||||
"customer.hotspotsystem.com",
|
||||
"youtube.com"
|
||||
]
|
||||
}
|
||||
}
|
||||
]},
|
||||
"rf": {},
|
||||
"radius": False
|
||||
}
|
||||
|
||||
|
||||
@allure.feature("Advanced Captive Portal Test")
|
||||
@allure.parent_suite("Advanced Captive Portal Tests")
|
||||
@allure.suite(suite_name="External Captive Portal")
|
||||
@allure.sub_suite(sub_suite_name="Click-to-continue mode")
|
||||
@pytest.mark.parametrize(
|
||||
'setup_configuration',
|
||||
[setup_params_general],
|
||||
indirect=True,
|
||||
scope="class"
|
||||
)
|
||||
@pytest.mark.usefixtures("setup_configuration")
|
||||
class TestBridgeModeExternalCaptivePortal(object):
|
||||
"""
|
||||
External Captive Portal Test: BRIDGE Mode
|
||||
pytest -m "advanced_captive_portal_tests and bridge and external_captive_portal_tests"
|
||||
"""
|
||||
|
||||
@pytest.mark.open
|
||||
@pytest.mark.twog
|
||||
@pytest.mark.click_to_continue
|
||||
@allure.title("Click-to-continue mode with open encryption 2.4 GHz Band Bridge mode")
|
||||
@allure.testcase(url="https://telecominfraproject.atlassian.net/browse/WIFI-11148", name="WIFI-11148")
|
||||
def test_bridge_open_2g_click_to_continue(self, get_test_library, get_dut_logs_per_test_case,
|
||||
get_test_device_logs, check_connectivity, setup_configuration,
|
||||
get_testbed_details, get_target_object):
|
||||
"""
|
||||
BRIDGE Mode External Captive Portal Test with open encryption 2.4 GHz Band
|
||||
pytest -m "advanced_captive_portal_tests and external_captive_portal_tests and open and twog and bridge and click_to_continue"
|
||||
"""
|
||||
def run_command_using_ssh(ssh_client, command: str):
|
||||
output = ""
|
||||
try_count = 1
|
||||
while output.strip() == "" and try_count <= 10:
|
||||
try:
|
||||
try_count += 1
|
||||
time.sleep(2)
|
||||
logging.info(f"Executing command: {command}")
|
||||
stdin, stdout, stderr = ssh_client.exec_command(command)
|
||||
output = stdout.read().decode()
|
||||
except Exception as exc:
|
||||
logging.error(f"Handled Exception while running {command}: {exc}", exc_info=True)
|
||||
|
||||
if output.strip() == "":
|
||||
allure.attach(name="No response while running following command:", body=f"{command}")
|
||||
raise Exception("No output from command, check test body!")
|
||||
return output
|
||||
|
||||
for dut in get_test_library.dut_data:
|
||||
get_test_library.pre_cleanup()
|
||||
|
||||
radio_port_name = list(get_test_library.get_radio_availabilities(num_stations_2g=1)[0].keys())[0]
|
||||
security = "open"
|
||||
station = 'sta_ecp'
|
||||
logging.info(f"Creating a station on the configured ssid on {radio_port_name} radio...")
|
||||
sta_got_ip = get_test_library.client_connect_using_radio(
|
||||
ssid=setup_params_general["ssid_modes"][security][0]["ssid_name"],
|
||||
passkey="[BLANK]",
|
||||
security="open",
|
||||
mode=setup_params_general["mode"],
|
||||
radio=radio_port_name,
|
||||
station_name=[station],
|
||||
attach_port_info=False
|
||||
)
|
||||
|
||||
sta_info = get_test_library.json_get(_req_url=f"port/1/1/{station}")
|
||||
dict_table_sta = {
|
||||
"Key": list(sta_info["interface"].keys()),
|
||||
"Value": list(sta_info["interface"].values())
|
||||
}
|
||||
data_table_sta = tabulate(dict_table_sta, headers='keys', tablefmt='fancy_grid')
|
||||
logging.info(f"Stations Data ({station}): \n{data_table_sta}\n")
|
||||
allure.attach(name=f"Stations Data ({station})", body=str(data_table_sta))
|
||||
|
||||
if sta_got_ip is False:
|
||||
logging.info("Station Failed to get IP")
|
||||
pytest.fail("Station Failed to get IP")
|
||||
|
||||
logging.info("Connecting SSH connection...")
|
||||
hostname = get_test_library.manager_ip
|
||||
port = get_test_library.manager_ssh_port
|
||||
username = 'root'
|
||||
password = 'lanforge'
|
||||
ping_host = "google.com"
|
||||
ping_count = 10
|
||||
ping_command = f"/home/lanforge/vrf_exec.bash {station} ping -c {ping_count} {ping_host}"
|
||||
client = paramiko.SSHClient()
|
||||
try:
|
||||
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||||
client.connect(hostname, port=port, username=username, password=password)
|
||||
|
||||
logging.info("Making sure client not getting internet access before UAM authentication...")
|
||||
ping_output_pre_authentication = run_command_using_ssh(client, ping_command)
|
||||
|
||||
logging.info(f"\nBefore Captive Portal-UAM authentication:\n{ping_output_pre_authentication}\n")
|
||||
allure.attach(name="Before Captive Portal-UAM authentication, station ping response (google.com)",
|
||||
body=str(ping_output_pre_authentication))
|
||||
|
||||
if "100% packet loss" not in ping_output_pre_authentication:
|
||||
logging.info("Client already have internet access before UAM authentication!!!")
|
||||
pytest.fail("Client already have internet access before UAM authentication")
|
||||
logging.info("Client do not have internet access before UAM authentication.")
|
||||
|
||||
logging.info("Getting the inet ip address...")
|
||||
logging.info(f"AP idx: {get_test_library.dut_data.index(dut)}")
|
||||
cmd_output = get_target_object.get_dut_library_object().run_generic_command(
|
||||
cmd="ifconfig up0v0",
|
||||
idx=get_test_library.dut_data.index(dut),
|
||||
attach_allure=False
|
||||
)
|
||||
ip_pattern = re.compile(r"inet addr:(\d+\.\d+\.\d+\.\d+)")
|
||||
match = ip_pattern.search(cmd_output)
|
||||
inet_ip_addr = match.group(1)
|
||||
logging.info(f"inet ip addr: {inet_ip_addr}")
|
||||
|
||||
expected_location = f"/home/lanforge/vrf_exec.bash {station} curl -I http://{inet_ip_addr}/hotspot/"
|
||||
expected_location_output = run_command_using_ssh(client, expected_location)
|
||||
|
||||
challenge_link = re.findall(r'^Location:\s+(.*?)\s*$', expected_location_output, re.MULTILINE)[0]
|
||||
logging.info(f"Redirection link: {challenge_link}")
|
||||
|
||||
url_info = {}
|
||||
for field in challenge_link.split('?')[1].split('&'):
|
||||
key_val_list = field.split('=')
|
||||
if len(key_val_list) == 2 and len(key_val_list[1]) != 0:
|
||||
url_info[key_val_list[0]] = key_val_list[1]
|
||||
logging.info(f"url_info: {url_info}")
|
||||
|
||||
challenge = url_info['challenge']
|
||||
nasid = url_info['nasid']
|
||||
station_mac = url_info['mac']
|
||||
uamport = url_info['uamport']
|
||||
|
||||
link = (
|
||||
f"https://customer.hotspotsystem.com/customer/hotspotlogin.php?name=&email=&company=&address="
|
||||
f"&city=&state=&country=&zip=&phone=&capture_custom_1=&capture_custom_2=&capture_custom_3="
|
||||
f"&capture_custom_4=&capture_custom_5=&ssl-login=&chal={challenge}&uamip={inet_ip_addr}"
|
||||
f"&uamport={uamport}&nasid={nasid}&mac={station_mac}&userurl=&login=login&skin_id="
|
||||
f"&uid={station_mac}&pwd=password&operator={nasid}&location_id=1&lang=en&agree=1"
|
||||
)
|
||||
expected_302 = f'/home/lanforge/vrf_exec.bash {station} curl -I "{link}"'
|
||||
response_302 = run_command_using_ssh(client, expected_302)
|
||||
|
||||
logging.info(f"\n{response_302}")
|
||||
allure.attach(name="Expected 302 response: ", body=str(response_302),
|
||||
attachment_type=allure.attachment_type.TEXT)
|
||||
|
||||
link_to_hit = re.findall(r'^Location:\s+(.*?)\s*$', response_302, re.MULTILINE)[0]
|
||||
logging.info(f"Link to hit: {link_to_hit}")
|
||||
|
||||
cmd_to_authenticate = f'/home/lanforge/vrf_exec.bash {station} curl "{link_to_hit}"'
|
||||
authentication_response = run_command_using_ssh(client, cmd_to_authenticate)
|
||||
|
||||
logging.info(f"\n{authentication_response}\n")
|
||||
allure.attach(name="Response from captive portal: ",
|
||||
body=authentication_response, attachment_type=allure.attachment_type.HTML)
|
||||
|
||||
if "<h1> Connected </h1>" not in authentication_response:
|
||||
logging.info("Captive portal authentication Failed")
|
||||
pytest.fail("Captive portal authentication Failed")
|
||||
|
||||
logging.info("Captive portal authentication successful! Checking if client got internet access...")
|
||||
ping_output_post_authentication = run_command_using_ssh(client, ping_command)
|
||||
|
||||
logging.info(f"\nAfter Captive Portal-UAM authentication:\n{ping_output_post_authentication}\n")
|
||||
allure.attach(name="After Captive Portal-UAM authentication, station ping response (google.com)",
|
||||
body=str(ping_output_post_authentication))
|
||||
|
||||
if "100% packet loss" in ping_output_post_authentication:
|
||||
logging.info("Client did not get internet access even after authentication!!!")
|
||||
pytest.fail("Client did not get internet access even after authentication")
|
||||
except Exception as e:
|
||||
logging.error(f"Error occurred: {e}", exc_info=True)
|
||||
pytest.fail(f"Error occurred: {e}")
|
||||
finally:
|
||||
client.close()
|
||||
@@ -0,0 +1,252 @@
|
||||
"""
|
||||
|
||||
External Captive Portal Test: BRIDGE Mode
|
||||
pytest -m "external_captive_portal_tests and bridge"
|
||||
|
||||
"""
|
||||
import logging
|
||||
import re
|
||||
import time
|
||||
import allure
|
||||
import paramiko
|
||||
import pytest
|
||||
from tabulate import tabulate
|
||||
from bs4 import BeautifulSoup
|
||||
|
||||
pytestmark = [pytest.mark.external_captive_portal_tests, pytest.mark.bridge, pytest.mark.advanced_captive_portal_tests]
|
||||
|
||||
setup_params_general = {
|
||||
"mode": "BRIDGE",
|
||||
"ssid_modes": {
|
||||
"open": [
|
||||
{"ssid_name": "ssid_ext_cap_portal_open_2g_id_p", "appliedRadios": ["2G"], "security_key": "something",
|
||||
"captive": {
|
||||
"auth-mode": "uam",
|
||||
"uam-port": 3990,
|
||||
"uam-secret": "hotsys123",
|
||||
"uam-server": "https://customer.hotspotsystem.com/customer/hotspotlogin.php",
|
||||
"nasid": "AlmondLabs_6",
|
||||
"auth-server": "radius.hotspotsystem.com",
|
||||
"auth-port": 1812,
|
||||
"auth-secret": "hotsys123",
|
||||
"walled-garden-fqdn": [
|
||||
"*.google.com",
|
||||
"telecominfraproject.com",
|
||||
"customer.hotspotsystem.com",
|
||||
"youtube.com"
|
||||
]
|
||||
}
|
||||
}
|
||||
]},
|
||||
"rf": {},
|
||||
"radius": False
|
||||
}
|
||||
|
||||
|
||||
@allure.feature("Advanced Captive Portal Test")
|
||||
@allure.parent_suite("Advanced Captive Portal Tests")
|
||||
@allure.suite(suite_name="External Captive Portal")
|
||||
@allure.sub_suite(sub_suite_name="Local user/pass mode")
|
||||
@pytest.mark.parametrize(
|
||||
'setup_configuration',
|
||||
[setup_params_general],
|
||||
indirect=True,
|
||||
scope="class"
|
||||
)
|
||||
@pytest.mark.usefixtures("setup_configuration")
|
||||
class TestBridgeModeExternalCaptivePortal(object):
|
||||
"""
|
||||
External Captive Portal Test: BRIDGE Mode
|
||||
pytest -m "advanced_captive_portal_tests and external_captive_portal_tests and bridge"
|
||||
"""
|
||||
|
||||
@pytest.mark.open
|
||||
@pytest.mark.twog
|
||||
@pytest.mark.local_user_and_pass
|
||||
@allure.title("Local user/pass mode with open encryption 2.4 GHz Band Bridge mode")
|
||||
@allure.testcase(url="https://telecominfraproject.atlassian.net/browse/WIFI-13683", name="WIFI-13683")
|
||||
def test_bridge_open_2g_local_user_and_pass(self, get_test_library, get_dut_logs_per_test_case,
|
||||
get_test_device_logs, check_connectivity, setup_configuration,
|
||||
get_testbed_details, get_target_object):
|
||||
"""
|
||||
BRIDGE Mode External Captive Portal Test with open encryption 2.4 GHz Band
|
||||
pytest -m "advanced_captive_portal_tests and external_captive_portal_tests and open and twog and bridge and local_user_and_pass"
|
||||
"""
|
||||
def run_command_using_ssh(ssh_client, command: str):
|
||||
output = ""
|
||||
try_count = 1
|
||||
while output.strip() == "" and try_count <= 10:
|
||||
try:
|
||||
try_count += 1
|
||||
time.sleep(2)
|
||||
logging.info(f"Executing command: {command}")
|
||||
stdin, stdout, stderr = ssh_client.exec_command(command)
|
||||
output = stdout.read().decode()
|
||||
except Exception as exc:
|
||||
logging.error(f"Handled Exception while running {command}: {exc}", exc_info=True)
|
||||
|
||||
if output.strip() == "":
|
||||
allure.attach(name="No response while running following command:", body=f"{command}")
|
||||
raise Exception("No output from command, check test body!")
|
||||
return output
|
||||
|
||||
for dut in get_test_library.dut_data:
|
||||
get_test_library.pre_cleanup()
|
||||
|
||||
radio_port_name = list(get_test_library.get_radio_availabilities(num_stations_2g=1)[0].keys())[0]
|
||||
security = "open"
|
||||
station = 'sta_ecp'
|
||||
logging.info(f"Creating a station on the configured ssid on {radio_port_name} radio...")
|
||||
sta_got_ip = get_test_library.client_connect_using_radio(
|
||||
ssid=setup_params_general["ssid_modes"][security][0]["ssid_name"],
|
||||
passkey="[BLANK]",
|
||||
security="open",
|
||||
mode=setup_params_general["mode"],
|
||||
radio=radio_port_name,
|
||||
station_name=[station],
|
||||
attach_port_info=False
|
||||
)
|
||||
|
||||
sta_info = get_test_library.json_get(_req_url=f"port/1/1/{station}")
|
||||
dict_table_sta = {
|
||||
"Key": list(sta_info["interface"].keys()),
|
||||
"Value": list(sta_info["interface"].values())
|
||||
}
|
||||
data_table_sta = tabulate(dict_table_sta, headers='keys', tablefmt='fancy_grid')
|
||||
logging.info(f"Stations Data ({station}): \n{data_table_sta}\n")
|
||||
allure.attach(name=f"Stations Data ({station})", body=str(data_table_sta))
|
||||
|
||||
if sta_got_ip is False:
|
||||
logging.info("Station Failed to get IP")
|
||||
pytest.fail("Station Failed to get IP")
|
||||
|
||||
logging.info("Connecting SSH connection...")
|
||||
hostname = get_test_library.manager_ip
|
||||
port = get_test_library.manager_ssh_port
|
||||
username = 'root'
|
||||
password = 'lanforge'
|
||||
ping_host = "google.com"
|
||||
ping_count = 10
|
||||
ping_command = f"/home/lanforge/vrf_exec.bash {station} ping -c {ping_count} {ping_host}"
|
||||
client = paramiko.SSHClient()
|
||||
try:
|
||||
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
|
||||
client.connect(hostname, port=port, username=username, password=password)
|
||||
|
||||
logging.info("Making sure client not getting internet access before UAM authentication...")
|
||||
ping_output_pre_authentication = run_command_using_ssh(client, ping_command)
|
||||
|
||||
logging.info(f"\nBefore Captive Portal-UAM authentication:\n{ping_output_pre_authentication}\n")
|
||||
allure.attach(name="Before Captive Portal-UAM authentication, station ping response (google.com)",
|
||||
body=str(ping_output_pre_authentication))
|
||||
|
||||
if "100% packet loss" not in ping_output_pre_authentication:
|
||||
logging.info("Client already have internet access before UAM authentication!!!")
|
||||
pytest.fail("Client already have internet access before UAM authentication")
|
||||
logging.info("Client do not have internet access before UAM authentication.")
|
||||
|
||||
logging.info("Getting the inet ip address...")
|
||||
logging.info(f"AP idx: {get_test_library.dut_data.index(dut)}")
|
||||
cmd_output = get_target_object.get_dut_library_object().run_generic_command(
|
||||
cmd="ifconfig up0v0",
|
||||
idx=get_test_library.dut_data.index(dut),
|
||||
attach_allure=False
|
||||
)
|
||||
ip_pattern = re.compile(r"inet addr:(\d+\.\d+\.\d+\.\d+)")
|
||||
match = ip_pattern.search(cmd_output)
|
||||
inet_ip_addr = match.group(1)
|
||||
logging.info(f"inet ip addr: {inet_ip_addr}")
|
||||
|
||||
expected_location = f"/home/lanforge/vrf_exec.bash {station} curl -I http://{inet_ip_addr}/hotspot/"
|
||||
expected_location_output = run_command_using_ssh(client, expected_location)
|
||||
|
||||
challenge_link = re.findall(r'^Location:\s+(.*?)\s*$', expected_location_output, re.MULTILINE)[0]
|
||||
logging.info(f"Redirection link: {challenge_link}")
|
||||
|
||||
url_info = {}
|
||||
for field in challenge_link.split('?')[1].split('&'):
|
||||
key_val_list = field.split('=')
|
||||
if len(key_val_list) == 2 and len(key_val_list[1]) != 0:
|
||||
url_info[key_val_list[0]] = key_val_list[1]
|
||||
logging.info(f"url_info: {url_info}")
|
||||
|
||||
challenge = url_info['challenge']
|
||||
nasid = url_info['nasid']
|
||||
station_mac = url_info['mac']
|
||||
uamport = url_info['uamport']
|
||||
|
||||
link = (f'https://customer.hotspotsystem.com/customer/hotspotlogin.php?ssl-login=&chal={challenge}'
|
||||
f'&uamip={inet_ip_addr}&uamport={uamport}&nasid={nasid}&mac={station_mac}'
|
||||
f'&userurl=ct522-7481%2F&login=login&skin_id=&uid=userr1&pwd=password1')
|
||||
html_request = f'/home/lanforge/vrf_exec.bash {station} curl "{link}"'
|
||||
html_response = run_command_using_ssh(client, html_request)
|
||||
|
||||
logging.info(f"HTML response containing authentication url:\n{html_response}")
|
||||
allure.attach(name="HTML response containing authentication url:", body=str(html_response),
|
||||
attachment_type=allure.attachment_type.TEXT)
|
||||
|
||||
soup = BeautifulSoup(html_response, 'html.parser')
|
||||
meta_tag = soup.find('meta', attrs={'http-equiv': 'refresh'})
|
||||
content = meta_tag['content']
|
||||
authentication_url = "=".join(content.split('=')[1:])
|
||||
|
||||
logging.info(f"Authentication URL extracted from HTML:\n{authentication_url}\n")
|
||||
allure.attach(name="Authentication URL extracted from HTML:", body=str(authentication_url))
|
||||
|
||||
cmd_to_authenticate = f'/home/lanforge/vrf_exec.bash {station} curl "{authentication_url}"'
|
||||
authentication_response = run_command_using_ssh(client, cmd_to_authenticate)
|
||||
|
||||
logging.info(f"\n{authentication_response}\n")
|
||||
allure.attach(name="Response from captive portal: ",
|
||||
body=authentication_response, attachment_type=allure.attachment_type.HTML)
|
||||
|
||||
if "<h1> Connected </h1>" not in authentication_response:
|
||||
logging.info("Captive portal authentication Failed")
|
||||
pytest.fail("Captive portal authentication Failed")
|
||||
|
||||
logging.info("Captive portal authentication successful! Checking if client got internet access...")
|
||||
ping_output_post_authentication = run_command_using_ssh(client, ping_command)
|
||||
|
||||
logging.info(f"\nAfter Captive Portal-UAM authentication:\n{ping_output_post_authentication}\n")
|
||||
allure.attach(name="After Captive Portal-UAM authentication, station ping response (google.com)",
|
||||
body=str(ping_output_post_authentication))
|
||||
|
||||
if "100% packet loss" in ping_output_post_authentication:
|
||||
logging.info("Client did not get internet access even after authentication!!!")
|
||||
pytest.fail("Client did not get internet access even after authentication")
|
||||
except Exception as e:
|
||||
logging.error(f"Error occurred: {e}", exc_info=True)
|
||||
pytest.fail(f"Error occurred: {e}")
|
||||
finally:
|
||||
client.close()
|
||||
|
||||
logging.info("Checking throughput speed...")
|
||||
wifi_capacity_obj_list = get_test_library.wifi_capacity(mode="BRIDGE",
|
||||
download_rate="10Gbps",
|
||||
upload_rate="56Kbps",
|
||||
protocol="UDP-IPv4",
|
||||
duration="60000",
|
||||
batch_size="1",
|
||||
stations=radio_port_name[:4] + station,
|
||||
add_stations=False,
|
||||
create_stations=False)
|
||||
|
||||
report = wifi_capacity_obj_list[0].report_name[0]['LAST']["response"].split(":::")[1].split("/")[-1] + "/"
|
||||
numeric_score = get_test_library.read_kpi_file(column_name=["numeric-score"], dir_name=report)
|
||||
expected_throughput = 10
|
||||
throughput = {
|
||||
"download": [numeric_score[0][0]],
|
||||
"upload": [numeric_score[1][0]],
|
||||
"total": [numeric_score[2][0]],
|
||||
"expected": [f"<= {expected_throughput}"],
|
||||
"unit": ["Mbps"],
|
||||
"PASS": [numeric_score[2][0] <= expected_throughput]
|
||||
}
|
||||
data_table = tabulate(throughput, headers='keys', tablefmt='fancy_grid')
|
||||
allure.attach(name='Throughput Data', body=data_table)
|
||||
logging.info(f"\n{data_table}")
|
||||
|
||||
if not throughput["PASS"][0]:
|
||||
logging.info("Throughput exceeded than set threshold")
|
||||
pytest.fail("Throughput exceeded than set threshold")
|
||||
logging.info("Throughput is within the set threshold")
|
||||
Reference in New Issue
Block a user