~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/__init__.py

[patch] use unicode literals for all hardcoded paths (Alexander Belchenko)

> When you use flat string on Windows for base part of file names then all
> derived file names is always representing as flat string. On Linux/Cygwin as
> I can see in situations when path cannot be represented as flat string (or in
> ascii encoding?) it silently converted to unicode. As result we have
> different behaviour with non-ascii (non-english) file names.

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
 
18
 
# TODO: Perhaps there should be an API to find out if bzr running under the
19
 
# test suite -- some plugins might want to avoid making intrusive changes if
20
 
# this is the case.  However, we want behaviour under to test to diverge as
21
 
# little as possible, so this should be used rarely if it's added at all.
22
 
# (Suggestion from j-a-meinel, 2005-11-24)
23
 
 
24
18
from cStringIO import StringIO
25
19
import difflib
26
20
import errno
32
26
import tempfile
33
27
import unittest
34
28
import time
35
 
import codecs
36
29
 
37
30
import bzrlib.branch
38
31
import bzrlib.commands
124
117
        self._start_time = time.time()
125
118
 
126
119
    def addError(self, test, err):
127
 
        if isinstance(err[1], TestSkipped):
128
 
            return self.addSkipped(test, err)    
129
120
        unittest.TestResult.addError(self, test, err)
130
121
        if self.showAll:
131
122
            self.stream.writeln("ERROR %s" % self._elapsedTime())
149
140
        self.stream.flush()
150
141
        unittest.TestResult.addSuccess(self, test)
151
142
 
152
 
    def addSkipped(self, test, skip_excinfo):
153
 
        if self.showAll:
154
 
            print >>self.stream, ' SKIP %s' % self._elapsedTime()
155
 
            print >>self.stream, '     %s' % skip_excinfo[1]
156
 
        elif self.dots:
157
 
            self.stream.write('S')
158
 
        self.stream.flush()
159
 
        # seems best to treat this as success from point-of-view of unittest
160
 
        # -- it actually does nothing so it barely matters :)
161
 
        unittest.TestResult.addSuccess(self, test)
162
 
 
163
143
    def printErrorList(self, flavour, errors):
164
144
        for test, err in errors:
165
145
            self.stream.writeln(self.separator1)
166
146
            self.stream.writeln("%s: %s" % (flavour,self.getDescription(test)))
167
147
            if hasattr(test, '_get_log'):
168
 
                print >>self.stream
169
 
                print >>self.stream, \
170
 
                        ('vvvv[log from %s]' % test).ljust(78,'-')
 
148
                self.stream.writeln()
 
149
                self.stream.writeln('log from this test:')
171
150
                print >>self.stream, test._get_log()
172
 
                print >>self.stream, \
173
 
                        ('^^^^[log from %s]' % test).ljust(78,'-')
174
151
            self.stream.writeln(self.separator2)
175
152
            self.stream.writeln("%s" % err)
176
153
 
264
241
            return
265
242
        raise AssertionError("texts not equal:\n" + 
266
243
                             self._ndiff_strings(a, b))      
267
 
        
268
 
    def assertStartsWith(self, s, prefix):
269
 
        if not s.startswith(prefix):
270
 
            raise AssertionError('string %r does not start with %r' % (s, prefix))
271
 
 
272
 
    def assertEndsWith(self, s, suffix):
273
 
        if not s.endswith(prefix):
274
 
            raise AssertionError('string %r does not end with %r' % (s, suffix))
275
244
 
276
245
    def assertContainsRe(self, haystack, needle_re):
277
246
        """Assert that a contains something matching a regular expression."""
279
248
            raise AssertionError('pattern "%s" not found in "%s"'
280
249
                    % (needle_re, haystack))
281
250
 
282
 
    def AssertSubset(self, sublist, superlist):
283
 
        """Assert that every entry in sublist is present in superlist."""
284
 
        missing = []
285
 
        for entry in sublist:
286
 
            if entry not in superlist:
287
 
                missing.append(entry)
288
 
        if len(missing) > 0:
289
 
            raise AssertionError("value(s) %r not present in container %r" % 
290
 
                                 (missing, superlist))
291
 
 
292
251
    def _startLogFile(self):
293
252
        """Send bzr and test log messages to a temporary file.
294
253
 
295
254
        The file is removed as the test is torn down.
296
255
        """
297
256
        fileno, name = tempfile.mkstemp(suffix='.log', prefix='testbzr')
298
 
        encoder, decoder, stream_reader, stream_writer = codecs.lookup('UTF-8')
299
 
        self._log_file = stream_writer(os.fdopen(fileno, 'w+'))
 
257
        self._log_file = os.fdopen(fileno, 'w+')
300
258
        bzrlib.trace.enable_test_log(self._log_file)
301
259
        self._log_file_name = name
302
260
        self.addCleanup(self._finishLogFile)
367
325
 
368
326
        This should only be called from TestCase.tearDown.
369
327
        """
370
 
        for cleanup_fn in reversed(self._cleanups):
371
 
            cleanup_fn()
 
328
        for callable in reversed(self._cleanups):
 
329
            callable()
372
330
 
373
331
    def log(self, *args):
374
332
        mutter(*args)
539
497
                else:
540
498
                    raise
541
499
            # successfully created
542
 
            TestCaseInTempDir.TEST_ROOT = osutils.abspath(root)
 
500
            TestCaseInTempDir.TEST_ROOT = os.path.abspath(root)
543
501
            break
544
502
        # make a fake bzr directory there to prevent any tests propagating
545
503
        # up onto the source directory's real branch
546
 
        os.mkdir(osutils.pathjoin(TestCaseInTempDir.TEST_ROOT, '.bzr'))
 
504
        os.mkdir(os.path.join(TestCaseInTempDir.TEST_ROOT, '.bzr'))
547
505
 
548
506
    def setUp(self):
549
507
        super(TestCaseInTempDir, self).setUp()
551
509
        _currentdir = os.getcwdu()
552
510
        short_id = self.id().replace('bzrlib.tests.', '') \
553
511
                   .replace('__main__.', '')
554
 
        self.test_dir = osutils.pathjoin(self.TEST_ROOT, short_id)
 
512
        self.test_dir = os.path.join(self.TEST_ROOT, short_id)
555
513
        os.mkdir(self.test_dir)
556
514
        os.chdir(self.test_dir)
557
515
        os.environ['HOME'] = self.test_dir
558
 
        os.environ['APPDATA'] = self.test_dir
559
516
        def _leaveDirectory():
560
517
            os.chdir(_currentdir)
561
518
        self.addCleanup(_leaveDirectory)
593
550
    def failUnlessExists(self, path):
594
551
        """Fail unless path, which may be abs or relative, exists."""
595
552
        self.failUnless(osutils.lexists(path))
596
 
 
597
 
    def failIfExists(self, path):
598
 
        """Fail if path, which may be abs or relative, exists."""
599
 
        self.failIf(osutils.lexists(path))
600
553
        
601
554
    def assertFileEqual(self, content, path):
602
555
        """Fail if path does not contain 'content'."""
603
556
        self.failUnless(osutils.lexists(path))
604
557
        self.assertEqualDiff(content, open(path, 'r').read())
 
558
        
 
559
 
 
560
class MetaTestLog(TestCase):
 
561
    def test_logging(self):
 
562
        """Test logs are captured when a test fails."""
 
563
        self.log('a test message')
 
564
        self._log_file.flush()
 
565
        self.assertContainsRe(self._get_log(), 'a test message\n')
605
566
 
606
567
 
607
568
def filter_suite_by_re(suite, pattern):
608
 
    result = TestSuite()
 
569
    result = TestUtil.TestSuite()
609
570
    filter_re = re.compile(pattern)
610
571
    for test in iter_suite_tests(suite):
611
572
        if filter_re.search(test.id()):
651
612
 
652
613
    global MODULES_TO_DOCTEST
653
614
 
654
 
    testmod_names = [ \
 
615
    # FIXME: If these fail to load, e.g. because of a syntax error, the
 
616
    # exception is hidden by unittest.  Sucks.  Should either fix that or
 
617
    # perhaps import them and pass them to unittest as modules.
 
618
    testmod_names = \
 
619
                  ['bzrlib.tests.MetaTestLog',
 
620
                   'bzrlib.tests.test_api',
 
621
                   'bzrlib.tests.test_gpg',
 
622
                   'bzrlib.tests.test_identitymap',
 
623
                   'bzrlib.tests.test_inv',
655
624
                   'bzrlib.tests.test_ancestry',
656
 
                   'bzrlib.tests.test_annotate',
657
 
                   'bzrlib.tests.test_api',
658
 
                   'bzrlib.tests.test_bad_files',
659
 
                   'bzrlib.tests.test_basis_inventory',
660
 
                   'bzrlib.tests.test_branch',
 
625
                   'bzrlib.tests.test_commit',
661
626
                   'bzrlib.tests.test_command',
662
 
                   'bzrlib.tests.test_commit',
663
627
                   'bzrlib.tests.test_commit_merge',
664
628
                   'bzrlib.tests.test_config',
665
 
                   'bzrlib.tests.test_conflicts',
666
 
                   'bzrlib.tests.test_diff',
667
 
                   'bzrlib.tests.test_fetch',
668
 
                   'bzrlib.tests.test_gpg',
669
 
                   'bzrlib.tests.test_graph',
 
629
                   'bzrlib.tests.test_merge3',
 
630
                   'bzrlib.tests.test_merge',
670
631
                   'bzrlib.tests.test_hashcache',
671
 
                   'bzrlib.tests.test_http',
672
 
                   'bzrlib.tests.test_identitymap',
673
 
                   'bzrlib.tests.test_inv',
 
632
                   'bzrlib.tests.test_status',
674
633
                   'bzrlib.tests.test_log',
675
 
                   'bzrlib.tests.test_merge',
676
 
                   'bzrlib.tests.test_merge3',
 
634
                   'bzrlib.tests.test_revisionnamespaces',
 
635
                   'bzrlib.tests.test_branch',
 
636
                   'bzrlib.tests.test_revision',
 
637
                   'bzrlib.tests.test_revision_info',
677
638
                   'bzrlib.tests.test_merge_core',
678
 
                   'bzrlib.tests.test_missing',
679
 
                   'bzrlib.tests.test_msgeditor',
680
 
                   'bzrlib.tests.test_nonascii',
681
 
                   'bzrlib.tests.test_options',
682
 
                   'bzrlib.tests.test_osutils',
 
639
                   'bzrlib.tests.test_smart_add',
 
640
                   'bzrlib.tests.test_bad_files',
 
641
                   'bzrlib.tests.test_diff',
683
642
                   'bzrlib.tests.test_parent',
684
 
                   'bzrlib.tests.test_permissions',
685
 
                   'bzrlib.tests.test_plugins',
686
 
                   'bzrlib.tests.test_remove',
687
 
                   'bzrlib.tests.test_revision',
688
 
                   'bzrlib.tests.test_revisionnamespaces',
689
 
                   'bzrlib.tests.test_revprops',
690
 
                   'bzrlib.tests.test_reweave',
691
 
                   'bzrlib.tests.test_rio',
 
643
                   'bzrlib.tests.test_xml',
 
644
                   'bzrlib.tests.test_weave',
 
645
                   'bzrlib.tests.test_fetch',
 
646
                   'bzrlib.tests.test_whitebox',
 
647
                   'bzrlib.tests.test_store',
692
648
                   'bzrlib.tests.test_sampler',
693
 
                   'bzrlib.tests.test_selftest',
694
 
                   'bzrlib.tests.test_setup',
695
 
                   'bzrlib.tests.test_sftp_transport',
696
 
                   'bzrlib.tests.test_smart_add',
697
 
                   'bzrlib.tests.test_source',
698
 
                   'bzrlib.tests.test_status',
699
 
                   'bzrlib.tests.test_store',
700
 
                   'bzrlib.tests.test_symbol_versioning',
701
 
                   'bzrlib.tests.test_testament',
702
 
                   'bzrlib.tests.test_trace',
703
649
                   'bzrlib.tests.test_transactions',
704
650
                   'bzrlib.tests.test_transport',
 
651
                   'bzrlib.tests.test_sftp',
 
652
                   'bzrlib.tests.test_graph',
 
653
                   'bzrlib.tests.test_workingtree',
 
654
                   'bzrlib.tests.test_upgrade',
 
655
                   'bzrlib.tests.test_uncommit',
 
656
                   'bzrlib.tests.test_conflicts',
 
657
                   'bzrlib.tests.test_testament',
 
658
                   'bzrlib.tests.test_annotate',
 
659
                   'bzrlib.tests.test_revprops',
 
660
                   'bzrlib.tests.test_options',
 
661
                   'bzrlib.tests.test_http',
 
662
                   'bzrlib.tests.test_nonascii',
 
663
                   'bzrlib.tests.test_reweave',
705
664
                   'bzrlib.tests.test_tsort',
706
 
                   'bzrlib.tests.test_ui',
707
 
                   'bzrlib.tests.test_uncommit',
708
 
                   'bzrlib.tests.test_upgrade',
709
 
                   'bzrlib.tests.test_weave',
710
 
                   'bzrlib.tests.test_whitebox',
711
 
                   'bzrlib.tests.test_workingtree',
712
 
                   'bzrlib.tests.test_xml',
 
665
                   'bzrlib.tests.test_trace',
 
666
                   'bzrlib.tests.test_rio',
713
667
                   ]
714
668
 
715
 
    TestCase.BZRPATH = osutils.pathjoin(
716
 
            osutils.realpath(osutils.dirname(bzrlib.__path__[0])), 'bzr')
717
 
    print '%10s: %s' % ('bzr', osutils.realpath(sys.argv[0]))
718
 
    print '%10s: %s' % ('bzrlib', bzrlib.__path__[0])
 
669
    TestCase.BZRPATH = os.path.join(os.path.realpath(os.path.dirname(bzrlib.__path__[0])), 'bzr')
 
670
    print '%-30s %s' % ('bzr binary', TestCase.BZRPATH)
719
671
    print
720
672
    suite = TestSuite()
721
 
    # python2.4's TestLoader.loadTestsFromNames gives very poor 
722
 
    # errors if it fails to load a named module - no indication of what's
723
 
    # actually wrong, just "no such module".  We should probably override that
724
 
    # class, but for the moment just load them ourselves. (mbp 20051202)
725
 
    loader = TestLoader()
726
 
    for mod_name in testmod_names:
727
 
        mod = _load_module_by_name(mod_name)
728
 
        suite.addTest(loader.loadTestsFromModule(mod))
 
673
    suite.addTest(TestLoader().loadTestsFromNames(testmod_names))
729
674
    for package in packages_to_test():
730
675
        suite.addTest(package.test_suite())
731
676
    for m in MODULES_TO_TEST:
732
 
        suite.addTest(loader.loadTestsFromModule(m))
 
677
        suite.addTest(TestLoader().loadTestsFromModule(m))
733
678
    for m in (MODULES_TO_DOCTEST):
734
679
        suite.addTest(DocTestSuite(m))
735
 
    for name, plugin in bzrlib.plugin.all_plugins().items():
736
 
        if hasattr(plugin, 'test_suite'):
737
 
            suite.addTest(plugin.test_suite())
 
680
    for p in bzrlib.plugin.all_plugins:
 
681
        if hasattr(p, 'test_suite'):
 
682
            suite.addTest(p.test_suite())
738
683
    return suite
739
684
 
740
 
 
741
 
def _load_module_by_name(mod_name):
742
 
    parts = mod_name.split('.')
743
 
    module = __import__(mod_name)
744
 
    del parts[0]
745
 
    # for historical reasons python returns the top-level module even though
746
 
    # it loads the submodule; we need to walk down to get the one we want.
747
 
    while parts:
748
 
        module = getattr(module, parts.pop(0))
749
 
    return module