~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/__init__.py

Merge bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
62
62
from bzrlib.revision import common_ancestor
63
63
import bzrlib.store
64
64
import bzrlib.trace
65
 
from bzrlib.transport import urlescape, get_transport
 
65
from bzrlib.transport import get_transport
66
66
import bzrlib.transport
67
67
from bzrlib.transport.local import LocalRelpathServer
68
68
from bzrlib.transport.readonly import ReadonlyServer
69
69
from bzrlib.trace import mutter
70
70
from bzrlib.tests.TestUtil import TestLoader, TestSuite
71
71
from bzrlib.tests.treeshape import build_tree_contents
 
72
import bzrlib.urlutils as urlutils
72
73
from bzrlib.workingtree import WorkingTree, WorkingTreeFormat2
73
74
 
74
75
default_transport = LocalRelpathServer
328
329
        test_root = TestCaseInTempDir.TEST_ROOT
329
330
        if result.wasSuccessful() or not self.keep_output:
330
331
            if test_root is not None:
331
 
                    osutils.rmtree(test_root)
 
332
                # If LANG=C we probably have created some bogus paths
 
333
                # which rmtree(unicode) will fail to delete
 
334
                # so make sure we are using rmtree(str) to delete everything
 
335
                osutils.rmtree(test_root.encode(
 
336
                    sys.getfilesystemencoding()))
332
337
        else:
333
338
            if self.pb is not None:
334
339
                self.pb.note("Failed tests working directories are in '%s'\n",
364
369
class CommandFailed(Exception):
365
370
    pass
366
371
 
 
372
 
 
373
class StringIOWrapper(object):
 
374
    """A wrapper around cStringIO which just adds an encoding attribute.
 
375
    
 
376
    Internally we can check sys.stdout to see what the output encoding
 
377
    should be. However, cStringIO has no encoding attribute that we can
 
378
    set. So we wrap it instead.
 
379
    """
 
380
    encoding='ascii'
 
381
    _cstring = None
 
382
 
 
383
    def __init__(self, s=None):
 
384
        if s is not None:
 
385
            self.__dict__['_cstring'] = StringIO(s)
 
386
        else:
 
387
            self.__dict__['_cstring'] = StringIO()
 
388
 
 
389
    def __getattr__(self, name, getattr=getattr):
 
390
        return getattr(self.__dict__['_cstring'], name)
 
391
 
 
392
    def __setattr__(self, name, val):
 
393
        if name == 'encoding':
 
394
            self.__dict__['encoding'] = val
 
395
        else:
 
396
            return setattr(self._cstring, name, val)
 
397
 
 
398
 
367
399
class TestCase(unittest.TestCase):
368
400
    """Base class for bzr unit tests.
369
401
    
602
634
        """Shortcut that splits cmd into words, runs, and returns stdout"""
603
635
        return self.run_bzr_captured(cmd.split(), retcode=retcode)[0]
604
636
 
605
 
    def run_bzr_captured(self, argv, retcode=0, stdin=None):
 
637
    def run_bzr_captured(self, argv, retcode=0, encoding=None, stdin=None):
606
638
        """Invoke bzr and return (stdout, stderr).
607
639
 
608
640
        Useful for code that wants to check the contents of the
619
651
        errors, and with logging set to something approximating the
620
652
        default, so that error reporting can be checked.
621
653
 
622
 
        argv -- arguments to invoke bzr
623
 
        retcode -- expected return code, or None for don't-care.
 
654
        :param argv: arguments to invoke bzr
 
655
        :param retcode: expected return code, or None for don't-care.
 
656
        :param encoding: encoding for sys.stdout and sys.stderr
624
657
        :param stdin: A string to be used as stdin for the command.
625
658
        """
 
659
        if encoding is None:
 
660
            encoding = bzrlib.user_encoding
626
661
        if stdin is not None:
627
662
            stdin = StringIO(stdin)
628
 
        stdout = StringIO()
629
 
        stderr = StringIO()
630
 
        self.log('run bzr: %s', ' '.join(argv))
 
663
        stdout = StringIOWrapper()
 
664
        stderr = StringIOWrapper()
 
665
        stdout.encoding = encoding
 
666
        stderr.encoding = encoding
 
667
 
 
668
        self.log('run bzr: %r', argv)
631
669
        # FIXME: don't call into logging here
632
670
        handler = logging.StreamHandler(stderr)
633
671
        handler.setFormatter(bzrlib.trace.QuietFormatter())
646
684
        finally:
647
685
            logger.removeHandler(handler)
648
686
            bzrlib.ui.ui_factory = old_ui_factory
 
687
 
649
688
        out = stdout.getvalue()
650
689
        err = stderr.getvalue()
651
690
        if out:
652
 
            self.log('output:\n%s', out)
 
691
            self.log('output:\n%r', out)
653
692
        if err:
654
 
            self.log('errors:\n%s', err)
 
693
            self.log('errors:\n%r', err)
655
694
        if retcode is not None:
656
 
            self.assertEquals(result, retcode)
 
695
            self.assertEquals(retcode, result)
657
696
        return out, err
658
697
 
659
698
    def run_bzr(self, *args, **kwargs):
669
708
        :param stdin: A string to be used as stdin for the command.
670
709
        """
671
710
        retcode = kwargs.pop('retcode', 0)
 
711
        encoding = kwargs.pop('encoding', None)
672
712
        stdin = kwargs.pop('stdin', None)
673
 
        return self.run_bzr_captured(args, retcode, stdin)
 
713
        return self.run_bzr_captured(args, retcode=retcode, encoding=encoding, stdin=stdin)
 
714
 
 
715
    def run_bzr_decode(self, *args, **kwargs):
 
716
        if kwargs.has_key('encoding'):
 
717
            encoding = kwargs['encoding']
 
718
        else:
 
719
            encoding = bzrlib.user_encoding
 
720
        return self.run_bzr(*args, **kwargs)[0].decode(encoding)
674
721
 
675
722
    def check_inventory_shape(self, inv, shape):
676
723
        """Compare an inventory to a list of expected names.
841
888
        for name in shape:
842
889
            self.assert_(isinstance(name, basestring))
843
890
            if name[-1] == '/':
844
 
                transport.mkdir(urlescape(name[:-1]))
 
891
                transport.mkdir(urlutils.escape(name[:-1]))
845
892
            else:
846
893
                if line_endings == 'binary':
847
894
                    end = '\n'
849
896
                    end = os.linesep
850
897
                else:
851
898
                    raise errors.BzrError('Invalid line ending request %r' % (line_endings,))
852
 
                content = "contents of %s%s" % (name, end)
853
 
                transport.put(urlescape(name), StringIO(content))
 
899
                content = "contents of %s%s" % (name.encode('utf-8'), end)
 
900
                transport.put(urlutils.escape(name), StringIO(content))
854
901
 
855
902
    def build_tree_contents(self, shape):
856
903
        build_tree_contents(shape)
866
913
    def assertFileEqual(self, content, path):
867
914
        """Fail if path does not contain 'content'."""
868
915
        self.failUnless(osutils.lexists(path))
 
916
        # TODO: jam 20060427 Shouldn't this be 'rb'?
869
917
        self.assertEqualDiff(content, open(path, 'r').read())
870
918
 
871
919
 
947
995
        if relpath is not None and relpath != '.':
948
996
            if not base.endswith('/'):
949
997
                base = base + '/'
950
 
            base = base + relpath
 
998
            base = base + urlutils.escape(relpath)
951
999
        return base
952
1000
 
953
1001
    def get_transport(self):
974
1022
    def make_bzrdir(self, relpath, format=None):
975
1023
        try:
976
1024
            url = self.get_url(relpath)
977
 
            segments = relpath.split('/')
 
1025
            mutter('relpath %r => url %r', relpath, url)
 
1026
            segments = url.split('/')
978
1027
            if segments and segments[-1] not in ('', '.'):
979
 
                parent = self.get_url('/'.join(segments[:-1]))
 
1028
                parent = '/'.join(segments[:-1])
980
1029
                t = get_transport(parent)
981
1030
                try:
982
1031
                    t.mkdir(segments[-1])
1181
1230
                   'bzrlib.tests.test_tuned_gzip',
1182
1231
                   'bzrlib.tests.test_ui',
1183
1232
                   'bzrlib.tests.test_upgrade',
 
1233
                   'bzrlib.tests.test_urlutils',
1184
1234
                   'bzrlib.tests.test_versionedfile',
1185
1235
                   'bzrlib.tests.test_weave',
1186
1236
                   'bzrlib.tests.test_whitebox',