1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
# Copyright (C) 2005 by Canonical Ltd
# -*- coding: utf-8 -*-
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
"""Black-box tests for bzr log.
"""
import bzrlib
import sys
from bzrlib.tests import TestCaseInTempDir, TestSkipped
class TestLog(TestCaseInTempDir):
_mu = u'\xb5'
_message = u'Message with \xb5'
# Encodings which can encode mu
good_encodings = [
'utf-8',
'latin-1',
'iso-8859-1',
'cp437', # Common windows encoding
'cp1251', # Alexander Belchenko's windows encoding
'cp1258', # Common windows encoding
]
# Encodings which cannot encode mu
bad_encodings = [
'ascii',
'iso-8859-2',
'koi8_r',
]
def create_branch(self):
bzr = self.run_bzr
bzr('init')
open('a', 'wb').write('some stuff\n')
bzr('add', 'a')
bzr('commit', '-m', self._message)
def try_encoding(self, encoding, fail=False):
bzr = self.run_bzr
if fail:
self.assertRaises(UnicodeEncodeError,
self._mu.encode, encoding)
encoded_msg = self._message.encode(encoding, 'replace')
else:
encoded_msg = self._message.encode(encoding)
old_encoding = bzrlib.user_encoding
# This test requires that 'run_bzr' uses the current
# bzrlib, because we override user_encoding, and expect
# it to be used
try:
bzrlib.user_encoding = 'ascii'
# We should be able to handle any encoding
out, err = bzr('log', encoding=encoding)
if not fail:
# Make sure we wrote mu as we expected it to exist
self.assertNotEqual(-1, out.find(encoded_msg))
out_unicode = out.decode(encoding)
self.assertNotEqual(-1, out_unicode.find(self._message))
else:
self.assertNotEqual(-1, out.find('Message with ?'))
finally:
bzrlib.user_encoding = old_encoding
def test_log_handles_encoding(self):
self.create_branch()
for encoding in self.good_encodings:
self.try_encoding(encoding)
def test_log_handles_bad_encoding(self):
self.create_branch()
for encoding in self.bad_encodings:
self.try_encoding(encoding, fail=True)
class TestLogEncodings(TestCaseInTempDir):
def setUp(self):
TestCaseInTempDir.setUp(self)
self.user_encoding = bzrlib.user_encoding
def tearDown(self):
bzrlib.user_encoding = self.user_encoding
TestCaseInTempDir.tearDown(self)
def test_stdout_encoding(self):
bzr = self.run_bzr
bzrlib.user_encoding = "cp1251"
bzr('init')
self.build_tree(['a'])
bzr('add', 'a')
bzr('commit', '-m', u'\u0422\u0435\u0441\u0442')
stdout, stderr = self.run_bzr('log', encoding='cp866')
message = stdout.splitlines()[-1]
# explanation of the check:
# u'\u0422\u0435\u0441\u0442' is word 'Test' in russian
# in cp866 encoding this is string '\x92\xa5\xe1\xe2'
# in cp1251 encoding this is string '\xd2\xe5\xf1\xf2'
# This test should check that output of log command
# encoded to sys.stdout.encoding
test_in_cp866 = '\x92\xa5\xe1\xe2'
test_in_cp1251 = '\xd2\xe5\xf1\xf2'
# Make sure the log string is encoded in cp866
self.assertEquals(test_in_cp866, message[2:])
# Make sure the cp1251 string is not found anywhere
self.assertEquals(-1, stdout.find(test_in_cp1251))
|