Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,19 @@ class ConnectivityPlusLinuxPlugin extends ConnectivityPlatform {
/// Checks the connection status of the device.
@override
Future<List<ConnectivityResult>> checkConnectivity() async {
final client = createClient();
await client.connect();
final connectivity = _getConnectivity(client);
await client.close();
return connectivity;
try {
final client = createClient();
await client.connect();
final connectivity = _getConnectivity(client);
await client.close();
return connectivity;
} catch (e) {
// NetworkManager may not be installed or running on this Linux system.
// Rather than crashing, we gracefully degrade by treating this as
// no connectivity. This ensures the plugin works on all Linux distributions
// regardless of their network management infrastructure.
return [ConnectivityResult.none];
}
}

NetworkManagerClient? _client;
Expand Down Expand Up @@ -69,14 +77,21 @@ class ConnectivityPlusLinuxPlugin extends ConnectivityPlatform {
}

Future<void> _startListenConnectivity() async {
_client ??= createClient();
await _client!.connect();
_addConnectivity(_client!);
_client!.propertiesChanged.listen((properties) {
if (properties.contains('Connectivity')) {
_addConnectivity(_client!);
}
});
try {
_client ??= createClient();
await _client!.connect();
_addConnectivity(_client!);
_client!.propertiesChanged.listen((properties) {
if (properties.contains('Connectivity')) {
_addConnectivity(_client!);
}
});
} catch (e) {
// NetworkManager may not be installed or running on this Linux system.
// We emit ConnectivityResult.none to the stream to indicate no connectivity
// can be determined, rather than crashing the application.
_controller?.add([ConnectivityResult.none]);
}
}

void _addConnectivity(NetworkManagerClient client) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@ void main() {
final linux = ConnectivityPlusLinuxPlugin();
linux.createClient = () {
final client = MockNetworkManagerClient();
when(client.connectivity)
.thenReturn(NetworkManagerConnectivityState.full);
when(
client.connectivity,
).thenReturn(NetworkManagerConnectivityState.full);
when(client.primaryConnectionType).thenReturn('bluetooth');
return client;
};
Expand All @@ -33,8 +34,9 @@ void main() {
final linux = ConnectivityPlusLinuxPlugin();
linux.createClient = () {
final client = MockNetworkManagerClient();
when(client.connectivity)
.thenReturn(NetworkManagerConnectivityState.full);
when(
client.connectivity,
).thenReturn(NetworkManagerConnectivityState.full);
when(client.primaryConnectionType).thenReturn('ethernet');
return client;
};
Expand All @@ -48,8 +50,9 @@ void main() {
final linux = ConnectivityPlusLinuxPlugin();
linux.createClient = () {
final client = MockNetworkManagerClient();
when(client.connectivity)
.thenReturn(NetworkManagerConnectivityState.full);
when(
client.connectivity,
).thenReturn(NetworkManagerConnectivityState.full);
when(client.primaryConnectionType).thenReturn('wireless');
return client;
};
Expand All @@ -63,8 +66,9 @@ void main() {
final linux = ConnectivityPlusLinuxPlugin();
linux.createClient = () {
final client = MockNetworkManagerClient();
when(client.connectivity)
.thenReturn(NetworkManagerConnectivityState.full);
when(
client.connectivity,
).thenReturn(NetworkManagerConnectivityState.full);
when(client.primaryConnectionType).thenReturn('vpn');
return client;
};
Expand All @@ -78,8 +82,9 @@ void main() {
final linux = ConnectivityPlusLinuxPlugin();
linux.createClient = () {
final client = MockNetworkManagerClient();
when(client.connectivity)
.thenReturn(NetworkManagerConnectivityState.full);
when(
client.connectivity,
).thenReturn(NetworkManagerConnectivityState.full);
when(client.primaryConnectionType).thenReturn('wireless,vpn');
return client;
};
Expand All @@ -93,33 +98,66 @@ void main() {
final linux = ConnectivityPlusLinuxPlugin();
linux.createClient = () {
final client = MockNetworkManagerClient();
when(client.connectivity)
.thenReturn(NetworkManagerConnectivityState.none);
when(
client.connectivity,
).thenReturn(NetworkManagerConnectivityState.none);
return client;
};
expect(linux.checkConnectivity(),
completion(equals([ConnectivityResult.none])));
expect(
linux.checkConnectivity(),
completion(equals([ConnectivityResult.none])),
);
});

test('connectivity changes', () {
final linux = ConnectivityPlusLinuxPlugin();
linux.createClient = () {
final client = MockNetworkManagerClient();
when(client.connectivity)
.thenReturn(NetworkManagerConnectivityState.full);
when(
client.connectivity,
).thenReturn(NetworkManagerConnectivityState.full);
when(client.primaryConnectionType).thenReturn('wireless');
when(client.propertiesChanged).thenAnswer((_) {
when(client.connectivity)
.thenReturn(NetworkManagerConnectivityState.none);
when(
client.connectivity,
).thenReturn(NetworkManagerConnectivityState.none);
return Stream.value(['Connectivity']);
});
return client;
};
expect(
linux.onConnectivityChanged,
emitsInOrder([
[ConnectivityResult.wifi],
[ConnectivityResult.none]
]));
linux.onConnectivityChanged,
emitsInOrder([
[ConnectivityResult.wifi],
[ConnectivityResult.none],
]),
);
});

test('NetworkManager unavailable - checkConnectivity', () async {
final linux = ConnectivityPlusLinuxPlugin();
linux.createClient = () {
final client = MockNetworkManagerClient();
when(
client.connect(),
).thenThrow(Exception('NetworkManager not available'));
return client;
};
expect(
linux.checkConnectivity(),
completion(equals([ConnectivityResult.none])),
);
});

test('NetworkManager unavailable - onConnectivityChanged', () {
final linux = ConnectivityPlusLinuxPlugin();
linux.createClient = () {
final client = MockNetworkManagerClient();
when(
client.connect(),
).thenThrow(Exception('NetworkManager not available'));
return client;
};
expect(linux.onConnectivityChanged, emits([ConnectivityResult.none]));
});
}
Loading