diff --git a/acts_tests/acts_contrib/test_utils/wifi/WifiBaseTest.py b/acts_tests/acts_contrib/test_utils/wifi/WifiBaseTest.py
index 5ad7237..a56e794 100644
--- a/acts_tests/acts_contrib/test_utils/wifi/WifiBaseTest.py
+++ b/acts_tests/acts_contrib/test_utils/wifi/WifiBaseTest.py
@@ -45,7 +45,6 @@
 
 
 class WifiBaseTest(BaseTestClass):
-
     def __init__(self, configs):
         super().__init__(configs)
         self.enable_packet_log = False
@@ -71,32 +70,35 @@
             self.packet_logger.configure_monitor_mode("5G", self.packet_log_5g)
 
     def setup_test(self):
-        if (hasattr(self, "android_devices") and
-                hasattr(self, "cnss_diag_file") and
-                hasattr(self, "pixel_models")):
-            wutils.start_cnss_diags(
-                self.android_devices, self.cnss_diag_file, self.pixel_models)
+        if (hasattr(self, "android_devices")
+                and hasattr(self, "cnss_diag_file")
+                and hasattr(self, "pixel_models")):
+            wutils.start_cnss_diags(self.android_devices, self.cnss_diag_file,
+                                    self.pixel_models)
         self.tcpdump_proc = []
         if hasattr(self, "android_devices"):
             for ad in self.android_devices:
                 proc = nutils.start_tcpdump(ad, self.test_name)
                 self.tcpdump_proc.append((ad, proc))
         if hasattr(self, "packet_logger"):
-            self.packet_log_pid = wutils.start_pcap(
-                    self.packet_logger, 'dual', self.test_name)
+            self.packet_log_pid = wutils.start_pcap(self.packet_logger, 'dual',
+                                                    self.test_name)
 
     def teardown_test(self):
-        if (hasattr(self, "android_devices") and
-                hasattr(self, "cnss_diag_file") and
-                hasattr(self, "pixel_models")):
+        if (hasattr(self, "android_devices")
+                and hasattr(self, "cnss_diag_file")
+                and hasattr(self, "pixel_models")):
             wutils.stop_cnss_diags(self.android_devices, self.pixel_models)
-        for proc in self.tcpdump_proc:
-            nutils.stop_tcpdump(
-                    proc[0], proc[1], self.test_name, pull_dump=False)
-        self.tcpdump_proc = []
+            for proc in self.tcpdump_proc:
+                nutils.stop_tcpdump(proc[0],
+                                    proc[1],
+                                    self.test_name,
+                                    pull_dump=False)
+            self.tcpdump_proc = []
         if hasattr(self, "packet_logger") and self.packet_log_pid:
-            wutils.stop_pcap(
-                    self.packet_logger, self.packet_log_pid, test_status=True)
+            wutils.stop_pcap(self.packet_logger,
+                             self.packet_log_pid,
+                             test_status=True)
             self.packet_log_pid = {}
 
     def on_fail(self, test_name, begin_time):
@@ -105,17 +107,18 @@
                 ad.take_bug_report(test_name, begin_time)
                 ad.cat_adb_log(test_name, begin_time)
                 wutils.get_ssrdumps(ad)
-            if (hasattr(self, "cnss_diag_file") and
-                    hasattr(self, "pixel_models")):
+            if (hasattr(self, "cnss_diag_file")
+                    and hasattr(self, "pixel_models")):
                 wutils.stop_cnss_diags(self.android_devices, self.pixel_models)
                 for ad in self.android_devices:
                     wutils.get_cnss_diag_log(ad)
-        for proc in self.tcpdump_proc:
-            nutils.stop_tcpdump(proc[0], proc[1], self.test_name)
-        self.tcpdump_proc = []
+            for proc in self.tcpdump_proc:
+                nutils.stop_tcpdump(proc[0], proc[1], self.test_name)
+            self.tcpdump_proc = []
         if hasattr(self, "packet_logger") and self.packet_log_pid:
-            wutils.stop_pcap(
-                    self.packet_logger, self.packet_log_pid, test_status=False)
+            wutils.stop_pcap(self.packet_logger,
+                             self.packet_log_pid,
+                             test_status=False)
             self.packet_log_pid = {}
 
     def get_psk_network(
@@ -361,13 +364,13 @@
             if 'channel' in network:
                 continue
             self.update_bssid(ap_instance, ap, network,
-                hostapd_constants.BAND_5G)
+                              hostapd_constants.BAND_5G)
 
         for network in networks_2g:
             if 'channel' in network:
                 continue
             self.update_bssid(ap_instance, ap, network,
-                hostapd_constants.BAND_2G)
+                              hostapd_constants.BAND_2G)
 
     def configure_openwrt_ap_and_start(
             self,
@@ -414,7 +417,7 @@
             ap_count: APs to configure.
         """
         if mirror_ap and ap_count == 1:
-             raise ValueError("ap_count cannot be 1 if mirror_ap is True.")
+            raise ValueError("ap_count cannot be 1 if mirror_ap is True.")
 
         self.reference_networks = []
         self.wpa_networks = []
@@ -430,10 +433,8 @@
             if wpa_network:
                 wpa_dict = self.get_psk_network(mirror_ap,
                                                 self.reference_networks,
-                                                hidden,
-                                                same_ssid,
-                                                ssid_length_2g,
-                                                ssid_length_5g,
+                                                hidden, same_ssid,
+                                                ssid_length_2g, ssid_length_5g,
                                                 passphrase_length_2g,
                                                 passphrase_length_5g)
                 wpa_dict[hostapd_constants.BAND_2G]["security"] = "psk2"
@@ -441,18 +442,13 @@
                 self.wpa_networks.append(wpa_dict)
                 network_list.append(wpa_dict)
             if wep_network:
-                wep_dict = self.get_wep_network(mirror_ap,
-                                                self.wep_networks,
-                                                hidden,
-                                                same_ssid,
-                                                ssid_length_2g,
-                                                ssid_length_5g)
+                wep_dict = self.get_wep_network(mirror_ap, self.wep_networks,
+                                                hidden, same_ssid,
+                                                ssid_length_2g, ssid_length_5g)
                 network_list.append(wep_dict)
             if ent_network:
-                ent_dict = self.get_open_network(mirror_ap,
-                                                 self.ent_networks,
-                                                 hidden,
-                                                 same_ssid,
+                ent_dict = self.get_open_network(mirror_ap, self.ent_networks,
+                                                 hidden, same_ssid,
                                                  ssid_length_2g,
                                                  ssid_length_5g)
                 ent_dict["2g"]["security"] = "wpa2"
@@ -463,8 +459,7 @@
             if ent_network_pwd:
                 ent_pwd_dict = self.get_open_network(mirror_ap,
                                                      self.ent_networks_pwd,
-                                                     hidden,
-                                                     same_ssid,
+                                                     hidden, same_ssid,
                                                      ssid_length_2g,
                                                      ssid_length_5g)
                 ent_pwd_dict["2g"]["security"] = "wpa2"
@@ -473,50 +468,38 @@
                 ent_pwd_dict["5g"].update(radius_conf_pwd)
                 network_list.append(ent_pwd_dict)
             if open_network:
-                open_dict = self.get_open_network(mirror_ap,
-                                                  self.open_network,
-                                                  hidden,
-                                                  same_ssid,
+                open_dict = self.get_open_network(mirror_ap, self.open_network,
+                                                  hidden, same_ssid,
                                                   ssid_length_2g,
                                                   ssid_length_5g)
                 network_list.append(open_dict)
             if owe_network:
-                owe_dict = self.get_open_network(mirror_ap,
-                                                 self.owe_networks,
-                                                 hidden,
-                                                 same_ssid,
+                owe_dict = self.get_open_network(mirror_ap, self.owe_networks,
+                                                 hidden, same_ssid,
                                                  ssid_length_2g,
-                                                 ssid_length_5g,
-                                                 "OWE")
+                                                 ssid_length_5g, "OWE")
                 owe_dict[hostapd_constants.BAND_2G]["security"] = "owe"
                 owe_dict[hostapd_constants.BAND_5G]["security"] = "owe"
                 network_list.append(owe_dict)
             if sae_network:
-                sae_dict = self.get_psk_network(mirror_ap,
-                                                self.sae_networks,
-                                                hidden,
-                                                same_ssid,
-                                                hostapd_constants.WPA3_KEY_MGMT,
-                                                ssid_length_2g,
-                                                ssid_length_5g,
-                                                passphrase_length_2g,
-                                                passphrase_length_5g)
+                sae_dict = self.get_psk_network(
+                    mirror_ap, self.sae_networks, hidden, same_ssid,
+                    hostapd_constants.WPA3_KEY_MGMT, ssid_length_2g,
+                    ssid_length_5g, passphrase_length_2g, passphrase_length_5g)
                 sae_dict[hostapd_constants.BAND_2G]["security"] = "sae"
                 sae_dict[hostapd_constants.BAND_5G]["security"] = "sae"
                 network_list.append(sae_dict)
-            self.access_points[i].configure_ap(network_list,
-                                               channel_2g,
+            self.access_points[i].configure_ap(network_list, channel_2g,
                                                channel_5g)
             self.access_points[i].start_ap()
             self.bssid_map.append(
                 self.access_points[i].get_bssids_for_wifi_networks())
             if mirror_ap:
-                self.access_points[i+1].configure_ap(network_list,
-                                                     channel_2g,
-                                                     channel_5g)
-                self.access_points[i+1].start_ap()
+                self.access_points[i + 1].configure_ap(network_list,
+                                                       channel_2g, channel_5g)
+                self.access_points[i + 1].start_ap()
                 self.bssid_map.append(
-                    self.access_points[i+1].get_bssids_for_wifi_networks())
+                    self.access_points[i + 1].get_bssids_for_wifi_networks())
                 break
 
     def legacy_configure_ap_and_start(
@@ -547,7 +530,7 @@
         # For example, the NetworkSelector tests use 2 APs and require that
         # both APs are not mirrored.
         if not mirror_ap and ap_count == 1:
-             raise ValueError("ap_count cannot be 1 if mirror_ap is False.")
+            raise ValueError("ap_count cannot be 1 if mirror_ap is False.")
 
         if not mirror_ap:
             config_count = ap_count
@@ -580,10 +563,10 @@
             network_list_5g.append({"channel": channel_5g})
 
             networks_dict = self.get_psk_network(
-                                mirror_ap,
-                                self.user_params["reference_networks"],
-                                hidden=hidden,
-                                same_ssid=same_ssid)
+                mirror_ap,
+                self.user_params["reference_networks"],
+                hidden=hidden,
+                same_ssid=same_ssid)
             self.reference_networks = self.user_params["reference_networks"]
 
             network_list_2g.append(networks_dict["2g"])
@@ -596,10 +579,10 @@
             # instead of defaulting to WPA.
             if not same_ssid:
                 networks_dict = self.get_open_network(
-                                    mirror_ap,
-                                    self.user_params["open_network"],
-                                    hidden=hidden,
-                                    same_ssid=same_ssid)
+                    mirror_ap,
+                    self.user_params["open_network"],
+                    hidden=hidden,
+                    same_ssid=same_ssid)
                 self.open_network = self.user_params["open_network"]
 
                 network_list_2g.append(networks_dict["2g"])
@@ -607,11 +590,11 @@
 
                 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)
+                        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"])
@@ -619,10 +602,10 @@
 
                 if wep_network:
                     networks_dict = self.get_wep_network(
-                                        mirror_ap,
-                                        self.user_params["wep_networks"],
-                                        hidden=hidden,
-                                        same_ssid=same_ssid)
+                        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"])
@@ -630,13 +613,15 @@
 
                 if ent_network:
                     networks_dict = self.get_open_network(
-                                        mirror_ap,
-                                        self.user_params["ent_networks"],
-                                        hidden=hidden,
-                                        same_ssid=same_ssid)
-                    networks_dict["2g"]["security"] = hostapd_constants.ENT_STRING
+                        mirror_ap,
+                        self.user_params["ent_networks"],
+                        hidden=hidden,
+                        same_ssid=same_ssid)
+                    networks_dict["2g"][
+                        "security"] = hostapd_constants.ENT_STRING
                     networks_dict["2g"].update(radius_conf_2g)
-                    networks_dict["5g"]["security"] = hostapd_constants.ENT_STRING
+                    networks_dict["5g"][
+                        "security"] = hostapd_constants.ENT_STRING
                     networks_dict["5g"].update(radius_conf_5g)
                     self.ent_networks = self.user_params["ent_networks"]
 
@@ -645,15 +630,18 @@
 
                 if ent_network_pwd:
                     networks_dict = self.get_open_network(
-                                        mirror_ap,
-                                        self.user_params["ent_networks_pwd"],
-                                        hidden=hidden,
-                                        same_ssid=same_ssid)
-                    networks_dict["2g"]["security"] = hostapd_constants.ENT_STRING
+                        mirror_ap,
+                        self.user_params["ent_networks_pwd"],
+                        hidden=hidden,
+                        same_ssid=same_ssid)
+                    networks_dict["2g"][
+                        "security"] = hostapd_constants.ENT_STRING
                     networks_dict["2g"].update(radius_conf_pwd)
-                    networks_dict["5g"]["security"] = hostapd_constants.ENT_STRING
+                    networks_dict["5g"][
+                        "security"] = hostapd_constants.ENT_STRING
                     networks_dict["5g"].update(radius_conf_pwd)
-                    self.ent_networks_pwd = self.user_params["ent_networks_pwd"]
+                    self.ent_networks_pwd = self.user_params[
+                        "ent_networks_pwd"]
 
                     network_list_2g.append(networks_dict["2g"])
                     network_list_5g.append(networks_dict["5g"])
@@ -662,21 +650,23 @@
             orig_network_list_2g = copy.copy(network_list_2g)
 
             if len(network_list_5g) > 1:
-                self.config_5g = self._generate_legacy_ap_config(network_list_5g)
+                self.config_5g = self._generate_legacy_ap_config(
+                    network_list_5g)
             if len(network_list_2g) > 1:
-                self.config_2g = self._generate_legacy_ap_config(network_list_2g)
+                self.config_2g = self._generate_legacy_ap_config(
+                    network_list_2g)
 
             self.access_points[count].start_ap(self.config_2g)
             self.access_points[count].start_ap(self.config_5g)
-            self.populate_bssid(count, self.access_points[count], orig_network_list_5g,
-                                orig_network_list_2g)
+            self.populate_bssid(count, self.access_points[count],
+                                orig_network_list_5g, orig_network_list_2g)
 
         # Repeat configuration on the second router.
         if mirror_ap and ap_count == 2:
             self.access_points[AP_2].start_ap(self.config_2g)
             self.access_points[AP_2].start_ap(self.config_5g)
             self.populate_bssid(AP_2, self.access_points[AP_2],
-                orig_network_list_5g, orig_network_list_2g)
+                                orig_network_list_5g, orig_network_list_2g)
 
     def _kill_processes(self, ap, daemon):
         """ Kill hostapd and dhcpd daemons
@@ -726,7 +716,7 @@
         self.log.debug("Cleanup AP")
         if not self._kill_processes(ap, 'hostapd') or \
             not self._kill_processes(ap, 'dhcpd'):
-              raise("Failed to cleanup AP")
+            raise ("Failed to cleanup AP")
 
         ap.__init__(self.user_params['AccessPoint'][count])
 
@@ -769,7 +759,8 @@
                             security_mode=network["security"],
                             radius_server_ip=network["radius_server_ip"],
                             radius_server_port=network["radius_server_port"],
-                            radius_server_secret=network["radius_server_secret"])))
+                            radius_server_secret=network[
+                                "radius_server_secret"])))
             else:
                 bss_settings.append(
                     hostapd_bss_settings.BssSettings(
@@ -842,7 +833,8 @@
             for i in range(tries + 1):
                 result = True
                 if i > 0:
-                    log_string = "[Test Case] RETRY:%s %s" % (i, self.test_name)
+                    log_string = "[Test Case] RETRY:%s %s" % (i,
+                                                              self.test_name)
                     self.log.info(log_string)
                     self._teardown_test(self.test_name)
                     self._setup_test(self.test_name)
@@ -870,4 +862,4 @@
             else:
                 asserts.fail(self.result_detail)
 
-        return _safe_wrap_test_case
\ No newline at end of file
+        return _safe_wrap_test_case
diff --git a/acts_tests/tests/google/wifi/WifiEnterpriseTest.py b/acts_tests/tests/google/wifi/WifiEnterpriseTest.py
index 0c4cf02..015cf16 100644
--- a/acts_tests/tests/google/wifi/WifiEnterpriseTest.py
+++ b/acts_tests/tests/google/wifi/WifiEnterpriseTest.py
@@ -34,13 +34,9 @@
 
 
 class WifiEnterpriseTest(WifiBaseTest):
-
-    def __init__(self, configs):
-        super().__init__(configs)
-        self.enable_packet_log = True
-
     def setup_class(self):
         super().setup_class()
+        self.enable_packet_log = True
 
         self.dut = self.android_devices[0]
         wutils.wifi_test_device_init(self.dut)
@@ -67,14 +63,16 @@
                 radius_conf_2g=self.radius_conf_2g,
                 radius_conf_5g=self.radius_conf_5g,
                 ent_network_pwd=True,
-                radius_conf_pwd=self.radius_conf_pwd,)
+                radius_conf_pwd=self.radius_conf_pwd,
+            )
         elif "OpenWrtAP" in self.user_params:
             self.configure_openwrt_ap_and_start(
                 ent_network=True,
                 radius_conf_2g=self.radius_conf_2g,
                 radius_conf_5g=self.radius_conf_5g,
                 ent_network_pwd=True,
-                radius_conf_pwd=self.radius_conf_pwd,)
+                radius_conf_pwd=self.radius_conf_pwd,
+            )
         self.ent_network_2g = self.ent_networks[0]["2g"]
         self.ent_network_5g = self.ent_networks[0]["5g"]
         self.ent_network_pwd = self.ent_networks_pwd[0]["2g"]
@@ -207,8 +205,9 @@
             field.
         """
         negative_config = dict(config)
-        if negative_config in [self.config_sim, self.config_aka,
-                               self.config_aka_prime]:
+        if negative_config in [
+                self.config_sim, self.config_aka, self.config_aka_prime
+        ]:
             negative_config[WifiEnums.SSID_KEY] = 'wrong_hostapd_ssid'
         for k, v in neg_params.items():
             # Skip negative test for TLS's identity field since it's not
@@ -266,9 +265,7 @@
         }
         return self.gen_negative_configs(config, neg_params)
 
-    def eap_connect_toggle_wifi(self,
-                                config,
-                                *args):
+    def eap_connect_toggle_wifi(self, config, *args):
         """Connects to an enterprise network, toggles wifi state and ensures
         that the device reconnects.
 
@@ -283,7 +280,9 @@
         """
         ad = args[0]
         wutils.wifi_connect(ad, config)
-        wutils.toggle_wifi_and_wait_for_reconnection(ad, config, num_of_tries=5)
+        wutils.toggle_wifi_and_wait_for_reconnection(ad,
+                                                     config,
+                                                     num_of_tries=5)
 
     """ Tests """
 
@@ -305,6 +304,7 @@
             Successful connection and Internet access through the enterprise
             networks.
     """
+
     @test_tracker_info(uuid="4e720cac-ea17-4de7-a540-8dc7c49f9713")
     def test_eap_connect_with_config_tls(self):
         wutils.wifi_connect(self.dut, self.config_tls)
@@ -346,7 +346,8 @@
     @test_tracker_info(uuid="fdb286c7-8069-481d-baf0-c5dd7a31ff03")
     def test_eap_connect_with_config_ttls_mschapv2(self):
         config = dict(self.config_ttls)
-        config[WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value
+        config[
+            WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value
         wutils.wifi_connect(self.dut, config)
 
     @test_tracker_info(uuid="d9315962-7987-4ee7-905d-6972c78ce8a1")
@@ -358,7 +359,8 @@
     @test_tracker_info(uuid="90a67bd3-30da-4daf-8ab0-d964d7ad19be")
     def test_eap_connect_with_config_peap0_mschapv2(self):
         config = dict(self.config_peap0)
-        config[WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value
+        config[
+            WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value
         wutils.wifi_connect(self.dut, config)
 
     @test_tracker_info(uuid="3c451ba4-0c83-4eef-bc95-db4c21893008")
@@ -370,7 +372,8 @@
     @test_tracker_info(uuid="6b45157d-0325-417a-af18-11af5d240d79")
     def test_eap_connect_with_config_peap1_mschapv2(self):
         config = dict(self.config_peap1)
-        config[WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value
+        config[
+            WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value
         wutils.wifi_connect(self.dut, config)
 
     @test_tracker_info(uuid="1663decc-71ae-4f95-a027-8a6dbf9c337f")
@@ -389,6 +392,7 @@
         Expect:
             Fail to establish connection.
     """
+
     @test_tracker_info(uuid="b2a91f1f-ccd7-4bd1-ab81-19aab3d8ee38")
     def test_eap_connect_negative_with_config_tls(self):
         config = self.gen_negative_eap_configs(self.config_tls)
@@ -438,7 +442,8 @@
     @test_tracker_info(uuid="625e7aa5-e3e6-4bbe-98c0-5aad8ca1555b")
     def test_eap_connect_negative_with_config_ttls_mschapv2(self):
         config = dict(self.config_ttls)
-        config[WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value
+        config[
+            WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value
         config = self.gen_negative_eap_configs(config)
         self.eap_negative_connect_logic(config, self.dut)
 
@@ -452,7 +457,8 @@
     @test_tracker_info(uuid="b7c1f0f8-6338-4501-8e1d-c9b136aaba88")
     def test_eap_connect_negative_with_config_peap0_mschapv2(self):
         config = dict(self.config_peap0)
-        config[WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value
+        config[
+            WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value
         config = self.gen_negative_eap_configs(config)
         self.eap_negative_connect_logic(config, self.dut)
 
@@ -466,7 +472,8 @@
     @test_tracker_info(uuid="89bb2b6b-d073-402a-bdc1-68ac5f8752a3")
     def test_eap_connect_negative_with_config_peap1_mschapv2(self):
         config = dict(self.config_peap1)
-        config[WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value
+        config[
+            WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value
         config = self.gen_negative_eap_configs(config)
         self.eap_negative_connect_logic(config, self.dut)
 
@@ -497,6 +504,7 @@
             Successful connection and Internet access through the enterprise
             networks.
     """
+
     @test_tracker_info(uuid="2a933b7f-27d7-4201-a34f-25b9d8072a8c")
     def test_eap_connect_config_store_with_config_tls(self):
         self.eap_connect_toggle_wifi(self.config_tls, self.dut)
@@ -538,7 +546,8 @@
     @test_tracker_info(uuid="f0243684-fae0-46f3-afbd-bf525fc712e2")
     def test_eap_connect_config_store_with_config_ttls_mschapv2(self):
         config = dict(self.config_ttls)
-        config[WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value
+        config[
+            WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value
         self.eap_connect_toggle_wifi(config, self.dut)
 
     @test_tracker_info(uuid="49ec7202-3b00-49c3-970a-201360888c74")
@@ -550,7 +559,8 @@
     @test_tracker_info(uuid="1c6abfa3-f344-4e28-b891-5481ab79efcf")
     def test_eap_connect_config_store_with_config_peap0_mschapv2(self):
         config = dict(self.config_peap0)
-        config[WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value
+        config[
+            WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value
         self.eap_connect_toggle_wifi(config, self.dut)
 
     @test_tracker_info(uuid="2815bc76-49fa-43a5-a4b6-84788f9809d5")
@@ -562,7 +572,8 @@
     @test_tracker_info(uuid="e93f7472-6895-4e36-bff2-9b2dcfd07ad0")
     def test_eap_connect_config_store_with_config_peap1_mschapv2(self):
         config = dict(self.config_peap1)
-        config[WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value
+        config[
+            WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value
         self.eap_connect_toggle_wifi(config, self.dut)
 
     @test_tracker_info(uuid="6da72fa0-b858-4475-9559-46fe052d0d64")
@@ -591,6 +602,7 @@
             Successful connection and Internet access through the enterprise
             networks with passpoint support.
     """
+
     @test_tracker_info(uuid="0b942524-bde9-4fc6-ac6a-fef1c247cb8e")
     def passpoint_connect_with_config_passpoint_tls(self):
         asserts.skip_if(not self.dut.droid.wifiIsPasspointSupported(),
@@ -626,7 +638,8 @@
         asserts.skip_if(not self.dut.droid.wifiIsPasspointSupported(),
                         "Passpoint is not supported on %s" % self.dut.model)
         config = dict(self.config_passpoint_ttls)
-        config[WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value
+        config[
+            WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value
         wutils.wifi_connect(self.dut, config)
 
     @test_tracker_info(uuid="357e5162-5081-4149-bedd-ef2c0f88b97e")
@@ -647,6 +660,7 @@
         Expect:
             Fail to establish connection.
     """
+
     @test_tracker_info(uuid="7b6b44a0-ff70-49b4-94ca-a98bedc18f92")
     def passpoint_connect_negative_with_config_passpoint_tls(self):
         asserts.skip_if(not self.dut.droid.wifiIsPasspointSupported(),
@@ -686,7 +700,8 @@
         asserts.skip_if(not self.dut.droid.wifiIsPasspointSupported(),
                         "Passpoint is not supported on %s" % self.dut.model)
         config = dict(self.config_passpoint_ttls)
-        config[WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value
+        config[
+            WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value
         config = self.gen_negative_passpoint_configs(config)
         self.eap_negative_connect_logic(config, self.dut)
 
@@ -718,6 +733,7 @@
             Successful connection and Internet access through the enterprise
             networks with passpoint support.
     """
+
     @test_tracker_info(uuid="5d5e6bb0-faea-4a6e-a6bc-c87de997a4fd")
     def passpoint_connect_config_store_with_config_passpoint_tls(self):
         asserts.skip_if(not self.dut.droid.wifiIsPasspointSupported(),
@@ -749,11 +765,13 @@
         self.eap_connect_toggle_wifi(config, self.dut)
 
     @test_tracker_info(uuid="2abd348c-9c66-456b-88ad-55f971717620")
-    def passpoint_connect_config_store_with_config_passpoint_ttls_mschapv2(self):
+    def passpoint_connect_config_store_with_config_passpoint_ttls_mschapv2(
+            self):
         asserts.skip_if(not self.dut.droid.wifiIsPasspointSupported(),
                         "Passpoint is not supported on %s" % self.dut.model)
         config = dict(self.config_passpoint_ttls)
-        config[WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value
+        config[
+            WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.MSCHAPV2.value
         self.eap_connect_toggle_wifi(config, self.dut)
 
     @test_tracker_info(uuid="043e8cdd-db95-4f03-b308-3c8cecf874b1")
@@ -762,4 +780,4 @@
                         "Passpoint is not supported on %s" % self.dut.model)
         config = dict(self.config_passpoint_ttls)
         config[WifiEnums.Enterprise.PHASE2] = WifiEnums.EapPhase2.GTC.value
-        self.eap_connect_toggle_wifi(config, self.dut)
\ No newline at end of file
+        self.eap_connect_toggle_wifi(config, self.dut)
