vorta/tests/network_manager/test_network_manager.py

163 lines
4.6 KiB
Python

from datetime import datetime
from unittest.mock import MagicMock
import pytest
from vorta.network_status.abc import SystemWifiInfo
from vorta.network_status.network_manager import (
ActiveConnectionInfo,
DBusException,
NetworkManagerDBusAdapter,
NetworkManagerMonitor,
NMMetered,
decode_ssid,
)
@pytest.fixture
def mock_adapter():
return MagicMock(spec_set=NetworkManagerDBusAdapter, wraps=UncallableNetworkManagerDBusAdapter())
@pytest.fixture
def nm_monitor(mock_adapter):
return NetworkManagerMonitor(nm_adapter=mock_adapter)
def test_is_network_status_available(nm_monitor):
assert nm_monitor.is_network_status_available() is True
@pytest.mark.parametrize(
'global_metered_status, expected',
[
(NMMetered.UNKNOWN, False),
(NMMetered.YES, True),
(NMMetered.NO, False),
(NMMetered.GUESS_YES, True),
(NMMetered.GUESS_NO, False),
],
)
def test_is_network_metered(global_metered_status, expected, nm_monitor):
nm_monitor._nm.get_global_metered_status.return_value = global_metered_status
result = nm_monitor.is_network_metered()
assert result == expected
@pytest.mark.parametrize(
'connection_path, connection_type, type_settings, expected',
[
(
'/org/freedesktop/NetworkManager/ActiveConnection/1',
'802-11-wireless',
{'ssid': bytes([84, 69, 83, 84])},
'TEST',
),
('/org/freedesktop/NetworkManager/ActiveConnection/2', '802-11-ethernet', {}, None),
],
)
def test_get_current_wifi(connection_path, connection_type, type_settings, expected, nm_monitor):
nm_monitor._nm.get_primary_connection_path.return_value = connection_path
nm_monitor._nm.get_active_connection_info.return_value = ActiveConnectionInfo(
connection='/org/freedesktop/NetworkManager/Settings/12', type=connection_type
)
nm_monitor._nm.get_settings.side_effect = [{connection_type: type_settings}]
result = nm_monitor.get_current_wifi()
assert result == expected
def test_get_current_wifi_with_no_connection(nm_monitor):
nm_monitor._nm.get_primary_connection_path.return_value = None
assert nm_monitor.get_current_wifi() is None
def test_get_known_wifis(nm_monitor):
nm_monitor._nm.get_connections_paths.return_value = ['/org/freedesktop/NetworkManager/Settings/12']
nm_monitor._nm.get_settings.return_value = {
'connection': {'timestamp': 1597303736},
'802-11-wireless': {'ssid': [84, 69, 83, 84]},
}
result = nm_monitor.get_known_wifis()
assert result == [
SystemWifiInfo(
ssid='TEST',
last_connected=datetime(2020, 8, 13, 7, 28, 56),
)
]
def test_get_known_wifis_with_never_used_connection(nm_monitor):
nm_monitor._nm.get_connections_paths.return_value = ['/org/freedesktop/NetworkManager/Settings/12']
nm_monitor._nm.get_settings.return_value = {
'connection': {},
'802-11-wireless': {'ssid': [84, 69, 83, 84]},
}
result = nm_monitor.get_known_wifis()
assert result == [
SystemWifiInfo(
ssid='TEST',
last_connected=None,
)
]
def test_get_known_wifis_partial_failure(nm_monitor):
nm_monitor._nm.get_connections_paths.return_value = [
'/org/freedesktop/NetworkManager/Settings/12',
'/org/freedesktop/NetworkManager/Settings/42',
]
nm_monitor._nm.get_settings.side_effect = [
DBusException("Test"),
{
'connection': {},
'802-11-wireless': {'ssid': [84, 69, 83, 84]},
},
]
result = nm_monitor.get_known_wifis()
assert result == [
SystemWifiInfo(
ssid='TEST',
last_connected=None,
)
]
def test_get_known_wifis_with_no_wifi_connections(nm_monitor):
nm_monitor._nm.get_connections_paths.return_value = ['/org/freedesktop/NetworkManager/Settings/12']
nm_monitor._nm.get_settings.return_value = {
'connection': {},
'802-11-ethernet': {},
}
result = nm_monitor.get_known_wifis()
assert result == []
@pytest.mark.parametrize(
'ssid_bytes, expected',
[
([84, 69, 83, 84], 'TEST'),
([240, 159, 150, 150], '🖖'),
([0, 1, 2, 10, 34, 39], '\\x00\\x01\\x02\\n"\''),
],
)
def test_decode_ssid(ssid_bytes, expected):
result = decode_ssid(ssid_bytes)
assert result == expected
class UncallableNetworkManagerDBusAdapter(NetworkManagerDBusAdapter):
def __init__(self):
# Skip parent setup, this way none of the DBus calls can happen in tests
super(NetworkManagerDBusAdapter, self).__init__(parent=None)