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."""
28
from bzrlib.tests import (
34
class FakeCodec(object):
35
"""Special class that helps testing over several non-existed encodings.
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.
42
_enabled_encodings = set()
44
def add(self, encoding_name):
45
"""Adding encoding name to fake.
47
:type encoding_name: lowercase plain string
49
if not self._registered:
51
self._registered = True
52
if encoding_name is not None:
53
self._enabled_encodings.add(encoding_name)
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')
61
fake_codec = FakeCodec()
64
class TestFakeCodec(TestCase):
66
def test_fake_codec(self):
67
self.assertRaises(LookupError, codecs.lookup, 'fake')
69
fake_codec.add('fake')
73
class TestTerminalEncoding(TestCase):
74
"""Test the auto-detection of proper terminal encoding."""
77
self._stdout = sys.stdout
78
self._stderr = sys.stderr
79
self._stdin = sys.stdin
80
self._user_encoding = osutils._cached_user_encoding
82
self.addCleanup(self._reset)
84
def make_wrapped_streams(self,
88
user_encoding='user_encoding',
89
enable_fake_encodings=True):
90
sys.stdout = StringIOWrapper()
91
sys.stdout.encoding = stdout_encoding
92
sys.stderr = StringIOWrapper()
93
sys.stderr.encoding = stderr_encoding
94
sys.stdin = StringIOWrapper()
95
sys.stdin.encoding = stdin_encoding
96
osutils._cached_user_encoding = user_encoding
97
if enable_fake_encodings:
98
fake_codec.add(stdout_encoding)
99
fake_codec.add(stderr_encoding)
100
fake_codec.add(stdin_encoding)
103
sys.stdout = self._stdout
104
sys.stderr = self._stderr
105
sys.stdin = self._stdin
106
osutils._cached_user_encoding = self._user_encoding
108
def test_get_terminal_encoding(self):
109
self.make_wrapped_streams('stdout_encoding',
113
# first preference is stdout encoding
114
self.assertEqual('stdout_encoding', osutils.get_terminal_encoding())
116
sys.stdout.encoding = None
117
# if sys.stdout is None, fall back to sys.stdin
118
self.assertEqual('stdin_encoding', osutils.get_terminal_encoding())
120
sys.stdin.encoding = None
121
# and in the worst case, use osutils.get_user_encoding()
122
self.assertEqual('user_encoding', osutils.get_terminal_encoding())
124
def test_terminal_cp0(self):
125
# test cp0 encoding (Windows returns cp0 when there is no encoding)
126
self.make_wrapped_streams('cp0',
129
user_encoding='latin-1',
130
enable_fake_encodings=False)
132
# cp0 is invalid encoding. We should fall back to user_encoding
133
self.assertEqual('latin-1', osutils.get_terminal_encoding())
136
self.assertEquals('', sys.stderr.getvalue())
138
def test_terminal_cp_unknown(self):
139
# test against really unknown encoding
140
# catch warning at stderr
141
self.make_wrapped_streams('cp-unknown',
144
user_encoding='latin-1',
145
enable_fake_encodings=False)
147
self.assertEqual('latin-1', osutils.get_terminal_encoding())
150
self.assertEquals('bzr: warning: unknown terminal encoding cp-unknown.\n'
151
' Using encoding latin-1 instead.\n',
152
sys.stderr.getvalue())
155
class TestUserEncoding(TestCase):
156
"""Test detection of default user encoding."""
159
self._stderr = sys.stderr
160
self._getpreferredencoding = locale.getpreferredencoding
161
self.addCleanup(self._reset)
162
sys.stderr = StringIOWrapper()
164
self._LANG = os.environ.get('LANG')
167
locale.getpreferredencoding = self._getpreferredencoding
168
sys.stderr = self._stderr
170
osutils.set_or_unset_env('LANG', self._LANG)
172
def test_get_user_encoding(self):
174
return 'user_encoding'
176
locale.getpreferredencoding = f
177
fake_codec.add('user_encoding')
178
self.assertEquals('user_encoding', osutils.get_user_encoding(use_cache=False))
179
self.assertEquals('', sys.stderr.getvalue())
181
def test_user_cp0(self):
185
locale.getpreferredencoding = f
186
self.assertEquals('ascii', osutils.get_user_encoding(use_cache=False))
187
self.assertEquals('', sys.stderr.getvalue())
189
def test_user_cp_unknown(self):
193
locale.getpreferredencoding = f
194
self.assertEquals('ascii', osutils.get_user_encoding(use_cache=False))
195
self.assertEquals('bzr: warning: unknown encoding cp-unknown.'
196
' Continuing with ascii encoding.\n',
197
sys.stderr.getvalue())
199
def test_user_empty(self):
200
"""Running bzr from a vim script gives '' for a preferred locale"""
204
locale.getpreferredencoding = f
205
self.assertEquals('ascii', osutils.get_user_encoding(use_cache=False))
206
self.assertEquals('', sys.stderr.getvalue())
208
def test_user_locale_error(self):
210
raise locale.Error, 'unsupported locale'
212
locale.getpreferredencoding = f
213
os.environ['LANG'] = 'BOGUS'
214
self.assertEquals('ascii', osutils.get_user_encoding(use_cache=False))
215
self.assertEquals('bzr: warning: unsupported locale\n'
216
' Could not determine what text encoding to use.\n'
217
' This error usually means your Python interpreter\n'
218
' doesn\'t support the locale set by $LANG (BOGUS)\n'
219
' Continuing with ascii encoding.\n',
220
sys.stderr.getvalue())