mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-08-21 08:14:00 +08:00
teste
This commit is contained in:
@@ -16,6 +16,9 @@ def _make_wm(mocker: MockerFixture, connections=None):
|
||||
mocker.patch.object(WifiManager, '_initialize')
|
||||
wm = WifiManager.__new__(WifiManager)
|
||||
wm._exit = True # prevent stop() from doing anything in __del__
|
||||
wm._backend_unavailable = False
|
||||
wm._fake_networking = False
|
||||
wm._nmcli_networking = False
|
||||
wm._conn_monitor = mocker.MagicMock()
|
||||
wm._connections = dict(connections or {})
|
||||
wm._wifi_state = WifiState()
|
||||
@@ -877,7 +880,6 @@ class TestWorkerErrorRecovery:
|
||||
mock_init.assert_called_once()
|
||||
assert wm._wifi_state.ssid == "A"
|
||||
assert wm._wifi_state.status == ConnectStatus.CONNECTED
|
||||
|
||||
def test_connect_to_network_dbus_error_resyncs(self, mocker):
|
||||
"""AddAndActivateConnection2 returns DBus error while A is connected."""
|
||||
wm = _make_wm(mocker, connections={"A": "/path/A"})
|
||||
@@ -904,3 +906,32 @@ class TestWorkerErrorRecovery:
|
||||
mock_init.assert_called_once()
|
||||
assert wm._wifi_state.ssid == "A"
|
||||
assert wm._wifi_state.status == ConnectStatus.CONNECTED
|
||||
|
||||
|
||||
class TestMonitorSocketRecovery:
|
||||
def test_state_monitor_recovers_dead_main_router(self, mocker):
|
||||
wm = _make_wm(mocker)
|
||||
wm._handle_state_change = mocker.MagicMock(side_effect=OSError(88, "Socket operation on non-socket"))
|
||||
wm._recover_main_dbus_connection = mocker.MagicMock(return_value=True)
|
||||
|
||||
wm._handle_state_change_safely(NMDeviceState.ACTIVATED, NMDeviceState.IP_CHECK, NMDeviceStateReason.NONE)
|
||||
|
||||
wm._recover_main_dbus_connection.assert_called_once_with()
|
||||
|
||||
def test_reconnect_replaces_router_and_resyncs_state(self, mocker):
|
||||
wm = _make_wm(mocker)
|
||||
old_router = mocker.MagicMock()
|
||||
new_router = mocker.MagicMock()
|
||||
wm._router_main = old_router
|
||||
wm._init_connections = mocker.MagicMock()
|
||||
wm._init_wifi_state = mocker.MagicMock()
|
||||
mocker.patch('openpilot.system.ui.lib.wifi_manager.open_dbus_connection_threading', return_value=mocker.MagicMock())
|
||||
mocker.patch('openpilot.system.ui.lib.wifi_manager.DBusRouter', return_value=new_router)
|
||||
|
||||
assert wm._recover_main_dbus_connection()
|
||||
|
||||
assert wm._router_main is new_router
|
||||
old_router.close.assert_called_once_with()
|
||||
old_router.conn.close.assert_called_once_with()
|
||||
wm._init_connections.assert_called_once_with()
|
||||
wm._init_wifi_state.assert_called_once_with()
|
||||
|
||||
@@ -465,7 +465,38 @@ class WifiManager:
|
||||
while len(state_q):
|
||||
new_state, previous_state, change_reason = state_q.popleft().body
|
||||
|
||||
self._handle_state_change(new_state, previous_state, change_reason)
|
||||
self._handle_state_change_safely(new_state, previous_state, change_reason)
|
||||
|
||||
def _handle_state_change_safely(self, new_state: int, previous_state: int, change_reason: int) -> None:
|
||||
try:
|
||||
self._handle_state_change(new_state, previous_state, change_reason)
|
||||
except OSError as exc:
|
||||
cloudlog.warning(f"Wi-Fi D-Bus socket failed; reconnecting: {exc}")
|
||||
self._recover_main_dbus_connection()
|
||||
|
||||
def _recover_main_dbus_connection(self) -> bool:
|
||||
try:
|
||||
router = DBusRouter(open_dbus_connection_threading(bus="SYSTEM"))
|
||||
_wrap_router(router)
|
||||
except Exception:
|
||||
cloudlog.exception("Failed to reconnect Wi-Fi D-Bus router")
|
||||
return False
|
||||
|
||||
old_router = self._router_main
|
||||
self._router_main = router
|
||||
if old_router is not None:
|
||||
try:
|
||||
old_router.close()
|
||||
old_router.conn.close()
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
try:
|
||||
self._init_connections()
|
||||
self._init_wifi_state()
|
||||
except Exception:
|
||||
cloudlog.exception("Failed to restore Wi-Fi state after D-Bus reconnect")
|
||||
return True
|
||||
|
||||
def _handle_state_change(self, new_state: int, prev_state: int, change_reason: int):
|
||||
# Thread safety: _wifi_state is read/written by both the monitor thread (this handler)
|
||||
|
||||
Reference in New Issue
Block a user