Mercurial > ~darius > hgwebdir.cgi > epro
diff velib_python/test/mock_dbus_service.py @ 8:9c0435a617db
Import velib_python
author | Daniel O'Connor <darius@dons.net.au> |
---|---|
date | Sun, 05 Dec 2021 14:35:36 +1030 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/velib_python/test/mock_dbus_service.py Sun Dec 05 14:35:36 2021 +1030 @@ -0,0 +1,58 @@ +# Simulates the busService object without using the D-Bus (intended for unit tests). Data usually stored in +# D-Bus items is now stored in memory. +class MockDbusService(object): + def __init__(self, servicename): + self._dbusobjects = {} + self._callbacks = {} + self._service_name = servicename + + def add_path(self, path, value, description="", writeable=False, onchangecallback=None, + gettextcallback=None): + self._dbusobjects[path] = value + if onchangecallback is not None: + self._callbacks[path] = onchangecallback + + # Add the mandatory paths, as per victron dbus api doc + def add_mandatory_paths(self, processname, processversion, connection, + deviceinstance, productid, productname, firmwareversion, hardwareversion, connected): + self.add_path('/Management/ProcessName', processname) + self.add_path('/Management/ProcessVersion', processversion) + self.add_path('/Management/Connection', connection) + + # Create rest of the mandatory objects + self.add_path('/DeviceInstance', deviceinstance) + self.add_path('/ProductId', productid) + self.add_path('/ProductName', productname) + self.add_path('/FirmwareVersion', firmwareversion) + self.add_path('/HardwareVersion', hardwareversion) + self.add_path('/Connected', connected) + + # Simulates a SetValue from the D-Bus, if avaible the onchangecallback associated with the path will + # be called before the data is changed. + def set_value(self, path, newvalue): + callback = self._callbacks.get(path) + if callback is None or callback(path, newvalue): + self._dbusobjects[path] = newvalue + + def __getitem__(self, path): + return self._dbusobjects[path] + + def __setitem__(self, path, newvalue): + if path not in self._dbusobjects: + raise Exception('Path not registered in service: {}{} (use add_path to register)'.\ + format(self._service_name, path)) + self._dbusobjects[path] = newvalue + + def __delitem__(self, path): + del self._dbusobjects[path] + + def __contains__(self, path): + return path in self._dbusobjects + + def __enter__(self): + # No batching done in mock object, and we already + # support the required dict interface. + return self + + def __exit__(self, *exc): + pass