~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/__init__.py

  • Committer: Vincent Ladeuil
  • Date: 2007-02-21 14:46:06 UTC
  • mto: (2326.1.1 jam-integration)
  • mto: This revision was merged to the branch mainline in revision 2327.
  • Revision ID: v.ladeuil+lp@free.fr-20070221144606-qoy01pue1p187j3b
Provide a better implementation for testing passwords.

* bzrlib/ui/__init__.py:
(UIFactory.get_login): Deleted.
(CLIUIFactory.get_non_echoed_password): New method allowing
overriding.

* bzrlib/tests/__init__.py:
(TestUIFactory.get_non_echoed_password): Allows password testing
 without worrying about echo echo.

* bzrlib/tests/__init__.py:
(TestUIFactory): Moved from bzrlib/tests/blackbox/__init__.py
(FakeStdin): Deleted.
(TestCase.run_bzr_captured): Set and reuse ui.ui_factory.stdin.

* bzrlib/ui/text.py:
(TextUIFactory.get_login): Deleted.
(TextUIFactory.get_password): Moved to CLIUIFactory.

* bzrlib/tests/test_ui.py:
(UITests): Delete get_login tests.
(FakeTextUIFactory): Deleted. Better implementation in
TestUIFactory.

* bzrlib/tests/blackbox/__init__.py:
(TestUIFactory): Moved to bzrlib/tests/__init__.py.

Show diffs side-by-side

added added

removed removed

Lines of Context:
50
50
    memorytree,
51
51
    osutils,
52
52
    progress,
 
53
    ui,
53
54
    urlutils,
54
55
    )
55
56
import bzrlib.branch
170
171
                revision_id = ''
171
172
            bench_history.write("--date %s %s\n" % (time.time(), revision_id))
172
173
        self._bench_history = bench_history
173
 
        self.ui = bzrlib.ui.ui_factory
 
174
        self.ui = ui.ui_factory
174
175
        self.num_tests = num_tests
175
176
        self.error_count = 0
176
177
        self.failure_count = 0
530
531
            return setattr(self._cstring, name, val)
531
532
 
532
533
 
533
 
class FakeStdin(StringIOWrapper):
534
 
    """Simulated stdin for tests only.
535
 
 
536
 
    We pretend to be the real stdin by redirecting the fileno method so that
537
 
    getpass.getpass can succeed changing the echo mode of the real
538
 
    stdin. More precisely, getpass change the echo mode via tcsetattr which
539
 
    requires a file descriptor, once the user have entered its password the
540
 
    echo mode is restored (this is garanteed by a try-finally). So basically
541
 
    the risk for the tester is to lose ist echo if he attemps to type some
542
 
    characters *while* the echo is disabled.
543
 
 
544
 
    That allows tests to can user inputs without having to implement a
545
 
    full-fledged stdin.
 
534
class TestUIFactory(ui.CLIUIFactory):
 
535
    """A UI Factory for testing.
 
536
 
 
537
    Hide the progress bar but emit note()s.
 
538
    Redirect stdin.
 
539
    Allows get_password to be tested without real tty attached.
546
540
    """
547
541
 
548
 
    fileno = sys.stdin.fileno
549
 
 
550
 
    def __init__(self, string, encoding='ascii'):
551
 
        StringIOWrapper.__init__(self, string.encode(encoding))
552
 
        self.encoding = encoding
 
542
    def __init__(self,
 
543
                 stdout=None,
 
544
                 stderr=None,
 
545
                 stdin=None):
 
546
        super(TestUIFactory, self).__init__()
 
547
        if stdin is not None:
 
548
            # We use a StringIOWrapper to be able to test various
 
549
            # encodings, but the user is still responsible to
 
550
            # encode the string and to set the encoding attribute
 
551
            # of StringIOWrapper.
 
552
            self.stdin = StringIOWrapper(stdin)
 
553
        if stdout is None:
 
554
            self.stdout = sys.stdout
 
555
        else:
 
556
            self.stdout = stdout
 
557
        if stderr is None:
 
558
            self.stderr = sys.stderr
 
559
        else:
 
560
            self.stderr = stderr
 
561
 
 
562
    def clear(self):
 
563
        """See progress.ProgressBar.clear()."""
 
564
 
 
565
    def clear_term(self):
 
566
        """See progress.ProgressBar.clear_term()."""
 
567
 
 
568
    def clear_term(self):
 
569
        """See progress.ProgressBar.clear_term()."""
 
570
 
 
571
    def finished(self):
 
572
        """See progress.ProgressBar.finished()."""
 
573
 
 
574
    def note(self, fmt_string, *args, **kwargs):
 
575
        """See progress.ProgressBar.note()."""
 
576
        self.stdout.write((fmt_string + "\n") % args)
 
577
 
 
578
    def progress_bar(self):
 
579
        return self
 
580
 
 
581
    def nested_progress_bar(self):
 
582
        return self
 
583
 
 
584
    def update(self, message, count=None, total=None):
 
585
        """See progress.ProgressBar.update()."""
 
586
 
 
587
    def get_non_echoed_password(self, prompt):
 
588
        """Get password from stdin without trying to handle the echo mode"""
 
589
        if prompt:
 
590
            self.stdout.write(prompt)
 
591
        password = self.stdin.readline()
 
592
        if not password:
 
593
            raise EOFError
 
594
        if password[-1] == '\n':
 
595
            password = password[:-1]
 
596
        return password
553
597
 
554
598
 
555
599
class TestCase(unittest.TestCase):
601
645
    def _silenceUI(self):
602
646
        """Turn off UI for duration of test"""
603
647
        # by default the UI is off; tests can turn it on if they want it.
604
 
        saved = bzrlib.ui.ui_factory
 
648
        saved = ui.ui_factory
605
649
        def _restore():
606
 
            bzrlib.ui.ui_factory = saved
607
 
        bzrlib.ui.ui_factory = bzrlib.ui.SilentUIFactory()
 
650
            ui.ui_factory = saved
 
651
        ui.ui_factory = ui.SilentUIFactory()
608
652
        self.addCleanup(_restore)
609
653
 
610
654
    def _ndiff_strings(self, a, b):
957
1001
        """
958
1002
        if encoding is None:
959
1003
            encoding = bzrlib.user_encoding
960
 
        if stdin is not None:
961
 
            stdin = StringIO(stdin)
962
1004
        stdout = StringIOWrapper()
963
1005
        stderr = StringIOWrapper()
964
1006
        stdout.encoding = encoding
970
1012
        handler.setLevel(logging.INFO)
971
1013
        logger = logging.getLogger('')
972
1014
        logger.addHandler(handler)
973
 
        old_ui_factory = bzrlib.ui.ui_factory
974
 
        bzrlib.ui.ui_factory = bzrlib.tests.blackbox.TestUIFactory(
975
 
            stdout=stdout,
976
 
            stderr=stderr)
977
 
        bzrlib.ui.ui_factory.stdin = stdin
 
1015
        old_ui_factory = ui.ui_factory
 
1016
        ui.ui_factory = TestUIFactory(stdin=stdin, stdout=stdout, stderr=stderr)
978
1017
 
979
1018
        cwd = None
980
1019
        if working_dir is not None:
985
1024
            saved_debug_flags = frozenset(debug.debug_flags)
986
1025
            debug.debug_flags.clear()
987
1026
            try:
988
 
                result = self.apply_redirected(stdin, stdout, stderr,
 
1027
                result = self.apply_redirected(ui.ui_factory.stdin,
 
1028
                                               stdout, stderr,
989
1029
                                               bzrlib.commands.run_bzr_catch_errors,
990
1030
                                               argv)
991
1031
            finally:
992
1032
                debug.debug_flags.update(saved_debug_flags)
993
1033
        finally:
994
1034
            logger.removeHandler(handler)
995
 
            bzrlib.ui.ui_factory = old_ui_factory
 
1035
            ui.ui_factory = old_ui_factory
996
1036
            if cwd is not None:
997
1037
                os.chdir(cwd)
998
1038