~bzr-pqm/bzr/bzr.dev

5273.1.9 by Vincent Ladeuil
Merge bzr.dev into cleanup resolving conflicts
1
# Copyright (C) 2006-2010 Canonical Ltd
2192.1.2 by Alexander Belchenko
Tests for osutils.get_terminal_encoding()
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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2192.1.2 by Alexander Belchenko
Tests for osutils.get_terminal_encoding()
16
17
"""Tests for the osutils wrapper."""
18
19
import codecs
2192.1.9 by Alexander Belchenko
final fix suggested by John Meinel
20
import locale
2192.1.7 by Alexander Belchenko
get_user_encoding: if locale.Error raised we need to set user_encoding to 'ascii' as warning says
21
import os
2192.1.2 by Alexander Belchenko
Tests for osutils.get_terminal_encoding()
22
import sys
23
24
from bzrlib import (
25
    errors,
26
    osutils,
27
    )
28
from bzrlib.tests import (
29
        StringIOWrapper,
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
30
        TestCase,
2192.1.2 by Alexander Belchenko
Tests for osutils.get_terminal_encoding()
31
        )
32
33
34
class FakeCodec(object):
2192.1.8 by Alexander Belchenko
Rework tests after John's review
35
    """Special class that helps testing over several non-existed encodings.
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
36
2192.1.8 by Alexander Belchenko
Rework tests after John's review
37
    Clients can add new encoding names, but because of how codecs is
38
    implemented they cannot be removed. Be careful with naming to avoid
39
    collisions between tests.
2192.1.2 by Alexander Belchenko
Tests for osutils.get_terminal_encoding()
40
    """
41
    _registered = False
42
    _enabled_encodings = set()
43
44
    def add(self, encoding_name):
2192.1.8 by Alexander Belchenko
Rework tests after John's review
45
        """Adding encoding name to fake.
46
47
        :type   encoding_name:  lowercase plain string
48
        """
2192.1.2 by Alexander Belchenko
Tests for osutils.get_terminal_encoding()
49
        if not self._registered:
50
            codecs.register(self)
51
            self._registered = True
2192.1.8 by Alexander Belchenko
Rework tests after John's review
52
        if encoding_name is not None:
53
            self._enabled_encodings.add(encoding_name)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
54
2192.1.2 by Alexander Belchenko
Tests for osutils.get_terminal_encoding()
55
    def __call__(self, encoding_name):
56
        """Called indirectly by codecs module during lookup"""
57
        if encoding_name in self._enabled_encodings:
58
            return codecs.lookup('latin-1')
2192.1.6 by Alexander Belchenko
Fixes after Aaron's review
59
2192.1.2 by Alexander Belchenko
Tests for osutils.get_terminal_encoding()
60
61
fake_codec = FakeCodec()
62
63
64
class TestFakeCodec(TestCase):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
65
2192.1.2 by Alexander Belchenko
Tests for osutils.get_terminal_encoding()
66
    def test_fake_codec(self):
67
        self.assertRaises(LookupError, codecs.lookup, 'fake')
68
69
        fake_codec.add('fake')
70
        codecs.lookup('fake')
71
72
73
class TestTerminalEncoding(TestCase):
74
    """Test the auto-detection of proper terminal encoding."""
75
76
    def setUp(self):
4153.1.2 by Andrew Bennetts
Add missing TestCase.setUp upcalls.
77
        TestCase.setUp(self)
4985.1.5 by Vincent Ladeuil
Deploying the new overrideAttr facility further reduces the complexity
78
        self.overrideAttr(sys, 'stdin')
79
        self.overrideAttr(sys, 'stdout')
80
        self.overrideAttr(sys, 'stderr')
81
        self.overrideAttr(osutils, '_cached_user_encoding')
2192.1.2 by Alexander Belchenko
Tests for osutils.get_terminal_encoding()
82
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
83
    def make_wrapped_streams(self,
2192.1.2 by Alexander Belchenko
Tests for osutils.get_terminal_encoding()
84
                             stdout_encoding,
85
                             stderr_encoding,
86
                             stdin_encoding,
87
                             user_encoding='user_encoding',
88
                             enable_fake_encodings=True):
89
        sys.stdout = StringIOWrapper()
90
        sys.stdout.encoding = stdout_encoding
91
        sys.stderr = StringIOWrapper()
92
        sys.stderr.encoding = stderr_encoding
93
        sys.stdin = StringIOWrapper()
94
        sys.stdin.encoding = stdin_encoding
3224.5.4 by Andrew Bennetts
Fix test suite, mainly weeding out uses of bzrlib.user_encoding.
95
        osutils._cached_user_encoding = user_encoding
2192.1.8 by Alexander Belchenko
Rework tests after John's review
96
        if enable_fake_encodings:
97
            fake_codec.add(stdout_encoding)
98
            fake_codec.add(stderr_encoding)
99
            fake_codec.add(stdin_encoding)
2192.1.2 by Alexander Belchenko
Tests for osutils.get_terminal_encoding()
100
101
    def test_get_terminal_encoding(self):
102
        self.make_wrapped_streams('stdout_encoding',
103
                                  'stderr_encoding',
104
                                  'stdin_encoding')
105
106
        # first preference is stdout encoding
107
        self.assertEqual('stdout_encoding', osutils.get_terminal_encoding())
108
109
        sys.stdout.encoding = None
110
        # if sys.stdout is None, fall back to sys.stdin
111
        self.assertEqual('stdin_encoding', osutils.get_terminal_encoding())
112
113
        sys.stdin.encoding = None
3224.5.4 by Andrew Bennetts
Fix test suite, mainly weeding out uses of bzrlib.user_encoding.
114
        # and in the worst case, use osutils.get_user_encoding()
2192.1.2 by Alexander Belchenko
Tests for osutils.get_terminal_encoding()
115
        self.assertEqual('user_encoding', osutils.get_terminal_encoding())
116
5320.2.4 by Robert Collins
``bzrlib.osutils.get_terminal_encoding`` will now only mutter its
117
    def test_get_terminal_encoding_silent(self):
118
        self.make_wrapped_streams('stdout_encoding',
119
                                  'stderr_encoding',
120
                                  'stdin_encoding')
121
        # Calling get_terminal_encoding should not mutter when silent=True is
122
        # passed.
123
        log = self.get_log()
124
        osutils.get_terminal_encoding()
125
        self.assertEqual(log, self.get_log())
126
127
    def test_get_terminal_encoding_trace(self):
128
        self.make_wrapped_streams('stdout_encoding',
129
                                  'stderr_encoding',
130
                                  'stdin_encoding')
131
        # Calling get_terminal_encoding should not mutter when silent=True is
132
        # passed.
133
        log = self.get_log()
134
        osutils.get_terminal_encoding(trace=True)
135
        self.assertNotEqual(log, self.get_log())
136
2192.1.2 by Alexander Belchenko
Tests for osutils.get_terminal_encoding()
137
    def test_terminal_cp0(self):
2192.1.6 by Alexander Belchenko
Fixes after Aaron's review
138
        # test cp0 encoding (Windows returns cp0 when there is no encoding)
2192.1.2 by Alexander Belchenko
Tests for osutils.get_terminal_encoding()
139
        self.make_wrapped_streams('cp0',
2192.1.8 by Alexander Belchenko
Rework tests after John's review
140
                                  'cp0',
141
                                  'cp0',
2192.1.2 by Alexander Belchenko
Tests for osutils.get_terminal_encoding()
142
                                  user_encoding='latin-1',
143
                                  enable_fake_encodings=False)
144
145
        # cp0 is invalid encoding. We should fall back to user_encoding
146
        self.assertEqual('latin-1', osutils.get_terminal_encoding())
147
148
        # check stderr
149
        self.assertEquals('', sys.stderr.getvalue())
150
2192.1.8 by Alexander Belchenko
Rework tests after John's review
151
    def test_terminal_cp_unknown(self):
2192.1.2 by Alexander Belchenko
Tests for osutils.get_terminal_encoding()
152
        # test against really unknown encoding
153
        # catch warning at stderr
2192.1.8 by Alexander Belchenko
Rework tests after John's review
154
        self.make_wrapped_streams('cp-unknown',
155
                                  'cp-unknown',
156
                                  'cp-unknown',
2192.1.2 by Alexander Belchenko
Tests for osutils.get_terminal_encoding()
157
                                  user_encoding='latin-1',
158
                                  enable_fake_encodings=False)
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
159
2192.1.2 by Alexander Belchenko
Tests for osutils.get_terminal_encoding()
160
        self.assertEqual('latin-1', osutils.get_terminal_encoding())
161
162
        # check stderr
2192.1.10 by Alexander Belchenko
merge bzr.dev
163
        self.assertEquals('bzr: warning: unknown terminal encoding cp-unknown.\n'
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
164
                          '  Using encoding latin-1 instead.\n',
2192.1.2 by Alexander Belchenko
Tests for osutils.get_terminal_encoding()
165
                          sys.stderr.getvalue())
2192.1.3 by Alexander Belchenko
Tests for osutils.get_user_encoding
166
167
168
class TestUserEncoding(TestCase):
169
    """Test detection of default user encoding."""
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
170
2192.1.3 by Alexander Belchenko
Tests for osutils.get_user_encoding
171
    def setUp(self):
4153.1.2 by Andrew Bennetts
Add missing TestCase.setUp upcalls.
172
        TestCase.setUp(self)
4985.1.5 by Vincent Ladeuil
Deploying the new overrideAttr facility further reduces the complexity
173
        self.overrideAttr(locale, 'getpreferredencoding')
4985.2.1 by Vincent Ladeuil
Deploy addAttrCleanup on the whole test suite.
174
        self.addCleanup(osutils.set_or_unset_env,
175
                        'LANG', os.environ.get('LANG'))
4985.1.5 by Vincent Ladeuil
Deploying the new overrideAttr facility further reduces the complexity
176
        self.overrideAttr(sys, 'stderr', StringIOWrapper())
2192.1.3 by Alexander Belchenko
Tests for osutils.get_user_encoding
177
178
    def test_get_user_encoding(self):
179
        def f():
180
            return 'user_encoding'
181
182
        locale.getpreferredencoding = f
183
        fake_codec.add('user_encoding')
184
        self.assertEquals('user_encoding', osutils.get_user_encoding(use_cache=False))
185
        self.assertEquals('', sys.stderr.getvalue())
186
187
    def test_user_cp0(self):
188
        def f():
189
            return 'cp0'
190
191
        locale.getpreferredencoding = f
192
        self.assertEquals('ascii', osutils.get_user_encoding(use_cache=False))
193
        self.assertEquals('', sys.stderr.getvalue())
194
2192.1.8 by Alexander Belchenko
Rework tests after John's review
195
    def test_user_cp_unknown(self):
2192.1.3 by Alexander Belchenko
Tests for osutils.get_user_encoding
196
        def f():
2192.1.8 by Alexander Belchenko
Rework tests after John's review
197
            return 'cp-unknown'
2192.1.3 by Alexander Belchenko
Tests for osutils.get_user_encoding
198
199
        locale.getpreferredencoding = f
200
        self.assertEquals('ascii', osutils.get_user_encoding(use_cache=False))
2192.1.8 by Alexander Belchenko
Rework tests after John's review
201
        self.assertEquals('bzr: warning: unknown encoding cp-unknown.'
2192.1.3 by Alexander Belchenko
Tests for osutils.get_user_encoding
202
                          ' Continuing with ascii encoding.\n',
203
                          sys.stderr.getvalue())
2192.1.7 by Alexander Belchenko
get_user_encoding: if locale.Error raised we need to set user_encoding to 'ascii' as warning says
204
3405.3.1 by Neil Martinsen-Burrell
accept for an encoding to mean ascii
205
    def test_user_empty(self):
206
        """Running bzr from a vim script gives '' for a preferred locale"""
207
        def f():
208
            return ''
209
210
        locale.getpreferredencoding = f
211
        self.assertEquals('ascii', osutils.get_user_encoding(use_cache=False))
212
        self.assertEquals('', sys.stderr.getvalue())
213
2192.1.7 by Alexander Belchenko
get_user_encoding: if locale.Error raised we need to set user_encoding to 'ascii' as warning says
214
    def test_user_locale_error(self):
215
        def f():
216
            raise locale.Error, 'unsupported locale'
217
218
        locale.getpreferredencoding = f
219
        os.environ['LANG'] = 'BOGUS'
220
        self.assertEquals('ascii', osutils.get_user_encoding(use_cache=False))
221
        self.assertEquals('bzr: warning: unsupported locale\n'
222
                          '  Could not determine what text encoding to use.\n'
223
                          '  This error usually means your Python interpreter\n'
224
                          '  doesn\'t support the locale set by $LANG (BOGUS)\n'
225
                          '  Continuing with ascii encoding.\n',
226
                          sys.stderr.getvalue())