~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/__init__.py

  • Committer: John Arbash Meinel
  • Date: 2006-01-05 21:29:23 UTC
  • mto: (1685.1.1 bzr-encoding)
  • mto: This revision was merged to the branch mainline in revision 1752.
  • Revision ID: john@arbash-meinel.com-20060105212923-5ac32c133789cadb
Adding wrapper for sys.stdout so we can set the output encoding. Adding tests that 'bzr log' handles multiple encodings properly

Show diffs side-by-side

added added

removed removed

Lines of Context:
200
200
class CommandFailed(Exception):
201
201
    pass
202
202
 
 
203
 
 
204
class StringIOWrapper(object):
 
205
    """A wrapper around cStringIO which just adds an encoding attribute.
 
206
    
 
207
    Internally we can check sys.stdout to see what the output encoding
 
208
    should be. However, cStringIO has no encoding attribute that we can
 
209
    set. So we wrap it instead.
 
210
    """
 
211
    encoding='ascii'
 
212
    _cstring = None
 
213
 
 
214
    def __init__(self, s=None):
 
215
        if s is not None:
 
216
            self.__dict__['_cstring'] = StringIO(s)
 
217
        else:
 
218
            self.__dict__['_cstring'] = StringIO()
 
219
 
 
220
    def __getattr__(self, name, getattr=getattr):
 
221
        return getattr(self.__dict__['_cstring'], name)
 
222
 
 
223
    def __setattr__(self, name, val):
 
224
        if name == 'encoding':
 
225
            self.__dict__['encoding'] = val
 
226
        else:
 
227
            return setattr(self._cstring, name, val)
 
228
 
 
229
 
203
230
class TestCase(unittest.TestCase):
204
231
    """Base class for bzr unit tests.
205
232
    
379
406
        """Shortcut that splits cmd into words, runs, and returns stdout"""
380
407
        return self.run_bzr_captured(cmd.split(), retcode=retcode)[0]
381
408
 
382
 
    def run_bzr_captured(self, argv, retcode=0):
 
409
    def run_bzr_captured(self, argv, retcode=0, encoding=None):
383
410
        """Invoke bzr and return (stdout, stderr).
384
411
 
385
412
        Useful for code that wants to check the contents of the
396
423
        errors, and with logging set to something approximating the
397
424
        default, so that error reporting can be checked.
398
425
 
399
 
        argv -- arguments to invoke bzr
400
 
        retcode -- expected return code, or None for don't-care.
 
426
        :param argv: arguments to invoke bzr
 
427
        :param retcode: expected return code, or None for don't-care.
 
428
        :param encoding: encoding for sys.stdout and sys.stderr
401
429
        """
402
 
        stdout = StringIO()
403
 
        stderr = StringIO()
 
430
        if encoding is None:
 
431
            encoding = bzrlib.user_encoding
 
432
        stdout = StringIOWrapper()
 
433
        stderr = StringIOWrapper()
 
434
        stdout.encoding = encoding
 
435
        stderr.encoding = encoding
 
436
 
404
437
        self.log('run bzr: %s', ' '.join(argv))
405
438
        # FIXME: don't call into logging here
406
439
        handler = logging.StreamHandler(stderr)
414
447
                                           argv)
415
448
        finally:
416
449
            logger.removeHandler(handler)
 
450
        # TODO: jam 20060105 Because we theoretically know the encoding
 
451
        #       of stdout and stderr, we could decode them at this time
 
452
        #       but for now, we will assume that the output of all
 
453
        #       functions
417
454
        out = stdout.getvalue()
418
455
        err = stderr.getvalue()
419
456
        if out:
435
472
        where it may be useful for debugging.  See also run_captured.
436
473
        """
437
474
        retcode = kwargs.pop('retcode', 0)
438
 
        return self.run_bzr_captured(args, retcode)
 
475
        encoding = kwargs.pop('encoding', None)
 
476
        return self.run_bzr_captured(args, retcode=retcode, encoding=encoding)
439
477
 
440
478
    def check_inventory_shape(self, inv, shape):
441
479
        """Compare an inventory to a list of expected names.