[Telepathy-commits] [telepathy-gabble/master] IMChannel: report whether send errors are temporary or permanent

Will Thompson will.thompson at collabora.co.uk
Tue Feb 3 06:34:50 PST 2009


---
 src/im-channel.c                 |    9 ++--
 src/im-channel.h                 |    3 +-
 src/im-factory.c                 |    2 +-
 src/message-util.c               |    4 +-
 tests/twisted/text/send-error.py |  108 ++++++++++++++++++++++++++++++++++---
 5 files changed, 108 insertions(+), 18 deletions(-)

diff --git a/src/im-channel.c b/src/im-channel.c
index 0fc5ab3..66e995c 100644
--- a/src/im-channel.c
+++ b/src/im-channel.c
@@ -500,7 +500,8 @@ _gabble_im_channel_receive (GabbleIMChannel *chan,
                             const char *from,
                             time_t timestamp,
                             const char *text,
-                            TpChannelTextSendError send_error)
+                            TpChannelTextSendError send_error,
+                            TpDeliveryStatus delivery_status)
 {
   GabbleIMChannelPrivate *priv;
   TpBaseConnection *base_conn;
@@ -548,11 +549,9 @@ _gabble_im_channel_receive (GabbleIMChannel *chan,
           TP_CHANNEL_TEXT_MESSAGE_TYPE_DELIVERY_REPORT);
       tp_message_set_handle (delivery_report, 0, "message-sender",
           TP_HANDLE_TYPE_CONTACT, sender);
-      /* FIXME: Propagate whether the error is temporary or permanent from
-       * gabble_xmpp_error_from_node via _tp_send_error_from_error_node
-       */
+
       tp_message_set_uint32 (delivery_report, 0, "delivery-status",
-          TP_DELIVERY_STATUS_PERMANENTLY_FAILED);
+          delivery_status);
       tp_message_set_uint32 (delivery_report, 0, "delivery-error", send_error);
 
       /* We're getting a send error, so the original sender of the echoed
diff --git a/src/im-channel.h b/src/im-channel.h
index bc02c24..80fc67a 100644
--- a/src/im-channel.h
+++ b/src/im-channel.h
@@ -67,7 +67,8 @@ GType gabble_im_channel_get_type (void);
 
 void _gabble_im_channel_receive (GabbleIMChannel *chan,
     TpChannelTextMessageType type, TpHandle sender, const char *from,
-    time_t timestamp, const char *text, TpChannelTextSendError send_error);
+    time_t timestamp, const char *text, TpChannelTextSendError send_error,
+    TpDeliveryStatus delivery_status);
 void _gabble_im_channel_state_receive (GabbleIMChannel *chan, guint state);
 
 G_END_DECLS
diff --git a/src/im-factory.c b/src/im-factory.c
index 8f56aae..03f7733 100644
--- a/src/im-factory.c
+++ b/src/im-factory.c
@@ -281,7 +281,7 @@ im_factory_message_cb (LmMessageHandler *handler,
 
   if (body != NULL)
     _gabble_im_channel_receive (chan, msgtype, handle, from, stamp, body,
-        send_error);
+        send_error, delivery_status);
 
   return LM_HANDLER_RESULT_REMOVE_MESSAGE;
 }
diff --git a/src/message-util.c b/src/message-util.c
index 5ba4fd6..c8c02e7 100644
--- a/src/message-util.c
+++ b/src/message-util.c
@@ -226,8 +226,8 @@ _tp_send_error_from_error_node (LmMessageNode *error_node,
       GabbleXmppErrorType err_type = XMPP_ERROR_TYPE_UNDEFINED;
       GabbleXmppError err = gabble_xmpp_error_from_node (error_node, &err_type);
 
-      DEBUG ("got xmpp error: %s: %s", gabble_xmpp_error_string (err),
-          gabble_xmpp_error_description (err));
+      DEBUG ("got xmpp error: %s (type=%u): %s", gabble_xmpp_error_string (err),
+          err_type, gabble_xmpp_error_description (err));
 
       if (err_type == XMPP_ERROR_TYPE_WAIT)
         *delivery_status = TP_DELIVERY_STATUS_TEMPORARILY_FAILED;
diff --git a/tests/twisted/text/send-error.py b/tests/twisted/text/send-error.py
index 73c5b0a..c315485 100644
--- a/tests/twisted/text/send-error.py
+++ b/tests/twisted/text/send-error.py
@@ -12,10 +12,7 @@ from servicetest import call_async, EventPattern
 
 import ns
 
-def test(q, bus, conn, stream):
-    conn.Connect()
-    q.expect('dbus-signal', signal='StatusChanged', args=[0, 1])
-
+def test_temporary_error(q, bus, conn, stream):
     self_handle = conn.GetSelfHandle()
 
     jid = 'foo at bar.com'
@@ -42,8 +39,8 @@ def test(q, bus, conn, stream):
 
     # <message from='foo at bar.com' type='error'>
     #   <body>what is up, my good sir?</body>
-    #   <error code='404' type='cancel'>
-    #     <item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
+    #   <error type='wait'>
+    #     <resource-constraint xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
     #   </error>
     # </message>
     message_body = 'what is up, my good sir?'
@@ -54,7 +51,93 @@ def test(q, bus, conn, stream):
     m.addElement('body', content=message_body)
 
     e = domish.Element(('', 'error'))
-    e['code'] = '404'
+    e['type'] = 'wait'
+    e.addElement((ns.STANZA, 'resource-constraint'))
+
+    m.addChild(e)
+
+    stream.send(m)
+
+    send_error, received, message_received = q.expect_many(
+        EventPattern('dbus-signal', signal='SendError'),
+        EventPattern('dbus-signal', signal='Received'),
+        EventPattern('dbus-signal', signal='MessageReceived'),
+        )
+
+    expected_send_error = 4 # Too_Long
+
+    assert send_error.args[0] == expected_send_error, send_error.args
+    # FIXME: It doesn't look like it's possible to know what the original
+    # message type is, given that the type attribute of <message> is 'error'
+    # for error reports.
+    #assert send_error.args[2] == 0, send_error.args
+    assert send_error.args[3] == message_body, send_error.args
+
+    assert received.args[2] == foo_handle, (received.args, foo_handle)
+    assert received.args[3] == 4, received.args # Channel_Text_Message_Type_Delivery_Report
+    assert received.args[4] == 2, received.args # Channel_Text_Message_Flag_Non_Text_Content
+    assert received.args[5] == '', received.args
+
+    delivery_report = message_received.args[0]
+    assert len(delivery_report) == 1, delivery_report
+    header = delivery_report[0]
+    assert header['message-sender'] == foo_handle, header
+    assert header['message-type'] == 4, header # Channel_Text_Message_Type_Delivery_Report
+    assert header['delivery-status'] == 2, header # Delivery_Status_Temporarily_Failed
+    assert 'delivery-token' not in header, header
+    assert header['delivery-error'] == expected_send_error, header
+
+    delivery_echo = header['delivery-echo']
+    assert len(delivery_echo) == 2, delivery_echo
+
+    assert delivery_echo[0]['message-sender'] == self_handle, delivery_echo
+    assert 'message-token' not in delivery_echo[0], delivery_echo
+    # FIXME: see above
+    #assert delivery_echo[0]['message-type'] == 0, delivery_echo
+
+    assert delivery_echo[1]['content-type'] == "text/plain", delivery_echo
+    assert delivery_echo[1]['content'] == message_body, delivery_echo
+
+
+def test_permanent_error(q, bus, conn, stream):
+    self_handle = conn.GetSelfHandle()
+
+    jid = 'wee at ninja.jp'
+    call_async(q, conn, 'RequestHandles', 1, [jid])
+
+    event = q.expect('dbus-return', method='RequestHandles')
+    ninja_handle = event.value[0][0]
+
+    properties = conn.GetAll(
+            'org.freedesktop.Telepathy.Connection.Interface.Requests',
+            dbus_interface='org.freedesktop.DBus.Properties')
+
+    requestotron = dbus.Interface(conn,
+            'org.freedesktop.Telepathy.Connection.Interface.Requests')
+    call_async(q, requestotron, 'CreateChannel',
+            { 'org.freedesktop.Telepathy.Channel.ChannelType':
+                'org.freedesktop.Telepathy.Channel.Type.Text',
+              'org.freedesktop.Telepathy.Channel.TargetHandleType': 1,
+              'org.freedesktop.Telepathy.Channel.TargetHandle': ninja_handle,
+              })
+
+    ret = q.expect('dbus-return', method='CreateChannel')
+    text_chan = bus.get_object(conn.bus_name, ret.value[0])
+
+    # <message from='wee at ninja.jp' type='error'>
+    #   <body>hello? is there anyone there?</body>
+    #   <error type='cancel'>
+    #     <item-not-found xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
+    #   </error>
+    # </message>
+    message_body = 'hello? is there anyone there?'
+
+    m = domish.Element(('', 'message'))
+    m['from'] = 'wee at ninja.jp'
+    m['type'] = 'error'
+    m.addElement('body', content=message_body)
+
+    e = domish.Element(('', 'error'))
     e['type'] = 'cancel'
     e.addElement((ns.STANZA, 'item-not-found'))
 
@@ -77,7 +160,7 @@ def test(q, bus, conn, stream):
     #assert send_error.args[2] == 0, send_error.args
     assert send_error.args[3] == message_body, send_error.args
 
-    assert received.args[2] == foo_handle, (received.args, foo_handle)
+    assert received.args[2] == ninja_handle, (received.args, ninja_handle)
     assert received.args[3] == 4, received.args # Channel_Text_Message_Type_Delivery_Report
     assert received.args[4] == 2, received.args # Channel_Text_Message_Flag_Non_Text_Content
     assert received.args[5] == '', received.args
@@ -85,7 +168,7 @@ def test(q, bus, conn, stream):
     delivery_report = message_received.args[0]
     assert len(delivery_report) == 1, delivery_report
     header = delivery_report[0]
-    assert header['message-sender'] == foo_handle, header
+    assert header['message-sender'] == ninja_handle, header
     assert header['message-type'] == 4, header # Channel_Text_Message_Type_Delivery_Report
     assert header['delivery-status'] == 3, header # Delivery_Status_Permanently_Failed
     assert 'delivery-token' not in header, header
@@ -102,6 +185,13 @@ def test(q, bus, conn, stream):
     assert delivery_echo[1]['content-type'] == "text/plain", delivery_echo
     assert delivery_echo[1]['content'] == message_body, delivery_echo
 
+def test(q, bus, conn, stream):
+    conn.Connect()
+    q.expect('dbus-signal', signal='StatusChanged', args=[0, 1])
+
+    test_temporary_error(q, bus, conn, stream)
+    test_permanent_error(q, bus, conn, stream)
+
     conn.Disconnect()
     q.expect('dbus-signal', signal='StatusChanged', args=[2, 1])
 
-- 
1.5.6.5




More information about the telepathy-commits mailing list