~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to testsweet.py

  • Committer: Robert Collins
  • Date: 2005-08-24 05:29:04 UTC
  • mto: (974.1.50) (1185.1.10) (1092.3.1)
  • mto: This revision was merged to the branch mainline in revision 1139.
  • Revision ID: robertc@robertcollins.net-20050824052904-8c23b7fba5dc7908
provide a helper to redirect output as desired

Show diffs side-by-side

added added

removed removed

Lines of Context:
68
68
    OVERRIDE_PYTHON = None # to run with alternative python 'python'
69
69
    BZRPATH = 'bzr'
70
70
 
 
71
    def apply_redirected(self, stdin=None, stdout=None, stderr=None,
 
72
                         a_callable=None, *args, **kwargs):
 
73
        """Call callable with redirected std io pipes.
 
74
 
 
75
        Returns the return code."""
 
76
        from StringIO import StringIO
 
77
        if not callable(a_callable):
 
78
            raise ValueError("a_callable must be callable.")
 
79
        if stdin is None:
 
80
            stdin = StringIO("")
 
81
        if stdout is None:
 
82
            stdout = self.TEST_LOG
 
83
        if stderr is None:
 
84
            stderr = self.TEST_LOG
 
85
        real_stdin = sys.stdin
 
86
        real_stdout = sys.stdout
 
87
        real_stderr = sys.stderr
 
88
        result = None
 
89
        try:
 
90
            sys.stdout = stdout
 
91
            sys.stderr = stderr
 
92
            sys.stdin = stdin
 
93
            result = a_callable(*args, **kwargs)
 
94
        finally:
 
95
            sys.stdout = real_stdout
 
96
            sys.stderr = real_stderr
 
97
            sys.stdin = real_stdin
 
98
        return result
 
99
 
71
100
    def setUp(self):
72
101
        super(TestCase, self).setUp()
73
102
        # setup a temporary log for the test 
74
 
        import time
75
 
        import os
76
103
        import tempfile
77
104
        self.TEST_LOG = tempfile.NamedTemporaryFile(mode='wt', bufsize=0)
78
 
        # save stdout & stderr so there's no leakage from code-under-test
79
 
        self.real_stdout = sys.stdout
80
 
        self.real_stderr = sys.stderr
81
 
        sys.stdout = sys.stderr = self.TEST_LOG
82
105
        self.log("%s setup" % self.id())
83
106
 
84
107
    def tearDown(self):
85
 
        sys.stdout = self.real_stdout
86
 
        sys.stderr = self.real_stderr
87
108
        self.log("%s teardown" % self.id())
88
109
        self.log('')
89
110
        super(TestCase, self).tearDown()
210
231
        except ImportError, e:
211
232
            _need_subprocess()
212
233
            raise
213
 
 
214
234
        cmd = self.formcmd(cmd)
215
235
        child = Popen(cmd, stdout=PIPE, stderr=self.TEST_LOG)
216
236
        outd, errd = child.communicate()
217
237
        self.log(outd)
218
238
        actual_retcode = child.wait()
219
 
 
220
239
        outd = outd.replace('\r', '')
221
 
 
222
240
        if retcode != actual_retcode:
223
241
            raise CommandFailed("test failed: %r returned %d, expected %d"
224
242
                                % (cmd, actual_retcode, retcode))
225
 
 
226
243
        return outd
227
244
 
228
 
 
229
 
 
230
245
    def build_tree(self, shape):
231
246
        """Build a test tree according to a pattern.
232
247