~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: 2008-09-03 22:30:56 UTC
  • mfrom: (3644.2.13 index_builder_cleanup)
  • Revision ID: pqm@pqm.ubuntu.com-20080903223056-b108iytb38xkznci
(jam) Streamline BTreeBuilder.add_node et al to make btree creation
        faster.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2012, 2016 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, 
29
32
        )
30
33
 
31
34
 
32
35
class FakeCodec(object):
33
36
    """Special class that helps testing over several non-existed encodings.
34
 
 
 
37
    
35
38
    Clients can add new encoding names, but because of how codecs is
36
39
    implemented they cannot be removed. Be careful with naming to avoid
37
40
    collisions between tests.
49
52
            self._registered = True
50
53
        if encoding_name is not None:
51
54
            self._enabled_encodings.add(encoding_name)
52
 
 
 
55
        
53
56
    def __call__(self, encoding_name):
54
57
        """Called indirectly by codecs module during lookup"""
55
58
        if encoding_name in self._enabled_encodings:
60
63
 
61
64
 
62
65
class TestFakeCodec(TestCase):
63
 
 
 
66
    
64
67
    def test_fake_codec(self):
65
68
        self.assertRaises(LookupError, codecs.lookup, 'fake')
66
69
 
72
75
    """Test the auto-detection of proper terminal encoding."""
73
76
 
74
77
    def setUp(self):
75
 
        super(TestTerminalEncoding, self).setUp()
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,
 
78
        self._stdout = sys.stdout
 
79
        self._stderr = sys.stderr
 
80
        self._stdin = sys.stdin
 
81
        self._user_encoding = bzrlib.user_encoding
 
82
 
 
83
        self.addCleanup(self._reset)
 
84
 
 
85
    def make_wrapped_streams(self, 
82
86
                             stdout_encoding,
83
87
                             stderr_encoding,
84
88
                             stdin_encoding,
90
94
        sys.stderr.encoding = stderr_encoding
91
95
        sys.stdin = StringIOWrapper()
92
96
        sys.stdin.encoding = stdin_encoding
93
 
        osutils._cached_user_encoding = user_encoding
 
97
        bzrlib.user_encoding = user_encoding
94
98
        if enable_fake_encodings:
95
99
            fake_codec.add(stdout_encoding)
96
100
            fake_codec.add(stderr_encoding)
97
101
            fake_codec.add(stdin_encoding)
98
102
 
 
103
    def _reset(self):
 
104
        sys.stdout = self._stdout
 
105
        sys.stderr = self._stderr
 
106
        sys.stdin = self._stdin
 
107
        bzrlib.user_encoding = self._user_encoding
 
108
 
99
109
    def test_get_terminal_encoding(self):
100
110
        self.make_wrapped_streams('stdout_encoding',
101
111
                                  'stderr_encoding',
109
119
        self.assertEqual('stdin_encoding', osutils.get_terminal_encoding())
110
120
 
111
121
        sys.stdin.encoding = None
112
 
        # and in the worst case, use osutils.get_user_encoding()
 
122
        # and in the worst case, use bzrlib.user_encoding
113
123
        self.assertEqual('user_encoding', osutils.get_terminal_encoding())
114
124
 
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
125
    def test_terminal_cp0(self):
136
126
        # test cp0 encoding (Windows returns cp0 when there is no encoding)
137
127
        self.make_wrapped_streams('cp0',
144
134
        self.assertEqual('latin-1', osutils.get_terminal_encoding())
145
135
 
146
136
        # check stderr
147
 
        self.assertEqual('', sys.stderr.getvalue())
 
137
        self.assertEquals('', sys.stderr.getvalue())
148
138
 
149
139
    def test_terminal_cp_unknown(self):
150
140
        # test against really unknown encoding
154
144
                                  'cp-unknown',
155
145
                                  user_encoding='latin-1',
156
146
                                  enable_fake_encodings=False)
157
 
 
 
147
        
158
148
        self.assertEqual('latin-1', osutils.get_terminal_encoding())
159
149
 
160
150
        # check stderr
161
 
        self.assertEqual('bzr: warning: unknown terminal encoding cp-unknown.\n'
162
 
                          '  Using encoding latin-1 instead.\n',
 
151
        self.assertEquals('bzr: warning: unknown terminal encoding cp-unknown.\n'
 
152
                          '  Using encoding latin-1 instead.\n', 
163
153
                          sys.stderr.getvalue())
164
154
 
165
155
 
166
156
class TestUserEncoding(TestCase):
167
157
    """Test detection of default user encoding."""
168
 
 
 
158
    
169
159
    def setUp(self):
170
 
        super(TestUserEncoding, self).setUp()
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())
 
160
        self._stderr = sys.stderr
 
161
        self._getpreferredencoding = locale.getpreferredencoding
 
162
        self.addCleanup(self._reset)
 
163
        sys.stderr = StringIOWrapper()
 
164
        # save $LANG
 
165
        self._LANG = os.environ.get('LANG')
175
166
 
176
 
    def get_encoding(self, do_setlocale=True):
177
 
        return self._encoding
 
167
    def _reset(self):
 
168
        locale.getpreferredencoding = self._getpreferredencoding
 
169
        sys.stderr = self._stderr
 
170
        # restore $LANG
 
171
        osutils.set_or_unset_env('LANG', self._LANG)
178
172
 
179
173
    def test_get_user_encoding(self):
180
 
        self._encoding = 'user_encoding'
 
174
        def f():
 
175
            return 'user_encoding'
 
176
 
 
177
        locale.getpreferredencoding = f
181
178
        fake_codec.add('user_encoding')
182
 
        self.assertEqual('iso8859-1', # fake_codec maps to latin-1
183
 
                          osutils.get_user_encoding())
184
 
        self.assertEqual('', sys.stderr.getvalue())
 
179
        self.assertEquals('user_encoding', osutils.get_user_encoding(use_cache=False))
 
180
        self.assertEquals('', sys.stderr.getvalue())
185
181
 
186
182
    def test_user_cp0(self):
187
 
        self._encoding = 'cp0'
188
 
        self.assertEqual('ascii', osutils.get_user_encoding())
189
 
        self.assertEqual('', sys.stderr.getvalue())
 
183
        def f():
 
184
            return 'cp0'
 
185
 
 
186
        locale.getpreferredencoding = f
 
187
        self.assertEquals('ascii', osutils.get_user_encoding(use_cache=False))
 
188
        self.assertEquals('', sys.stderr.getvalue())
190
189
 
191
190
    def test_user_cp_unknown(self):
192
 
        self._encoding = 'cp-unknown'
193
 
        self.assertEqual('ascii', osutils.get_user_encoding())
194
 
        self.assertEqual('bzr: warning: unknown encoding cp-unknown.'
 
191
        def f():
 
192
            return 'cp-unknown'
 
193
 
 
194
        locale.getpreferredencoding = f
 
195
        self.assertEquals('ascii', osutils.get_user_encoding(use_cache=False))
 
196
        self.assertEquals('bzr: warning: unknown encoding cp-unknown.'
195
197
                          ' Continuing with ascii encoding.\n',
196
198
                          sys.stderr.getvalue())
197
199
 
198
200
    def test_user_empty(self):
199
201
        """Running bzr from a vim script gives '' for a preferred locale"""
200
 
        self._encoding = ''
201
 
        self.assertEqual('ascii', osutils.get_user_encoding())
202
 
        self.assertEqual('', sys.stderr.getvalue())
 
202
        def f():
 
203
            return ''
 
204
 
 
205
        locale.getpreferredencoding = f
 
206
        self.assertEquals('ascii', osutils.get_user_encoding(use_cache=False))
 
207
        self.assertEquals('', sys.stderr.getvalue())
 
208
 
 
209
    def test_user_locale_error(self):
 
210
        def f():
 
211
            raise locale.Error, 'unsupported locale'
 
212
 
 
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())