Rename to slixmpp
[slixmpp.git] / tests / test_stream_exceptions.py
blob049060e89b618dfed7da68436f23bbaa8fd08015
1 from slixmpp.xmlstream.matcher import MatchXPath
2 from slixmpp.xmlstream.handler import Callback
3 from slixmpp.exceptions import XMPPError
4 import unittest
5 from slixmpp.test import SlixTest
8 class TestStreamExceptions(SlixTest):
9 """
10 Test handling roster updates.
11 """
13 def tearDown(self):
14 self.stream_close()
16 def testExceptionReply(self):
17 """Test that raising an exception replies with the original stanza."""
19 def message(msg):
20 msg.reply()
21 msg['body'] = 'Body changed'
22 raise XMPPError(clear=False)
24 self.stream_start()
25 self.xmpp.add_event_handler('message', message)
27 self.recv("""
28 <message>
29 <body>This is going to cause an error.</body>
30 </message>
31 """)
33 self.send("""
34 <message type="error">
35 <body>This is going to cause an error.</body>
36 <error type="cancel" code="500">
37 <undefined-condition
38 xmlns="urn:ietf:params:xml:ns:xmpp-stanzas" />
39 </error>
40 </message>
41 """)
43 def testExceptionContinueWorking(self):
44 """Test that Slixmpp continues to respond after an XMPPError is raised."""
46 def message(msg):
47 msg.reply()
48 msg['body'] = 'Body changed'
49 raise XMPPError(clear=False)
51 self.stream_start()
52 self.xmpp.add_event_handler('message', message)
54 self.recv("""
55 <message>
56 <body>This is going to cause an error.</body>
57 </message>
58 """)
60 self.send("""
61 <message type="error">
62 <body>This is going to cause an error.</body>
63 <error type="cancel" code="500">
64 <undefined-condition
65 xmlns="urn:ietf:params:xml:ns:xmpp-stanzas" />
66 </error>
67 </message>
68 """)
70 self.recv("""
71 <message>
72 <body>This is going to cause an error.</body>
73 </message>
74 """)
76 self.send("""
77 <message type="error">
78 <body>This is going to cause an error.</body>
79 <error type="cancel" code="500">
80 <undefined-condition
81 xmlns="urn:ietf:params:xml:ns:xmpp-stanzas" />
82 </error>
83 </message>
84 """)
86 def testXMPPErrorException(self):
87 """Test raising an XMPPError exception."""
89 def message(msg):
90 raise XMPPError(condition='feature-not-implemented',
91 text="We don't do things that way here.",
92 etype='cancel',
93 extension='foo',
94 extension_ns='foo:error',
95 extension_args={'test': 'true'})
97 self.stream_start()
98 self.xmpp.add_event_handler('message', message)
100 self.recv("""
101 <message>
102 <body>This is going to cause an error.</body>
103 </message>
104 """)
106 self.send("""
107 <message type="error">
108 <error type="cancel" code="501">
109 <feature-not-implemented
110 xmlns="urn:ietf:params:xml:ns:xmpp-stanzas" />
111 <text xmlns="urn:ietf:params:xml:ns:xmpp-stanzas">
112 We don&apos;t do things that way here.
113 </text>
114 <foo xmlns="foo:error" test="true" />
115 </error>
116 </message>
117 """, use_values=False)
119 def testIqErrorException(self):
120 """Test using error exceptions with Iq stanzas."""
122 def handle_iq(iq):
123 raise XMPPError(condition='feature-not-implemented',
124 text="We don't do things that way here.",
125 etype='cancel',
126 clear=False)
128 self.stream_start()
129 self.xmpp.register_handler(
130 Callback(
131 'Test Iq',
132 MatchXPath('{%s}iq/{test}query' % self.xmpp.default_ns),
133 handle_iq))
135 self.recv("""
136 <iq type="get" id="0">
137 <query xmlns="test" />
138 </iq>
139 """)
141 self.send("""
142 <iq type="error" id="0">
143 <query xmlns="test" />
144 <error type="cancel" code="501">
145 <feature-not-implemented
146 xmlns="urn:ietf:params:xml:ns:xmpp-stanzas" />
147 <text xmlns="urn:ietf:params:xml:ns:xmpp-stanzas">
148 We don&apos;t do things that way here.
149 </text>
150 </error>
151 </iq>
152 """, use_values=False)
154 def testThreadedXMPPErrorException(self):
155 """Test raising an XMPPError exception in a threaded handler."""
157 def message(msg):
158 raise XMPPError(condition='feature-not-implemented',
159 text="We don't do things that way here.",
160 etype='cancel')
162 self.stream_start()
163 self.xmpp.add_event_handler('message', message,
164 threaded=True)
166 self.recv("""
167 <message>
168 <body>This is going to cause an error.</body>
169 </message>
170 """)
172 self.send("""
173 <message type="error">
174 <error type="cancel" code="501">
175 <feature-not-implemented
176 xmlns="urn:ietf:params:xml:ns:xmpp-stanzas" />
177 <text xmlns="urn:ietf:params:xml:ns:xmpp-stanzas">
178 We don&apos;t do things that way here.
179 </text>
180 </error>
181 </message>
182 """)
184 def testUnknownException(self):
185 """Test raising an generic exception in a threaded handler."""
187 raised_errors = []
189 def message(msg):
190 raise ValueError("Did something wrong")
192 def catch_error(*args, **kwargs):
193 raised_errors.append(True)
195 self.stream_start()
196 self.xmpp.exception = catch_error
197 self.xmpp.add_event_handler('message', message)
199 self.recv("""
200 <message>
201 <body>This is going to cause an error.</body>
202 </message>
203 """)
205 self.send("""
206 <message type="error">
207 <error type="cancel" code="500">
208 <undefined-condition
209 xmlns="urn:ietf:params:xml:ns:xmpp-stanzas" />
210 <text xmlns="urn:ietf:params:xml:ns:xmpp-stanzas">
211 Slixmpp got into trouble.
212 </text>
213 </error>
214 </message>
215 """)
217 self.assertEqual(raised_errors, [True], "Exception was not raised: %s" % raised_errors)
219 def testUnknownException(self):
220 """Test Slixmpp continues to respond after an unknown exception."""
222 raised_errors = []
224 def message(msg):
225 raise ValueError("Did something wrong")
227 def catch_error(*args, **kwargs):
228 raised_errors.append(True)
230 self.stream_start()
231 self.xmpp.exception = catch_error
232 self.xmpp.add_event_handler('message', message)
234 self.recv("""
235 <message>
236 <body>This is going to cause an error.</body>
237 </message>
238 """)
240 self.send("""
241 <message type="error">
242 <error type="cancel" code="500">
243 <undefined-condition
244 xmlns="urn:ietf:params:xml:ns:xmpp-stanzas" />
245 <text xmlns="urn:ietf:params:xml:ns:xmpp-stanzas">
246 Slixmpp got into trouble.
247 </text>
248 </error>
249 </message>
250 """)
252 self.recv("""
253 <message>
254 <body>This is going to cause an error.</body>
255 </message>
256 """)
258 self.send("""
259 <message type="error">
260 <error type="cancel" code="500">
261 <undefined-condition
262 xmlns="urn:ietf:params:xml:ns:xmpp-stanzas" />
263 <text xmlns="urn:ietf:params:xml:ns:xmpp-stanzas">
264 Slixmpp got into trouble.
265 </text>
266 </error>
267 </message>
268 """)
270 self.assertEqual(raised_errors, [True, True], "Exceptions were not raised: %s" % raised_errors)
273 suite = unittest.TestLoader().loadTestsFromTestCase(TestStreamExceptions)