2 # -*- coding: utf-8 -*-
4 # TODO: adapt nm lib to connect to session bus too, and try this mock
9 from dbus
.mainloop
.glib
import DBusGMainLoop
13 import networkmanager
.device
14 from networkmanager
.base
import Bus
16 class DBusMock(dbus
.service
.Object
):
17 def __init__(self
, bus
, opath
, bus_name
=None):
18 print "INIT:", self
.__class
__, opath
20 NEE
= dbus
.exceptions
.NameExistsException
22 bus_name
= dbus
.service
.BusName(bus_name
, bus
,
23 replace_existing
=True,
26 raise NEE("%s (pid %d)" % (bus_name
, self
.service_pid(bus_name
)))
27 super(DBusMock
, self
).__init
__(bus
, opath
, bus_name
)
31 def service_pid(name
):
33 DBS
= 'org.freedesktop.DBus'
35 dbo
= bus
.get_object(DBS
, '/')
36 dbi
= dbus
.Interface(dbo
, DBI
)
37 owner
= dbi
.GetNameOwner(name
)
38 pid
= dbi
.GetConnectionUnixProcessID(owner
)
42 @dbus.service
.method(dbus_interface
="org.freedesktop.DBus.Properties",
43 in_signature
="ss", out_signature
="v")
44 def Get(self
, interface
, prop_name
):
45 # real NM ignores the interface too
46 value
= self
.properties
.get(prop_name
, 42)
47 print "Get", self
.__dbus
_object
_path
__, prop_name
, "->", value
50 class NetworkManagerMock(DBusMock
):
51 def __init__(self
, bus
):
52 opath
= "/org/freedesktop/NetworkManager"
53 bus_name
= "org.freedesktop.NetworkManager"
54 super(NetworkManagerMock
, self
).__init
__(bus
, opath
, bus_name
)
56 self
.properties
.update({
57 "State": networkmanager
.NetworkManager
.State
.CONNECTED
,
58 "ActiveConnections": ["/AC1"],
62 @dbus.service
.method(dbus_interface
="org.freedesktop.NetworkManager",
63 in_signature
="", out_signature
="ao")
67 class NetworkManagerSettingsMock(DBusMock
):
68 def __init__(self
, bus
):
69 opath
= "/org/freedesktop/NetworkManagerSettings"
70 bus_name
= "org.freedesktop.NetworkManagerUserSettings"
71 super(NetworkManagerSettingsMock
, self
).__init
__(bus
, opath
, bus_name
)
73 @dbus.service
.method(dbus_interface
="org.freedesktop.NetworkManagerSettings",
74 in_signature
="", out_signature
="ao")
75 def ListConnections(self
):
78 class ConnectionMock(DBusMock
):
79 def __init__(self
, bus
, opath
):
80 super(ConnectionMock
, self
).__init
__(bus
, opath
)
82 @dbus.service
.method(dbus_interface
="org.freedesktop.NetworkManagerSettings.Connection",
83 in_signature
="", out_signature
="a{sa{sv}}")
84 def GetSettings(self
):
87 # testing non-ASCII output: str vs unicode
88 "id": "moje síť", # "my net"
102 class DeviceMock(DBusMock
):
103 def __init__(self
, bus
, opath
):
104 super(DeviceMock
, self
).__init
__(bus
, opath
)
106 self
.properties
.update({
108 "Driver": "mock driver",
109 "HwAddress": "11:22:33:44:55:66",
113 class WiredDeviceMock(DeviceMock
):
114 def __init__(self
, bus
, opath
):
115 super(WiredDeviceMock
, self
).__init
__(bus
, opath
)
117 self
.properties
.update({
118 "DeviceType": networkmanager
.Device
.DeviceType
.ETHERNET
,
119 "Interface": "emock0",
122 class WirelessDeviceMock(DeviceMock
):
123 def __init__(self
, bus
, opath
):
124 super(WirelessDeviceMock
, self
).__init
__(bus
, opath
)
126 self
.properties
.update({
127 "DeviceType": networkmanager
.Device
.DeviceType
.WIRELESS
,
128 "ActiveAccessPoint": "/AP1",
129 "Interface": "wmock0",
132 @dbus.service
.method(dbus_interface
="org.freedesktop.NetworkManager.Device.Wireless",
133 in_signature
="", out_signature
="ao")
134 def GetAccessPoints(self
):
135 return ["/AP1", "/AP2"]
137 class ActiveConnectionMock(DBusMock
):
138 def __init__(self
, bus
, opath
):
139 super(ActiveConnectionMock
, self
).__init
__(bus
, opath
)
141 self
.properties
.update({
142 "ServiceName": "org.freedesktop.NetworkManagerUserSettings",
144 "SpecificObject": "/AP1",
148 class AccessPointMock(DBusMock
):
149 def __init__(self
, bus
, opath
):
150 super(AccessPointMock
, self
).__init
__(bus
, opath
)
152 self
.properties
.update({
153 "Ssid": dbus
.ByteArray("mock-ssid"),
154 "HwAddress": "11:22:33:44:55:66",
157 class Ip4ConfigMock(DBusMock
):
158 def __init__(self
, bus
, opath
):
159 super(Ip4ConfigMock
, self
).__init
__(bus
, opath
)
161 self
.properties
.update({
162 "Addresses": [(42, 43, 44)],
163 "Nameservers": [42, 43, 44],
164 "Domains": ["mockdom1", "mockdom2"],
165 "Routes": dbus
.Array([], signature
="au"), # format? fix nmcli
168 if __name__
== "__main__":
169 DBusGMainLoop(set_as_default
=True)
171 networkmanager
.base
.NM_BUS
= dbus
.SessionBus()
173 nmm
= NetworkManagerMock(bus
)
174 nms
= NetworkManagerSettingsMock(bus
)
175 c1
= ConnectionMock(bus
, "/C1")
176 c2
= ConnectionMock(bus
, "/C2")
177 ac
= ActiveConnectionMock(bus
, "/AC1")
178 d1
= WiredDeviceMock(bus
, "/D1")
179 d5
= WirelessDeviceMock(bus
, "/D5")
180 ap1
= AccessPointMock(bus
, "/AP1")
181 ap2
= AccessPointMock(bus
, "/AP2")
182 ic1
= Ip4ConfigMock(bus
, "/IC1")
183 loop
= gobject
.MainLoop()