~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_osutils_encodings.py

  • Committer: John Arbash Meinel
  • Date: 2013-05-19 14:29:37 UTC
  • mfrom: (6437.63.9 2.5)
  • mto: (6437.63.10 2.5)
  • mto: This revision was merged to the branch mainline in revision 6575.
  • Revision ID: john@arbash-meinel.com-20130519142937-21ykz2n2y2f22za9
Merge in the actual 2.5 branch. It seems I failed before

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 Canonical Ltd
 
1
# Copyright (C) 2006-2011 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
12
12
#
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
16
16
 
17
17
"""Tests for the osutils wrapper."""
18
18
 
19
19
import codecs
20
20
import locale
21
 
import os
22
21
import sys
23
22
 
24
 
import bzrlib
25
23
from bzrlib import (
26
 
    errors,
27
24
    osutils,
28
25
    )
29
26
from bzrlib.tests import (
30
27
        StringIOWrapper,
31
 
        TestCase, 
32
 
        TestSkipped,
 
28
        TestCase,
33
29
        )
34
30
 
35
31
 
36
32
class FakeCodec(object):
37
33
    """Special class that helps testing over several non-existed encodings.
38
 
    
 
34
 
39
35
    Clients can add new encoding names, but because of how codecs is
40
36
    implemented they cannot be removed. Be careful with naming to avoid
41
37
    collisions between tests.
53
49
            self._registered = True
54
50
        if encoding_name is not None:
55
51
            self._enabled_encodings.add(encoding_name)
56
 
        
 
52
 
57
53
    def __call__(self, encoding_name):
58
54
        """Called indirectly by codecs module during lookup"""
59
55
        if encoding_name in self._enabled_encodings:
64
60
 
65
61
 
66
62
class TestFakeCodec(TestCase):
67
 
    
 
63
 
68
64
    def test_fake_codec(self):
69
65
        self.assertRaises(LookupError, codecs.lookup, 'fake')
70
66
 
76
72
    """Test the auto-detection of proper terminal encoding."""
77
73
 
78
74
    def setUp(self):
79
 
        self._stdout = sys.stdout
80
 
        self._stderr = sys.stderr
81
 
        self._stdin = sys.stdin
82
 
        self._user_encoding = bzrlib.user_encoding
83
 
 
84
 
        self.addCleanup(self._reset)
85
 
 
86
 
    def make_wrapped_streams(self, 
 
75
        TestCase.setUp(self)
 
76
        self.overrideAttr(sys, 'stdin')
 
77
        self.overrideAttr(sys, 'stdout')
 
78
        self.overrideAttr(sys, 'stderr')
 
79
        self.overrideAttr(osutils, '_cached_user_encoding')
 
80
 
 
81
    def make_wrapped_streams(self,
87
82
                             stdout_encoding,
88
83
                             stderr_encoding,
89
84
                             stdin_encoding,
95
90
        sys.stderr.encoding = stderr_encoding
96
91
        sys.stdin = StringIOWrapper()
97
92
        sys.stdin.encoding = stdin_encoding
98
 
        bzrlib.user_encoding = user_encoding
 
93
        osutils._cached_user_encoding = user_encoding
99
94
        if enable_fake_encodings:
100
95
            fake_codec.add(stdout_encoding)
101
96
            fake_codec.add(stderr_encoding)
102
97
            fake_codec.add(stdin_encoding)
103
98
 
104
 
    def _reset(self):
105
 
        sys.stdout = self._stdout
106
 
        sys.stderr = self._stderr
107
 
        sys.stdin = self._stdin
108
 
        bzrlib.user_encoding = self._user_encoding
109
 
 
110
99
    def test_get_terminal_encoding(self):
111
100
        self.make_wrapped_streams('stdout_encoding',
112
101
                                  'stderr_encoding',
120
109
        self.assertEqual('stdin_encoding', osutils.get_terminal_encoding())
121
110
 
122
111
        sys.stdin.encoding = None
123
 
        # and in the worst case, use bzrlib.user_encoding
 
112
        # and in the worst case, use osutils.get_user_encoding()
124
113
        self.assertEqual('user_encoding', osutils.get_terminal_encoding())
125
114
 
 
115
    def test_get_terminal_encoding_silent(self):
 
116
        self.make_wrapped_streams('stdout_encoding',
 
117
                                  'stderr_encoding',
 
118
                                  'stdin_encoding')
 
119
        # Calling get_terminal_encoding should not mutter when silent=True is
 
120
        # passed.
 
121
        log = self.get_log()
 
122
        osutils.get_terminal_encoding()
 
123
        self.assertEqual(log, self.get_log())
 
124
 
 
125
    def test_get_terminal_encoding_trace(self):
 
126
        self.make_wrapped_streams('stdout_encoding',
 
127
                                  'stderr_encoding',
 
128
                                  'stdin_encoding')
 
129
        # Calling get_terminal_encoding should not mutter when silent=True is
 
130
        # passed.
 
131
        log = self.get_log()
 
132
        osutils.get_terminal_encoding(trace=True)
 
133
        self.assertNotEqual(log, self.get_log())
 
134
 
126
135
    def test_terminal_cp0(self):
127
136
        # test cp0 encoding (Windows returns cp0 when there is no encoding)
128
137
        self.make_wrapped_streams('cp0',
145
154
                                  'cp-unknown',
146
155
                                  user_encoding='latin-1',
147
156
                                  enable_fake_encodings=False)
148
 
        
 
157
 
149
158
        self.assertEqual('latin-1', osutils.get_terminal_encoding())
150
159
 
151
160
        # check stderr
152
161
        self.assertEquals('bzr: warning: unknown terminal encoding cp-unknown.\n'
153
 
                          '  Using encoding latin-1 instead.\n', 
 
162
                          '  Using encoding latin-1 instead.\n',
154
163
                          sys.stderr.getvalue())
155
164
 
156
165
 
157
166
class TestUserEncoding(TestCase):
158
167
    """Test detection of default user encoding."""
159
 
    
 
168
 
160
169
    def setUp(self):
161
 
        self._stderr = sys.stderr
162
 
        self._getpreferredencoding = locale.getpreferredencoding
163
 
        self.addCleanup(self._reset)
164
 
        sys.stderr = StringIOWrapper()
165
 
        # save $LANG
166
 
        self._LANG = os.environ.get('LANG')
 
170
        TestCase.setUp(self)
 
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
175
 
168
 
    def _reset(self):
169
 
        locale.getpreferredencoding = self._getpreferredencoding
170
 
        sys.stderr = self._stderr
171
 
        # restore $LANG
172
 
        osutils.set_or_unset_env('LANG', self._LANG)
 
176
    def get_encoding(self, do_setlocale=True):
 
177
        return self._encoding
173
178
 
174
179
    def test_get_user_encoding(self):
175
 
        def f():
176
 
            return 'user_encoding'
177
 
 
178
 
        locale.getpreferredencoding = f
 
180
        self._encoding = 'user_encoding'
179
181
        fake_codec.add('user_encoding')
180
 
        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())
181
184
        self.assertEquals('', sys.stderr.getvalue())
182
185
 
183
186
    def test_user_cp0(self):
184
 
        def f():
185
 
            return 'cp0'
186
 
 
187
 
        locale.getpreferredencoding = f
188
 
        self.assertEquals('ascii', osutils.get_user_encoding(use_cache=False))
 
187
        self._encoding = 'cp0'
 
188
        self.assertEquals('ascii', osutils.get_user_encoding())
189
189
        self.assertEquals('', sys.stderr.getvalue())
190
190
 
191
191
    def test_user_cp_unknown(self):
192
 
        def f():
193
 
            return 'cp-unknown'
194
 
 
195
 
        locale.getpreferredencoding = f
196
 
        self.assertEquals('ascii', osutils.get_user_encoding(use_cache=False))
 
192
        self._encoding = 'cp-unknown'
 
193
        self.assertEquals('ascii', osutils.get_user_encoding())
197
194
        self.assertEquals('bzr: warning: unknown encoding cp-unknown.'
198
195
                          ' Continuing with ascii encoding.\n',
199
196
                          sys.stderr.getvalue())
200
197
 
201
 
    def test_user_locale_error(self):
202
 
        def f():
203
 
            raise locale.Error, 'unsupported locale'
204
 
 
205
 
        locale.getpreferredencoding = f
206
 
        os.environ['LANG'] = 'BOGUS'
207
 
        self.assertEquals('ascii', osutils.get_user_encoding(use_cache=False))
208
 
        self.assertEquals('bzr: warning: unsupported locale\n'
209
 
                          '  Could not determine what text encoding to use.\n'
210
 
                          '  This error usually means your Python interpreter\n'
211
 
                          '  doesn\'t support the locale set by $LANG (BOGUS)\n'
212
 
                          '  Continuing with ascii encoding.\n',
213
 
                          sys.stderr.getvalue())
 
198
    def test_user_empty(self):
 
199
        """Running bzr from a vim script gives '' for a preferred locale"""
 
200
        self._encoding = ''
 
201
        self.assertEquals('ascii', osutils.get_user_encoding())
 
202
        self.assertEquals('', sys.stderr.getvalue())