~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/selftest/__init__.py

  • Committer: Martin Pool
  • Date: 2005-06-21 08:35:05 UTC
  • Revision ID: mbp@sourcefrog.net-20050621083505-79259fb5ed842e4f
- move more code to run external commands from testbzr to selftest

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
 
18
18
from unittest import TestResult, TestCase
19
19
 
 
20
try:
 
21
    import shutil
 
22
    from subprocess import call, Popen, PIPE
 
23
except ImportError, e:
 
24
    sys.stderr.write("testbzr: sorry, this test suite requires the subprocess module\n"
 
25
                     "this is shipped with python2.4 and available separately for 2.3\n")
 
26
    raise
 
27
 
 
28
 
 
29
class CommandFailed(Exception):
 
30
    pass
 
31
 
20
32
 
21
33
class TestBase(TestCase):
22
34
    """Base class for bzr test cases.
24
36
    Just defines some useful helper functions; doesn't actually test
25
37
    anything.
26
38
    """
27
 
    # TODO: Special methods to invoke bzr
28
 
    
29
 
    def runcmd(self, cmd, expected=0):
30
 
        self.log('$ ' + ' '.join(cmd))
31
 
        from os import spawnvp, P_WAIT
32
 
        rc = spawnvp(P_WAIT, cmd[0], cmd)
33
 
        if rc != expected:
34
 
            self.fail("command %r returned status %d" % (cmd, rc))
35
 
 
36
 
 
37
 
    def backtick(self, cmd):
38
 
        """Run a command and return its output"""
39
 
        from os import popen
40
 
        self.log('$ ' + ' '.join(cmd))
41
 
        pipe = popen(cmd)
42
 
        out = ''
43
 
        while True:
44
 
            buf = pipe.read()
45
 
            if buf:
46
 
                out += buf
47
 
                self.log(buf)
48
 
            else:
49
 
                break
50
 
        rc = pipe.close()
51
 
        if rc:
52
 
            self.fail("command %r returned status %d" % (cmd, rc))
53
 
        else:
54
 
            return out
55
 
            
 
39
    
 
40
    # TODO: Special methods to invoke bzr, so that we can run it
 
41
    # through a specified Python intepreter
 
42
 
 
43
    OVERRIDE_PYTHON = None # to run with alternative python 'python'
 
44
    BZRPATH = 'bzr'
 
45
    
 
46
 
 
47
    def formcmd(self, cmd):
 
48
        if isinstance(cmd, basestring):
 
49
            cmd = cmd.split()
 
50
 
 
51
        if cmd[0] == 'bzr':
 
52
            cmd[0] = self.BZRPATH
 
53
            if self.OVERRIDE_PYTHON:
 
54
                cmd.insert(0, self.OVERRIDE_PYTHON)
 
55
 
 
56
        self.log('$ %r' % cmd)
 
57
 
 
58
        return cmd
 
59
 
 
60
 
 
61
    def runcmd(self, cmd, retcode=0):
 
62
        """Run one command and check the return code.
 
63
 
 
64
        Returns a tuple of (stdout,stderr) strings.
 
65
 
 
66
        If a single string is based, it is split into words.
 
67
        For commands that are not simple space-separated words, please
 
68
        pass a list instead."""
 
69
        cmd = self.formcmd(cmd)
 
70
 
 
71
        self.log('$ ' + ' '.join(cmd))
 
72
        actual_retcode = call(cmd, stdout=self.TEST_LOG, stderr=self.TEST_LOG)
 
73
 
 
74
        if retcode != actual_retcode:
 
75
            raise CommandFailed("test failed: %r returned %d, expected %d"
 
76
                                % (cmd, actual_retcode, retcode))
 
77
 
 
78
 
56
79
 
57
80
    def log(self, msg):
58
81
        """Log a message to a progress file"""