13
13
# You should have received a copy of the GNU General Public License
14
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
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
17
"""Tests for the osutils wrapper."""
24
23
from bzrlib import (
28
26
from bzrlib.tests import (
34
32
class FakeCodec(object):
35
33
"""Special class that helps testing over several non-existed encodings.
37
35
Clients can add new encoding names, but because of how codecs is
38
36
implemented they cannot be removed. Be careful with naming to avoid
39
37
collisions between tests.
74
72
"""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,
76
self.overrideAttr(sys, 'stdin')
77
self.overrideAttr(sys, 'stdout')
78
self.overrideAttr(sys, 'stderr')
79
self.overrideAttr(osutils, '_cached_user_encoding')
81
def make_wrapped_streams(self,
121
112
# and in the worst case, use osutils.get_user_encoding()
122
113
self.assertEqual('user_encoding', osutils.get_terminal_encoding())
115
def test_get_terminal_encoding_silent(self):
116
self.make_wrapped_streams('stdout_encoding',
119
# Calling get_terminal_encoding should not mutter when silent=True is
122
osutils.get_terminal_encoding()
123
self.assertEqual(log, self.get_log())
125
def test_get_terminal_encoding_trace(self):
126
self.make_wrapped_streams('stdout_encoding',
129
# Calling get_terminal_encoding should not mutter when silent=True is
132
osutils.get_terminal_encoding(trace=True)
133
self.assertNotEqual(log, self.get_log())
124
135
def test_terminal_cp0(self):
125
136
# test cp0 encoding (Windows returns cp0 when there is no encoding)
126
137
self.make_wrapped_streams('cp0',
144
155
user_encoding='latin-1',
145
156
enable_fake_encodings=False)
147
158
self.assertEqual('latin-1', osutils.get_terminal_encoding())
150
161
self.assertEquals('bzr: warning: unknown terminal encoding cp-unknown.\n'
151
' Using encoding latin-1 instead.\n',
162
' Using encoding latin-1 instead.\n',
152
163
sys.stderr.getvalue())
155
166
class TestUserEncoding(TestCase):
156
167
"""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')
171
self.overrideAttr(osutils, '_cached_user_encoding', None)
172
self.overrideAttr(locale, 'getpreferredencoding', self.get_encoding)
173
self.overrideAttr(locale, 'CODESET', None)
174
self.overrideAttr(sys, 'stderr', StringIOWrapper())
167
locale.getpreferredencoding = self._getpreferredencoding
168
sys.stderr = self._stderr
170
osutils.set_or_unset_env('LANG', self._LANG)
176
def get_encoding(self, do_setlocale=True):
177
return self._encoding
172
179
def test_get_user_encoding(self):
174
return 'user_encoding'
176
locale.getpreferredencoding = f
180
self._encoding = 'user_encoding'
177
181
fake_codec.add('user_encoding')
178
self.assertEquals('user_encoding', osutils.get_user_encoding(use_cache=False))
182
self.assertEquals('iso8859-1', # fake_codec maps to latin-1
183
osutils.get_user_encoding())
179
184
self.assertEquals('', sys.stderr.getvalue())
181
186
def test_user_cp0(self):
185
locale.getpreferredencoding = f
186
self.assertEquals('ascii', osutils.get_user_encoding(use_cache=False))
187
self._encoding = 'cp0'
188
self.assertEquals('ascii', osutils.get_user_encoding())
187
189
self.assertEquals('', sys.stderr.getvalue())
189
191
def test_user_cp_unknown(self):
193
locale.getpreferredencoding = f
194
self.assertEquals('ascii', osutils.get_user_encoding(use_cache=False))
192
self._encoding = 'cp-unknown'
193
self.assertEquals('ascii', osutils.get_user_encoding())
195
194
self.assertEquals('bzr: warning: unknown encoding cp-unknown.'
196
195
' Continuing with ascii encoding.\n',
197
196
sys.stderr.getvalue())
199
198
def test_user_empty(self):
200
199
"""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))
201
self.assertEquals('ascii', osutils.get_user_encoding())
206
202
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())