~ubuntu-branches/ubuntu/vivid/samba/vivid

« back to all changes in this revision

Viewing changes to lib/subunit/python/subunit/tests/test_test_protocol.py

  • Committer: Package Import Robot
  • Author(s): Chuck Short
  • Date: 2011-12-21 13:18:04 UTC
  • mfrom: (0.39.21 sid)
  • Revision ID: package-import@ubuntu.com-20111221131804-xtlr39wx6njehxxr
Tags: 2:3.6.1-3ubuntu1
* Merge from Debian testing.  Remaining changes:
  + debian/patches/VERSION.patch:
    - set SAMBA_VERSION_SUFFIX to Ubuntu.
  + debian/patches/error-trans.fix-276472:
    - Add the translation of Unix Error code -ENOTSUP to NT Error Code
    - NT_STATUS_NOT_SUPPORTED to prevent the Permission denied error.
  + debian/smb.conf:
    - add "(Samba, Ubuntu)" to server string.
    - comment out the default [homes] share, and add a comment about
      "valid users = %S" to show users how to restrict access to
      \\server\username to only username.
    - Set 'usershare allow guests', so that usershare admins are 
      allowed to create public shares in addition to authenticated
      ones.
    - add map to guest = Bad user, maps bad username to guest access.
  + debian/samba-common.config:
    - Do not change priority to high if dhclient3 is installed.
    - Use priority medium instead of high for the workgroup question.
  + debian/control:
    - Don't build against or suggest ctdb.
    - Add dependency on samba-common-bin to samba.
  + Add ufw integration:
    - Created debian/samba.ufw.profile
    - debian/rules, debian/samba.dirs, debian/samba.files: install
      profile
    - debian/control: have samba suggest ufw
  + Add apport hook:
    - Created debian/source_samba.py.
    - debian/rules, debian/samba.dirs, debian/samba-common-bin.files: install
  + Switch to upstart:
    - Add debian/samba.{nmbd,smbd}.upstart.
  + debian/samba.logrotate, debian/samba-common.dhcp, debian/samba.if-up:
    - Make them upstart compatible
  + debian/samba.postinst: 
    - Avoid scary pdbedit warnings on first import.
  + debian/samba-common.postinst: Add more informative error message for
    the case where smb.conf was manually deleted
  + debian/patches/fix-debuglevel-name-conflict.patch: don't use 'debug_level'
    as a global variable name in an NSS module 
  + Dropped:
    - debian/patches/error-trans.fix-276472
    - debian/patches/fix-debuglevel-name-conflict.patch

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#
2
 
#  subunit: extensions to python unittest to get test results from subprocesses.
 
2
#  subunit: extensions to Python unittest to get test results from subprocesses.
3
3
#  Copyright (C) 2005  Robert Collins <robertc@robertcollins.net>
4
4
#
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.
9
 
#
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.
14
 
#
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
 
5
#  Licensed under either the Apache License, Version 2.0 or the BSD 3-clause
 
6
#  license at the users choice. A copy of both licenses are available in the
 
7
#  project source as Apache-2.0 and BSD. You may not use this file except in
 
8
#  compliance with one of these two licences.
 
9
#  
 
10
#  Unless required by applicable law or agreed to in writing, software
 
11
#  distributed under these licenses is distributed on an "AS IS" BASIS, WITHOUT
 
12
#  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
 
13
#  license you chose for the specific language governing permissions and
 
14
#  limitations under that license.
18
15
#
19
16
 
 
17
import datetime
20
18
import unittest
21
19
from StringIO import StringIO
22
20
import os
 
21
import sys
 
22
 
 
23
from testtools.content import Content, TracebackContent
 
24
from testtools.content_type import ContentType
 
25
from testtools.tests.helpers import (
 
26
    Python26TestResult,
 
27
    Python27TestResult,
 
28
    ExtendedTestResult,
 
29
    )
 
30
 
23
31
import subunit
24
 
import sys
25
 
 
26
 
try:
27
 
    class MockTestProtocolServerClient(object):
28
 
        """A mock protocol server client to test callbacks."""
29
 
 
30
 
        def __init__(self):
31
 
            self.end_calls = []
32
 
            self.error_calls = []
33
 
            self.failure_calls = []
34
 
            self.start_calls = []
35
 
            self.success_calls = []
36
 
            super(MockTestProtocolServerClient, self).__init__()
37
 
 
38
 
        def addError(self, test, error):
39
 
            self.error_calls.append((test, error))
40
 
 
41
 
        def addFailure(self, test, error):
42
 
            self.failure_calls.append((test, error))
43
 
 
44
 
        def addSuccess(self, test):
45
 
            self.success_calls.append(test)
46
 
 
47
 
        def stopTest(self, test):
48
 
            self.end_calls.append(test)
49
 
 
50
 
        def startTest(self, test):
51
 
            self.start_calls.append(test)
52
 
 
53
 
except AttributeError:
54
 
    MockTestProtocolServer = None
55
 
 
56
 
 
57
 
class TestMockTestProtocolServer(unittest.TestCase):
58
 
 
59
 
    def test_start_test(self):
60
 
        protocol = MockTestProtocolServerClient()
61
 
        protocol.startTest(subunit.RemotedTestCase("test old mcdonald"))
62
 
        self.assertEqual(protocol.start_calls,
63
 
                         [subunit.RemotedTestCase("test old mcdonald")])
64
 
        self.assertEqual(protocol.end_calls, [])
65
 
        self.assertEqual(protocol.error_calls, [])
66
 
        self.assertEqual(protocol.failure_calls, [])
67
 
        self.assertEqual(protocol.success_calls, [])
68
 
 
69
 
    def test_add_error(self):
70
 
        protocol = MockTestProtocolServerClient()
71
 
        protocol.addError(subunit.RemotedTestCase("old mcdonald"),
72
 
                          subunit.RemoteError("omg it works"))
73
 
        self.assertEqual(protocol.start_calls, [])
74
 
        self.assertEqual(protocol.end_calls, [])
75
 
        self.assertEqual(protocol.error_calls, [(
76
 
                            subunit.RemotedTestCase("old mcdonald"),
77
 
                            subunit.RemoteError("omg it works"))])
78
 
        self.assertEqual(protocol.failure_calls, [])
79
 
        self.assertEqual(protocol.success_calls, [])
80
 
 
81
 
    def test_add_failure(self):
82
 
        protocol = MockTestProtocolServerClient()
83
 
        protocol.addFailure(subunit.RemotedTestCase("old mcdonald"),
84
 
                            subunit.RemoteError("omg it works"))
85
 
        self.assertEqual(protocol.start_calls, [])
86
 
        self.assertEqual(protocol.end_calls, [])
87
 
        self.assertEqual(protocol.error_calls, [])
88
 
        self.assertEqual(protocol.failure_calls, [
89
 
                            (subunit.RemotedTestCase("old mcdonald"),
90
 
                             subunit.RemoteError("omg it works"))])
91
 
        self.assertEqual(protocol.success_calls, [])
92
 
 
93
 
    def test_add_success(self):
94
 
        protocol = MockTestProtocolServerClient()
95
 
        protocol.addSuccess(subunit.RemotedTestCase("test old mcdonald"))
96
 
        self.assertEqual(protocol.start_calls, [])
97
 
        self.assertEqual(protocol.end_calls, [])
98
 
        self.assertEqual(protocol.error_calls, [])
99
 
        self.assertEqual(protocol.failure_calls, [])
100
 
        self.assertEqual(protocol.success_calls,
101
 
                         [subunit.RemotedTestCase("test old mcdonald")])
102
 
 
103
 
    def test_end_test(self):
104
 
        protocol = MockTestProtocolServerClient()
105
 
        protocol.stopTest(subunit.RemotedTestCase("test old mcdonald"))
106
 
        self.assertEqual(protocol.end_calls,
107
 
                         [subunit.RemotedTestCase("test old mcdonald")])
108
 
        self.assertEqual(protocol.error_calls, [])
109
 
        self.assertEqual(protocol.failure_calls, [])
110
 
        self.assertEqual(protocol.success_calls, [])
111
 
        self.assertEqual(protocol.start_calls, [])
 
32
from subunit import _remote_exception_str
 
33
import subunit.iso8601 as iso8601
112
34
 
113
35
 
114
36
class TestTestImports(unittest.TestCase):
115
37
 
116
38
    def test_imports(self):
 
39
        from subunit import DiscardStream
117
40
        from subunit import TestProtocolServer
118
41
        from subunit import RemotedTestCase
119
42
        from subunit import RemoteError
120
43
        from subunit import ExecTestCase
121
44
        from subunit import IsolatedTestCase
122
45
        from subunit import TestProtocolClient
123
 
 
 
46
        from subunit import ProtocolTestCase
 
47
 
 
48
 
 
49
class TestDiscardStream(unittest.TestCase):
 
50
 
 
51
    def test_write(self):
 
52
        subunit.DiscardStream().write("content")
 
53
 
 
54
 
 
55
class TestProtocolServerForward(unittest.TestCase):
 
56
 
 
57
    def test_story(self):
 
58
        client = unittest.TestResult()
 
59
        out = StringIO()
 
60
        protocol = subunit.TestProtocolServer(client, forward_stream=out)
 
61
        pipe = StringIO("test old mcdonald\n"
 
62
                        "success old mcdonald\n")
 
63
        protocol.readFrom(pipe)
 
64
        mcdonald = subunit.RemotedTestCase("old mcdonald")
 
65
        self.assertEqual(client.testsRun, 1)
 
66
        self.assertEqual(pipe.getvalue(), out.getvalue())
 
67
 
 
68
    def test_not_command(self):
 
69
        client = unittest.TestResult()
 
70
        out = StringIO()
 
71
        protocol = subunit.TestProtocolServer(client,
 
72
            stream=subunit.DiscardStream(), forward_stream=out)
 
73
        pipe = StringIO("success old mcdonald\n")
 
74
        protocol.readFrom(pipe)
 
75
        self.assertEqual(client.testsRun, 0)
 
76
        self.assertEqual("", out.getvalue())
 
77
        
124
78
 
125
79
class TestTestProtocolServerPipe(unittest.TestCase):
126
80
 
140
94
        bing = subunit.RemotedTestCase("bing crosby")
141
95
        an_error = subunit.RemotedTestCase("an error")
142
96
        self.assertEqual(client.errors,
143
 
                         [(an_error, 'RemoteException: \n\n')])
 
97
                         [(an_error, _remote_exception_str + '\n')])
144
98
        self.assertEqual(
145
99
            client.failures,
146
 
            [(bing, "RemoteException: foo.c:53:ERROR invalid state\n\n")])
 
100
            [(bing, _remote_exception_str + ": Text attachment: traceback\n"
 
101
                "------------\nfoo.c:53:ERROR invalid state\n"
 
102
                "------------\n\n")])
147
103
        self.assertEqual(client.testsRun, 3)
148
104
 
 
105
    def test_non_test_characters_forwarded_immediately(self):
 
106
        pass
 
107
 
149
108
 
150
109
class TestTestProtocolServerStartTest(unittest.TestCase):
151
110
 
152
111
    def setUp(self):
153
 
        self.client = MockTestProtocolServerClient()
 
112
        self.client = Python26TestResult()
154
113
        self.protocol = subunit.TestProtocolServer(self.client)
155
114
 
156
115
    def test_start_test(self):
157
116
        self.protocol.lineReceived("test old mcdonald\n")
158
 
        self.assertEqual(self.client.start_calls,
159
 
                         [subunit.RemotedTestCase("old mcdonald")])
 
117
        self.assertEqual(self.client._events,
 
118
            [('startTest', subunit.RemotedTestCase("old mcdonald"))])
160
119
 
161
120
    def test_start_testing(self):
162
121
        self.protocol.lineReceived("testing old mcdonald\n")
163
 
        self.assertEqual(self.client.start_calls,
164
 
                         [subunit.RemotedTestCase("old mcdonald")])
 
122
        self.assertEqual(self.client._events,
 
123
            [('startTest', subunit.RemotedTestCase("old mcdonald"))])
165
124
 
166
125
    def test_start_test_colon(self):
167
126
        self.protocol.lineReceived("test: old mcdonald\n")
168
 
        self.assertEqual(self.client.start_calls,
169
 
                         [subunit.RemotedTestCase("old mcdonald")])
 
127
        self.assertEqual(self.client._events,
 
128
            [('startTest', subunit.RemotedTestCase("old mcdonald"))])
 
129
 
 
130
    def test_indented_test_colon_ignored(self):
 
131
        self.protocol.lineReceived(" test: old mcdonald\n")
 
132
        self.assertEqual([], self.client._events)
170
133
 
171
134
    def test_start_testing_colon(self):
172
135
        self.protocol.lineReceived("testing: old mcdonald\n")
173
 
        self.assertEqual(self.client.start_calls,
174
 
                         [subunit.RemotedTestCase("old mcdonald")])
 
136
        self.assertEqual(self.client._events,
 
137
            [('startTest', subunit.RemotedTestCase("old mcdonald"))])
175
138
 
176
139
 
177
140
class TestTestProtocolServerPassThrough(unittest.TestCase):
178
141
 
179
142
    def setUp(self):
180
 
        from StringIO import StringIO
181
143
        self.stdout = StringIO()
182
144
        self.test = subunit.RemotedTestCase("old mcdonald")
183
 
        self.client = MockTestProtocolServerClient()
 
145
        self.client = ExtendedTestResult()
184
146
        self.protocol = subunit.TestProtocolServer(self.client, self.stdout)
185
147
 
186
148
    def keywords_before_test(self):
205
167
 
206
168
    def test_keywords_before_test(self):
207
169
        self.keywords_before_test()
208
 
        self.assertEqual(self.client.start_calls, [])
209
 
        self.assertEqual(self.client.error_calls, [])
210
 
        self.assertEqual(self.client.failure_calls, [])
211
 
        self.assertEqual(self.client.success_calls, [])
 
170
        self.assertEqual(self.client._events, [])
212
171
 
213
172
    def test_keywords_after_error(self):
214
173
        self.protocol.lineReceived("test old mcdonald\n")
215
174
        self.protocol.lineReceived("error old mcdonald\n")
216
175
        self.keywords_before_test()
217
 
        self.assertEqual(self.client.start_calls, [self.test])
218
 
        self.assertEqual(self.client.end_calls, [self.test])
219
 
        self.assertEqual(self.client.error_calls,
220
 
                         [(self.test, subunit.RemoteError(""))])
221
 
        self.assertEqual(self.client.failure_calls, [])
222
 
        self.assertEqual(self.client.success_calls, [])
 
176
        self.assertEqual([
 
177
            ('startTest', self.test),
 
178
            ('addError', self.test, {}),
 
179
            ('stopTest', self.test),
 
180
            ], self.client._events)
223
181
 
224
182
    def test_keywords_after_failure(self):
225
183
        self.protocol.lineReceived("test old mcdonald\n")
226
184
        self.protocol.lineReceived("failure old mcdonald\n")
227
185
        self.keywords_before_test()
228
 
        self.assertEqual(self.client.start_calls, [self.test])
229
 
        self.assertEqual(self.client.end_calls, [self.test])
230
 
        self.assertEqual(self.client.error_calls, [])
231
 
        self.assertEqual(self.client.failure_calls,
232
 
                         [(self.test, subunit.RemoteError())])
233
 
        self.assertEqual(self.client.success_calls, [])
 
186
        self.assertEqual(self.client._events, [
 
187
            ('startTest', self.test),
 
188
            ('addFailure', self.test, {}),
 
189
            ('stopTest', self.test),
 
190
            ])
234
191
 
235
192
    def test_keywords_after_success(self):
236
193
        self.protocol.lineReceived("test old mcdonald\n")
237
194
        self.protocol.lineReceived("success old mcdonald\n")
238
195
        self.keywords_before_test()
239
 
        self.assertEqual(self.client.start_calls, [self.test])
240
 
        self.assertEqual(self.client.end_calls, [self.test])
241
 
        self.assertEqual(self.client.error_calls, [])
242
 
        self.assertEqual(self.client.failure_calls, [])
243
 
        self.assertEqual(self.client.success_calls, [self.test])
 
196
        self.assertEqual([
 
197
            ('startTest', self.test),
 
198
            ('addSuccess', self.test),
 
199
            ('stopTest', self.test),
 
200
            ], self.client._events)
244
201
 
245
202
    def test_keywords_after_test(self):
246
203
        self.protocol.lineReceived("test old mcdonald\n")
265
222
                                                 "successful a\n"
266
223
                                                 "successful: a\n"
267
224
                                                 "]\n")
268
 
        self.assertEqual(self.client.start_calls, [self.test])
269
 
        self.assertEqual(self.client.end_calls, [self.test])
270
 
        self.assertEqual(self.client.failure_calls,
271
 
                         [(self.test, subunit.RemoteError())])
272
 
        self.assertEqual(self.client.error_calls, [])
273
 
        self.assertEqual(self.client.success_calls, [])
 
225
        self.assertEqual(self.client._events, [
 
226
            ('startTest', self.test),
 
227
            ('addFailure', self.test, {}),
 
228
            ('stopTest', self.test),
 
229
            ])
274
230
 
275
231
    def test_keywords_during_failure(self):
 
232
        # A smoke test to make sure that the details parsers have control
 
233
        # appropriately.
276
234
        self.protocol.lineReceived("test old mcdonald\n")
277
235
        self.protocol.lineReceived("failure: old mcdonald [\n")
278
236
        self.protocol.lineReceived("test old mcdonald\n")
287
245
        self.protocol.lineReceived(" ]\n")
288
246
        self.protocol.lineReceived("]\n")
289
247
        self.assertEqual(self.stdout.getvalue(), "")
290
 
        self.assertEqual(self.client.start_calls, [self.test])
291
 
        self.assertEqual(self.client.failure_calls,
292
 
                         [(self.test, subunit.RemoteError("test old mcdonald\n"
293
 
                                                  "failure a\n"
294
 
                                                  "failure: a\n"
295
 
                                                  "error a\n"
296
 
                                                  "error: a\n"
297
 
                                                  "success a\n"
298
 
                                                  "success: a\n"
299
 
                                                  "successful a\n"
300
 
                                                  "successful: a\n"
301
 
                                                  "]\n"))])
302
 
        self.assertEqual(self.client.end_calls, [self.test])
303
 
        self.assertEqual(self.client.error_calls, [])
304
 
        self.assertEqual(self.client.success_calls, [])
 
248
        details = {}
 
249
        details['traceback'] = Content(ContentType("text", "x-traceback",
 
250
            {'charset': 'utf8'}),
 
251
            lambda:[
 
252
            "test old mcdonald\n"
 
253
            "failure a\n"
 
254
            "failure: a\n"
 
255
            "error a\n"
 
256
            "error: a\n"
 
257
            "success a\n"
 
258
            "success: a\n"
 
259
            "successful a\n"
 
260
            "successful: a\n"
 
261
            "]\n"])
 
262
        self.assertEqual(self.client._events, [
 
263
            ('startTest', self.test),
 
264
            ('addFailure', self.test, details),
 
265
            ('stopTest', self.test),
 
266
            ])
305
267
 
306
268
    def test_stdout_passthrough(self):
307
269
        """Lines received which cannot be interpreted as any protocol action
315
277
class TestTestProtocolServerLostConnection(unittest.TestCase):
316
278
 
317
279
    def setUp(self):
318
 
        self.client = MockTestProtocolServerClient()
 
280
        self.client = Python26TestResult()
319
281
        self.protocol = subunit.TestProtocolServer(self.client)
320
282
        self.test = subunit.RemotedTestCase("old mcdonald")
321
283
 
322
284
    def test_lost_connection_no_input(self):
323
285
        self.protocol.lostConnection()
324
 
        self.assertEqual(self.client.start_calls, [])
325
 
        self.assertEqual(self.client.error_calls, [])
326
 
        self.assertEqual(self.client.failure_calls, [])
327
 
        self.assertEqual(self.client.success_calls, [])
 
286
        self.assertEqual([], self.client._events)
328
287
 
329
288
    def test_lost_connection_after_start(self):
330
289
        self.protocol.lineReceived("test old mcdonald\n")
331
290
        self.protocol.lostConnection()
332
 
        self.assertEqual(self.client.start_calls, [self.test])
333
 
        self.assertEqual(self.client.end_calls, [self.test])
334
 
        self.assertEqual(self.client.error_calls, [
335
 
            (self.test, subunit.RemoteError("lost connection during "
336
 
                                            "test 'old mcdonald'"))])
337
 
        self.assertEqual(self.client.failure_calls, [])
338
 
        self.assertEqual(self.client.success_calls, [])
 
291
        failure = subunit.RemoteError(
 
292
            u"lost connection during test 'old mcdonald'")
 
293
        self.assertEqual([
 
294
            ('startTest', self.test),
 
295
            ('addError', self.test, failure),
 
296
            ('stopTest', self.test),
 
297
            ], self.client._events)
339
298
 
340
299
    def test_lost_connected_after_error(self):
341
300
        self.protocol.lineReceived("test old mcdonald\n")
342
301
        self.protocol.lineReceived("error old mcdonald\n")
343
302
        self.protocol.lostConnection()
344
 
        self.assertEqual(self.client.start_calls, [self.test])
345
 
        self.assertEqual(self.client.failure_calls, [])
346
 
        self.assertEqual(self.client.end_calls, [self.test])
347
 
        self.assertEqual(self.client.error_calls, [
348
 
            (self.test, subunit.RemoteError(""))])
349
 
        self.assertEqual(self.client.success_calls, [])
 
303
        self.assertEqual([
 
304
            ('startTest', self.test),
 
305
            ('addError', self.test, subunit.RemoteError(u"")),
 
306
            ('stopTest', self.test),
 
307
            ], self.client._events)
 
308
 
 
309
    def do_connection_lost(self, outcome, opening):
 
310
        self.protocol.lineReceived("test old mcdonald\n")
 
311
        self.protocol.lineReceived("%s old mcdonald %s" % (outcome, opening))
 
312
        self.protocol.lostConnection()
 
313
        failure = subunit.RemoteError(
 
314
            u"lost connection during %s report of test 'old mcdonald'" % 
 
315
            outcome)
 
316
        self.assertEqual([
 
317
            ('startTest', self.test),
 
318
            ('addError', self.test, failure),
 
319
            ('stopTest', self.test),
 
320
            ], self.client._events)
350
321
 
351
322
    def test_lost_connection_during_error(self):
352
 
        self.protocol.lineReceived("test old mcdonald\n")
353
 
        self.protocol.lineReceived("error old mcdonald [\n")
354
 
        self.protocol.lostConnection()
355
 
        self.assertEqual(self.client.start_calls, [self.test])
356
 
        self.assertEqual(self.client.end_calls, [self.test])
357
 
        self.assertEqual(self.client.error_calls, [
358
 
            (self.test, subunit.RemoteError("lost connection during error "
359
 
                                            "report of test 'old mcdonald'"))])
360
 
        self.assertEqual(self.client.failure_calls, [])
361
 
        self.assertEqual(self.client.success_calls, [])
 
323
        self.do_connection_lost("error", "[\n")
 
324
 
 
325
    def test_lost_connection_during_error_details(self):
 
326
        self.do_connection_lost("error", "[ multipart\n")
362
327
 
363
328
    def test_lost_connected_after_failure(self):
364
329
        self.protocol.lineReceived("test old mcdonald\n")
365
330
        self.protocol.lineReceived("failure old mcdonald\n")
366
331
        self.protocol.lostConnection()
367
 
        test = subunit.RemotedTestCase("old mcdonald")
368
 
        self.assertEqual(self.client.start_calls, [self.test])
369
 
        self.assertEqual(self.client.end_calls, [self.test])
370
 
        self.assertEqual(self.client.error_calls, [])
371
 
        self.assertEqual(self.client.failure_calls,
372
 
                         [(self.test, subunit.RemoteError())])
373
 
        self.assertEqual(self.client.success_calls, [])
 
332
        self.assertEqual([
 
333
            ('startTest', self.test),
 
334
            ('addFailure', self.test, subunit.RemoteError(u"")),
 
335
            ('stopTest', self.test),
 
336
            ], self.client._events)
374
337
 
375
338
    def test_lost_connection_during_failure(self):
376
 
        self.protocol.lineReceived("test old mcdonald\n")
377
 
        self.protocol.lineReceived("failure old mcdonald [\n")
378
 
        self.protocol.lostConnection()
379
 
        self.assertEqual(self.client.start_calls, [self.test])
380
 
        self.assertEqual(self.client.end_calls, [self.test])
381
 
        self.assertEqual(self.client.error_calls,
382
 
                         [(self.test,
383
 
                           subunit.RemoteError("lost connection during "
384
 
                                               "failure report"
385
 
                                               " of test 'old mcdonald'"))])
386
 
        self.assertEqual(self.client.failure_calls, [])
387
 
        self.assertEqual(self.client.success_calls, [])
 
339
        self.do_connection_lost("failure", "[\n")
 
340
 
 
341
    def test_lost_connection_during_failure_details(self):
 
342
        self.do_connection_lost("failure", "[ multipart\n")
388
343
 
389
344
    def test_lost_connection_after_success(self):
390
345
        self.protocol.lineReceived("test old mcdonald\n")
391
346
        self.protocol.lineReceived("success old mcdonald\n")
392
347
        self.protocol.lostConnection()
393
 
        self.assertEqual(self.client.start_calls, [self.test])
394
 
        self.assertEqual(self.client.end_calls, [self.test])
395
 
        self.assertEqual(self.client.error_calls, [])
396
 
        self.assertEqual(self.client.failure_calls, [])
397
 
        self.assertEqual(self.client.success_calls, [self.test])
 
348
        self.assertEqual([
 
349
            ('startTest', self.test),
 
350
            ('addSuccess', self.test),
 
351
            ('stopTest', self.test),
 
352
            ], self.client._events)
 
353
 
 
354
    def test_lost_connection_during_success(self):
 
355
        self.do_connection_lost("success", "[\n")
 
356
 
 
357
    def test_lost_connection_during_success_details(self):
 
358
        self.do_connection_lost("success", "[ multipart\n")
 
359
 
 
360
    def test_lost_connection_during_skip(self):
 
361
        self.do_connection_lost("skip", "[\n")
 
362
 
 
363
    def test_lost_connection_during_skip_details(self):
 
364
        self.do_connection_lost("skip", "[ multipart\n")
 
365
 
 
366
    def test_lost_connection_during_xfail(self):
 
367
        self.do_connection_lost("xfail", "[\n")
 
368
 
 
369
    def test_lost_connection_during_xfail_details(self):
 
370
        self.do_connection_lost("xfail", "[ multipart\n")
 
371
 
 
372
 
 
373
class TestInTestMultipart(unittest.TestCase):
 
374
 
 
375
    def setUp(self):
 
376
        self.client = ExtendedTestResult()
 
377
        self.protocol = subunit.TestProtocolServer(self.client)
 
378
        self.protocol.lineReceived("test mcdonalds farm\n")
 
379
        self.test = subunit.RemotedTestCase("mcdonalds farm")
 
380
 
 
381
    def test__outcome_sets_details_parser(self):
 
382
        self.protocol._reading_success_details.details_parser = None
 
383
        self.protocol._state._outcome(0, "mcdonalds farm [ multipart\n",
 
384
            None, self.protocol._reading_success_details)
 
385
        parser = self.protocol._reading_success_details.details_parser
 
386
        self.assertNotEqual(None, parser)
 
387
        self.assertTrue(isinstance(parser,
 
388
            subunit.details.MultipartDetailsParser))
398
389
 
399
390
 
400
391
class TestTestProtocolServerAddError(unittest.TestCase):
401
392
 
402
393
    def setUp(self):
403
 
        self.client = MockTestProtocolServerClient()
 
394
        self.client = ExtendedTestResult()
404
395
        self.protocol = subunit.TestProtocolServer(self.client)
405
396
        self.protocol.lineReceived("test mcdonalds farm\n")
406
397
        self.test = subunit.RemotedTestCase("mcdonalds farm")
407
398
 
408
399
    def simple_error_keyword(self, keyword):
409
400
        self.protocol.lineReceived("%s mcdonalds farm\n" % keyword)
410
 
        self.assertEqual(self.client.start_calls, [self.test])
411
 
        self.assertEqual(self.client.end_calls, [self.test])
412
 
        self.assertEqual(self.client.error_calls, [
413
 
            (self.test, subunit.RemoteError(""))])
414
 
        self.assertEqual(self.client.failure_calls, [])
 
401
        details = {}
 
402
        self.assertEqual([
 
403
            ('startTest', self.test),
 
404
            ('addError', self.test, details),
 
405
            ('stopTest', self.test),
 
406
            ], self.client._events)
415
407
 
416
408
    def test_simple_error(self):
417
409
        self.simple_error_keyword("error")
422
414
    def test_error_empty_message(self):
423
415
        self.protocol.lineReceived("error mcdonalds farm [\n")
424
416
        self.protocol.lineReceived("]\n")
425
 
        self.assertEqual(self.client.start_calls, [self.test])
426
 
        self.assertEqual(self.client.end_calls, [self.test])
427
 
        self.assertEqual(self.client.error_calls, [
428
 
            (self.test, subunit.RemoteError(""))])
429
 
        self.assertEqual(self.client.failure_calls, [])
 
417
        details = {}
 
418
        details['traceback'] = Content(ContentType("text", "x-traceback",
 
419
            {'charset': 'utf8'}), lambda:[""])
 
420
        self.assertEqual([
 
421
            ('startTest', self.test),
 
422
            ('addError', self.test, details),
 
423
            ('stopTest', self.test),
 
424
            ], self.client._events)
430
425
 
431
426
    def error_quoted_bracket(self, keyword):
432
427
        self.protocol.lineReceived("%s mcdonalds farm [\n" % keyword)
433
428
        self.protocol.lineReceived(" ]\n")
434
429
        self.protocol.lineReceived("]\n")
435
 
        self.assertEqual(self.client.start_calls, [self.test])
436
 
        self.assertEqual(self.client.end_calls, [self.test])
437
 
        self.assertEqual(self.client.error_calls, [
438
 
            (self.test, subunit.RemoteError("]\n"))])
439
 
        self.assertEqual(self.client.failure_calls, [])
 
430
        details = {}
 
431
        details['traceback'] = Content(ContentType("text", "x-traceback",
 
432
            {'charset': 'utf8'}), lambda:["]\n"])
 
433
        self.assertEqual([
 
434
            ('startTest', self.test),
 
435
            ('addError', self.test, details),
 
436
            ('stopTest', self.test),
 
437
            ], self.client._events)
440
438
 
441
439
    def test_error_quoted_bracket(self):
442
440
        self.error_quoted_bracket("error")
448
446
class TestTestProtocolServerAddFailure(unittest.TestCase):
449
447
 
450
448
    def setUp(self):
451
 
        self.client = MockTestProtocolServerClient()
 
449
        self.client = ExtendedTestResult()
452
450
        self.protocol = subunit.TestProtocolServer(self.client)
453
451
        self.protocol.lineReceived("test mcdonalds farm\n")
454
452
        self.test = subunit.RemotedTestCase("mcdonalds farm")
455
453
 
 
454
    def assertFailure(self, details):
 
455
        self.assertEqual([
 
456
            ('startTest', self.test),
 
457
            ('addFailure', self.test, details),
 
458
            ('stopTest', self.test),
 
459
            ], self.client._events)
 
460
 
456
461
    def simple_failure_keyword(self, keyword):
457
462
        self.protocol.lineReceived("%s mcdonalds farm\n" % keyword)
458
 
        self.assertEqual(self.client.start_calls, [self.test])
459
 
        self.assertEqual(self.client.end_calls, [self.test])
460
 
        self.assertEqual(self.client.error_calls, [])
461
 
        self.assertEqual(self.client.failure_calls,
462
 
                         [(self.test, subunit.RemoteError())])
 
463
        details = {}
 
464
        self.assertFailure(details)
463
465
 
464
466
    def test_simple_failure(self):
465
467
        self.simple_failure_keyword("failure")
470
472
    def test_failure_empty_message(self):
471
473
        self.protocol.lineReceived("failure mcdonalds farm [\n")
472
474
        self.protocol.lineReceived("]\n")
473
 
        self.assertEqual(self.client.start_calls, [self.test])
474
 
        self.assertEqual(self.client.end_calls, [self.test])
475
 
        self.assertEqual(self.client.error_calls, [])
476
 
        self.assertEqual(self.client.failure_calls,
477
 
                         [(self.test, subunit.RemoteError())])
 
475
        details = {}
 
476
        details['traceback'] = Content(ContentType("text", "x-traceback",
 
477
            {'charset': 'utf8'}), lambda:[""])
 
478
        self.assertFailure(details)
478
479
 
479
480
    def failure_quoted_bracket(self, keyword):
480
481
        self.protocol.lineReceived("%s mcdonalds farm [\n" % keyword)
481
482
        self.protocol.lineReceived(" ]\n")
482
483
        self.protocol.lineReceived("]\n")
483
 
        self.assertEqual(self.client.start_calls, [self.test])
484
 
        self.assertEqual(self.client.end_calls, [self.test])
485
 
        self.assertEqual(self.client.error_calls, [])
486
 
        self.assertEqual(self.client.failure_calls,
487
 
                         [(self.test, subunit.RemoteError("]\n"))])
 
484
        details = {}
 
485
        details['traceback'] = Content(ContentType("text", "x-traceback",
 
486
            {'charset': 'utf8'}), lambda:["]\n"])
 
487
        self.assertFailure(details)
488
488
 
489
489
    def test_failure_quoted_bracket(self):
490
490
        self.failure_quoted_bracket("failure")
493
493
        self.failure_quoted_bracket("failure:")
494
494
 
495
495
 
 
496
class TestTestProtocolServerAddxFail(unittest.TestCase):
 
497
    """Tests for the xfail keyword.
 
498
 
 
499
    In Python this can thunk through to Success due to stdlib limitations (see
 
500
    README).
 
501
    """
 
502
 
 
503
    def capture_expected_failure(self, test, err):
 
504
        self._events.append((test, err))
 
505
 
 
506
    def setup_python26(self):
 
507
        """Setup a test object ready to be xfailed and thunk to success."""
 
508
        self.client = Python26TestResult()
 
509
        self.setup_protocol()
 
510
 
 
511
    def setup_python27(self):
 
512
        """Setup a test object ready to be xfailed."""
 
513
        self.client = Python27TestResult()
 
514
        self.setup_protocol()
 
515
 
 
516
    def setup_python_ex(self):
 
517
        """Setup a test object ready to be xfailed with details."""
 
518
        self.client = ExtendedTestResult()
 
519
        self.setup_protocol()
 
520
 
 
521
    def setup_protocol(self):
 
522
        """Setup the protocol based on self.client."""
 
523
        self.protocol = subunit.TestProtocolServer(self.client)
 
524
        self.protocol.lineReceived("test mcdonalds farm\n")
 
525
        self.test = self.client._events[-1][-1]
 
526
 
 
527
    def simple_xfail_keyword(self, keyword, as_success):
 
528
        self.protocol.lineReceived("%s mcdonalds farm\n" % keyword)
 
529
        self.check_success_or_xfail(as_success)
 
530
 
 
531
    def check_success_or_xfail(self, as_success, error_message=None):
 
532
        if as_success:
 
533
            self.assertEqual([
 
534
                ('startTest', self.test),
 
535
                ('addSuccess', self.test),
 
536
                ('stopTest', self.test),
 
537
                ], self.client._events)
 
538
        else:
 
539
            details = {}
 
540
            if error_message is not None:
 
541
                details['traceback'] = Content(
 
542
                    ContentType("text", "x-traceback", {'charset': 'utf8'}),
 
543
                    lambda:[error_message])
 
544
            if isinstance(self.client, ExtendedTestResult):
 
545
                value = details
 
546
            else:
 
547
                if error_message is not None:
 
548
                    value = subunit.RemoteError(u'Text attachment: traceback\n'
 
549
                        '------------\n' + error_message + '------------\n')
 
550
                else:
 
551
                    value = subunit.RemoteError()
 
552
            self.assertEqual([
 
553
                ('startTest', self.test),
 
554
                ('addExpectedFailure', self.test, value),
 
555
                ('stopTest', self.test),
 
556
                ], self.client._events)
 
557
 
 
558
    def test_simple_xfail(self):
 
559
        self.setup_python26()
 
560
        self.simple_xfail_keyword("xfail", True)
 
561
        self.setup_python27()
 
562
        self.simple_xfail_keyword("xfail",  False)
 
563
        self.setup_python_ex()
 
564
        self.simple_xfail_keyword("xfail",  False)
 
565
 
 
566
    def test_simple_xfail_colon(self):
 
567
        self.setup_python26()
 
568
        self.simple_xfail_keyword("xfail:", True)
 
569
        self.setup_python27()
 
570
        self.simple_xfail_keyword("xfail:", False)
 
571
        self.setup_python_ex()
 
572
        self.simple_xfail_keyword("xfail:", False)
 
573
 
 
574
    def test_xfail_empty_message(self):
 
575
        self.setup_python26()
 
576
        self.empty_message(True)
 
577
        self.setup_python27()
 
578
        self.empty_message(False)
 
579
        self.setup_python_ex()
 
580
        self.empty_message(False, error_message="")
 
581
 
 
582
    def empty_message(self, as_success, error_message="\n"):
 
583
        self.protocol.lineReceived("xfail mcdonalds farm [\n")
 
584
        self.protocol.lineReceived("]\n")
 
585
        self.check_success_or_xfail(as_success, error_message)
 
586
 
 
587
    def xfail_quoted_bracket(self, keyword, as_success):
 
588
        # This tests it is accepted, but cannot test it is used today, because
 
589
        # of not having a way to expose it in Python so far.
 
590
        self.protocol.lineReceived("%s mcdonalds farm [\n" % keyword)
 
591
        self.protocol.lineReceived(" ]\n")
 
592
        self.protocol.lineReceived("]\n")
 
593
        self.check_success_or_xfail(as_success, "]\n")
 
594
 
 
595
    def test_xfail_quoted_bracket(self):
 
596
        self.setup_python26()
 
597
        self.xfail_quoted_bracket("xfail", True)
 
598
        self.setup_python27()
 
599
        self.xfail_quoted_bracket("xfail", False)
 
600
        self.setup_python_ex()
 
601
        self.xfail_quoted_bracket("xfail", False)
 
602
 
 
603
    def test_xfail_colon_quoted_bracket(self):
 
604
        self.setup_python26()
 
605
        self.xfail_quoted_bracket("xfail:", True)
 
606
        self.setup_python27()
 
607
        self.xfail_quoted_bracket("xfail:", False)
 
608
        self.setup_python_ex()
 
609
        self.xfail_quoted_bracket("xfail:", False)
 
610
 
 
611
 
 
612
class TestTestProtocolServerAddSkip(unittest.TestCase):
 
613
    """Tests for the skip keyword.
 
614
 
 
615
    In Python this meets the testtools extended TestResult contract.
 
616
    (See https://launchpad.net/testtools).
 
617
    """
 
618
 
 
619
    def setUp(self):
 
620
        """Setup a test object ready to be skipped."""
 
621
        self.client = ExtendedTestResult()
 
622
        self.protocol = subunit.TestProtocolServer(self.client)
 
623
        self.protocol.lineReceived("test mcdonalds farm\n")
 
624
        self.test = self.client._events[-1][-1]
 
625
 
 
626
    def assertSkip(self, reason):
 
627
        details = {}
 
628
        if reason is not None:
 
629
            details['reason'] = Content(
 
630
                ContentType("text", "plain"), lambda:[reason])
 
631
        self.assertEqual([
 
632
            ('startTest', self.test),
 
633
            ('addSkip', self.test, details),
 
634
            ('stopTest', self.test),
 
635
            ], self.client._events)
 
636
 
 
637
    def simple_skip_keyword(self, keyword):
 
638
        self.protocol.lineReceived("%s mcdonalds farm\n" % keyword)
 
639
        self.assertSkip(None)
 
640
 
 
641
    def test_simple_skip(self):
 
642
        self.simple_skip_keyword("skip")
 
643
 
 
644
    def test_simple_skip_colon(self):
 
645
        self.simple_skip_keyword("skip:")
 
646
 
 
647
    def test_skip_empty_message(self):
 
648
        self.protocol.lineReceived("skip mcdonalds farm [\n")
 
649
        self.protocol.lineReceived("]\n")
 
650
        self.assertSkip("")
 
651
 
 
652
    def skip_quoted_bracket(self, keyword):
 
653
        # This tests it is accepted, but cannot test it is used today, because
 
654
        # of not having a way to expose it in Python so far.
 
655
        self.protocol.lineReceived("%s mcdonalds farm [\n" % keyword)
 
656
        self.protocol.lineReceived(" ]\n")
 
657
        self.protocol.lineReceived("]\n")
 
658
        self.assertSkip("]\n")
 
659
 
 
660
    def test_skip_quoted_bracket(self):
 
661
        self.skip_quoted_bracket("skip")
 
662
 
 
663
    def test_skip_colon_quoted_bracket(self):
 
664
        self.skip_quoted_bracket("skip:")
 
665
 
 
666
 
496
667
class TestTestProtocolServerAddSuccess(unittest.TestCase):
497
668
 
498
669
    def setUp(self):
499
 
        self.client = MockTestProtocolServerClient()
 
670
        self.client = ExtendedTestResult()
500
671
        self.protocol = subunit.TestProtocolServer(self.client)
501
672
        self.protocol.lineReceived("test mcdonalds farm\n")
502
673
        self.test = subunit.RemotedTestCase("mcdonalds farm")
503
674
 
504
675
    def simple_success_keyword(self, keyword):
505
676
        self.protocol.lineReceived("%s mcdonalds farm\n" % keyword)
506
 
        self.assertEqual(self.client.start_calls, [self.test])
507
 
        self.assertEqual(self.client.end_calls, [self.test])
508
 
        self.assertEqual(self.client.error_calls, [])
509
 
        self.assertEqual(self.client.success_calls, [self.test])
 
677
        self.assertEqual([
 
678
            ('startTest', self.test),
 
679
            ('addSuccess', self.test),
 
680
            ('stopTest', self.test),
 
681
            ], self.client._events)
510
682
 
511
683
    def test_simple_success(self):
512
684
        self.simple_success_keyword("failure")
520
692
    def test_simple_success_colon(self):
521
693
        self.simple_success_keyword("successful:")
522
694
 
 
695
    def assertSuccess(self, details):
 
696
        self.assertEqual([
 
697
            ('startTest', self.test),
 
698
            ('addSuccess', self.test, details),
 
699
            ('stopTest', self.test),
 
700
            ], self.client._events)
 
701
 
 
702
    def test_success_empty_message(self):
 
703
        self.protocol.lineReceived("success mcdonalds farm [\n")
 
704
        self.protocol.lineReceived("]\n")
 
705
        details = {}
 
706
        details['message'] = Content(ContentType("text", "plain"),
 
707
            lambda:[""])
 
708
        self.assertSuccess(details)
 
709
 
 
710
    def success_quoted_bracket(self, keyword):
 
711
        # This tests it is accepted, but cannot test it is used today, because
 
712
        # of not having a way to expose it in Python so far.
 
713
        self.protocol.lineReceived("%s mcdonalds farm [\n" % keyword)
 
714
        self.protocol.lineReceived(" ]\n")
 
715
        self.protocol.lineReceived("]\n")
 
716
        details = {}
 
717
        details['message'] = Content(ContentType("text", "plain"),
 
718
            lambda:["]\n"])
 
719
        self.assertSuccess(details)
 
720
 
 
721
    def test_success_quoted_bracket(self):
 
722
        self.success_quoted_bracket("success")
 
723
 
 
724
    def test_success_colon_quoted_bracket(self):
 
725
        self.success_quoted_bracket("success:")
 
726
 
 
727
 
 
728
class TestTestProtocolServerProgress(unittest.TestCase):
 
729
    """Test receipt of progress: directives."""
 
730
 
 
731
    def test_progress_accepted_stdlib(self):
 
732
        self.result = Python26TestResult()
 
733
        self.stream = StringIO()
 
734
        self.protocol = subunit.TestProtocolServer(self.result,
 
735
            stream=self.stream)
 
736
        self.protocol.lineReceived("progress: 23")
 
737
        self.protocol.lineReceived("progress: -2")
 
738
        self.protocol.lineReceived("progress: +4")
 
739
        self.assertEqual("", self.stream.getvalue())
 
740
 
 
741
    def test_progress_accepted_extended(self):
 
742
        # With a progress capable TestResult, progress events are emitted.
 
743
        self.result = ExtendedTestResult()
 
744
        self.stream = StringIO()
 
745
        self.protocol = subunit.TestProtocolServer(self.result,
 
746
            stream=self.stream)
 
747
        self.protocol.lineReceived("progress: 23")
 
748
        self.protocol.lineReceived("progress: push")
 
749
        self.protocol.lineReceived("progress: -2")
 
750
        self.protocol.lineReceived("progress: pop")
 
751
        self.protocol.lineReceived("progress: +4")
 
752
        self.assertEqual("", self.stream.getvalue())
 
753
        self.assertEqual([
 
754
            ('progress', 23, subunit.PROGRESS_SET),
 
755
            ('progress', None, subunit.PROGRESS_PUSH),
 
756
            ('progress', -2, subunit.PROGRESS_CUR),
 
757
            ('progress', None, subunit.PROGRESS_POP),
 
758
            ('progress', 4, subunit.PROGRESS_CUR),
 
759
            ], self.result._events)
 
760
 
 
761
 
 
762
class TestTestProtocolServerStreamTags(unittest.TestCase):
 
763
    """Test managing tags on the protocol level."""
 
764
 
 
765
    def setUp(self):
 
766
        self.client = ExtendedTestResult()
 
767
        self.protocol = subunit.TestProtocolServer(self.client)
 
768
 
 
769
    def test_initial_tags(self):
 
770
        self.protocol.lineReceived("tags: foo bar:baz  quux\n")
 
771
        self.assertEqual([
 
772
            ('tags', set(["foo", "bar:baz", "quux"]), set()),
 
773
            ], self.client._events)
 
774
 
 
775
    def test_minus_removes_tags(self):
 
776
        self.protocol.lineReceived("tags: -bar quux\n")
 
777
        self.assertEqual([
 
778
            ('tags', set(["quux"]), set(["bar"])),
 
779
            ], self.client._events)
 
780
 
 
781
    def test_tags_do_not_get_set_on_test(self):
 
782
        self.protocol.lineReceived("test mcdonalds farm\n")
 
783
        test = self.client._events[0][-1]
 
784
        self.assertEqual(None, getattr(test, 'tags', None))
 
785
 
 
786
    def test_tags_do_not_get_set_on_global_tags(self):
 
787
        self.protocol.lineReceived("tags: foo bar\n")
 
788
        self.protocol.lineReceived("test mcdonalds farm\n")
 
789
        test = self.client._events[-1][-1]
 
790
        self.assertEqual(None, getattr(test, 'tags', None))
 
791
 
 
792
    def test_tags_get_set_on_test_tags(self):
 
793
        self.protocol.lineReceived("test mcdonalds farm\n")
 
794
        test = self.client._events[-1][-1]
 
795
        self.protocol.lineReceived("tags: foo bar\n")
 
796
        self.protocol.lineReceived("success mcdonalds farm\n")
 
797
        self.assertEqual(None, getattr(test, 'tags', None))
 
798
 
 
799
 
 
800
class TestTestProtocolServerStreamTime(unittest.TestCase):
 
801
    """Test managing time information at the protocol level."""
 
802
 
 
803
    def test_time_accepted_stdlib(self):
 
804
        self.result = Python26TestResult()
 
805
        self.stream = StringIO()
 
806
        self.protocol = subunit.TestProtocolServer(self.result,
 
807
            stream=self.stream)
 
808
        self.protocol.lineReceived("time: 2001-12-12 12:59:59Z\n")
 
809
        self.assertEqual("", self.stream.getvalue())
 
810
 
 
811
    def test_time_accepted_extended(self):
 
812
        self.result = ExtendedTestResult()
 
813
        self.stream = StringIO()
 
814
        self.protocol = subunit.TestProtocolServer(self.result,
 
815
            stream=self.stream)
 
816
        self.protocol.lineReceived("time: 2001-12-12 12:59:59Z\n")
 
817
        self.assertEqual("", self.stream.getvalue())
 
818
        self.assertEqual([
 
819
            ('time', datetime.datetime(2001, 12, 12, 12, 59, 59, 0,
 
820
            iso8601.Utc()))
 
821
            ], self.result._events)
 
822
 
523
823
 
524
824
class TestRemotedTestCase(unittest.TestCase):
525
825
 
529
829
        self.assertRaises(NotImplementedError, test.tearDown)
530
830
        self.assertEqual("A test description",
531
831
                         test.shortDescription())
532
 
        self.assertEqual("subunit.RemotedTestCase.A test description",
 
832
        self.assertEqual("A test description",
533
833
                         test.id())
534
834
        self.assertEqual("A test description (subunit.RemotedTestCase)", "%s" % test)
535
835
        self.assertEqual("<subunit.RemotedTestCase description="
536
836
                         "'A test description'>", "%r" % test)
537
837
        result = unittest.TestResult()
538
838
        test.run(result)
539
 
        self.assertEqual([(test, "RemoteException: "
 
839
        self.assertEqual([(test, _remote_exception_str + ": "
540
840
                                 "Cannot run RemotedTestCases.\n\n")],
541
841
                         result.errors)
542
842
        self.assertEqual(1, result.testsRun)
550
850
class TestRemoteError(unittest.TestCase):
551
851
 
552
852
    def test_eq(self):
553
 
        error = subunit.RemoteError("Something went wrong")
554
 
        another_error = subunit.RemoteError("Something went wrong")
555
 
        different_error = subunit.RemoteError("boo!")
 
853
        error = subunit.RemoteError(u"Something went wrong")
 
854
        another_error = subunit.RemoteError(u"Something went wrong")
 
855
        different_error = subunit.RemoteError(u"boo!")
556
856
        self.assertEqual(error, another_error)
557
857
        self.assertNotEqual(error, different_error)
558
858
        self.assertNotEqual(different_error, another_error)
559
859
 
560
860
    def test_empty_constructor(self):
561
 
        self.assertEqual(subunit.RemoteError(), subunit.RemoteError(""))
 
861
        self.assertEqual(subunit.RemoteError(), subunit.RemoteError(u""))
562
862
 
563
863
 
564
864
class TestExecTestCase(unittest.TestCase):
570
870
            # the sample script runs three tests, one each
571
871
            # that fails, errors and succeeds
572
872
 
 
873
        def test_sample_method_args(self):
 
874
            """sample-script.py foo"""
 
875
            # sample that will run just one test.
573
876
 
574
877
    def test_construct(self):
575
878
        test = self.SampleExecTestCase("test_sample_method")
576
879
        self.assertEqual(test.script,
577
880
                         subunit.join_dir(__file__, 'sample-script.py'))
578
881
 
 
882
    def test_args(self):
 
883
        result = unittest.TestResult()
 
884
        test = self.SampleExecTestCase("test_sample_method_args")
 
885
        test.run(result)
 
886
        self.assertEqual(1, result.testsRun)
 
887
 
579
888
    def test_run(self):
580
 
        runner = MockTestProtocolServerClient()
 
889
        result = ExtendedTestResult()
581
890
        test = self.SampleExecTestCase("test_sample_method")
582
 
        test.run(runner)
 
891
        test.run(result)
583
892
        mcdonald = subunit.RemotedTestCase("old mcdonald")
584
893
        bing = subunit.RemotedTestCase("bing crosby")
 
894
        bing_details = {}
 
895
        bing_details['traceback'] = Content(ContentType("text", "x-traceback",
 
896
            {'charset': 'utf8'}), lambda:["foo.c:53:ERROR invalid state\n"])
585
897
        an_error = subunit.RemotedTestCase("an error")
586
 
        self.assertEqual(runner.error_calls,
587
 
                         [(an_error, subunit.RemoteError())])
588
 
        self.assertEqual(runner.failure_calls,
589
 
                         [(bing,
590
 
                           subunit.RemoteError(
591
 
                            "foo.c:53:ERROR invalid state\n"))])
592
 
        self.assertEqual(runner.start_calls, [mcdonald, bing, an_error])
593
 
        self.assertEqual(runner.end_calls, [mcdonald, bing, an_error])
 
898
        error_details = {}
 
899
        self.assertEqual([
 
900
            ('startTest', mcdonald),
 
901
            ('addSuccess', mcdonald),
 
902
            ('stopTest', mcdonald),
 
903
            ('startTest', bing),
 
904
            ('addFailure', bing, bing_details),
 
905
            ('stopTest', bing),
 
906
            ('startTest', an_error),
 
907
            ('addError', an_error, error_details),
 
908
            ('stopTest', an_error),
 
909
            ], result._events)
594
910
 
595
911
    def test_debug(self):
596
912
        test = self.SampleExecTestCase("test_sample_method")
689
1005
        self.io = StringIO()
690
1006
        self.protocol = subunit.TestProtocolClient(self.io)
691
1007
        self.test = TestTestProtocolClient("test_start_test")
692
 
 
 
1008
        self.sample_details = {'something':Content(
 
1009
            ContentType('text', 'plain'), lambda:['serialised\nform'])}
 
1010
        self.sample_tb_details = dict(self.sample_details)
 
1011
        self.sample_tb_details['traceback'] = TracebackContent(
 
1012
            subunit.RemoteError(u"boo qux"), self.test)
693
1013
 
694
1014
    def test_start_test(self):
695
1015
        """Test startTest on a TestProtocolClient."""
697
1017
        self.assertEqual(self.io.getvalue(), "test: %s\n" % self.test.id())
698
1018
 
699
1019
    def test_stop_test(self):
700
 
        """Test stopTest on a TestProtocolClient."""
 
1020
        # stopTest doesn't output anything.
701
1021
        self.protocol.stopTest(self.test)
702
1022
        self.assertEqual(self.io.getvalue(), "")
703
1023
 
707
1027
        self.assertEqual(
708
1028
            self.io.getvalue(), "successful: %s\n" % self.test.id())
709
1029
 
 
1030
    def test_add_success_details(self):
 
1031
        """Test addSuccess on a TestProtocolClient with details."""
 
1032
        self.protocol.addSuccess(self.test, details=self.sample_details)
 
1033
        self.assertEqual(
 
1034
            self.io.getvalue(), "successful: %s [ multipart\n"
 
1035
                "Content-Type: text/plain\n"
 
1036
                "something\n"
 
1037
                "F\r\nserialised\nform0\r\n]\n" % self.test.id())
 
1038
 
710
1039
    def test_add_failure(self):
711
1040
        """Test addFailure on a TestProtocolClient."""
712
 
        self.protocol.addFailure(self.test, subunit.RemoteError("boo"))
713
 
        self.assertEqual(
714
 
            self.io.getvalue(),
715
 
            'failure: %s [\nRemoteException: boo\n]\n' % self.test.id())
 
1041
        self.protocol.addFailure(
 
1042
            self.test, subunit.RemoteError(u"boo qux"))
 
1043
        self.assertEqual(
 
1044
            self.io.getvalue(),
 
1045
            ('failure: %s [\n' + _remote_exception_str + ': boo qux\n]\n')
 
1046
            % self.test.id())
 
1047
 
 
1048
    def test_add_failure_details(self):
 
1049
        """Test addFailure on a TestProtocolClient with details."""
 
1050
        self.protocol.addFailure(
 
1051
            self.test, details=self.sample_tb_details)
 
1052
        self.assertEqual(
 
1053
            self.io.getvalue(),
 
1054
            ("failure: %s [ multipart\n"
 
1055
            "Content-Type: text/plain\n"
 
1056
            "something\n"
 
1057
            "F\r\nserialised\nform0\r\n"
 
1058
            "Content-Type: text/x-traceback;charset=utf8,language=python\n"
 
1059
            "traceback\n"
 
1060
            "1A\r\n" + _remote_exception_str + ": boo qux\n0\r\n"
 
1061
            "]\n") % self.test.id())
716
1062
 
717
1063
    def test_add_error(self):
718
1064
        """Test stopTest on a TestProtocolClient."""
719
 
        self.protocol.addError(self.test, subunit.RemoteError("phwoar"))
720
 
        self.assertEqual(
721
 
            self.io.getvalue(),
722
 
            'error: %s [\n'
723
 
            "RemoteException: phwoar\n"
 
1065
        self.protocol.addError(
 
1066
            self.test, subunit.RemoteError(u"phwoar crikey"))
 
1067
        self.assertEqual(
 
1068
            self.io.getvalue(),
 
1069
            ('error: %s [\n' +
 
1070
            _remote_exception_str + ": phwoar crikey\n"
 
1071
            "]\n") % self.test.id())
 
1072
 
 
1073
    def test_add_error_details(self):
 
1074
        """Test stopTest on a TestProtocolClient with details."""
 
1075
        self.protocol.addError(
 
1076
            self.test, details=self.sample_tb_details)
 
1077
        self.assertEqual(
 
1078
            self.io.getvalue(),
 
1079
            ("error: %s [ multipart\n"
 
1080
            "Content-Type: text/plain\n"
 
1081
            "something\n"
 
1082
            "F\r\nserialised\nform0\r\n"
 
1083
            "Content-Type: text/x-traceback;charset=utf8,language=python\n"
 
1084
            "traceback\n"
 
1085
            "1A\r\n" + _remote_exception_str + ": boo qux\n0\r\n"
 
1086
            "]\n") % self.test.id())
 
1087
 
 
1088
    def test_add_expected_failure(self):
 
1089
        """Test addExpectedFailure on a TestProtocolClient."""
 
1090
        self.protocol.addExpectedFailure(
 
1091
            self.test, subunit.RemoteError(u"phwoar crikey"))
 
1092
        self.assertEqual(
 
1093
            self.io.getvalue(),
 
1094
            ('xfail: %s [\n' +
 
1095
            _remote_exception_str + ": phwoar crikey\n"
 
1096
            "]\n") % self.test.id())
 
1097
 
 
1098
    def test_add_expected_failure_details(self):
 
1099
        """Test addExpectedFailure on a TestProtocolClient with details."""
 
1100
        self.protocol.addExpectedFailure(
 
1101
            self.test, details=self.sample_tb_details)
 
1102
        self.assertEqual(
 
1103
            self.io.getvalue(),
 
1104
            ("xfail: %s [ multipart\n"
 
1105
            "Content-Type: text/plain\n"
 
1106
            "something\n"
 
1107
            "F\r\nserialised\nform0\r\n"
 
1108
            "Content-Type: text/x-traceback;charset=utf8,language=python\n"
 
1109
            "traceback\n"
 
1110
            "1A\r\n"+ _remote_exception_str + ": boo qux\n0\r\n"
 
1111
            "]\n") % self.test.id())
 
1112
 
 
1113
    def test_add_skip(self):
 
1114
        """Test addSkip on a TestProtocolClient."""
 
1115
        self.protocol.addSkip(
 
1116
            self.test, "Has it really?")
 
1117
        self.assertEqual(
 
1118
            self.io.getvalue(),
 
1119
            'skip: %s [\nHas it really?\n]\n' % self.test.id())
 
1120
    
 
1121
    def test_add_skip_details(self):
 
1122
        """Test addSkip on a TestProtocolClient with details."""
 
1123
        details = {'reason':Content(
 
1124
            ContentType('text', 'plain'), lambda:['Has it really?'])}
 
1125
        self.protocol.addSkip(
 
1126
            self.test, details=details)
 
1127
        self.assertEqual(
 
1128
            self.io.getvalue(),
 
1129
            "skip: %s [ multipart\n"
 
1130
            "Content-Type: text/plain\n"
 
1131
            "reason\n"
 
1132
            "E\r\nHas it really?0\r\n"
724
1133
            "]\n" % self.test.id())
725
1134
 
 
1135
    def test_progress_set(self):
 
1136
        self.protocol.progress(23, subunit.PROGRESS_SET)
 
1137
        self.assertEqual(self.io.getvalue(), 'progress: 23\n')
 
1138
 
 
1139
    def test_progress_neg_cur(self):
 
1140
        self.protocol.progress(-23, subunit.PROGRESS_CUR)
 
1141
        self.assertEqual(self.io.getvalue(), 'progress: -23\n')
 
1142
 
 
1143
    def test_progress_pos_cur(self):
 
1144
        self.protocol.progress(23, subunit.PROGRESS_CUR)
 
1145
        self.assertEqual(self.io.getvalue(), 'progress: +23\n')
 
1146
 
 
1147
    def test_progress_pop(self):
 
1148
        self.protocol.progress(1234, subunit.PROGRESS_POP)
 
1149
        self.assertEqual(self.io.getvalue(), 'progress: pop\n')
 
1150
 
 
1151
    def test_progress_push(self):
 
1152
        self.protocol.progress(1234, subunit.PROGRESS_PUSH)
 
1153
        self.assertEqual(self.io.getvalue(), 'progress: push\n')
 
1154
 
 
1155
    def test_time(self):
 
1156
        # Calling time() outputs a time signal immediately.
 
1157
        self.protocol.time(
 
1158
            datetime.datetime(2009,10,11,12,13,14,15, iso8601.Utc()))
 
1159
        self.assertEqual(
 
1160
            "time: 2009-10-11 12:13:14.000015Z\n",
 
1161
            self.io.getvalue())
 
1162
 
 
1163
    def test_add_unexpected_success(self):
 
1164
        """Test addUnexpectedSuccess on a TestProtocolClient."""
 
1165
        self.protocol.addUnexpectedSuccess(self.test)
 
1166
        self.assertEqual(
 
1167
            self.io.getvalue(), "successful: %s\n" % self.test.id())
 
1168
 
 
1169
    def test_add_unexpected_success_details(self):
 
1170
        """Test addUnexpectedSuccess on a TestProtocolClient with details."""
 
1171
        self.protocol.addUnexpectedSuccess(self.test, details=self.sample_details)
 
1172
        self.assertEqual(
 
1173
            self.io.getvalue(), "successful: %s [ multipart\n"
 
1174
                "Content-Type: text/plain\n"
 
1175
                "something\n"
 
1176
                "F\r\nserialised\nform0\r\n]\n" % self.test.id())
 
1177
 
726
1178
 
727
1179
def test_suite():
728
1180
    loader = subunit.tests.TestUtil.TestLoader()