~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_osutils_encodings.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2007-04-26 06:21:34 UTC
  • mfrom: (2457.1.1 integration)
  • Revision ID: pqm@pqm.ubuntu.com-20070426062134-r5pvo74u33vke1km
(robertc) Fix bzr --no-plugins selftest which was broken by the help indices patch. (Robert Collins, Martin Pool)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2011 Canonical Ltd
 
1
# Copyright (C) 2005, 2006 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
"""Tests for the osutils wrapper."""
18
18
 
19
19
import codecs
20
20
import locale
 
21
import os
21
22
import sys
22
23
 
 
24
import bzrlib
23
25
from bzrlib import (
 
26
    errors,
24
27
    osutils,
25
28
    )
26
29
from bzrlib.tests import (
27
30
        StringIOWrapper,
28
 
        TestCase,
 
31
        TestCase, 
 
32
        TestSkipped,
29
33
        )
30
34
 
31
35
 
32
36
class FakeCodec(object):
33
37
    """Special class that helps testing over several non-existed encodings.
34
 
 
 
38
    
35
39
    Clients can add new encoding names, but because of how codecs is
36
40
    implemented they cannot be removed. Be careful with naming to avoid
37
41
    collisions between tests.
49
53
            self._registered = True
50
54
        if encoding_name is not None:
51
55
            self._enabled_encodings.add(encoding_name)
52
 
 
 
56
        
53
57
    def __call__(self, encoding_name):
54
58
        """Called indirectly by codecs module during lookup"""
55
59
        if encoding_name in self._enabled_encodings:
60
64
 
61
65
 
62
66
class TestFakeCodec(TestCase):
63
 
 
 
67
    
64
68
    def test_fake_codec(self):
65
69
        self.assertRaises(LookupError, codecs.lookup, 'fake')
66
70
 
72
76
    """Test the auto-detection of proper terminal encoding."""
73
77
 
74
78
    def setUp(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,
 
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, 
82
87
                             stdout_encoding,
83
88
                             stderr_encoding,
84
89
                             stdin_encoding,
90
95
        sys.stderr.encoding = stderr_encoding
91
96
        sys.stdin = StringIOWrapper()
92
97
        sys.stdin.encoding = stdin_encoding
93
 
        osutils._cached_user_encoding = user_encoding
 
98
        bzrlib.user_encoding = user_encoding
94
99
        if enable_fake_encodings:
95
100
            fake_codec.add(stdout_encoding)
96
101
            fake_codec.add(stderr_encoding)
97
102
            fake_codec.add(stdin_encoding)
98
103
 
 
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
 
99
110
    def test_get_terminal_encoding(self):
100
111
        self.make_wrapped_streams('stdout_encoding',
101
112
                                  'stderr_encoding',
109
120
        self.assertEqual('stdin_encoding', osutils.get_terminal_encoding())
110
121
 
111
122
        sys.stdin.encoding = None
112
 
        # and in the worst case, use osutils.get_user_encoding()
 
123
        # and in the worst case, use bzrlib.user_encoding
113
124
        self.assertEqual('user_encoding', osutils.get_terminal_encoding())
114
125
 
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
 
 
135
126
    def test_terminal_cp0(self):
136
127
        # test cp0 encoding (Windows returns cp0 when there is no encoding)
137
128
        self.make_wrapped_streams('cp0',
154
145
                                  'cp-unknown',
155
146
                                  user_encoding='latin-1',
156
147
                                  enable_fake_encodings=False)
157
 
 
 
148
        
158
149
        self.assertEqual('latin-1', osutils.get_terminal_encoding())
159
150
 
160
151
        # check stderr
161
152
        self.assertEquals('bzr: warning: unknown terminal encoding cp-unknown.\n'
162
 
                          '  Using encoding latin-1 instead.\n',
 
153
                          '  Using encoding latin-1 instead.\n', 
163
154
                          sys.stderr.getvalue())
164
155
 
165
156
 
166
157
class TestUserEncoding(TestCase):
167
158
    """Test detection of default user encoding."""
168
 
 
 
159
    
169
160
    def setUp(self):
170
 
        TestCase.setUp(self)
171
 
        self.overrideAttr(locale, 'getpreferredencoding')
172
 
        self.overrideAttr(sys, 'stderr', StringIOWrapper())
 
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')
 
167
 
 
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)
173
173
 
174
174
    def test_get_user_encoding(self):
175
175
        def f():
177
177
 
178
178
        locale.getpreferredencoding = f
179
179
        fake_codec.add('user_encoding')
180
 
        self.assertEquals('user_encoding',
181
 
                          osutils.get_user_encoding(use_cache=False))
 
180
        self.assertEquals('user_encoding', osutils.get_user_encoding(use_cache=False))
182
181
        self.assertEquals('', sys.stderr.getvalue())
183
182
 
184
183
    def test_user_cp0(self):
199
198
                          ' Continuing with ascii encoding.\n',
200
199
                          sys.stderr.getvalue())
201
200
 
202
 
    def test_user_empty(self):
203
 
        """Running bzr from a vim script gives '' for a preferred locale"""
204
 
        def f():
205
 
            return ''
206
 
 
207
 
        locale.getpreferredencoding = f
208
 
        self.assertEquals('ascii', osutils.get_user_encoding(use_cache=False))
209
 
        self.assertEquals('', sys.stderr.getvalue())
210
 
 
211
201
    def test_user_locale_error(self):
212
202
        def f():
213
203
            raise locale.Error, 'unsupported locale'
214
204
 
215
205
        locale.getpreferredencoding = f
216
 
        self.overrideEnv('LANG', 'BOGUS')
 
206
        os.environ['LANG'] = 'BOGUS'
217
207
        self.assertEquals('ascii', osutils.get_user_encoding(use_cache=False))
218
208
        self.assertEquals('bzr: warning: unsupported locale\n'
219
209
                          '  Could not determine what text encoding to use.\n'