~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_osutils_encodings.py

Show diffs side-by-side

added added

removed removed

Lines of Context:
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
 
21
21
import os
22
22
import sys
23
23
 
24
 
import bzrlib
25
24
from bzrlib import (
26
25
    errors,
27
26
    osutils,
28
27
    )
29
28
from bzrlib.tests import (
30
29
        StringIOWrapper,
31
 
        TestCase, 
32
 
        TestSkipped,
 
30
        TestCase,
33
31
        )
34
32
 
35
33
 
36
34
class FakeCodec(object):
37
35
    """Special class that helps testing over several non-existed encodings.
38
 
    
 
36
 
39
37
    Clients can add new encoding names, but because of how codecs is
40
38
    implemented they cannot be removed. Be careful with naming to avoid
41
39
    collisions between tests.
53
51
            self._registered = True
54
52
        if encoding_name is not None:
55
53
            self._enabled_encodings.add(encoding_name)
56
 
        
 
54
 
57
55
    def __call__(self, encoding_name):
58
56
        """Called indirectly by codecs module during lookup"""
59
57
        if encoding_name in self._enabled_encodings:
64
62
 
65
63
 
66
64
class TestFakeCodec(TestCase):
67
 
    
 
65
 
68
66
    def test_fake_codec(self):
69
67
        self.assertRaises(LookupError, codecs.lookup, 'fake')
70
68
 
76
74
    """Test the auto-detection of proper terminal encoding."""
77
75
 
78
76
    def setUp(self):
 
77
        TestCase.setUp(self)
79
78
        self._stdout = sys.stdout
80
79
        self._stderr = sys.stderr
81
80
        self._stdin = sys.stdin
82
 
        self._user_encoding = bzrlib.user_encoding
 
81
        self._user_encoding = osutils._cached_user_encoding
83
82
 
84
83
        self.addCleanup(self._reset)
85
84
 
86
 
    def make_wrapped_streams(self, 
 
85
    def make_wrapped_streams(self,
87
86
                             stdout_encoding,
88
87
                             stderr_encoding,
89
88
                             stdin_encoding,
95
94
        sys.stderr.encoding = stderr_encoding
96
95
        sys.stdin = StringIOWrapper()
97
96
        sys.stdin.encoding = stdin_encoding
98
 
        bzrlib.user_encoding = user_encoding
 
97
        osutils._cached_user_encoding = user_encoding
99
98
        if enable_fake_encodings:
100
99
            fake_codec.add(stdout_encoding)
101
100
            fake_codec.add(stderr_encoding)
105
104
        sys.stdout = self._stdout
106
105
        sys.stderr = self._stderr
107
106
        sys.stdin = self._stdin
108
 
        bzrlib.user_encoding = self._user_encoding
 
107
        osutils._cached_user_encoding = self._user_encoding
109
108
 
110
109
    def test_get_terminal_encoding(self):
111
110
        self.make_wrapped_streams('stdout_encoding',
120
119
        self.assertEqual('stdin_encoding', osutils.get_terminal_encoding())
121
120
 
122
121
        sys.stdin.encoding = None
123
 
        # and in the worst case, use bzrlib.user_encoding
 
122
        # and in the worst case, use osutils.get_user_encoding()
124
123
        self.assertEqual('user_encoding', osutils.get_terminal_encoding())
125
124
 
126
125
    def test_terminal_cp0(self):
145
144
                                  'cp-unknown',
146
145
                                  user_encoding='latin-1',
147
146
                                  enable_fake_encodings=False)
148
 
        
 
147
 
149
148
        self.assertEqual('latin-1', osutils.get_terminal_encoding())
150
149
 
151
150
        # check stderr
152
151
        self.assertEquals('bzr: warning: unknown terminal encoding cp-unknown.\n'
153
 
                          '  Using encoding latin-1 instead.\n', 
 
152
                          '  Using encoding latin-1 instead.\n',
154
153
                          sys.stderr.getvalue())
155
154
 
156
155
 
157
156
class TestUserEncoding(TestCase):
158
157
    """Test detection of default user encoding."""
159
 
    
 
158
 
160
159
    def setUp(self):
 
160
        TestCase.setUp(self)
161
161
        self._stderr = sys.stderr
162
162
        self._getpreferredencoding = locale.getpreferredencoding
163
163
        self.addCleanup(self._reset)
198
198
                          ' Continuing with ascii encoding.\n',
199
199
                          sys.stderr.getvalue())
200
200
 
 
201
    def test_user_empty(self):
 
202
        """Running bzr from a vim script gives '' for a preferred locale"""
 
203
        def f():
 
204
            return ''
 
205
 
 
206
        locale.getpreferredencoding = f
 
207
        self.assertEquals('ascii', osutils.get_user_encoding(use_cache=False))
 
208
        self.assertEquals('', sys.stderr.getvalue())
 
209
 
201
210
    def test_user_locale_error(self):
202
211
        def f():
203
212
            raise locale.Error, 'unsupported locale'