diff --git a/varlink/client.py b/varlink/client.py index fd92b5c..157a5e4 100644 --- a/varlink/client.py +++ b/varlink/client.py @@ -87,7 +87,7 @@ def _next_varlink_message(self): if "error" in message and message["error"] is not None: self._in_use = False - e = VarlinkError.new(message, self._namespaced) + e = VarlinkError.new(message) raise e else: return message["parameters"], ("continues" in message) and message["continues"] diff --git a/varlink/error.py b/varlink/error.py index d72e872..255537d 100644 --- a/varlink/error.py +++ b/varlink/error.py @@ -32,6 +32,9 @@ def new(cls, message, namespaced=False): elif message["error"] == "org.varlink.service.MethodNotImplemented": return MethodNotImplemented.new(message, namespaced) + elif message["error"] == "org.varlink.service.MethodNotFound": + return MethodNotFound.new(message, namespaced) + else: return cls(message, namespaced) diff --git a/varlink/tests/test_error.py b/varlink/tests/test_error.py new file mode 100644 index 0000000..b61c28b --- /dev/null +++ b/varlink/tests/test_error.py @@ -0,0 +1,34 @@ +import json +import unittest + +import varlink + + +class OneMessageClientHandler(varlink.ClientInterfaceHandler): + def __init__(self, interface, namespaced, next_message): + # No interface but we do not use them + super().__init__(interface, namespaced) + self.next_message = next_message + + def _next_message(self): + yield self.next_message + + +class TestError(unittest.TestCase): + def test_pack_unpack(self): + dummy_if = varlink.Interface("interface org.example.dummy") + for error in [ + varlink.InterfaceNotFound("org.varlink.notfound"), + varlink.MethodNotFound("Method"), + varlink.MethodNotImplemented("Abstract"), + varlink.InvalidParameter("Struct.param"), + ]: + for namespaced in (True, False): + with self.subTest(error=error, namespaced=namespaced): + # encode error + encoded = json.dumps(error, cls=varlink.VarlinkEncoder) + + # Emulates the client receiving an error + handler = OneMessageClientHandler(dummy_if, namespaced, encoded) + with self.assertRaises(error.__class__): + handler._next_varlink_message()