2 # subunit: extensions to Python unittest to get test results from subprocesses.
3 # Copyright (C) 2005 Robert Collins <robertc@robertcollins.net>
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 2 of the License, or
8 # (at your option) any later version.
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 from StringIO import StringIO
28 class MockTestProtocolServerClient(object):
29 """A mock protocol server client to test callbacks."""
34 self.failure_calls = []
36 self.success_calls = []
37 super(MockTestProtocolServerClient, self).__init__()
39 def addError(self, test, error):
40 self.error_calls.append((test, error))
42 def addFailure(self, test, error):
43 self.failure_calls.append((test, error))
45 def addSuccess(self, test):
46 self.success_calls.append(test)
48 def stopTest(self, test):
49 self.end_calls.append(test)
51 def startTest(self, test):
52 self.start_calls.append(test)
54 except AttributeError:
55 MockTestProtocolServer = None
58 class TestMockTestProtocolServer(unittest.TestCase):
60 def test_start_test(self):
61 protocol = MockTestProtocolServerClient()
62 protocol.startTest(subunit.RemotedTestCase("test old mcdonald"))
63 self.assertEqual(protocol.start_calls,
64 [subunit.RemotedTestCase("test old mcdonald")])
65 self.assertEqual(protocol.end_calls, [])
66 self.assertEqual(protocol.error_calls, [])
67 self.assertEqual(protocol.failure_calls, [])
68 self.assertEqual(protocol.success_calls, [])
70 def test_add_error(self):
71 protocol = MockTestProtocolServerClient()
72 protocol.addError(subunit.RemotedTestCase("old mcdonald"),
73 subunit.RemoteError("omg it works"))
74 self.assertEqual(protocol.start_calls, [])
75 self.assertEqual(protocol.end_calls, [])
76 self.assertEqual(protocol.error_calls, [(
77 subunit.RemotedTestCase("old mcdonald"),
78 subunit.RemoteError("omg it works"))])
79 self.assertEqual(protocol.failure_calls, [])
80 self.assertEqual(protocol.success_calls, [])
82 def test_add_failure(self):
83 protocol = MockTestProtocolServerClient()
84 protocol.addFailure(subunit.RemotedTestCase("old mcdonald"),
85 subunit.RemoteError("omg it works"))
86 self.assertEqual(protocol.start_calls, [])
87 self.assertEqual(protocol.end_calls, [])
88 self.assertEqual(protocol.error_calls, [])
89 self.assertEqual(protocol.failure_calls, [
90 (subunit.RemotedTestCase("old mcdonald"),
91 subunit.RemoteError("omg it works"))])
92 self.assertEqual(protocol.success_calls, [])
94 def test_add_success(self):
95 protocol = MockTestProtocolServerClient()
96 protocol.addSuccess(subunit.RemotedTestCase("test old mcdonald"))
97 self.assertEqual(protocol.start_calls, [])
98 self.assertEqual(protocol.end_calls, [])
99 self.assertEqual(protocol.error_calls, [])
100 self.assertEqual(protocol.failure_calls, [])
101 self.assertEqual(protocol.success_calls,
102 [subunit.RemotedTestCase("test old mcdonald")])
104 def test_end_test(self):
105 protocol = MockTestProtocolServerClient()
106 protocol.stopTest(subunit.RemotedTestCase("test old mcdonald"))
107 self.assertEqual(protocol.end_calls,
108 [subunit.RemotedTestCase("test old mcdonald")])
109 self.assertEqual(protocol.error_calls, [])
110 self.assertEqual(protocol.failure_calls, [])
111 self.assertEqual(protocol.success_calls, [])
112 self.assertEqual(protocol.start_calls, [])
115 class TestTestImports(unittest.TestCase):
117 def test_imports(self):
118 from subunit import TestProtocolServer
119 from subunit import RemotedTestCase
120 from subunit import RemoteError
121 from subunit import ExecTestCase
122 from subunit import IsolatedTestCase
123 from subunit import TestProtocolClient
126 class TestTestProtocolServerPipe(unittest.TestCase):
128 def test_story(self):
129 client = unittest.TestResult()
130 protocol = subunit.TestProtocolServer(client)
131 pipe = StringIO("test old mcdonald\n"
132 "success old mcdonald\n"
134 "failure bing crosby [\n"
135 "foo.c:53:ERROR invalid state\n"
139 protocol.readFrom(pipe)
140 mcdonald = subunit.RemotedTestCase("old mcdonald")
141 bing = subunit.RemotedTestCase("bing crosby")
142 an_error = subunit.RemotedTestCase("an error")
143 self.assertEqual(client.errors,
144 [(an_error, 'RemoteException: \n\n')])
147 [(bing, "RemoteException: foo.c:53:ERROR invalid state\n\n")])
148 self.assertEqual(client.testsRun, 3)
151 class TestTestProtocolServerStartTest(unittest.TestCase):
154 self.client = MockTestProtocolServerClient()
155 self.protocol = subunit.TestProtocolServer(self.client)
157 def test_start_test(self):
158 self.protocol.lineReceived("test old mcdonald\n")
159 self.assertEqual(self.client.start_calls,
160 [subunit.RemotedTestCase("old mcdonald")])
162 def test_start_testing(self):
163 self.protocol.lineReceived("testing old mcdonald\n")
164 self.assertEqual(self.client.start_calls,
165 [subunit.RemotedTestCase("old mcdonald")])
167 def test_start_test_colon(self):
168 self.protocol.lineReceived("test: old mcdonald\n")
169 self.assertEqual(self.client.start_calls,
170 [subunit.RemotedTestCase("old mcdonald")])
172 def test_start_testing_colon(self):
173 self.protocol.lineReceived("testing: old mcdonald\n")
174 self.assertEqual(self.client.start_calls,
175 [subunit.RemotedTestCase("old mcdonald")])
178 class TestTestProtocolServerPassThrough(unittest.TestCase):
181 from StringIO import StringIO
182 self.stdout = StringIO()
183 self.test = subunit.RemotedTestCase("old mcdonald")
184 self.client = MockTestProtocolServerClient()
185 self.protocol = subunit.TestProtocolServer(self.client, self.stdout)
187 def keywords_before_test(self):
188 self.protocol.lineReceived("failure a\n")
189 self.protocol.lineReceived("failure: a\n")
190 self.protocol.lineReceived("error a\n")
191 self.protocol.lineReceived("error: a\n")
192 self.protocol.lineReceived("success a\n")
193 self.protocol.lineReceived("success: a\n")
194 self.protocol.lineReceived("successful a\n")
195 self.protocol.lineReceived("successful: a\n")
196 self.protocol.lineReceived("]\n")
197 self.assertEqual(self.stdout.getvalue(), "failure a\n"
207 def test_keywords_before_test(self):
208 self.keywords_before_test()
209 self.assertEqual(self.client.start_calls, [])
210 self.assertEqual(self.client.error_calls, [])
211 self.assertEqual(self.client.failure_calls, [])
212 self.assertEqual(self.client.success_calls, [])
214 def test_keywords_after_error(self):
215 self.protocol.lineReceived("test old mcdonald\n")
216 self.protocol.lineReceived("error old mcdonald\n")
217 self.keywords_before_test()
218 self.assertEqual(self.client.start_calls, [self.test])
219 self.assertEqual(self.client.end_calls, [self.test])
220 self.assertEqual(self.client.error_calls,
221 [(self.test, subunit.RemoteError(""))])
222 self.assertEqual(self.client.failure_calls, [])
223 self.assertEqual(self.client.success_calls, [])
225 def test_keywords_after_failure(self):
226 self.protocol.lineReceived("test old mcdonald\n")
227 self.protocol.lineReceived("failure old mcdonald\n")
228 self.keywords_before_test()
229 self.assertEqual(self.client.start_calls, [self.test])
230 self.assertEqual(self.client.end_calls, [self.test])
231 self.assertEqual(self.client.error_calls, [])
232 self.assertEqual(self.client.failure_calls,
233 [(self.test, subunit.RemoteError())])
234 self.assertEqual(self.client.success_calls, [])
236 def test_keywords_after_success(self):
237 self.protocol.lineReceived("test old mcdonald\n")
238 self.protocol.lineReceived("success old mcdonald\n")
239 self.keywords_before_test()
240 self.assertEqual(self.client.start_calls, [self.test])
241 self.assertEqual(self.client.end_calls, [self.test])
242 self.assertEqual(self.client.error_calls, [])
243 self.assertEqual(self.client.failure_calls, [])
244 self.assertEqual(self.client.success_calls, [self.test])
246 def test_keywords_after_test(self):
247 self.protocol.lineReceived("test old mcdonald\n")
248 self.protocol.lineReceived("test old mcdonald\n")
249 self.protocol.lineReceived("failure a\n")
250 self.protocol.lineReceived("failure: a\n")
251 self.protocol.lineReceived("error a\n")
252 self.protocol.lineReceived("error: a\n")
253 self.protocol.lineReceived("success a\n")
254 self.protocol.lineReceived("success: a\n")
255 self.protocol.lineReceived("successful a\n")
256 self.protocol.lineReceived("successful: a\n")
257 self.protocol.lineReceived("]\n")
258 self.protocol.lineReceived("failure old mcdonald\n")
259 self.assertEqual(self.stdout.getvalue(), "test old mcdonald\n"
269 self.assertEqual(self.client.start_calls, [self.test])
270 self.assertEqual(self.client.end_calls, [self.test])
271 self.assertEqual(self.client.failure_calls,
272 [(self.test, subunit.RemoteError())])
273 self.assertEqual(self.client.error_calls, [])
274 self.assertEqual(self.client.success_calls, [])
276 def test_keywords_during_failure(self):
277 self.protocol.lineReceived("test old mcdonald\n")
278 self.protocol.lineReceived("failure: old mcdonald [\n")
279 self.protocol.lineReceived("test old mcdonald\n")
280 self.protocol.lineReceived("failure a\n")
281 self.protocol.lineReceived("failure: a\n")
282 self.protocol.lineReceived("error a\n")
283 self.protocol.lineReceived("error: a\n")
284 self.protocol.lineReceived("success a\n")
285 self.protocol.lineReceived("success: a\n")
286 self.protocol.lineReceived("successful a\n")
287 self.protocol.lineReceived("successful: a\n")
288 self.protocol.lineReceived(" ]\n")
289 self.protocol.lineReceived("]\n")
290 self.assertEqual(self.stdout.getvalue(), "")
291 self.assertEqual(self.client.start_calls, [self.test])
292 self.assertEqual(self.client.failure_calls,
293 [(self.test, subunit.RemoteError("test old mcdonald\n"
303 self.assertEqual(self.client.end_calls, [self.test])
304 self.assertEqual(self.client.error_calls, [])
305 self.assertEqual(self.client.success_calls, [])
307 def test_stdout_passthrough(self):
308 """Lines received which cannot be interpreted as any protocol action
309 should be passed through to sys.stdout.
311 bytes = "randombytes\n"
312 self.protocol.lineReceived(bytes)
313 self.assertEqual(self.stdout.getvalue(), bytes)
316 class TestTestProtocolServerLostConnection(unittest.TestCase):
319 self.client = MockTestProtocolServerClient()
320 self.protocol = subunit.TestProtocolServer(self.client)
321 self.test = subunit.RemotedTestCase("old mcdonald")
323 def test_lost_connection_no_input(self):
324 self.protocol.lostConnection()
325 self.assertEqual(self.client.start_calls, [])
326 self.assertEqual(self.client.error_calls, [])
327 self.assertEqual(self.client.failure_calls, [])
328 self.assertEqual(self.client.success_calls, [])
330 def test_lost_connection_after_start(self):
331 self.protocol.lineReceived("test old mcdonald\n")
332 self.protocol.lostConnection()
333 self.assertEqual(self.client.start_calls, [self.test])
334 self.assertEqual(self.client.end_calls, [self.test])
335 self.assertEqual(self.client.error_calls, [
336 (self.test, subunit.RemoteError("lost connection during "
337 "test 'old mcdonald'"))])
338 self.assertEqual(self.client.failure_calls, [])
339 self.assertEqual(self.client.success_calls, [])
341 def test_lost_connected_after_error(self):
342 self.protocol.lineReceived("test old mcdonald\n")
343 self.protocol.lineReceived("error old mcdonald\n")
344 self.protocol.lostConnection()
345 self.assertEqual(self.client.start_calls, [self.test])
346 self.assertEqual(self.client.failure_calls, [])
347 self.assertEqual(self.client.end_calls, [self.test])
348 self.assertEqual(self.client.error_calls, [
349 (self.test, subunit.RemoteError(""))])
350 self.assertEqual(self.client.success_calls, [])
352 def test_lost_connection_during_error(self):
353 self.protocol.lineReceived("test old mcdonald\n")
354 self.protocol.lineReceived("error old mcdonald [\n")
355 self.protocol.lostConnection()
356 self.assertEqual(self.client.start_calls, [self.test])
357 self.assertEqual(self.client.end_calls, [self.test])
358 self.assertEqual(self.client.error_calls, [
359 (self.test, subunit.RemoteError("lost connection during error "
360 "report of test 'old mcdonald'"))])
361 self.assertEqual(self.client.failure_calls, [])
362 self.assertEqual(self.client.success_calls, [])
364 def test_lost_connected_after_failure(self):
365 self.protocol.lineReceived("test old mcdonald\n")
366 self.protocol.lineReceived("failure old mcdonald\n")
367 self.protocol.lostConnection()
368 test = subunit.RemotedTestCase("old mcdonald")
369 self.assertEqual(self.client.start_calls, [self.test])
370 self.assertEqual(self.client.end_calls, [self.test])
371 self.assertEqual(self.client.error_calls, [])
372 self.assertEqual(self.client.failure_calls,
373 [(self.test, subunit.RemoteError())])
374 self.assertEqual(self.client.success_calls, [])
376 def test_lost_connection_during_failure(self):
377 self.protocol.lineReceived("test old mcdonald\n")
378 self.protocol.lineReceived("failure old mcdonald [\n")
379 self.protocol.lostConnection()
380 self.assertEqual(self.client.start_calls, [self.test])
381 self.assertEqual(self.client.end_calls, [self.test])
382 self.assertEqual(self.client.error_calls,
384 subunit.RemoteError("lost connection during "
386 " of test 'old mcdonald'"))])
387 self.assertEqual(self.client.failure_calls, [])
388 self.assertEqual(self.client.success_calls, [])
390 def test_lost_connection_after_success(self):
391 self.protocol.lineReceived("test old mcdonald\n")
392 self.protocol.lineReceived("success old mcdonald\n")
393 self.protocol.lostConnection()
394 self.assertEqual(self.client.start_calls, [self.test])
395 self.assertEqual(self.client.end_calls, [self.test])
396 self.assertEqual(self.client.error_calls, [])
397 self.assertEqual(self.client.failure_calls, [])
398 self.assertEqual(self.client.success_calls, [self.test])
400 def test_lost_connection_during_skip(self):
401 self.protocol.lineReceived("test old mcdonald\n")
402 self.protocol.lineReceived("skip old mcdonald [\n")
403 self.protocol.lostConnection()
404 self.assertEqual(self.client.start_calls, [self.test])
405 self.assertEqual(self.client.end_calls, [self.test])
406 self.assertEqual(self.client.error_calls, [
407 (self.test, subunit.RemoteError("lost connection during skip "
408 "report of test 'old mcdonald'"))])
409 self.assertEqual(self.client.failure_calls, [])
410 self.assertEqual(self.client.success_calls, [])
412 def test_lost_connection_during_xfail(self):
413 self.protocol.lineReceived("test old mcdonald\n")
414 self.protocol.lineReceived("xfail old mcdonald [\n")
415 self.protocol.lostConnection()
416 self.assertEqual(self.client.start_calls, [self.test])
417 self.assertEqual(self.client.end_calls, [self.test])
418 self.assertEqual(self.client.error_calls, [
419 (self.test, subunit.RemoteError("lost connection during xfail "
420 "report of test 'old mcdonald'"))])
421 self.assertEqual(self.client.failure_calls, [])
422 self.assertEqual(self.client.success_calls, [])
424 def test_lost_connection_during_success(self):
425 self.protocol.lineReceived("test old mcdonald\n")
426 self.protocol.lineReceived("success old mcdonald [\n")
427 self.protocol.lostConnection()
428 self.assertEqual(self.client.start_calls, [self.test])
429 self.assertEqual(self.client.end_calls, [self.test])
430 self.assertEqual(self.client.error_calls, [
431 (self.test, subunit.RemoteError("lost connection during success "
432 "report of test 'old mcdonald'"))])
433 self.assertEqual(self.client.failure_calls, [])
434 self.assertEqual(self.client.success_calls, [])
437 class TestTestProtocolServerAddError(unittest.TestCase):
440 self.client = MockTestProtocolServerClient()
441 self.protocol = subunit.TestProtocolServer(self.client)
442 self.protocol.lineReceived("test mcdonalds farm\n")
443 self.test = subunit.RemotedTestCase("mcdonalds farm")
445 def simple_error_keyword(self, keyword):
446 self.protocol.lineReceived("%s mcdonalds farm\n" % keyword)
447 self.assertEqual(self.client.start_calls, [self.test])
448 self.assertEqual(self.client.end_calls, [self.test])
449 self.assertEqual(self.client.error_calls, [
450 (self.test, subunit.RemoteError(""))])
451 self.assertEqual(self.client.failure_calls, [])
453 def test_simple_error(self):
454 self.simple_error_keyword("error")
456 def test_simple_error_colon(self):
457 self.simple_error_keyword("error:")
459 def test_error_empty_message(self):
460 self.protocol.lineReceived("error mcdonalds farm [\n")
461 self.protocol.lineReceived("]\n")
462 self.assertEqual(self.client.start_calls, [self.test])
463 self.assertEqual(self.client.end_calls, [self.test])
464 self.assertEqual(self.client.error_calls, [
465 (self.test, subunit.RemoteError(""))])
466 self.assertEqual(self.client.failure_calls, [])
468 def error_quoted_bracket(self, keyword):
469 self.protocol.lineReceived("%s mcdonalds farm [\n" % keyword)
470 self.protocol.lineReceived(" ]\n")
471 self.protocol.lineReceived("]\n")
472 self.assertEqual(self.client.start_calls, [self.test])
473 self.assertEqual(self.client.end_calls, [self.test])
474 self.assertEqual(self.client.error_calls, [
475 (self.test, subunit.RemoteError("]\n"))])
476 self.assertEqual(self.client.failure_calls, [])
478 def test_error_quoted_bracket(self):
479 self.error_quoted_bracket("error")
481 def test_error_colon_quoted_bracket(self):
482 self.error_quoted_bracket("error:")
485 class TestTestProtocolServerAddFailure(unittest.TestCase):
488 self.client = MockTestProtocolServerClient()
489 self.protocol = subunit.TestProtocolServer(self.client)
490 self.protocol.lineReceived("test mcdonalds farm\n")
491 self.test = subunit.RemotedTestCase("mcdonalds farm")
493 def simple_failure_keyword(self, keyword):
494 self.protocol.lineReceived("%s mcdonalds farm\n" % keyword)
495 self.assertEqual(self.client.start_calls, [self.test])
496 self.assertEqual(self.client.end_calls, [self.test])
497 self.assertEqual(self.client.error_calls, [])
498 self.assertEqual(self.client.failure_calls,
499 [(self.test, subunit.RemoteError())])
501 def test_simple_failure(self):
502 self.simple_failure_keyword("failure")
504 def test_simple_failure_colon(self):
505 self.simple_failure_keyword("failure:")
507 def test_failure_empty_message(self):
508 self.protocol.lineReceived("failure mcdonalds farm [\n")
509 self.protocol.lineReceived("]\n")
510 self.assertEqual(self.client.start_calls, [self.test])
511 self.assertEqual(self.client.end_calls, [self.test])
512 self.assertEqual(self.client.error_calls, [])
513 self.assertEqual(self.client.failure_calls,
514 [(self.test, subunit.RemoteError())])
516 def failure_quoted_bracket(self, keyword):
517 self.protocol.lineReceived("%s mcdonalds farm [\n" % keyword)
518 self.protocol.lineReceived(" ]\n")
519 self.protocol.lineReceived("]\n")
520 self.assertEqual(self.client.start_calls, [self.test])
521 self.assertEqual(self.client.end_calls, [self.test])
522 self.assertEqual(self.client.error_calls, [])
523 self.assertEqual(self.client.failure_calls,
524 [(self.test, subunit.RemoteError("]\n"))])
526 def test_failure_quoted_bracket(self):
527 self.failure_quoted_bracket("failure")
529 def test_failure_colon_quoted_bracket(self):
530 self.failure_quoted_bracket("failure:")
533 class TestTestProtocolServerAddxFail(unittest.TestCase):
534 """Tests for the xfail keyword.
536 In Python this thunks through to Success due to stdlib limitations (see
541 """Setup a test object ready to be xfailed."""
542 self.client = MockTestProtocolServerClient()
543 self.protocol = subunit.TestProtocolServer(self.client)
544 self.protocol.lineReceived("test mcdonalds farm\n")
545 self.test = self.client.start_calls[-1]
547 def simple_xfail_keyword(self, keyword):
548 self.protocol.lineReceived("%s mcdonalds farm\n" % keyword)
549 self.assertEqual(self.client.start_calls, [self.test])
550 self.assertEqual(self.client.end_calls, [self.test])
551 self.assertEqual(self.client.error_calls, [])
552 self.assertEqual(self.client.failure_calls, [])
553 self.assertEqual(self.client.success_calls, [self.test])
555 def test_simple_xfail(self):
556 self.simple_xfail_keyword("xfail")
558 def test_simple_xfail_colon(self):
559 self.simple_xfail_keyword("xfail:")
561 def test_xfail_empty_message(self):
562 self.protocol.lineReceived("xfail mcdonalds farm [\n")
563 self.protocol.lineReceived("]\n")
564 self.assertEqual(self.client.start_calls, [self.test])
565 self.assertEqual(self.client.end_calls, [self.test])
566 self.assertEqual(self.client.error_calls, [])
567 self.assertEqual(self.client.failure_calls, [])
568 self.assertEqual(self.client.success_calls, [self.test])
570 def xfail_quoted_bracket(self, keyword):
571 # This tests it is accepted, but cannot test it is used today, because
572 # of not having a way to expose it in Python so far.
573 self.protocol.lineReceived("%s mcdonalds farm [\n" % keyword)
574 self.protocol.lineReceived(" ]\n")
575 self.protocol.lineReceived("]\n")
576 self.assertEqual(self.client.start_calls, [self.test])
577 self.assertEqual(self.client.end_calls, [self.test])
578 self.assertEqual(self.client.error_calls, [])
579 self.assertEqual(self.client.failure_calls, [])
580 self.assertEqual(self.client.success_calls, [self.test])
582 def test_xfail_quoted_bracket(self):
583 self.xfail_quoted_bracket("xfail")
585 def test_xfail_colon_quoted_bracket(self):
586 self.xfail_quoted_bracket("xfail:")
589 class TestTestProtocolServerAddSkip(unittest.TestCase):
590 """Tests for the skip keyword.
592 In Python this thunks through to Success due to stdlib limitations. (See
597 """Setup a test object ready to be skipped."""
598 self.client = MockTestProtocolServerClient()
599 self.protocol = subunit.TestProtocolServer(self.client)
600 self.protocol.lineReceived("test mcdonalds farm\n")
601 self.test = self.client.start_calls[-1]
603 def simple_skip_keyword(self, keyword):
604 self.protocol.lineReceived("%s mcdonalds farm\n" % keyword)
605 self.assertEqual(self.client.start_calls, [self.test])
606 self.assertEqual(self.client.end_calls, [self.test])
607 self.assertEqual(self.client.error_calls, [])
608 self.assertEqual(self.client.failure_calls, [])
609 self.assertEqual(self.client.success_calls, [self.test])
611 def test_simple_skip(self):
612 self.simple_skip_keyword("skip")
614 def test_simple_skip_colon(self):
615 self.simple_skip_keyword("skip:")
617 def test_skip_empty_message(self):
618 self.protocol.lineReceived("skip mcdonalds farm [\n")
619 self.protocol.lineReceived("]\n")
620 self.assertEqual(self.client.start_calls, [self.test])
621 self.assertEqual(self.client.end_calls, [self.test])
622 self.assertEqual(self.client.error_calls, [])
623 self.assertEqual(self.client.failure_calls, [])
624 self.assertEqual(self.client.success_calls, [self.test])
626 def skip_quoted_bracket(self, keyword):
627 # This tests it is accepted, but cannot test it is used today, because
628 # of not having a way to expose it in Python so far.
629 self.protocol.lineReceived("%s mcdonalds farm [\n" % keyword)
630 self.protocol.lineReceived(" ]\n")
631 self.protocol.lineReceived("]\n")
632 self.assertEqual(self.client.start_calls, [self.test])
633 self.assertEqual(self.client.end_calls, [self.test])
634 self.assertEqual(self.client.error_calls, [])
635 self.assertEqual(self.client.failure_calls, [])
636 self.assertEqual(self.client.success_calls, [self.test])
638 def test_skip_quoted_bracket(self):
639 self.skip_quoted_bracket("skip")
641 def test_skip_colon_quoted_bracket(self):
642 self.skip_quoted_bracket("skip:")
645 class TestTestProtocolServerAddSuccess(unittest.TestCase):
648 self.client = MockTestProtocolServerClient()
649 self.protocol = subunit.TestProtocolServer(self.client)
650 self.protocol.lineReceived("test mcdonalds farm\n")
651 self.test = subunit.RemotedTestCase("mcdonalds farm")
653 def simple_success_keyword(self, keyword):
654 self.protocol.lineReceived("%s mcdonalds farm\n" % keyword)
655 self.assertEqual(self.client.start_calls, [self.test])
656 self.assertEqual(self.client.end_calls, [self.test])
657 self.assertEqual(self.client.error_calls, [])
658 self.assertEqual(self.client.success_calls, [self.test])
660 def test_simple_success(self):
661 self.simple_success_keyword("failure")
663 def test_simple_success_colon(self):
664 self.simple_success_keyword("failure:")
666 def test_simple_success(self):
667 self.simple_success_keyword("successful")
669 def test_simple_success_colon(self):
670 self.simple_success_keyword("successful:")
672 def test_success_empty_message(self):
673 self.protocol.lineReceived("success mcdonalds farm [\n")
674 self.protocol.lineReceived("]\n")
675 self.assertEqual(self.client.start_calls, [self.test])
676 self.assertEqual(self.client.end_calls, [self.test])
677 self.assertEqual(self.client.error_calls, [])
678 self.assertEqual(self.client.failure_calls, [])
679 self.assertEqual(self.client.success_calls, [self.test])
681 def success_quoted_bracket(self, keyword):
682 # This tests it is accepted, but cannot test it is used today, because
683 # of not having a way to expose it in Python so far.
684 self.protocol.lineReceived("%s mcdonalds farm [\n" % keyword)
685 self.protocol.lineReceived(" ]\n")
686 self.protocol.lineReceived("]\n")
687 self.assertEqual(self.client.start_calls, [self.test])
688 self.assertEqual(self.client.end_calls, [self.test])
689 self.assertEqual(self.client.error_calls, [])
690 self.assertEqual(self.client.failure_calls, [])
691 self.assertEqual(self.client.success_calls, [self.test])
693 def test_success_quoted_bracket(self):
694 self.success_quoted_bracket("success")
696 def test_success_colon_quoted_bracket(self):
697 self.success_quoted_bracket("success:")
700 class TestTestProtocolServerStreamTags(unittest.TestCase):
701 """Test managing tags on the protocol level."""
704 self.client = MockTestProtocolServerClient()
705 self.protocol = subunit.TestProtocolServer(self.client)
707 def test_initial_tags(self):
708 self.protocol.lineReceived("tags: foo bar:baz quux\n")
709 self.assertEqual(set(["foo", "bar:baz", "quux"]),
712 def test_minus_removes_tags(self):
713 self.protocol.lineReceived("tags: foo bar\n")
714 self.protocol.lineReceived("tags: -bar quux\n")
715 self.assertEqual(set(["foo", "quux"]),
718 def test_tags_get_set_on_test_no_tags(self):
719 self.protocol.lineReceived("test mcdonalds farm\n")
720 test = self.client.start_calls[-1]
721 self.assertEqual(set(), test.tags)
723 def test_tags_get_set_on_test_protocol_tags_only(self):
724 self.protocol.lineReceived("tags: foo bar\n")
725 self.protocol.lineReceived("test mcdonalds farm\n")
726 test = self.client.start_calls[-1]
727 self.assertEqual(set(["foo", "bar"]), test.tags)
729 def test_tags_get_set_on_test_simple(self):
730 self.protocol.lineReceived("test mcdonalds farm\n")
731 test = self.client.start_calls[-1]
732 self.protocol.lineReceived("tags: foo bar\n")
733 self.assertEqual(set(["foo", "bar"]), test.tags)
734 self.assertEqual(set(), self.protocol.tags)
736 def test_tags_get_set_on_test_minus_removes(self):
737 self.protocol.lineReceived("test mcdonalds farm\n")
738 test = self.client.start_calls[-1]
739 self.protocol.lineReceived("tags: foo bar\n")
740 self.protocol.lineReceived("tags: -bar quux\n")
741 self.assertEqual(set(["foo", "quux"]), test.tags)
742 self.assertEqual(set(), self.protocol.tags)
744 def test_test_tags_inherit_protocol_tags(self):
745 self.protocol.lineReceived("tags: foo bar\n")
746 self.protocol.lineReceived("test mcdonalds farm\n")
747 test = self.client.start_calls[-1]
748 self.protocol.lineReceived("tags: -bar quux\n")
749 self.assertEqual(set(["foo", "quux"]), test.tags)
750 self.assertEqual(set(["foo", "bar"]), self.protocol.tags)
753 class TestTestProtocolServerStreamTime(unittest.TestCase):
754 """Test managing time information at the protocol level."""
757 self.client = MockTestProtocolServerClient()
758 self.stream = StringIO()
759 self.protocol = subunit.TestProtocolServer(self.client,
762 def test_time_accepted(self):
763 self.protocol.lineReceived("time: 2001-12-12 12:59:59Z\n")
764 self.assertEqual("", self.stream.getvalue())
767 class TestRemotedTestCase(unittest.TestCase):
769 def test_simple(self):
770 test = subunit.RemotedTestCase("A test description")
771 self.assertRaises(NotImplementedError, test.setUp)
772 self.assertRaises(NotImplementedError, test.tearDown)
773 self.assertEqual("A test description",
774 test.shortDescription())
775 self.assertEqual("subunit.RemotedTestCase.A test description",
777 self.assertEqual("A test description (subunit.RemotedTestCase)", "%s" % test)
778 self.assertEqual("<subunit.RemotedTestCase description="
779 "'A test description'>", "%r" % test)
780 result = unittest.TestResult()
782 self.assertEqual([(test, "RemoteException: "
783 "Cannot run RemotedTestCases.\n\n")],
785 self.assertEqual(1, result.testsRun)
786 another_test = subunit.RemotedTestCase("A test description")
787 self.assertEqual(test, another_test)
788 different_test = subunit.RemotedTestCase("ofo")
789 self.assertNotEqual(test, different_test)
790 self.assertNotEqual(another_test, different_test)
793 class TestRemoteError(unittest.TestCase):
796 error = subunit.RemoteError("Something went wrong")
797 another_error = subunit.RemoteError("Something went wrong")
798 different_error = subunit.RemoteError("boo!")
799 self.assertEqual(error, another_error)
800 self.assertNotEqual(error, different_error)
801 self.assertNotEqual(different_error, another_error)
803 def test_empty_constructor(self):
804 self.assertEqual(subunit.RemoteError(), subunit.RemoteError(""))
807 class TestExecTestCase(unittest.TestCase):
809 class SampleExecTestCase(subunit.ExecTestCase):
811 def test_sample_method(self):
812 """sample-script.py"""
813 # the sample script runs three tests, one each
814 # that fails, errors and succeeds
817 def test_construct(self):
818 test = self.SampleExecTestCase("test_sample_method")
819 self.assertEqual(test.script,
820 subunit.join_dir(__file__, 'sample-script.py'))
823 runner = MockTestProtocolServerClient()
824 test = self.SampleExecTestCase("test_sample_method")
826 mcdonald = subunit.RemotedTestCase("old mcdonald")
827 bing = subunit.RemotedTestCase("bing crosby")
828 an_error = subunit.RemotedTestCase("an error")
829 self.assertEqual(runner.error_calls,
830 [(an_error, subunit.RemoteError())])
831 self.assertEqual(runner.failure_calls,
834 "foo.c:53:ERROR invalid state\n"))])
835 self.assertEqual(runner.start_calls, [mcdonald, bing, an_error])
836 self.assertEqual(runner.end_calls, [mcdonald, bing, an_error])
838 def test_debug(self):
839 test = self.SampleExecTestCase("test_sample_method")
842 def test_count_test_cases(self):
843 """TODO run the child process and count responses to determine the count."""
845 def test_join_dir(self):
846 sibling = subunit.join_dir(__file__, 'foo')
847 expected = '%s/foo' % (os.path.split(__file__)[0],)
848 self.assertEqual(sibling, expected)
851 class DoExecTestCase(subunit.ExecTestCase):
853 def test_working_script(self):
854 """sample-two-script.py"""
857 class TestIsolatedTestCase(unittest.TestCase):
859 class SampleIsolatedTestCase(subunit.IsolatedTestCase):
866 TestIsolatedTestCase.SampleIsolatedTestCase.SETUP = True
869 TestIsolatedTestCase.SampleIsolatedTestCase.TEARDOWN = True
871 def test_sets_global_state(self):
872 TestIsolatedTestCase.SampleIsolatedTestCase.TEST = True
875 def test_construct(self):
876 test = self.SampleIsolatedTestCase("test_sets_global_state")
879 result = unittest.TestResult()
880 test = self.SampleIsolatedTestCase("test_sets_global_state")
882 self.assertEqual(result.testsRun, 1)
883 self.assertEqual(self.SampleIsolatedTestCase.SETUP, False)
884 self.assertEqual(self.SampleIsolatedTestCase.TEARDOWN, False)
885 self.assertEqual(self.SampleIsolatedTestCase.TEST, False)
887 def test_debug(self):
889 #test = self.SampleExecTestCase("test_sample_method")
893 class TestIsolatedTestSuite(unittest.TestCase):
895 class SampleTestToIsolate(unittest.TestCase):
902 TestIsolatedTestSuite.SampleTestToIsolate.SETUP = True
905 TestIsolatedTestSuite.SampleTestToIsolate.TEARDOWN = True
907 def test_sets_global_state(self):
908 TestIsolatedTestSuite.SampleTestToIsolate.TEST = True
911 def test_construct(self):
912 suite = subunit.IsolatedTestSuite()
915 result = unittest.TestResult()
916 suite = subunit.IsolatedTestSuite()
917 sub_suite = unittest.TestSuite()
918 sub_suite.addTest(self.SampleTestToIsolate("test_sets_global_state"))
919 sub_suite.addTest(self.SampleTestToIsolate("test_sets_global_state"))
920 suite.addTest(sub_suite)
921 suite.addTest(self.SampleTestToIsolate("test_sets_global_state"))
923 self.assertEqual(result.testsRun, 3)
924 self.assertEqual(self.SampleTestToIsolate.SETUP, False)
925 self.assertEqual(self.SampleTestToIsolate.TEARDOWN, False)
926 self.assertEqual(self.SampleTestToIsolate.TEST, False)
929 class TestTestProtocolClient(unittest.TestCase):
933 self.protocol = subunit.TestProtocolClient(self.io)
934 self.test = TestTestProtocolClient("test_start_test")
937 def test_start_test(self):
938 """Test startTest on a TestProtocolClient."""
939 self.protocol.startTest(self.test)
940 self.assertEqual(self.io.getvalue(), "test: %s\n" % self.test.id())
942 def test_stop_test(self):
943 """Test stopTest on a TestProtocolClient."""
944 self.protocol.stopTest(self.test)
945 self.assertEqual(self.io.getvalue(), "")
947 def test_add_success(self):
948 """Test addSuccess on a TestProtocolClient."""
949 self.protocol.addSuccess(self.test)
951 self.io.getvalue(), "successful: %s\n" % self.test.id())
953 def test_add_failure(self):
954 """Test addFailure on a TestProtocolClient."""
955 self.protocol.addFailure(
956 self.test, subunit.RemoteError("boo qux"))
959 'failure: %s [\nRemoteException: boo qux\n]\n' % self.test.id())
961 def test_add_error(self):
962 """Test stopTest on a TestProtocolClient."""
963 self.protocol.addError(
964 self.test, subunit.RemoteError("phwoar crikey"))
968 "RemoteException: phwoar crikey\n"
969 "]\n" % self.test.id())
973 loader = subunit.tests.TestUtil.TestLoader()
974 result = loader.loadTestsFromName(__name__)