~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_osutils_encodings.py

(vila) Fix test failures blocking package builds. (Vincent Ladeuil)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2006-2011 Canonical Ltd
 
2
#
 
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.
 
7
#
 
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.
 
12
#
 
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
16
 
 
17
"""Tests for the osutils wrapper."""
 
18
 
 
19
import codecs
 
20
import locale
 
21
import sys
 
22
 
 
23
from bzrlib import (
 
24
    osutils,
 
25
    )
 
26
from bzrlib.tests import (
 
27
        StringIOWrapper,
 
28
        TestCase,
 
29
        )
 
30
 
 
31
 
 
32
class FakeCodec(object):
 
33
    """Special class that helps testing over several non-existed encodings.
 
34
 
 
35
    Clients can add new encoding names, but because of how codecs is
 
36
    implemented they cannot be removed. Be careful with naming to avoid
 
37
    collisions between tests.
 
38
    """
 
39
    _registered = False
 
40
    _enabled_encodings = set()
 
41
 
 
42
    def add(self, encoding_name):
 
43
        """Adding encoding name to fake.
 
44
 
 
45
        :type   encoding_name:  lowercase plain string
 
46
        """
 
47
        if not self._registered:
 
48
            codecs.register(self)
 
49
            self._registered = True
 
50
        if encoding_name is not None:
 
51
            self._enabled_encodings.add(encoding_name)
 
52
 
 
53
    def __call__(self, encoding_name):
 
54
        """Called indirectly by codecs module during lookup"""
 
55
        if encoding_name in self._enabled_encodings:
 
56
            return codecs.lookup('latin-1')
 
57
 
 
58
 
 
59
fake_codec = FakeCodec()
 
60
 
 
61
 
 
62
class TestFakeCodec(TestCase):
 
63
 
 
64
    def test_fake_codec(self):
 
65
        self.assertRaises(LookupError, codecs.lookup, 'fake')
 
66
 
 
67
        fake_codec.add('fake')
 
68
        codecs.lookup('fake')
 
69
 
 
70
 
 
71
class TestTerminalEncoding(TestCase):
 
72
    """Test the auto-detection of proper terminal encoding."""
 
73
 
 
74
    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,
 
82
                             stdout_encoding,
 
83
                             stderr_encoding,
 
84
                             stdin_encoding,
 
85
                             user_encoding='user_encoding',
 
86
                             enable_fake_encodings=True):
 
87
        sys.stdout = StringIOWrapper()
 
88
        sys.stdout.encoding = stdout_encoding
 
89
        sys.stderr = StringIOWrapper()
 
90
        sys.stderr.encoding = stderr_encoding
 
91
        sys.stdin = StringIOWrapper()
 
92
        sys.stdin.encoding = stdin_encoding
 
93
        osutils._cached_user_encoding = user_encoding
 
94
        if enable_fake_encodings:
 
95
            fake_codec.add(stdout_encoding)
 
96
            fake_codec.add(stderr_encoding)
 
97
            fake_codec.add(stdin_encoding)
 
98
 
 
99
    def test_get_terminal_encoding(self):
 
100
        self.make_wrapped_streams('stdout_encoding',
 
101
                                  'stderr_encoding',
 
102
                                  'stdin_encoding')
 
103
 
 
104
        # first preference is stdout encoding
 
105
        self.assertEqual('stdout_encoding', osutils.get_terminal_encoding())
 
106
 
 
107
        sys.stdout.encoding = None
 
108
        # if sys.stdout is None, fall back to sys.stdin
 
109
        self.assertEqual('stdin_encoding', osutils.get_terminal_encoding())
 
110
 
 
111
        sys.stdin.encoding = None
 
112
        # and in the worst case, use osutils.get_user_encoding()
 
113
        self.assertEqual('user_encoding', osutils.get_terminal_encoding())
 
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
 
 
135
    def test_terminal_cp0(self):
 
136
        # test cp0 encoding (Windows returns cp0 when there is no encoding)
 
137
        self.make_wrapped_streams('cp0',
 
138
                                  'cp0',
 
139
                                  'cp0',
 
140
                                  user_encoding='latin-1',
 
141
                                  enable_fake_encodings=False)
 
142
 
 
143
        # cp0 is invalid encoding. We should fall back to user_encoding
 
144
        self.assertEqual('latin-1', osutils.get_terminal_encoding())
 
145
 
 
146
        # check stderr
 
147
        self.assertEquals('', sys.stderr.getvalue())
 
148
 
 
149
    def test_terminal_cp_unknown(self):
 
150
        # test against really unknown encoding
 
151
        # catch warning at stderr
 
152
        self.make_wrapped_streams('cp-unknown',
 
153
                                  'cp-unknown',
 
154
                                  'cp-unknown',
 
155
                                  user_encoding='latin-1',
 
156
                                  enable_fake_encodings=False)
 
157
 
 
158
        self.assertEqual('latin-1', osutils.get_terminal_encoding())
 
159
 
 
160
        # check stderr
 
161
        self.assertEquals('bzr: warning: unknown terminal encoding cp-unknown.\n'
 
162
                          '  Using encoding latin-1 instead.\n',
 
163
                          sys.stderr.getvalue())
 
164
 
 
165
 
 
166
class TestUserEncoding(TestCase):
 
167
    """Test detection of default user encoding."""
 
168
 
 
169
    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())
 
175
 
 
176
    def get_encoding(self, do_setlocale=True):
 
177
        return self._encoding
 
178
 
 
179
    def test_get_user_encoding(self):
 
180
        self._encoding = 'user_encoding'
 
181
        fake_codec.add('user_encoding')
 
182
        self.assertEquals('iso8859-1', # fake_codec maps to latin-1
 
183
                          osutils.get_user_encoding())
 
184
        self.assertEquals('', sys.stderr.getvalue())
 
185
 
 
186
    def test_user_cp0(self):
 
187
        self._encoding = 'cp0'
 
188
        self.assertEquals('ascii', osutils.get_user_encoding())
 
189
        self.assertEquals('', sys.stderr.getvalue())
 
190
 
 
191
    def test_user_cp_unknown(self):
 
192
        self._encoding = 'cp-unknown'
 
193
        self.assertEquals('ascii', osutils.get_user_encoding())
 
194
        self.assertEquals('bzr: warning: unknown encoding cp-unknown.'
 
195
                          ' Continuing with ascii encoding.\n',
 
196
                          sys.stderr.getvalue())
 
197
 
 
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())