~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/__init__.py

  • Committer: Jelmer Vernooij
  • Date: 2006-06-13 13:24:40 UTC
  • mfrom: (1767 +trunk)
  • mto: (1769.1.1 integration)
  • mto: This revision was merged to the branch mainline in revision 1770.
  • Revision ID: jelmer@samba.org-20060613132440-24e222a86f948f60
[merge] bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
33
33
import logging
34
34
import os
35
35
import re
 
36
import shlex
36
37
import stat
 
38
from subprocess import Popen, PIPE
37
39
import sys
38
40
import tempfile
39
41
import unittest
43
45
import bzrlib.branch
44
46
import bzrlib.bzrdir as bzrdir
45
47
import bzrlib.commands
 
48
import bzrlib.bundle.serializer
46
49
import bzrlib.errors as errors
47
50
import bzrlib.inventory
48
51
import bzrlib.iterablefile
61
64
from bzrlib.revision import common_ancestor
62
65
import bzrlib.store
63
66
import bzrlib.trace
64
 
from bzrlib.transport import urlescape, get_transport
 
67
from bzrlib.transport import get_transport
65
68
import bzrlib.transport
66
69
from bzrlib.transport.local import LocalRelpathServer
67
70
from bzrlib.transport.readonly import ReadonlyServer
68
71
from bzrlib.trace import mutter
69
72
from bzrlib.tests.TestUtil import TestLoader, TestSuite
70
73
from bzrlib.tests.treeshape import build_tree_contents
 
74
import bzrlib.urlutils as urlutils
71
75
from bzrlib.workingtree import WorkingTree, WorkingTreeFormat2
72
76
 
73
77
default_transport = LocalRelpathServer
75
79
MODULES_TO_TEST = []
76
80
MODULES_TO_DOCTEST = [
77
81
                      bzrlib.branch,
 
82
                      bzrlib.bundle.serializer,
78
83
                      bzrlib.commands,
79
84
                      bzrlib.errors,
80
85
                      bzrlib.inventory,
85
90
                      bzrlib.osutils,
86
91
                      bzrlib.store
87
92
                      ]
 
93
 
 
94
 
88
95
def packages_to_test():
89
96
    """Return a list of packages to test.
90
97
 
324
331
        test_root = TestCaseInTempDir.TEST_ROOT
325
332
        if result.wasSuccessful() or not self.keep_output:
326
333
            if test_root is not None:
327
 
                    osutils.rmtree(test_root)
 
334
                # If LANG=C we probably have created some bogus paths
 
335
                # which rmtree(unicode) will fail to delete
 
336
                # so make sure we are using rmtree(str) to delete everything
 
337
                osutils.rmtree(test_root.encode(
 
338
                    sys.getfilesystemencoding()))
328
339
        else:
329
340
            if self.pb is not None:
330
341
                self.pb.note("Failed tests working directories are in '%s'\n",
360
371
class CommandFailed(Exception):
361
372
    pass
362
373
 
 
374
 
 
375
class StringIOWrapper(object):
 
376
    """A wrapper around cStringIO which just adds an encoding attribute.
 
377
    
 
378
    Internally we can check sys.stdout to see what the output encoding
 
379
    should be. However, cStringIO has no encoding attribute that we can
 
380
    set. So we wrap it instead.
 
381
    """
 
382
    encoding='ascii'
 
383
    _cstring = None
 
384
 
 
385
    def __init__(self, s=None):
 
386
        if s is not None:
 
387
            self.__dict__['_cstring'] = StringIO(s)
 
388
        else:
 
389
            self.__dict__['_cstring'] = StringIO()
 
390
 
 
391
    def __getattr__(self, name, getattr=getattr):
 
392
        return getattr(self.__dict__['_cstring'], name)
 
393
 
 
394
    def __setattr__(self, name, val):
 
395
        if name == 'encoding':
 
396
            self.__dict__['encoding'] = val
 
397
        else:
 
398
            return setattr(self._cstring, name, val)
 
399
 
 
400
 
363
401
class TestCase(unittest.TestCase):
364
402
    """Base class for bzr unit tests.
365
403
    
446
484
            raise AssertionError('pattern "%s" not found in "%s"'
447
485
                    % (needle_re, haystack))
448
486
 
 
487
    def assertNotContainsRe(self, haystack, needle_re):
 
488
        """Assert that a does not match a regular expression"""
 
489
        if re.search(needle_re, haystack):
 
490
            raise AssertionError('pattern "%s" found in "%s"'
 
491
                    % (needle_re, haystack))
 
492
 
449
493
    def assertSubset(self, sublist, superlist):
450
494
        """Assert that every entry in sublist is present in superlist."""
451
495
        missing = []
598
642
        """Shortcut that splits cmd into words, runs, and returns stdout"""
599
643
        return self.run_bzr_captured(cmd.split(), retcode=retcode)[0]
600
644
 
601
 
    def run_bzr_captured(self, argv, retcode=0, stdin=None):
 
645
    def run_bzr_captured(self, argv, retcode=0, encoding=None, stdin=None):
602
646
        """Invoke bzr and return (stdout, stderr).
603
647
 
604
648
        Useful for code that wants to check the contents of the
615
659
        errors, and with logging set to something approximating the
616
660
        default, so that error reporting can be checked.
617
661
 
618
 
        argv -- arguments to invoke bzr
619
 
        retcode -- expected return code, or None for don't-care.
 
662
        :param argv: arguments to invoke bzr
 
663
        :param retcode: expected return code, or None for don't-care.
 
664
        :param encoding: encoding for sys.stdout and sys.stderr
620
665
        :param stdin: A string to be used as stdin for the command.
621
666
        """
 
667
        if encoding is None:
 
668
            encoding = bzrlib.user_encoding
622
669
        if stdin is not None:
623
670
            stdin = StringIO(stdin)
624
 
        stdout = StringIO()
625
 
        stderr = StringIO()
626
 
        self.log('run bzr: %s', ' '.join(argv))
 
671
        stdout = StringIOWrapper()
 
672
        stderr = StringIOWrapper()
 
673
        stdout.encoding = encoding
 
674
        stderr.encoding = encoding
 
675
 
 
676
        self.log('run bzr: %r', argv)
627
677
        # FIXME: don't call into logging here
628
678
        handler = logging.StreamHandler(stderr)
629
679
        handler.setFormatter(bzrlib.trace.QuietFormatter())
642
692
        finally:
643
693
            logger.removeHandler(handler)
644
694
            bzrlib.ui.ui_factory = old_ui_factory
 
695
 
645
696
        out = stdout.getvalue()
646
697
        err = stderr.getvalue()
647
698
        if out:
648
 
            self.log('output:\n%s', out)
 
699
            self.log('output:\n%r', out)
649
700
        if err:
650
 
            self.log('errors:\n%s', err)
 
701
            self.log('errors:\n%r', err)
651
702
        if retcode is not None:
652
 
            self.assertEquals(result, retcode)
 
703
            self.assertEquals(retcode, result)
653
704
        return out, err
654
705
 
655
706
    def run_bzr(self, *args, **kwargs):
665
716
        :param stdin: A string to be used as stdin for the command.
666
717
        """
667
718
        retcode = kwargs.pop('retcode', 0)
 
719
        encoding = kwargs.pop('encoding', None)
668
720
        stdin = kwargs.pop('stdin', None)
669
 
        return self.run_bzr_captured(args, retcode, stdin)
 
721
        return self.run_bzr_captured(args, retcode=retcode, encoding=encoding, stdin=stdin)
 
722
 
 
723
    def run_bzr_decode(self, *args, **kwargs):
 
724
        if kwargs.has_key('encoding'):
 
725
            encoding = kwargs['encoding']
 
726
        else:
 
727
            encoding = bzrlib.user_encoding
 
728
        return self.run_bzr(*args, **kwargs)[0].decode(encoding)
 
729
 
 
730
    def run_bzr_subprocess(self, *args, **kwargs):
 
731
        """Run bzr in a subprocess for testing.
 
732
 
 
733
        This starts a new Python interpreter and runs bzr in there. 
 
734
        This should only be used for tests that have a justifiable need for
 
735
        this isolation: e.g. they are testing startup time, or signal
 
736
        handling, or early startup code, etc.  Subprocess code can't be 
 
737
        profiled or debugged so easily.
 
738
 
 
739
        :param retcode: The status code that is expected.  Defaults to 0.  If
 
740
        None is supplied, the status code is not checked.
 
741
        """
 
742
        bzr_path = os.path.dirname(os.path.dirname(bzrlib.__file__))+'/bzr'
 
743
        args = list(args)
 
744
        process = Popen([sys.executable, bzr_path]+args, stdout=PIPE, 
 
745
                         stderr=PIPE)
 
746
        out = process.stdout.read()
 
747
        err = process.stderr.read()
 
748
        retcode = process.wait()
 
749
        supplied_retcode = kwargs.get('retcode', 0)
 
750
        if supplied_retcode is not None:
 
751
            assert supplied_retcode == retcode
 
752
        return [out, err]
670
753
 
671
754
    def check_inventory_shape(self, inv, shape):
672
755
        """Compare an inventory to a list of expected names.
837
920
        for name in shape:
838
921
            self.assert_(isinstance(name, basestring))
839
922
            if name[-1] == '/':
840
 
                transport.mkdir(urlescape(name[:-1]))
 
923
                transport.mkdir(urlutils.escape(name[:-1]))
841
924
            else:
842
925
                if line_endings == 'binary':
843
926
                    end = '\n'
845
928
                    end = os.linesep
846
929
                else:
847
930
                    raise errors.BzrError('Invalid line ending request %r' % (line_endings,))
848
 
                content = "contents of %s%s" % (name, end)
849
 
                transport.put(urlescape(name), StringIO(content))
 
931
                content = "contents of %s%s" % (name.encode('utf-8'), end)
 
932
                transport.put(urlutils.escape(name), StringIO(content))
850
933
 
851
934
    def build_tree_contents(self, shape):
852
935
        build_tree_contents(shape)
862
945
    def assertFileEqual(self, content, path):
863
946
        """Fail if path does not contain 'content'."""
864
947
        self.failUnless(osutils.lexists(path))
 
948
        # TODO: jam 20060427 Shouldn't this be 'rb'?
865
949
        self.assertEqualDiff(content, open(path, 'r').read())
866
950
 
867
951
 
943
1027
        if relpath is not None and relpath != '.':
944
1028
            if not base.endswith('/'):
945
1029
                base = base + '/'
946
 
            base = base + relpath
 
1030
            base = base + urlutils.escape(relpath)
947
1031
        return base
948
1032
 
949
1033
    def get_transport(self):
970
1054
    def make_bzrdir(self, relpath, format=None):
971
1055
        try:
972
1056
            url = self.get_url(relpath)
973
 
            segments = relpath.split('/')
 
1057
            mutter('relpath %r => url %r', relpath, url)
 
1058
            segments = url.split('/')
974
1059
            if segments and segments[-1] not in ('', '.'):
975
 
                parent = self.get_url('/'.join(segments[:-1]))
 
1060
                parent = '/'.join(segments[:-1])
976
1061
                t = get_transport(parent)
977
1062
                try:
978
1063
                    t.mkdir(segments[-1])
1114
1199
                   'bzrlib.tests.test_api',
1115
1200
                   'bzrlib.tests.test_bad_files',
1116
1201
                   'bzrlib.tests.test_branch',
 
1202
                   'bzrlib.tests.test_bundle',
1117
1203
                   'bzrlib.tests.test_bzrdir',
1118
1204
                   'bzrlib.tests.test_command',
1119
1205
                   'bzrlib.tests.test_commit',
1145
1231
                   'bzrlib.tests.test_options',
1146
1232
                   'bzrlib.tests.test_osutils',
1147
1233
                   'bzrlib.tests.test_patch',
 
1234
                   'bzrlib.tests.test_patches',
1148
1235
                   'bzrlib.tests.test_permissions',
1149
1236
                   'bzrlib.tests.test_plugins',
1150
1237
                   'bzrlib.tests.test_progress',
1174
1261
                   'bzrlib.tests.test_tuned_gzip',
1175
1262
                   'bzrlib.tests.test_ui',
1176
1263
                   'bzrlib.tests.test_upgrade',
 
1264
                   'bzrlib.tests.test_urlutils',
1177
1265
                   'bzrlib.tests.test_versionedfile',
1178
1266
                   'bzrlib.tests.test_weave',
1179
1267
                   'bzrlib.tests.test_whitebox',