[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