~bzr/ubuntu/lucid/bzr/beta-ppa

« back to all changes in this revision

Viewing changes to bzrlib/tests/per_uifactory/__init__.py

  • Committer: Martin Pool
  • Date: 2010-07-02 07:29:40 UTC
  • mfrom: (129.1.7 packaging-karmic)
  • Revision ID: mbp@sourcefrog.net-20100702072940-hpzq5elg8wjve8rh
* PPA rebuild.
* PPA rebuild for Karmic.
* PPA rebuild for Jaunty.
* PPA rebuild for Hardy.
* From postinst, actually remove the example bash completion scripts.
  (LP: #249452)
* New upstream release.
* New upstream release.
* New upstream release.
* Revert change to Build-depends: Dapper does not have python-central.
  Should be python-support..
* Target ppa..
* Target ppa..
* Target ppa..
* Target ppa..
* New upstream release.
* Switch to dpkg-source 3.0 (quilt) format.
* Bump standards version to 3.8.4.
* Remove embedded copy of python-configobj. Closes: #555336
* Remove embedded copy of python-elementtree. Closes: #555343
* Change section from 'Devel' to 'Vcs'..
* Change section from 'Devel' to 'Vcs'..
* Change section from 'Devel' to 'Vcs'..
* Change section from 'Devel' to 'Vcs'..
* Change section from 'Devel' to 'Vcs'..
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* debian/control: Fix obsolete-relation-form-in-source
  lintian warning. 
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Split out docs into bzr-doc package.
* New upstream release.
* Added John Francesco Ferlito to Uploaders.
* Fix install path to quick-reference guide
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Fix FTBFS due to path changes, again.
* Fix FTBFS due to doc paths changing
* New upstream release.
* Fix FTBFS due to path changes, again.
* Fix FTBFS due to doc paths changing
* New upstream release.
* Fix FTBFS due to path changes, again.
* Fix FTBFS due to doc paths changing
* New upstream release.
* Fix FTBFS due to path changes, again, again.
* Fix FTBFS due to path changes, again.
* Fix FTBFS due to path changes.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Bump standards version to 3.8.3.
* Remove unused patch system.
* New upstream release.
* New upstream release.
* New upstream release.
* Fix copy and paste tab error in .install file
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
 + Fixes compatibility with Python 2.4. Closes: #537708
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream version.
* Bump standards version to 3.8.2.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Add python-pyrex to build-deps to ensure C extensions are always build.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Split documentation into bzr-doc package. ((LP: #385074)
* Multiple packaging changes to make us more linitan clean.
* New upstream release.
* Split documentation into bzr-doc package. ((LP: #385074)
* Multiple packaging changes to make us more linitan clean.
* New upstream release.
* Split documentation into bzr-doc package. ((LP: #385074)
* Multiple packaging changes to make us more linitan clean.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Fix API compatibility version. (Closes: #526233)
* New upstream release.
  + Fixes default format for upgrade command. (Closes: #464688)
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Add missing dependency on zlib development library. (Closes:
  #523595)
* Add zlib build-depends.
* Add zlib build-depends.
* Add zlib build-depends.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Move to section vcs.
* Bump standards version to 3.8.1.
* New upstream release.
* Remove temporary patch for missing .c files from distribution
* New upstream release.
* Remove temporary patch for missing .c files from distribution
* New upstream release.
* Remove temporary patch for missing .c files from distribution
* Add temporary patch for missing .c files from distribution
* Add temporary patch for missing .c files from distribution
* Add temporary patch for missing .c files from distribution
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Recommend ca-certificates. (Closes: #452024)
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Update watch file. bazaar now uses launchpad to host its sources.
* Remove patch for inventory root revision copy, applied upstream.
* New upstream release.
* New upstream release.
* New upstream release
* Force removal of files installed in error to /etc/bash_completion.d/
  (LP: #249452)
* New upstream release.
* New upstream release
* New upstream release.
* Bump standards version.
* Include patch for inventory root revision copy, required for bzr-svn.
* New upstream release.
* Remove unused lintian overrides.
* Correct the package version not to be native.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* New upstream release.
* Final 1.5 release.
* New upstream release.
* New upstream release.
* New upstream release.
* Add myself as a co-maintainer.
* Add a Dm-Upload-Allowed: yes header.
* New upstream bugfix release.
* New upstream release.
* Final 1.3 release.
* New upstream release.
* First release candidate of the upcoming 1.3 release.
* Rebuild to fix the problem caused by a build with a broken python-central.
* New upstream release.
* Rebuild for dapper PPA.
* Apply Lamont's patches to fix build-dependencies on dapper.
  (See: https://bugs.launchpad.net/bzr/+bug/189915)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2009, 2010 Canonical Ltd
 
2
#
 
3
# This program is free software; you can redistribute it and/or modify
 
4
# it under the terms of the GNU General Public License as published by
 
5
# the Free Software Foundation; either version 2 of the License, or
 
6
# (at your option) any later version.
 
7
#
 
8
# This program is distributed in the hope that it will be useful,
 
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
# GNU General Public License for more details.
 
12
#
 
13
# You should have received a copy of the GNU General Public License
 
14
# along with this program; if not, write to the Free Software
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
16
 
 
17
"""Tests run per UIFactory."""
 
18
 
 
19
# Testing UIFactories is a bit interesting because we require they all support a
 
20
# common interface, but the way they implement it can vary very widely.  Between
 
21
# text, batch-mode, graphical and other potential UIFactories, the requirements
 
22
# to set up a factory, to make it respond to requests, and to simulate user
 
23
# input can vary a lot.
 
24
#
 
25
# We want tests that therefore allow for the evaluation of the result to vary
 
26
# per implementation, but we want to check that the supported facilities are
 
27
# the same across all UIFactorys, unless they're specifically skipped.
 
28
#
 
29
# Our normal approach is to use test scenarios but that seems to just end up
 
30
# creating test-like objects inside the scenario.  Therefore we fall back to
 
31
# the older method of putting the common tests in a mixin.
 
32
#
 
33
# Plugins that add new UIFactorys can create their own subclasses.
 
34
 
 
35
 
 
36
from cStringIO import StringIO
 
37
import unittest
 
38
 
 
39
 
 
40
from bzrlib import (
 
41
    tests,
 
42
    transport,
 
43
    ui,
 
44
    )
 
45
 
 
46
 
 
47
class UIFactoryTestMixin(object):
 
48
    """Common tests for UIFactories.
 
49
 
 
50
    These are supposed to be expressed with no assumptions about how the
 
51
    UIFactory implements the method, only that it does implement them (or
 
52
    fails cleanly), and that the concrete subclass will make arrangements to
 
53
    build a factory and to examine its behaviour.
 
54
 
 
55
    Note that this is *not* a TestCase, because it can't be directly run, but
 
56
    the concrete subclasses should be.
 
57
    """
 
58
 
 
59
    def test_be_quiet(self):
 
60
        self.factory.be_quiet(True)
 
61
        self.assertEquals(True, self.factory.is_quiet())
 
62
        self.factory.be_quiet(False)
 
63
        self.assertEquals(False, self.factory.is_quiet())
 
64
 
 
65
    def test_note(self):
 
66
        self.factory.note("a note to the user")
 
67
        self._check_note("a note to the user")
 
68
 
 
69
    def test_show_error(self):
 
70
        msg = 'an error occurred'
 
71
        self.factory.show_error(msg)
 
72
        self._check_show_error(msg)
 
73
 
 
74
    def test_show_message(self):
 
75
        msg = 'a message'
 
76
        self.factory.show_message(msg)
 
77
        self._check_show_message(msg)
 
78
 
 
79
    def test_show_warning(self):
 
80
        msg = 'a warning'
 
81
        self.factory.show_warning(msg)
 
82
        self._check_show_warning(msg)
 
83
 
 
84
    def test_make_output_stream(self):
 
85
        # All UIs must now be able to at least accept output, even if they
 
86
        # just discard it.
 
87
        output_stream = self.factory.make_output_stream()
 
88
        output_stream.write('hello!')
 
89
 
 
90
    def test_transport_activity(self):
 
91
        # It doesn't matter what the implementation does, we just want to make
 
92
        # sure the interface is there
 
93
        t = transport.get_transport('memory:///')
 
94
        self.factory.report_transport_activity(t, 1000, 'write')
 
95
        self.factory.report_transport_activity(t, 2000, 'read')
 
96
        self.factory.report_transport_activity(t, 4000, None)
 
97
        self.factory.log_transport_activity()
 
98
        self._check_log_transport_activity_noarg()
 
99
        self.factory.log_transport_activity(display=True)
 
100
        self._check_log_transport_activity_display()
 
101
 
 
102
    def test_no_transport_activity(self):
 
103
        # No activity to report
 
104
        t = transport.get_transport('memory:///')
 
105
        self.factory.log_transport_activity(display=True)
 
106
        self._check_log_transport_activity_display_no_bytes()
 
107
 
 
108
 
 
109
class TestTextUIFactory(tests.TestCase, UIFactoryTestMixin):
 
110
 
 
111
    def setUp(self):
 
112
        super(TestTextUIFactory, self).setUp()
 
113
        self.stdin = StringIO()
 
114
        self.stdout = StringIO()
 
115
        self.stderr = StringIO()
 
116
        self.factory = ui.text.TextUIFactory(self.stdin, self.stdout,
 
117
            self.stderr)
 
118
 
 
119
    def _check_note(self, note_text):
 
120
        self.assertEquals("%s\n" % note_text,
 
121
            self.stdout.getvalue())
 
122
 
 
123
    def _check_show_error(self, msg):
 
124
        self.assertEquals("bzr: error: %s\n" % msg,
 
125
            self.stderr.getvalue())
 
126
        self.assertEquals("", self.stdout.getvalue())
 
127
 
 
128
    def _check_show_message(self, msg):
 
129
        self.assertEquals("%s\n" % msg,
 
130
            self.stdout.getvalue())
 
131
        self.assertEquals("", self.stderr.getvalue())
 
132
 
 
133
    def _check_show_warning(self, msg):
 
134
        self.assertEquals("bzr: warning: %s\n" % msg,
 
135
            self.stderr.getvalue())
 
136
        self.assertEquals("", self.stdout.getvalue())
 
137
 
 
138
    def _check_log_transport_activity_noarg(self):
 
139
        self.assertEqual('', self.stdout.getvalue())
 
140
        self.assertContainsRe(self.stderr.getvalue(), r'\d+KB\s+\dKB/s |')
 
141
        self.assertNotContainsRe(self.stderr.getvalue(), r'Transferred:')
 
142
 
 
143
    def _check_log_transport_activity_display(self):
 
144
        self.assertEqual('', self.stdout.getvalue())
 
145
        # Without a TTY, we shouldn't display anything
 
146
        self.assertEqual('', self.stderr.getvalue())
 
147
 
 
148
    def _check_log_transport_activity_display_no_bytes(self):
 
149
        self.assertEqual('', self.stdout.getvalue())
 
150
        # Without a TTY, we shouldn't display anything
 
151
        self.assertEqual('', self.stderr.getvalue())
 
152
 
 
153
 
 
154
class TestTTYTextUIFactory(TestTextUIFactory):
 
155
 
 
156
    def setUp(self):
 
157
        super(TestTTYTextUIFactory, self).setUp()
 
158
 
 
159
        class TTYStringIO(object):
 
160
            """Thunk over to StringIO() for everything but 'isatty'"""
 
161
 
 
162
            def __init__(self):
 
163
                self.__dict__['_sio'] = StringIO()
 
164
 
 
165
            def isatty(self):
 
166
                return True
 
167
 
 
168
            def __getattr__(self, name):
 
169
                return getattr(self._sio, name)
 
170
 
 
171
            def __setattr__(self, name, value):
 
172
                return setattr(self._sio, name, value)
 
173
                
 
174
        # Remove 'TERM' == 'dumb' which causes us to *not* treat output as a
 
175
        # real terminal, even though isatty returns True
 
176
        self._captureVar('TERM', None)
 
177
        self.stderr = TTYStringIO()
 
178
        self.stdout = TTYStringIO()
 
179
        self.factory = ui.text.TextUIFactory(self.stdin, self.stdout,
 
180
            self.stderr)
 
181
 
 
182
    def _check_log_transport_activity_display(self):
 
183
        self.assertEqual('', self.stdout.getvalue())
 
184
        # Displaying the result should write to the progress stream
 
185
        self.assertContainsRe(self.stderr.getvalue(),
 
186
            r'Transferred: 7KiB'
 
187
            r' \(\d+\.\dK/s r:2K w:1K u:4K\)')
 
188
 
 
189
    def _check_log_transport_activity_display_no_bytes(self):
 
190
        self.assertEqual('', self.stdout.getvalue())
 
191
        # Without actual bytes transferred, we should report nothing
 
192
        self.assertEqual('', self.stderr.getvalue())
 
193
 
 
194
 
 
195
class TestSilentUIFactory(tests.TestCase, UIFactoryTestMixin):
 
196
    # discards output, therefore tests for output expect nothing
 
197
 
 
198
    def setUp(self):
 
199
        super(TestSilentUIFactory, self).setUp()
 
200
        self.factory = ui.SilentUIFactory()
 
201
 
 
202
    def _check_note(self, note_text):
 
203
        # it's just discarded
 
204
        pass
 
205
 
 
206
    def _check_show_error(self, msg):
 
207
        pass
 
208
 
 
209
    def _check_show_message(self, msg):
 
210
        pass
 
211
 
 
212
    def _check_show_warning(self, msg):
 
213
        pass
 
214
 
 
215
    def _check_log_transport_activity_noarg(self):
 
216
        pass
 
217
 
 
218
    def _check_log_transport_activity_display(self):
 
219
        pass
 
220
 
 
221
    def _check_log_transport_activity_display_no_bytes(self):
 
222
        pass
 
223
 
 
224
 
 
225
class TestCannedInputUIFactory(tests.TestCase, UIFactoryTestMixin):
 
226
    # discards output, reads input from variables
 
227
 
 
228
    def setUp(self):
 
229
        super(TestCannedInputUIFactory, self).setUp()
 
230
        self.factory = ui.CannedInputUIFactory([])
 
231
 
 
232
    def _check_note(self, note_text):
 
233
        pass
 
234
 
 
235
    def _check_show_error(self, msg):
 
236
        pass
 
237
 
 
238
    def _check_show_message(self, msg):
 
239
        pass
 
240
 
 
241
    def _check_show_warning(self, msg):
 
242
        pass
 
243
 
 
244
    def _check_log_transport_activity_noarg(self):
 
245
        pass
 
246
 
 
247
    def _check_log_transport_activity_display(self):
 
248
        pass
 
249
 
 
250
    def _check_log_transport_activity_display_no_bytes(self):
 
251
        pass