Skip to content

Commit be55267

Browse files
committed
Add a testsuite
1 parent bccaba9 commit be55267

11 files changed

Lines changed: 436 additions & 0 deletions

test/README

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
WARNING: THE TESTS MESS WITH YOUR SETTINGS
2+
3+
Some of the things the testsuite does:
4+
5+
- Repeatedly kill all network connections
6+
- Delete, modify and add network connections
7+
- Change your hostname
8+
9+
Think twice before you want to run this testsuire. And read the tests to see
10+
what they do.
11+
12+
The following tests are safe to run, as they only read data:
13+
14+
test_accesspoint.py
15+
test_activeconnection.py
16+
test_devices.py
17+
test_ipconfig.py

test/__init__.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
# Set this variable in your environment if you understand that
2+
#
3+
# THE TESTS WILL MESS WITH YOUR COMPUTER!
4+
#
5+
# You will repeatedly go offline and it will attempt to add and delete
6+
# connections, change the hostname and more nasty things.
7+
8+
import os
9+
if 'NM_TESTS' not in os.environ:
10+
print("Cowardly refusing to run tests")
11+
os._exit(1)
12+
13+
import dbus
14+
import ipaddress
15+
import six
16+
import time
17+
import unittest
18+
19+
import NetworkManager
20+
21+
class TestCase(unittest.TestCase):
22+
def assertRaisesDBus(self, exception, func, *args, **kwargs):
23+
if '.' not in exception:
24+
exception = 'org.freedesktop.NetworkManager.' + exception
25+
with self.assertRaises(dbus.exceptions.DBusException) as cm:
26+
func(*args, **kwargs)
27+
self.assertEqual(cm.exception.get_dbus_name(), exception)
28+
29+
def assertIsStrictSubclass(self, klass1, klass2):
30+
self.assertTrue(issubclass(klass1, klass2) and klass1 != klass2)
31+
32+
def assertIsIpAddress(self, ip):
33+
try:
34+
ipaddress.ip_address(ip)
35+
except ValueError as e:
36+
raise self.failureException(str(e))
37+
38+
def assertIsIpNetwork(self, ip, prefix):
39+
try:
40+
ipaddress.ip_network((ip, prefix), strict=False)
41+
except ValueError as e:
42+
raise self.failureException(str(e))
43+
44+
def assertIsMacAddress(self, address):
45+
self.assertRegex(address, '^[0-9a-fA-F]{2}(?::[0-9a-fA-F]{2}){5}$', '%s is not a mac address' % address)
46+
47+
def waitForConnection(self):
48+
while NetworkManager.NetworkManager.State < NetworkManager.NM_STATE_CONNECTED_LOCAL:
49+
time.sleep(0.5)
50+
51+
def waitForDisconnection(self):
52+
while NetworkManager.NetworkManager.State >= NetworkManager.NM_STATE_CONNECTED_LOCAL:
53+
time.sleep(0.5)
54+
55+
permissions = NetworkManager.NetworkManager.GetPermissions()
56+
def have_permission(permission):
57+
permission = 'org.freedesktop.NetworkManager.' + permission
58+
return permissions.get(permission, None) == 'yes'
59+

test/test_accesspoint.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from test import *
2+
3+
class AccessPointTest(TestCase):
4+
def test_accesspoints(self):
5+
for dev in NetworkManager.NetworkManager.Devices:
6+
if isinstance(dev, NetworkManager.Wireless):
7+
for ap in dev.AccessPoints:
8+
self.assertIsInstance(ap.Flags, int)
9+
# Frequencies from https://en.wikipedia.org/wiki/List_of_WLAN_channels
10+
f = ap.Frequency
11+
if not (
12+
(f > 2400 and f < 2500) or
13+
(f > 3650 and f < 3700) or
14+
(f > 4900 and f < 6000)):
15+
self.fail("Frequency is not a valid wifi frequency")
16+
self.assertIsMacAddress(ap.HwAddress)
17+
self.assertIsInstance(ap.LastSeen, int)
18+
self.assertIsInstance(ap.MaxBitrate, int)
19+
self.assertIsInstance(ap.WpaFlags, int)
20+
self.assertIsInstance(ap.RsnFlags, int)
21+
self.assertLess(ap.Strength, 100)
22+
self.assertIsInstance(ap.Ssid, six.text_type)
23+
self.assertIn(ap.Mode, (NetworkManager.NM_802_11_MODE_ADHOC, NetworkManager.NM_802_11_MODE_INFRA, NetworkManager.NM_802_11_MODE_AP))
24+
25+
if __name__ == '__main__':
26+
unittest.main()

test/test_activeconnection.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from test import *
2+
3+
class ActiveConnectionTest(TestCase):
4+
def test_properties(self):
5+
for conn in NetworkManager.NetworkManager.ActiveConnections:
6+
self.assertIsInstance(conn.Connection, NetworkManager.Connection)
7+
for device in conn.Devices:
8+
self.assertIsInstance(device, NetworkManager.Device)
9+
if conn.Connection.GetSettings()['connection']['type'] == '802-11-wireless':
10+
self.assertIsInstance(conn.SpecificObject, NetworkManager.AccessPoint)
11+
if conn.Vpn:
12+
self.assertIsInstance(conn, NetworkManager.VPNConnection)
13+
self.assertIsInstance(conn.Banner, six.text_type)
14+
self.assertIsInstance(conn.SpecificObject, NetworkManager.ActiveConnection)
15+
self.assertTrue(conn.State == NetworkManager.NM_ACTIVE_CONNECTION_STATE_ACTIVATED)
16+
self.assertIsInstance(conn.Ip4Config, NetworkManager.IP4Config)
17+
self.assertIsInstance(conn.Ip6Config, (NetworkManager.IP6Config, type(None)))
18+
self.assertIsInstance(conn.Dhcp4Config, (NetworkManager.DHCP4Config, type(None)))
19+
self.assertIsInstance(conn.Dhcp6Config, (NetworkManager.DHCP6Config, type(None)))
20+
if conn.Master != None:
21+
self.assertIsInstance(conn.Master, NetworkManager.Device)
22+
self.assertEqual(conn.Master, conn.SpecificObject.Devices[0])
23+
24+
if __name__ == '__main__':
25+
unittest.main()

test/test_agentmanager.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
from test import *
2+
3+
class AgentManagerTest(TestCase):
4+
def test_registration(self):
5+
NetworkManager.AgentManager.Register('python-network-manager-test')
6+
NetworkManager.AgentManager.Unregister()
7+
8+
if __name__ == '__main__':
9+
unittest.main()

test/test_connection.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
from test import *
2+
3+
class ConnectionTest(TestCase):
4+
def test_settings(self):
5+
for connection in NetworkManager.Settings.ListConnections():
6+
settings = connection.GetSettings()
7+
self.assertIn(settings['connection']['type'], settings)
8+
9+
secrets = connection.GetSecrets()
10+
for key in settings:
11+
self.assertIn(key, secrets)
12+
13+
if 'ipv4' in settings:
14+
for address, prefix, gateway in settings['ipv4']['addresses']:
15+
self.assertIsIpAddress(address)
16+
self.assertIsIpAddress(gateway)
17+
if 'ipv6' in settings:
18+
for address, prefix, gateway in settings['ipv6']['addresses']:
19+
self.assertIsIpAddress(address)
20+
self.assertIsIpAddress(gateway)
21+
22+
def test_update(self):
23+
active = [x.Connection for x in NetworkManager.NetworkManager.ActiveConnections]
24+
for connection in NetworkManager.Settings.Connections:
25+
if connection in active:
26+
continue
27+
settings = connection.GetSettings()
28+
connection.Update(settings)
29+
# FIXME: this causes assertion failures in n-m, which cause the dbus call to hang
30+
#settings['connection']['timestamp'] -= 1
31+
#connection.UpdateUnsaved(settings)
32+
#self.assertTrue(connection.Unsaved)
33+
#print("Saving")
34+
#connection.Save()
35+
#print("Saved")
36+
#self.assertFalse(connection.Unsaved)
37+
break
38+
39+
def test_secrets(self):
40+
active = [x.Connection for x in NetworkManager.NetworkManager.ActiveConnections]
41+
key = '802-11-wireless-security'
42+
for connection in NetworkManager.Settings.Connections:
43+
if connection in active:
44+
continue
45+
settings = connection.GetSettings()
46+
if key not in settings:
47+
continue
48+
secrets = connection.GetSecrets()
49+
if not secrets[key]:
50+
continue
51+
settings[key].update(secrets[key])
52+
53+
connection.ClearSecrets()
54+
secrets = connection.GetSecrets()
55+
self.assertEqual(secrets[key], {})
56+
57+
connection.Update(settings)
58+
secrets = connection.GetSecrets()
59+
self.assertNotEqual(secrets[key], {})
60+
break
61+
62+
if __name__ == '__main__':
63+
unittest.main()

test/test_connection_addremove.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
from test import *
2+
3+
class ConnectionAddRemoveTest(TestCase):
4+
5+
def test_activate(self):
6+
active = NetworkManager.NetworkManager.ActiveConnections[0]
7+
ap = active.SpecificObject
8+
conn = active.Connection
9+
dev = active.Devices[0]
10+
11+
NetworkManager.NetworkManager.DeactivateConnection(active)
12+
self.waitForDisconnection()
13+
NetworkManager.NetworkManager.ActivateConnection(conn, dev, ap)
14+
self.waitForConnection()
15+
16+
def test_delete_addactivate(self):
17+
active = NetworkManager.NetworkManager.ActiveConnections[0]
18+
ap = active.SpecificObject
19+
conn = active.Connection
20+
dev = active.Devices[0]
21+
settings = conn.GetSettings()
22+
typ = settings['connection']['type']
23+
if 'security' in settings[typ]:
24+
key2 = settings[typ]['security']
25+
settings[key2].update(conn.GetSecrets(key2)[key2])
26+
27+
conn.Delete()
28+
self.waitForDisconnection()
29+
conn, active = NetworkManager.NetworkManager.AddAndActivateConnection(settings, dev, ap)
30+
self.assertIsInstance(conn, NetworkManager.Connection)
31+
self.assertIsInstance(active, NetworkManager.ActiveConnection)
32+
self.waitForConnection()
33+
34+
def test_delete_add_activate(self):
35+
active = NetworkManager.NetworkManager.ActiveConnections[0]
36+
ap = active.SpecificObject
37+
conn = active.Connection
38+
dev = active.Devices[0]
39+
settings = conn.GetSettings()
40+
typ = settings['connection']['type']
41+
if 'security' in settings[typ]:
42+
key2 = settings[typ]['security']
43+
settings[key2].update(conn.GetSecrets(key2)[key2])
44+
45+
conn.Delete()
46+
self.waitForDisconnection()
47+
conn = NetworkManager.Settings.AddConnection(settings)
48+
self.assertIsInstance(conn, NetworkManager.Connection)
49+
NetworkManager.NetworkManager.ActivateConnection(conn, dev, ap)
50+
self.waitForConnection()
51+
52+
if __name__ == '__main__':
53+
unittest.main()

test/test_devices.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from test import *
2+
3+
class DeviceTest(TestCase):
4+
def test_devices(self):
5+
for device in NetworkManager.NetworkManager.Devices:
6+
self.assertIsStrictSubclass(type(device), NetworkManager.Device)
7+
if device.Dhcp4Config:
8+
self.assertIsInstance(device.Dhcp4Config, NetworkManager.DHCP4Config)
9+
if device.Dhcp6Config:
10+
self.assertIsInstance(device.Dhcp6Config, NetworkManager.DHCP6Config)
11+
if device.Ip4Config:
12+
self.assertIsInstance(device.Ip4Config, NetworkManager.IP4Config)
13+
if device.Ip6Config:
14+
self.assertIsInstance(device.Ip6Config, NetworkManager.IP6Config)
15+
if device.Ip4Address:
16+
self.assertIsIpAddress(device.Ip4Address)
17+
if hasattr(device, 'HwAddress') and device.HwAddress:
18+
self.assertIsMacAddress(device.HwAddress)
19+
if hasattr(device, 'PermHwAddress') and device.PermHwAddress:
20+
self.assertIsMacAddress(device.PermHwAddress)
21+
if device.DeviceType == NetworkManager.NM_DEVICE_TYPE_WIFI:
22+
for ap in device.AccessPoints:
23+
self.assertIsInstance(ap, NetworkManager.AccessPoint)
24+
device.RequestScan({})
25+
elif device.DeviceType == NetworkManager.NM_DEVICE_TYPE_ETHERNET:
26+
self.assertIn(device.Carrier, (True, False))
27+
elif device.DeviceType == NetworkManager.NM_DEVICE_TYPE_GENERIC:
28+
self.assertIsInstance(device.TypeDescription, six.text_type)
29+
elif device.DeviceType == NetworkManager.NM_DEVICE_TYPE_TUN:
30+
if device.Owner != -1:
31+
import pwd
32+
pwd.getpwuid(device.Owner)
33+
else:
34+
self.fail("I don't know how to test %s devices" % type(device).__name__)
35+
36+
if __name__ == '__main__':
37+
unittest.main()

test/test_ipconfig.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
from test import *
2+
3+
class IpConfigTest(TestCase):
4+
def test_configs(self):
5+
for device in NetworkManager.NetworkManager.Devices:
6+
if device.State != NetworkManager.NM_DEVICE_STATE_ACTIVATED:
7+
continue
8+
self.do_check(device)
9+
for connection in NetworkManager.NetworkManager.ActiveConnections:
10+
self.do_check(connection)
11+
12+
def do_check(self, thing):
13+
if thing.Dhcp4Config:
14+
self.assertIsInstance(thing.Dhcp4Config, NetworkManager.DHCP4Config)
15+
self.assertIsInstance(thing.Dhcp4Config.Options, dict)
16+
o = thing.Dhcp4Config.Options
17+
self.assertIsInstance(o['domain_name_servers'], list)
18+
self.assertIsInstance(o['ntp_servers'], list)
19+
self.assertIsIpAddress(o['ip_address'])
20+
for key in o:
21+
if key.endswith('_requested'):
22+
self.assertTrue(o[key])
23+
if thing.Dhcp6Config:
24+
self.assertIsInstance(thing.Dhcp6Config, NetworkManager.DHCP6Config)
25+
self.assertIsInstance(thing.Dhcp6Config.Options, dict)
26+
for c in (thing.Ip4Config, thing.Ip6Config):
27+
if not c:
28+
continue
29+
for addr, prefix, gateway in c.Addresses:
30+
self.assertIsIpAddress(addr)
31+
self.assertIsIpAddress(gateway)
32+
self.assertIsIpNetwork(addr, prefix)
33+
for data in c.AddressData:
34+
self.assertIsIpAddress(data['address'])
35+
self.assertIsIpNetwork(data['address'], data['prefix'])
36+
if 'peer' in data:
37+
self.assertIsIpAddress(data['peer'])
38+
if c.Gateway:
39+
self.assertIsIpAddress(c.Gateway)
40+
for addr in c.Nameservers:
41+
self.assertIsIpAddress(addr)
42+
for addr in getattr(c, 'WinsServers', []):
43+
self.assertIsIpAddress(addr)
44+
for dest, prefix, next_hop, metric in c.Routes:
45+
self.assertIsIpNetwork(dest, prefix)
46+
self.assertIsIpAddress(next_hop)
47+
self.assertLessEqual(metric, 1000)
48+
for data in c.RouteData:
49+
self.assertIsIpNetwork(data['dest'], data['prefix'])
50+
self.assertIsIpAddress(data['next-hop'])
51+
self.assertLessEqual(data['metric'], 1000)
52+
53+
if __name__ == '__main__':
54+
unittest.main()

0 commit comments

Comments
 (0)