summary refs log tree commit diff
path: root/tools/test-networkmanager-service.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/test-networkmanager-service.py')
-rwxr-xr-xtools/test-networkmanager-service.py90
1 files changed, 74 insertions, 16 deletions
diff --git a/tools/test-networkmanager-service.py b/tools/test-networkmanager-service.py
index a7788510..9a423123 100755
--- a/tools/test-networkmanager-service.py
+++ b/tools/test-networkmanager-service.py
@@ -288,8 +288,15 @@ class Util:
         return (Util.ip_addr_ntop(a, family), family)
 
     @staticmethod
-    def eprint(*args, **kwargs):
-        print(*args, file=sys.stderr, **kwargs)
+    def log(message):
+        if gl.log_file:
+            try:
+                gl.log_file.write(message + "\n")
+                gl.log_file.flush()
+            except Exception:
+                pass
+        else:
+            print(message, file=sys.stderr)
 
     @staticmethod
     def variant_from_dbus(val):
@@ -308,9 +315,9 @@ class Util:
         if isinstance(val, dbus.Array):
             try:
                 if val.signature == "s":
-                    return GLib.Variant("as", [Util.variant_from_dbus(x) for x in val])
+                    return GLib.Variant("as", [str(x) for x in val])
                 if val.signature == "b":
-                    return GLib.Variant("ab", [Util.variant_from_dbus(x) for x in val])
+                    return GLib.Variant("ab", [bool(x) for x in val])
                 if val.signature == "y":
                     return GLib.Variant("ay", [int(x) for x in val])
                 if val.signature == "u":
@@ -342,8 +349,7 @@ class Util:
                     )
             except Exception as e:
                 raise Exception(
-                    "Cannot convert array element to type '%s': %s"
-                    % (val.signature, e.message)
+                    "Cannot convert array element to type '%s': %s" % (val.signature, e)
                 )
         if isinstance(val, dbus.Dictionary):
             if val.signature == "ss":
@@ -358,7 +364,7 @@ class Util:
                         [(str(k), Util.variant_from_dbus(v)) for k, v in val.items()]
                     ),
                 )
-            if val.signature == "sa{sv}":
+            if val.signature == "sa{sv}" or val.signature == "sa{ss}":
                 c = collections.OrderedDict(
                     [
                         (
@@ -825,10 +831,12 @@ class Device(ExportedObj):
 
         ExportedObj.__init__(self, ExportedObj.create_path(Device), ident)
 
+        self.applied_con = {}
         self.ip4_config = None
         self.ip6_config = None
         self.dhcp4_config = None
         self.dhcp6_config = None
+        self.activation_state_change_delay_ms = 50
 
         self.prp_state = NM.DeviceState.UNAVAILABLE
 
@@ -1037,6 +1045,20 @@ class Device(ExportedObj):
     def Disconnect(self):
         pass
 
+    @dbus.service.method(
+        dbus_interface=IFACE_DEVICE, in_signature="u", out_signature="a{sa{sv}}t"
+    )
+    def GetAppliedConnection(self, flags):
+        ac = self._dbus_property_get(IFACE_DEVICE, PRP_DEVICE_ACTIVE_CONNECTION)
+        return (self.applied_con, 0)
+
+    @dbus.service.method(
+        dbus_interface=IFACE_DEVICE, in_signature="a{sa{sv}}tu", out_signature=""
+    )
+    def Reapply(self, connection, version_id, flags):
+        self.applied_con = connection
+        pass
+
     @dbus.service.method(dbus_interface=IFACE_DEVICE, in_signature="", out_signature="")
     def Delete(self):
         # We don't currently support any software device types, so...
@@ -1067,6 +1089,10 @@ class Device(ExportedObj):
 
     def set_active_connection(self, ac):
         self._dbus_property_set(IFACE_DEVICE, PRP_DEVICE_ACTIVE_CONNECTION, ac)
+        if ac is None:
+            self.applied_con = {}
+        else:
+            self.applied_con = ac.con_inst.con_hash
 
     def connection_is_available(self, con_inst):
         if con_inst.is_vpn():
@@ -1388,9 +1414,9 @@ class ActiveConnection(ExportedObj):
         self.con_inst = con_inst
         self.is_vpn = con_inst.is_vpn()
 
+        self.activation_state_change_delay_ms = device.activation_state_change_delay_ms
         self._activation_id = None
         self._deactivation_id = None
-        self.activation_state_change_delay_ms = 50
 
         s_con = con_inst.con_hash[NM.SETTING_CONNECTION_SETTING_NAME]
 
@@ -1486,9 +1512,17 @@ class ActiveConnection(ExportedObj):
 
     def start_activation(self):
         assert self._activation_id is None
-        self._activation_id = GLib.timeout_add(
-            self.activation_state_change_delay_ms, self._activation_step1
-        )
+        if self.activation_state_change_delay_ms == 0:
+            self.device.set_active_connection(self)
+            self._set_state(
+                NM.ActiveConnectionState.ACTIVATED,
+                NM.ActiveConnectionStateReason.UNKNOWN,
+            )
+            self.device.set_state(NM.DeviceState.ACTIVATED, NM.DeviceStateReason.NONE)
+        else:
+            self._activation_id = GLib.timeout_add(
+                self.activation_state_change_delay_ms, self._activation_step1
+            )
 
     def start_deactivation(self):
         assert self._deactivation_id is None
@@ -1553,7 +1587,9 @@ class NetworkManager(ExportedObj):
             PRP_NM_ACTIVATING_CONNECTION: ExportedObj.to_path(None),
             PRP_NM_STARTUP: False,
             PRP_NM_STATE: dbus.UInt32(NM.State.DISCONNECTED),
-            PRP_NM_VERSION: "0.9.9.0",
+            PRP_NM_VERSION: os.environ.get(
+                "NM_TEST_NETWORKMANAGER_SERVICE_VERSION", "0.9.9.0"
+            ),
             PRP_NM_CONNECTIVITY: dbus.UInt32(NM.ConnectivityState.NONE),
         }
 
@@ -1918,9 +1954,9 @@ class NetworkManager(ExportedObj):
 
     @dbus.service.method(dbus_interface=IFACE_TEST, in_signature="ou", out_signature="")
     def SetActiveConnectionStateChangedDelay(self, devpath, delay_ms):
-        for ac in reversed(self.active_connections):
-            if ac.device.path == devpath:
-                ac.activation_state_change_delay_ms = delay_ms
+        for d in self.devices:
+            if d.path == devpath:
+                d.activation_state_change_delay_ms = delay_ms
                 return
         raise BusErr.UnknownDeviceException(
             "Device with iface '%s' not found" % devpath
@@ -2856,6 +2892,26 @@ class ObjectManager(dbus.service.Object):
         return managed_objects
 
 
+def setup_log_file():
+    """
+    Get environment variable for the log file , if any
+    We accept a %p placeholder to replace with the pid of the current
+    process
+    """
+    try:
+        log_file_name = os.environ["NM_TEST_NETWORKMANAGER_SERVICE_LOGFILE"]
+    except KeyError:
+        return None
+    if "%p" in log_file_name:
+        log_file_name = log_file_name.replace("%p", str(os.getpid()))
+    try:
+        log_file = open(log_file_name, "w")
+    except Exception:
+        log_file = None
+
+    return log_file
+
+
 ###############################################################################
 
 
@@ -2867,6 +2923,7 @@ def main():
     global gl
     gl = Global()
 
+    gl.log_file = setup_log_file()
     gl.mainloop = GLib.MainLoop()
     gl.bus = dbus.SessionBus()
     gl.force_activation_failure = {}
@@ -2899,7 +2956,8 @@ def main():
     gl.settings.unexport()
     gl.manager.unexport()
     gl.object_manager.remove_from_connection()
-
+    if gl.log_file:
+        gl.log_file.close()
     sys.exit(0)