Add additional wifi test cases

This CL includes below changes:
- Support to create wep and wpa networks by WifiBaseTest
- Add test cases for wep/wpa networks
- Add 5G network for wifi scan test

Bug: 79666070
Test: Manual
Change-Id: I61de9b8156222b8fdc6b6f3eaf60d7257fe26aee
diff --git a/acts/framework/acts/test_utils/wifi/WifiBaseTest.py b/acts/framework/acts/test_utils/wifi/WifiBaseTest.py
index d89ad97..219c878 100755
--- a/acts/framework/acts/test_utils/wifi/WifiBaseTest.py
+++ b/acts/framework/acts/test_utils/wifi/WifiBaseTest.py
@@ -44,12 +44,13 @@
             for attenuator in self.attenuators:
                 attenuator.set_atten(0)
 
-    def get_wpa2_network(
+    def get_psk_network(
             self,
             mirror_ap,
             reference_networks,
             hidden=False,
             same_ssid=False,
+            security_mode=hostapd_constants.WPA2_STRING,
             ssid_length_2g=hostapd_constants.AP_SSID_LENGTH_2G,
             ssid_length_5g=hostapd_constants.AP_SSID_LENGTH_5G,
             passphrase_length_2g=hostapd_constants.AP_PASSPHRASE_LENGTH_2G,
@@ -73,8 +74,8 @@
         """
         network_dict_2g = {}
         network_dict_5g = {}
-        ref_5g_security = hostapd_constants.WPA2_STRING
-        ref_2g_security = hostapd_constants.WPA2_STRING
+        ref_5g_security = security_mode
+        ref_2g_security = security_mode
 
         if same_ssid:
             ref_2g_ssid = 'xg_%s' % utils.rand_ascii_str(ssid_length_2g)
@@ -168,6 +169,76 @@
                 break
         return {"2g": network_dict_2g, "5g": network_dict_5g}
 
+    def get_wep_network(
+            self,
+            mirror_ap,
+            networks,
+            hidden=False,
+            same_ssid=False,
+            ssid_length_2g=hostapd_constants.AP_SSID_LENGTH_2G,
+            ssid_length_5g=hostapd_constants.AP_SSID_LENGTH_5G,
+            passphrase_length_2g=hostapd_constants.AP_PASSPHRASE_LENGTH_2G,
+            passphrase_length_5g=hostapd_constants.AP_PASSPHRASE_LENGTH_5G):
+        """Generates SSID and passphrase for a WEP network using random
+           generator.
+
+           Args:
+               mirror_ap: Boolean, determines if both APs use the same hostapd
+                          config or different configs.
+               networks: List of WEP networks.
+               same_ssid: Boolean, determines if both bands on AP use the same
+                          SSID.
+               ssid_length_2gecond AP Int, number of characters to use for 2G SSID.
+               ssid_length_5g: Int, number of characters to use for 5G SSID.
+               passphrase_length_2g: Int, length of password for 2G network.
+               passphrase_length_5g: Int, length of password for 5G network.
+
+           Returns: A dict of 2G and 5G network lists for hostapd configuration.
+
+        """
+        network_dict_2g = {}
+        network_dict_5g = {}
+        ref_5g_security = hostapd_constants.WEP_STRING
+        ref_2g_security = hostapd_constants.WEP_STRING
+
+        if same_ssid:
+            ref_2g_ssid = 'xg_%s' % utils.rand_ascii_str(ssid_length_2g)
+            ref_5g_ssid = ref_2g_ssid
+
+            ref_2g_passphrase = utils.rand_hex_str(passphrase_length_2g)
+            ref_5g_passphrase = ref_2g_passphrase
+
+        else:
+            ref_2g_ssid = '2g_%s' % utils.rand_ascii_str(ssid_length_2g)
+            ref_2g_passphrase = utils.rand_hex_str(passphrase_length_2g)
+
+            ref_5g_ssid = '5g_%s' % utils.rand_ascii_str(ssid_length_5g)
+            ref_5g_passphrase = utils.rand_hex_str(passphrase_length_5g)
+
+        network_dict_2g = {
+            "SSID": ref_2g_ssid,
+            "security": ref_2g_security,
+            "wepKeys": [ref_2g_passphrase] * 4,
+            "hiddenSSID": hidden
+        }
+
+        network_dict_5g = {
+            "SSID": ref_5g_ssid,
+            "security": ref_5g_security,
+            "wepKeys": [ref_2g_passphrase] * 4,
+            "hiddenSSID": hidden
+        }
+
+        ap = 0
+        for ap in range(MAX_AP_COUNT):
+            networks.append({
+                "2g": copy.copy(network_dict_2g),
+                "5g": copy.copy(network_dict_5g)
+            })
+            if not mirror_ap:
+                break
+        return {"2g": network_dict_2g, "5g": network_dict_5g}
+
     def update_bssid(self, ap_instance, ap, network, band):
         """Get bssid and update network dictionary.
 
@@ -184,7 +255,10 @@
             # TODO:(bamahadev) Change all occurances of reference_networks
             # to wpa_networks.
             self.reference_networks[ap_instance][band]["bssid"] = bssid
-
+        if network["security"] == hostapd_constants.WPA_STRING:
+            self.wpa_networks[ap_instance][band]["bssid"] = bssid
+        if network["security"] == hostapd_constants.WEP_STRING:
+            self.wep_networks[ap_instance][band]["bssid"] = bssid
         if network["security"] == 'none':
             self.open_network[ap_instance][band]["bssid"] = bssid
 
@@ -227,6 +301,8 @@
             hidden=False,
             same_ssid=False,
             mirror_ap=True,
+            wpa_network=False,
+            wep_network=False,
             ap_count=1):
         asserts.assert_true(
             len(self.user_params["AccessPoint"]) == 2,
@@ -247,6 +323,10 @@
 
         self.user_params["reference_networks"] = []
         self.user_params["open_network"] = []
+        if wpa_network:
+            self.user_params["wpa_networks"] = []
+        if wep_network:
+            self.user_params["wep_networks"] = []
 
         for count in range(config_count):
 
@@ -259,7 +339,7 @@
             network_list_2g.append({"channel": channel_2g})
             network_list_5g.append({"channel": channel_5g})
 
-            networks_dict = self.get_wpa2_network(
+            networks_dict = self.get_psk_network(
                                 mirror_ap,
                                 self.user_params["reference_networks"],
                                 hidden=hidden,
@@ -285,6 +365,29 @@
                 network_list_2g.append(networks_dict["2g"])
                 network_list_5g.append(networks_dict["5g"])
 
+                if wpa_network:
+                    networks_dict = self.get_psk_network(
+                                        mirror_ap,
+                                        self.user_params["wpa_networks"],
+                                        hidden=hidden,
+                                        same_ssid=same_ssid,
+                                        security_mode=hostapd_constants.WPA_STRING)
+                    self.wpa_networks = self.user_params["wpa_networks"]
+
+                    network_list_2g.append(networks_dict["2g"])
+                    network_list_5g.append(networks_dict["5g"])
+
+                if wep_network:
+                    networks_dict = self.get_wep_network(
+                                        mirror_ap,
+                                        self.user_params["wep_networks"],
+                                        hidden=hidden,
+                                        same_ssid=same_ssid)
+                    self.wep_networks = self.user_params["wep_networks"]
+
+                    network_list_2g.append(networks_dict["2g"])
+                    network_list_5g.append(networks_dict["5g"])
+
             orig_network_list_5g = copy.copy(network_list_5g)
             orig_network_list_2g = copy.copy(network_list_2g)
 
@@ -323,7 +426,16 @@
                         security=hostapd_security.Security(
                             security_mode=network["security"],
                             password=network["password"])))
-            elif "password" not in network:
+            elif "wepKeys" in network:
+                bss_settings.append(
+                    hostapd_bss_settings.BssSettings(
+                        name=network["SSID"],
+                        ssid=network["SSID"],
+                        hidden=network["hiddenSSID"],
+                        security=hostapd_security.Security(
+                            security_mode=network["security"],
+                            password=network["wepKeys"][0])))
+            else:
                 bss_settings.append(
                     hostapd_bss_settings.BssSettings(
                         name=network["SSID"],
@@ -340,6 +452,16 @@
                     password=hostapd_config_settings["password"]),
                 bss_settings=bss_settings,
                 profile_name='whirlwind')
+        elif "wepKeys" in hostapd_config_settings:
+            config = hostapd_ap_preset.create_ap_preset(
+                channel=ap_settings["channel"],
+                ssid=hostapd_config_settings["SSID"],
+                hidden=hostapd_config_settings["hiddenSSID"],
+                security=hostapd_security.Security(
+                    security_mode=hostapd_config_settings["security"],
+                    password=hostapd_config_settings["wepKeys"][0]),
+                bss_settings=bss_settings,
+                profile_name='whirlwind')
         else:
             config = hostapd_ap_preset.create_ap_preset(
                 channel=ap_settings["channel"],
diff --git a/acts/framework/acts/utils.py b/acts/framework/acts/utils.py
index 19ac98c..f671f33 100755
--- a/acts/framework/acts/utils.py
+++ b/acts/framework/acts/utils.py
@@ -326,6 +326,19 @@
     return ''.join(letters)
 
 
+def rand_hex_str(length):
+    """Generates a random string of specified length, composed of hex digits
+
+    Args:
+        length: The number of characters in the string.
+
+    Returns:
+        The random string generated.
+    """
+    letters = [random.choice(string.hexdigits) for i in range(length)]
+    return ''.join(letters)
+
+
 # Thead/Process related functions.
 def concurrent_exec(func, param_list):
     """Executes a function with different parameters pseudo-concurrently.
diff --git a/acts/tests/google/wifi/WifiManagerTest.py b/acts/tests/google/wifi/WifiManagerTest.py
index 5a5dfeb..9fc7961 100755
--- a/acts/tests/google/wifi/WifiManagerTest.py
+++ b/acts/tests/google/wifi/WifiManagerTest.py
@@ -53,13 +53,14 @@
         wutils.wifi_test_device_init(self.dut)
         req_params = []
         opt_param = [
-            "open_network", "reference_networks", "iperf_server_address"
+            "open_network", "reference_networks", "iperf_server_address",
+            "wpa_networks", "wep_networks"
         ]
         self.unpack_userparams(
             req_param_names=req_params, opt_param_names=opt_param)
 
         if "AccessPoint" in self.user_params:
-            self.legacy_configure_ap_and_start()
+            self.legacy_configure_ap_and_start(wpa_network=True, wep_network=True)
 
         asserts.assert_true(
             len(self.reference_networks) > 0,
@@ -69,7 +70,8 @@
             self.iperf_server = self.iperf_servers[0]
         self.wpapsk_2g = self.reference_networks[0]["2g"]
         self.wpapsk_5g = self.reference_networks[0]["5g"]
-        self.open_network = self.open_network[0]["2g"]
+        self.open_network_2g = self.open_network[0]["2g"]
+        self.open_network_5g = self.open_network[0]["5g"]
         if hasattr(self, 'iperf_server'):
             self.iperf_server.start()
 
@@ -526,9 +528,12 @@
     @test_tracker_info(uuid="71556e06-7fb1-4e2b-9338-b01f1f8e286e")
     def test_scan(self):
         """Test wifi connection scan can start and find expected networks."""
-        ssid = self.open_network[WifiEnums.SSID_KEY]
+        ssid = self.open_network_2g[WifiEnums.SSID_KEY]
         wutils.start_wifi_connection_scan_and_ensure_network_found(
-            self.dut, ssid);
+            self.dut, ssid)
+        ssid = self.open_network_5g[WifiEnums.SSID_KEY]
+        wutils.start_wifi_connection_scan_and_ensure_network_found(
+            self.dut, ssid)
 
     @test_tracker_info(uuid="3ea09efb-6921-429e-afb1-705ef5a09afa")
     def test_scan_with_wifi_off_and_location_scan_on(self):
@@ -537,9 +542,12 @@
         wutils.wifi_toggle_state(self.dut, False)
 
         """Test wifi connection scan can start and find expected networks."""
-        ssid = self.open_network[WifiEnums.SSID_KEY]
+        ssid = self.open_network_2g[WifiEnums.SSID_KEY]
         wutils.start_wifi_connection_scan_and_ensure_network_found(
-            self.dut, ssid);
+            self.dut, ssid)
+        ssid = self.open_network_5g[WifiEnums.SSID_KEY]
+        wutils.start_wifi_connection_scan_and_ensure_network_found(
+            self.dut, ssid)
 
     @test_tracker_info(uuid="770caebe-bcb1-43ac-95b6-5dd52dd90e80")
     def test_scan_with_wifi_off_and_location_scan_off(self):
@@ -559,8 +567,8 @@
     @test_tracker_info(uuid="a4ad9930-a8fa-4868-81ed-a79c7483e502")
     def test_add_network(self):
         """Test wifi connection scan."""
-        ssid = self.open_network[WifiEnums.SSID_KEY]
-        nId = self.dut.droid.wifiAddNetwork(self.open_network)
+        ssid = self.open_network_2g[WifiEnums.SSID_KEY]
+        nId = self.dut.droid.wifiAddNetwork(self.open_network_2g)
         asserts.assert_true(nId > -1, "Failed to add network.")
         configured_networks = self.dut.droid.wifiGetConfiguredNetworks()
         self.log.debug(
@@ -571,8 +579,8 @@
 
     @test_tracker_info(uuid="aca85551-10ba-4007-90d9-08bcdeb16a60")
     def test_forget_network(self):
-        ssid = self.open_network[WifiEnums.SSID_KEY]
-        nId = self.dut.droid.wifiAddNetwork(self.open_network)
+        ssid = self.open_network_2g[WifiEnums.SSID_KEY]
+        nId = self.dut.droid.wifiAddNetwork(self.open_network_2g)
         asserts.assert_true(nId > -1, "Failed to add network.")
         configured_networks = self.dut.droid.wifiGetConfiguredNetworks()
         self.log.debug(
@@ -837,5 +845,45 @@
 
         Connect to a wifi network, then the same as test_energy_info.
         """
-        wutils.wifi_connect(self.dut, self.open_network)
+        wutils.wifi_connect(self.dut, self.open_network_2g)
         self.get_energy_info()
+
+    @test_tracker_info(uuid="2622c253-defc-4a35-93a6-ca9d29a8238c")
+    def test_connect_to_wep_2g(self):
+        """Verify DUT can connect to 2GHz WEP network
+
+        Steps:
+        1. Ensure the 2GHz WEP network is visible in scan result.
+        2. Connect to the network and validate internet connection.
+        """
+        wutils.connect_to_wifi_network(self.dut, self.wep_networks[0]["2g"])
+
+    @test_tracker_info(uuid="1f2d17a2-e92d-43af-966b-3421c0db8620")
+    def test_connect_to_wep_5g(self):
+        """Verify DUT can connect to 5GHz WEP network
+
+        Steps:
+        1. Ensure the 5GHz WEP network is visible in scan result.
+        2. Connect to the network and validate internet connection.
+        """
+        wutils.connect_to_wifi_network(self.dut, self.wep_networks[0]["5g"])
+
+    @test_tracker_info(uuid="4a957952-289d-4657-9882-e1475274a7ff")
+    def test_connect_to_wpa_2g(self):
+        """Verify DUT can connect to 2GHz WPA-PSK network
+
+        Steps:
+        1. Ensure the 2GHz WPA-PSK network is visible in scan result.
+        2. Connect to the network and validate internet connection.
+        """
+        wutils.connect_to_wifi_network(self.dut, self.wpa_networks[0]["2g"])
+
+    @test_tracker_info(uuid="612c3c31-a4c5-4014-9a2d-3f4bcc20c0d7")
+    def test_connect_to_wpa_5g(self):
+        """Verify DUT can connect to 5GHz WPA-PSK network
+
+        Steps:
+        1. Ensure the 5GHz WPA-PSK network is visible in scan result.
+        2. Connect to the network and validate internet connection.
+        """
+        wutils.connect_to_wifi_network(self.dut, self.wpa_networks[0]["5g"])