1
# Copyright (C) 2005, 2006 Canonical Ltd
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.
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.
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
"""Tests for the osutils wrapper."""
29
from bzrlib.tests import (
35
class FakeCodec(object):
36
"""Special class that helps testing over several non-existed encodings.
38
Clients can add new encoding names, but because of how codecs is
39
implemented they cannot be removed. Be careful with naming to avoid
40
collisions between tests.
43
_enabled_encodings = set()
45
def add(self, encoding_name):
46
"""Adding encoding name to fake.
48
:type encoding_name: lowercase plain string
50
if not self._registered:
52
self._registered = True
53
if encoding_name is not None:
54
self._enabled_encodings.add(encoding_name)
56
def __call__(self, encoding_name):
57
"""Called indirectly by codecs module during lookup"""
58
if encoding_name in self._enabled_encodings:
59
return codecs.lookup('latin-1')
62
fake_codec = FakeCodec()
65
class TestFakeCodec(TestCase):
67
def test_fake_codec(self):
68
self.assertRaises(LookupError, codecs.lookup, 'fake')
70
fake_codec.add('fake')
74
class TestTerminalEncoding(TestCase):
75
"""Test the auto-detection of proper terminal encoding."""
78
self._stdout = sys.stdout
79
self._stderr = sys.stderr
80
self._stdin = sys.stdin
81
self._user_encoding = bzrlib.user_encoding
83
self.addCleanup(self._reset)
85
def make_wrapped_streams(self,
89
user_encoding='user_encoding',
90
enable_fake_encodings=True):
91
sys.stdout = StringIOWrapper()
92
sys.stdout.encoding = stdout_encoding
93
sys.stderr = StringIOWrapper()
94
sys.stderr.encoding = stderr_encoding
95
sys.stdin = StringIOWrapper()
96
sys.stdin.encoding = stdin_encoding
97
bzrlib.user_encoding = user_encoding
98
if enable_fake_encodings:
99
fake_codec.add(stdout_encoding)
100
fake_codec.add(stderr_encoding)
101
fake_codec.add(stdin_encoding)
104
sys.stdout = self._stdout
105
sys.stderr = self._stderr
106
sys.stdin = self._stdin
107
bzrlib.user_encoding = self._user_encoding
109
def test_get_terminal_encoding(self):
110
self.make_wrapped_streams('stdout_encoding',
114
# first preference is stdout encoding
115
self.assertEqual('stdout_encoding', osutils.get_terminal_encoding())
117
sys.stdout.encoding = None
118
# if sys.stdout is None, fall back to sys.stdin
119
self.assertEqual('stdin_encoding', osutils.get_terminal_encoding())
121
sys.stdin.encoding = None
122
# and in the worst case, use bzrlib.user_encoding
123
self.assertEqual('user_encoding', osutils.get_terminal_encoding())
125
def test_terminal_cp0(self):
126
# test cp0 encoding (Windows returns cp0 when there is no encoding)
127
self.make_wrapped_streams('cp0',
130
user_encoding='latin-1',
131
enable_fake_encodings=False)
133
# cp0 is invalid encoding. We should fall back to user_encoding
134
self.assertEqual('latin-1', osutils.get_terminal_encoding())
137
self.assertEquals('', sys.stderr.getvalue())
139
def test_terminal_cp_unknown(self):
140
# test against really unknown encoding
141
# catch warning at stderr
142
self.make_wrapped_streams('cp-unknown',
145
user_encoding='latin-1',
146
enable_fake_encodings=False)
148
self.assertEqual('latin-1', osutils.get_terminal_encoding())
151
self.assertEquals('bzr: warning: unknown terminal encoding cp-unknown.\n'
152
' Using encoding latin-1 instead.\n',
153
sys.stderr.getvalue())
156
class TestUserEncoding(TestCase):
157
"""Test detection of default user encoding."""
160
self._stderr = sys.stderr
161
self._getpreferredencoding = locale.getpreferredencoding
162
self.addCleanup(self._reset)
163
sys.stderr = StringIOWrapper()
165
self._LANG = os.environ.get('LANG')
168
locale.getpreferredencoding = self._getpreferredencoding
169
sys.stderr = self._stderr
171
osutils.set_or_unset_env('LANG', self._LANG)
173
def test_get_user_encoding(self):
175
return 'user_encoding'
177
locale.getpreferredencoding = f
178
fake_codec.add('user_encoding')
179
self.assertEquals('user_encoding', osutils.get_user_encoding(use_cache=False))
180
self.assertEquals('', sys.stderr.getvalue())
182
def test_user_cp0(self):
186
locale.getpreferredencoding = f
187
self.assertEquals('ascii', osutils.get_user_encoding(use_cache=False))
188
self.assertEquals('', sys.stderr.getvalue())
190
def test_user_cp_unknown(self):
194
locale.getpreferredencoding = f
195
self.assertEquals('ascii', osutils.get_user_encoding(use_cache=False))
196
self.assertEquals('bzr: warning: unknown encoding cp-unknown.'
197
' Continuing with ascii encoding.\n',
198
sys.stderr.getvalue())
200
def test_user_empty(self):
201
"""Running bzr from a vim script gives '' for a preferred locale"""
205
locale.getpreferredencoding = f
206
self.assertEquals('ascii', osutils.get_user_encoding(use_cache=False))
207
self.assertEquals('', sys.stderr.getvalue())
209
def test_user_locale_error(self):
211
raise locale.Error, 'unsupported locale'
213
locale.getpreferredencoding = f
214
os.environ['LANG'] = 'BOGUS'
215
self.assertEquals('ascii', osutils.get_user_encoding(use_cache=False))
216
self.assertEquals('bzr: warning: unsupported locale\n'
217
' Could not determine what text encoding to use.\n'
218
' This error usually means your Python interpreter\n'
219
' doesn\'t support the locale set by $LANG (BOGUS)\n'
220
' Continuing with ascii encoding.\n',
221
sys.stderr.getvalue())