-
Notifications
You must be signed in to change notification settings - Fork 49
/
Copy pathxep206.py
133 lines (107 loc) · 3.44 KB
/
xep206.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
import os
import sys
import time
from twisted.internet import defer, protocol, reactor
from twisted.python import log
from punjab.httpb import *
import test_basic
from punjab import session
class DummyClient:
"""
a client for testing
"""
class DummyTransport:
"""
a transport for testing
"""
def loseConnection(self):
return None
class DummyXmlStream(object):
"""
An xmlstream for testing
"""
def __init__(self):
self.elements = []
self.transport = DummyTransport()
def send(self, element):
self.elements.append(element)
class DummyPint(object):
"""
A `pint` input for testing
"""
def __init__(self):
self.v = False
class XEP0206TestCase(test_basic.TestCase):
"""
Tests for Punjab compatability with http://www.xmpp.org/extensions/xep-0206.html
"""
def testCreateSession(self):
def _testSessionCreate(res):
self.failUnless(res[0].localPrefixes['xmpp'] == NS_XMPP, 'xmpp namespace not defined')
self.failUnless(res[0].localPrefixes['stream'] == NS_FEATURES, 'stream namespace not defined')
self.failUnless(res[0].hasAttribute((NS_XMPP, 'version')), 'version not found')
BOSH_XML = """<body content='text/xml; charset=utf-8'
hold='1'
rid='1573741820'
to='localhost'
route='xmpp:127.0.0.1:%(server_port)i'
secure='true'
ver='1.6'
wait='60'
ack='1'
xml:lang='en'
xmlns='http://jabber.org/protocol/httpbind'/>
"""% { "server_port": self.server_port }
d = self.proxy.connect(BOSH_XML).addCallback(_testSessionCreate)
return d
class DeliveryFailureTestCase(XEP0206TestCase):
"""
Tests for the XEP0206 message delivery failure NACK feature.
"""
def setUp(self):
XEP0206TestCase.setUp(self)
self.xmlstream = DummyXmlStream()
self.session = session.Session(
DummyPint(),
{
'rid': 0,
'to': '',
'route': 'xmpp:127.0.0.1:8080',
}, # Dummy values to satisfy the constructor. Not needed in tests.
)
self.session.xmlstream = self.xmlstream
def tearDown(self):
del self.session
XEP0206TestCase.tearDown(self)
def test_skips_presence(self):
"""
Test that the NACK skips presence elements.
"""
sentinel = domish.Element((None, 'presence'))
self.session.elems.append(sentinel)
self.session.disconnect()
self.assertTrue(sentinel not in self.xmlstream.elements)
def test_sends_messages(self):
"""
Test that the NACK sends message elements.
"""
sentinel = domish.Element((None, 'message'))
self.session.elems.append(sentinel)
self.session.disconnect()
self.assertTrue(sentinel in self.xmlstream.elements)
def test_sends_iq(self):
"""
Test that the NACK sends iq elements.
"""
sentinel = domish.Element((None, 'iq'))
self.session.elems.append(sentinel)
self.session.disconnect()
self.assertTrue(sentinel in self.xmlstream.elements)
def test_errors_dont_bubble_up(self):
"""
Test that NACK failures don't tank the service
"""
def fail(*args, **kwargs):
raise Exception("You shouldn't see this.")
self.session._handle_missed_messages = fail
self.session.disconnect()