~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:
242
242
        if isinstance(err[1], TestSkipped):
243
243
            return self.addSkipped(test, err)    
244
244
        unittest.TestResult.addError(self, test, err)
245
 
        method = getattr(test, 'setKeepLogfile', None)
246
 
        if method is not None:
247
 
            method()
 
245
        # We can only do this if we have one of our TestCases, not if
 
246
        # we have a doctest.
 
247
        setKeepLogfile = getattr(test, 'setKeepLogfile', None)
 
248
        if setKeepLogfile is not None:
 
249
            setKeepLogfile()
248
250
        self.extractBenchmarkTime(test)
249
251
        if self.showAll:
250
252
            self.stream.writeln("ERROR %s" % self._testTimeString())
261
263
 
262
264
    def addFailure(self, test, err):
263
265
        unittest.TestResult.addFailure(self, test, err)
264
 
        method = getattr(test, 'setKeepLogfile', None)
265
 
        if method is not None:
266
 
            method()
 
266
        # We can only do this if we have one of our TestCases, not if
 
267
        # we have a doctest.
 
268
        setKeepLogfile = getattr(test, 'setKeepLogfile', None)
 
269
        if setKeepLogfile is not None:
 
270
            setKeepLogfile()
267
271
        self.extractBenchmarkTime(test)
268
272
        if self.showAll:
269
273
            self.stream.writeln(" FAIL %s" % self._testTimeString())
784
788
        """Shortcut that splits cmd into words, runs, and returns stdout"""
785
789
        return self.run_bzr_captured(cmd.split(), retcode=retcode)[0]
786
790
 
787
 
    def run_bzr_captured(self, argv, retcode=0, encoding=None, stdin=None):
 
791
    def run_bzr_captured(self, argv, retcode=0, encoding=None, stdin=None,
 
792
                         working_dir=None):
788
793
        """Invoke bzr and return (stdout, stderr).
789
794
 
790
795
        Useful for code that wants to check the contents of the
805
810
        :param retcode: expected return code, or None for don't-care.
806
811
        :param encoding: encoding for sys.stdout and sys.stderr
807
812
        :param stdin: A string to be used as stdin for the command.
 
813
        :param working_dir: Change to this directory before running
808
814
        """
809
815
        if encoding is None:
810
816
            encoding = bzrlib.user_encoding
826
832
            stdout=stdout,
827
833
            stderr=stderr)
828
834
        bzrlib.ui.ui_factory.stdin = stdin
 
835
 
 
836
        cwd = None
 
837
        if working_dir is not None:
 
838
            cwd = osutils.getcwd()
 
839
            os.chdir(working_dir)
 
840
 
829
841
        try:
830
842
            result = self.apply_redirected(stdin, stdout, stderr,
831
843
                                           bzrlib.commands.run_bzr_catch_errors,
833
845
        finally:
834
846
            logger.removeHandler(handler)
835
847
            bzrlib.ui.ui_factory = old_ui_factory
 
848
            if cwd is not None:
 
849
                os.chdir(cwd)
836
850
 
837
851
        out = stdout.getvalue()
838
852
        err = stderr.getvalue()
859
873
        retcode = kwargs.pop('retcode', 0)
860
874
        encoding = kwargs.pop('encoding', None)
861
875
        stdin = kwargs.pop('stdin', None)
862
 
        return self.run_bzr_captured(args, retcode=retcode, encoding=encoding, stdin=stdin)
 
876
        working_dir = kwargs.pop('working_dir', None)
 
877
        return self.run_bzr_captured(args, retcode=retcode, encoding=encoding,
 
878
                                     stdin=stdin, working_dir=working_dir)
863
879
 
864
880
    def run_bzr_decode(self, *args, **kwargs):
865
881
        if 'encoding' in kwargs:
915
931
        :param universal_newlines: Convert CRLF => LF
916
932
        """
917
933
        env_changes = kwargs.get('env_changes', {})
918
 
        process = self.start_bzr_subprocess(args, env_changes=env_changes)
 
934
        working_dir = kwargs.get('working_dir', None)
 
935
        process = self.start_bzr_subprocess(args, env_changes=env_changes,
 
936
                                            working_dir=working_dir)
919
937
        # We distinguish between retcode=None and retcode not passed.
920
938
        supplied_retcode = kwargs.get('retcode', 0)
921
939
        return self.finish_bzr_subprocess(process, retcode=supplied_retcode,
923
941
            process_args=args)
924
942
 
925
943
    def start_bzr_subprocess(self, process_args, env_changes=None,
926
 
                             skip_if_plan_to_signal=False):
 
944
                             skip_if_plan_to_signal=False,
 
945
                             working_dir=None):
927
946
        """Start bzr in a subprocess for testing.
928
947
 
929
948
        This starts a new Python interpreter and runs bzr in there.
961
980
 
962
981
        bzr_path = self.get_bzr_path()
963
982
 
 
983
        cwd = None
 
984
        if working_dir is not None:
 
985
            cwd = osutils.getcwd()
 
986
            os.chdir(working_dir)
 
987
 
964
988
        try:
965
989
            # win32 subprocess doesn't support preexec_fn
966
990
            # so we will avoid using it on all platforms, just to
970
994
                             stdin=PIPE, stdout=PIPE, stderr=PIPE)
971
995
        finally:
972
996
            restore_environment()
 
997
            if cwd is not None:
 
998
                os.chdir(cwd)
 
999
 
973
1000
        return process
974
1001
 
975
1002
    def get_bzr_path(self):