~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-04-25 15:05:42 UTC
  • mfrom: (1185.85.85 bzr-encoding)
  • mto: This revision was merged to the branch mainline in revision 1752.
  • Revision ID: john@arbash-meinel.com-20060425150542-c7b518dca9928691
[merge] the old bzr-encoding changes, reparenting them on bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
230
230
class CommandFailed(Exception):
231
231
    pass
232
232
 
 
233
 
 
234
class StringIOWrapper(object):
 
235
    """A wrapper around cStringIO which just adds an encoding attribute.
 
236
    
 
237
    Internally we can check sys.stdout to see what the output encoding
 
238
    should be. However, cStringIO has no encoding attribute that we can
 
239
    set. So we wrap it instead.
 
240
    """
 
241
    encoding='ascii'
 
242
    _cstring = None
 
243
 
 
244
    def __init__(self, s=None):
 
245
        if s is not None:
 
246
            self.__dict__['_cstring'] = StringIO(s)
 
247
        else:
 
248
            self.__dict__['_cstring'] = StringIO()
 
249
 
 
250
    def __getattr__(self, name, getattr=getattr):
 
251
        return getattr(self.__dict__['_cstring'], name)
 
252
 
 
253
    def __setattr__(self, name, val):
 
254
        if name == 'encoding':
 
255
            self.__dict__['encoding'] = val
 
256
        else:
 
257
            return setattr(self._cstring, name, val)
 
258
 
 
259
 
233
260
class TestCase(unittest.TestCase):
234
261
    """Base class for bzr unit tests.
235
262
    
442
469
        """Shortcut that splits cmd into words, runs, and returns stdout"""
443
470
        return self.run_bzr_captured(cmd.split(), retcode=retcode)[0]
444
471
 
445
 
    def run_bzr_captured(self, argv, retcode=0):
 
472
    def run_bzr_captured(self, argv, retcode=0, encoding=None):
446
473
        """Invoke bzr and return (stdout, stderr).
447
474
 
448
475
        Useful for code that wants to check the contents of the
459
486
        errors, and with logging set to something approximating the
460
487
        default, so that error reporting can be checked.
461
488
 
462
 
        argv -- arguments to invoke bzr
463
 
        retcode -- expected return code, or None for don't-care.
 
489
        :param argv: arguments to invoke bzr
 
490
        :param retcode: expected return code, or None for don't-care.
 
491
        :param encoding: encoding for sys.stdout and sys.stderr
464
492
        """
465
 
        stdout = StringIO()
466
 
        stderr = StringIO()
467
 
        self.log('run bzr: %s', ' '.join(argv))
 
493
        if encoding is None:
 
494
            encoding = bzrlib.user_encoding
 
495
        stdout = StringIOWrapper()
 
496
        stderr = StringIOWrapper()
 
497
        stdout.encoding = encoding
 
498
        stderr.encoding = encoding
 
499
 
 
500
        self.log('run bzr: %r', argv)
468
501
        # FIXME: don't call into logging here
469
502
        handler = logging.StreamHandler(stderr)
470
503
        handler.setFormatter(bzrlib.trace.QuietFormatter())
477
510
                                           argv)
478
511
        finally:
479
512
            logger.removeHandler(handler)
 
513
        # TODO: jam 20060105 Because we theoretically know the encoding
 
514
        #       of stdout and stderr, we could decode them at this time
 
515
        #       but for now, we will assume that the output of all
 
516
        #       functions
480
517
        out = stdout.getvalue()
481
518
        err = stderr.getvalue()
482
519
        if out:
483
 
            self.log('output:\n%s', out)
 
520
            self.log('output:\n%r', out)
484
521
        if err:
485
 
            self.log('errors:\n%s', err)
 
522
            self.log('errors:\n%r', err)
486
523
        if retcode is not None:
487
524
            self.assertEquals(result, retcode)
488
525
        return out, err
498
535
        where it may be useful for debugging.  See also run_captured.
499
536
        """
500
537
        retcode = kwargs.pop('retcode', 0)
501
 
        return self.run_bzr_captured(args, retcode)
 
538
        encoding = kwargs.pop('encoding', None)
 
539
        return self.run_bzr_captured(args, retcode=retcode, encoding=encoding)
 
540
 
 
541
    def run_bzr_decode(self, *args, **kwargs):
 
542
        if kwargs.has_key('encoding'):
 
543
            encoding = kwargs['encoding']
 
544
        else:
 
545
            encoding = bzrlib.user_encoding
 
546
        return self.run_bzr(*args, **kwargs)[0].decode(encoding)
502
547
 
503
548
    def check_inventory_shape(self, inv, shape):
504
549
        """Compare an inventory to a list of expected names.
677
722
                    end = os.linesep
678
723
                else:
679
724
                    raise errors.BzrError('Invalid line ending request %r' % (line_endings,))
680
 
                content = "contents of %s%s" % (name, end)
 
725
                content = "contents of %s%s" % (name.encode('utf-8'), end)
681
726
                transport.put(urlescape(name), StringIO(content))
682
727
 
683
728
    def build_tree_contents(self, shape):