mirror of
				https://github.com/Telecominfraproject/wlan-testing.git
				synced 2025-10-31 19:08:01 +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:
		 Jitendrakumar Kushavah
					Jitendrakumar Kushavah
				
			
				
					committed by
					
						 GitHub
						GitHub
					
				
			
			
				
	
			
			
			 GitHub
						GitHub
					
				
			
						parent
						
							c0c3387ac2
						
					
				
				
					commit
					4f23f4109b
				
			| @@ -9,7 +9,7 @@ import logging | |||||||
| import allure | import allure | ||||||
| import pytest | 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 = { | setup_params_general = { | ||||||
|     "mode": "BRIDGE", |     "mode": "BRIDGE", | ||||||
| @@ -32,7 +32,7 @@ setup_params_general = { | |||||||
|  |  | ||||||
| @allure.feature("Advanced Captive Portal Test") | @allure.feature("Advanced Captive Portal Test") | ||||||
| @allure.parent_suite("Advanced Captive Portal Tests") | @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") | @allure.sub_suite(sub_suite_name="Click-to-continue mode") | ||||||
| @pytest.mark.parametrize( | @pytest.mark.parametrize( | ||||||
|     'setup_configuration', |     'setup_configuration', | ||||||
| @@ -44,21 +44,21 @@ setup_params_general = { | |||||||
| class TestBridgeModeadvancedcaptiveportal(object): | class TestBridgeModeadvancedcaptiveportal(object): | ||||||
|     """ |     """ | ||||||
|         Advanced Captive Portal Test: BRIDGE Mode |         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.open | ||||||
|     @pytest.mark.twog |     @pytest.mark.twog | ||||||
|     @pytest.mark.click_to_continue |     @pytest.mark.click_to_continue | ||||||
|     @pytest.mark.ow_regression_lf |     @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") |     @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, |     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, |                                               get_test_device_logs, num_stations, check_connectivity, | ||||||
|                                               setup_configuration, get_testbed_details, get_target_object): |                                               setup_configuration, get_testbed_details, get_target_object): | ||||||
|         """ |         """ | ||||||
|             BRIDGE Mode Advanced Captive Portal Test with open encryption 2.4 GHz Band |             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"], |         profile_data = {"ssid_name": "ssid_captive_portal_open_2g_br", "appliedRadios": ["2G"], | ||||||
|                         "security_key": "something", |                         "security_key": "something", | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ import logging | |||||||
| import allure | import allure | ||||||
| import pytest | 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 = { | setup_params_general = { | ||||||
|     "mode": "BRIDGE", |     "mode": "BRIDGE", | ||||||
| @@ -38,7 +38,7 @@ setup_params_general = { | |||||||
|  |  | ||||||
| @allure.feature("Advanced Captive Portal Test") | @allure.feature("Advanced Captive Portal Test") | ||||||
| @allure.parent_suite("Advanced Captive Portal Tests") | @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") | @allure.sub_suite(sub_suite_name="Local user/pass mode") | ||||||
| @pytest.mark.parametrize( | @pytest.mark.parametrize( | ||||||
|     'setup_configuration', |     'setup_configuration', | ||||||
| @@ -50,21 +50,21 @@ setup_params_general = { | |||||||
| class TestBridgeModeadvancedcaptiveportal(object): | class TestBridgeModeadvancedcaptiveportal(object): | ||||||
|     """ |     """ | ||||||
|         Advanced Captive Portal Test: BRIDGE Mode |         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.wpa2_personal | ||||||
|     @pytest.mark.twog |     @pytest.mark.twog | ||||||
|     @pytest.mark.local_user_and_pass |     @pytest.mark.local_user_and_pass | ||||||
|     @pytest.mark.ow_regression_lf |     @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") |     @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, |     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, |                                                 get_test_device_logs, num_stations, check_connectivity, | ||||||
|                                                 setup_configuration, get_testbed_details, get_target_object): |                                                 setup_configuration, get_testbed_details, get_target_object): | ||||||
|         """ |         """ | ||||||
|             BRIDGE Mode Advanced Captive Portal Test with wpa2_personal encryption 2.4 GHz Band |             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"], |         profile_data = {"ssid_name": "ssid_captive_portal_wpa2_2g_br", "appliedRadios": ["2G"], | ||||||
|                         "security_key": "something", |                         "security_key": "something", | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ import logging | |||||||
| import allure | import allure | ||||||
| import pytest | 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 = { | setup_params_general = { | ||||||
|     "mode": "BRIDGE", |     "mode": "BRIDGE", | ||||||
| @@ -35,7 +35,7 @@ setup_params_general = { | |||||||
|  |  | ||||||
| @allure.feature("Advanced Captive Portal Test") | @allure.feature("Advanced Captive Portal Test") | ||||||
| @allure.parent_suite("Advanced Captive Portal Tests") | @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") | @allure.sub_suite(sub_suite_name="Radius user/pass mode") | ||||||
| @pytest.mark.parametrize( | @pytest.mark.parametrize( | ||||||
|     'setup_configuration', |     'setup_configuration', | ||||||
| @@ -47,14 +47,14 @@ setup_params_general = { | |||||||
| class TestBridgeModeadvancedcaptiveportal(object): | class TestBridgeModeadvancedcaptiveportal(object): | ||||||
|     """ |     """ | ||||||
|         Advanced Captive Portal Test: BRIDGE Mode |         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.wpa2_personal | ||||||
|     @pytest.mark.twog |     @pytest.mark.twog | ||||||
|     @pytest.mark.radius_user_and_pass |     @pytest.mark.radius_user_and_pass | ||||||
|     @pytest.mark.ow_regression_lf |     @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") |     @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, |     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, |                                                  get_test_device_logs, num_stations, check_connectivity, | ||||||
| @@ -62,7 +62,7 @@ class TestBridgeModeadvancedcaptiveportal(object): | |||||||
|                                                  radius_info): |                                                  radius_info): | ||||||
|         """ |         """ | ||||||
|             BRIDGE Mode Advanced Captive Portal Test with wpa2_personal encryption 2.4 GHz Band |             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"], |         profile_data = {"ssid_name": "ssid_captive_portal_wpa2_2g_br", "appliedRadios": ["2G"], | ||||||
|                         "security_key": "something", |                         "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