~bzr-pqm/bzr/bzr.dev

4763.2.4 by John Arbash Meinel
merge bzr.2.1 in preparation for NEWS entry.
1
# Copyright (C) 2005-2010 Canonical Ltd
1185.33.72 by Martin Pool
Fix commit message template for non-ascii files, and add test for handling of
2
#
3
# This program is free software; you can redistribute it and/or modify
2052.3.1 by John Arbash Meinel
Add tests to cleanup the copyright of all source files
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.
1185.33.72 by Martin Pool
Fix commit message template for non-ascii files, and add test for handling of
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
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1185.33.72 by Martin Pool
Fix commit message template for non-ascii files, and add test for handling of
16
17
"""Test commit message editor.
18
"""
19
20
import os
21
import sys
22
2772.1.1 by Martin Pool
Merge commit --show-diff feature from Goffredo
23
from bzrlib import (
3642.2.2 by Jelmer Vernooij
Add tests for commit_message_template hooks.
24
    commit,
5345.1.13 by Vincent Ladeuil
Cleanup test_msgeditor.
25
    config,
2772.1.1 by Martin Pool
Merge commit --show-diff feature from Goffredo
26
    errors,
27
    msgeditor,
28
    osutils,
3477.1.1 by John Arbash Meinel
Move UnicodeFeature into a core 'tests' feature, rather than living in test_diff.
29
    tests,
3910.1.1 by Andrew Bennetts
Improve error handling in msgeditor._run_editor.
30
    trace,
2772.1.1 by Martin Pool
Merge commit --show-diff feature from Goffredo
31
    )
1185.33.72 by Martin Pool
Fix commit message template for non-ascii files, and add test for handling of
32
from bzrlib.branch import Branch
1185.50.93 by John Arbash Meinel
Added a test for the new list of editors.
33
from bzrlib.config import ensure_config_dir_exists, config_filename
2598.6.24 by ghigo
update on the basis of Aaron suggestions
34
from bzrlib.msgeditor import (
35
    make_commit_message_template_encoded,
2598.6.27 by ghigo
small cleanup (line lenght)
36
    edit_commit_message_encoded
2598.6.24 by ghigo
update on the basis of Aaron suggestions
37
)
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
38
from bzrlib.tests import (
4789.23.3 by Martin
Test that msgeditor errno workarounds for windows are actually required
39
    TestCaseInTempDir,
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
40
    TestCaseWithTransport,
3004.1.8 by Daniel Watkins
Changed TestSkipped to TestNotApplicable as suggested by Aaron.
41
    TestNotApplicable,
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
42
    TestSkipped,
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
43
    multiply_tests,
44
    probe_bad_non_ascii,
45
    split_suite_by_re,
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
46
    )
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
47
from bzrlib.tests.EncodingAdapter import encoding_scenarios
1185.85.9 by John Arbash Meinel
[patch] Alexander Belchenko: test spawning a msg editor
48
from bzrlib.trace import mutter
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
49
2592.3.164 by Robert Collins
Reduce spurious differences to bzr.dev from merge mishaps.
50
2921.6.14 by Robert Collins
Push the message editor test parameterisation down into the message editor
51
def load_tests(standard_tests, module, loader):
3128.1.3 by Vincent Ladeuil
Since we are there s/parameteris.*/parameteriz&/.
52
    """Parameterize the test for tempfile creation with different encodings."""
2921.6.14 by Robert Collins
Push the message editor test parameterisation down into the message editor
53
    to_adapt, result = split_suite_by_re(standard_tests,
54
        "test__create_temp_file_with_commit_template_in_unicode_dir")
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
55
    return multiply_tests(to_adapt, encoding_scenarios, result)
2921.6.14 by Robert Collins
Push the message editor test parameterisation down into the message editor
56
57
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
58
class MsgEditorTest(TestCaseWithTransport):
1185.33.72 by Martin Pool
Fix commit message template for non-ascii files, and add test for handling of
59
1526.1.4 by Robert Collins
forgot my self.
60
    def make_uncommitted_tree(self):
1526.1.1 by Robert Collins
Run the test suite with no locale as well as the default locale. Also add a test for build_tree_shape to selftest.
61
        """Build a branch with uncommitted unicode named changes in the cwd."""
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
62
        working_tree = self.make_branch_and_tree('.')
63
        b = working_tree.branch
1526.1.1 by Robert Collins
Run the test suite with no locale as well as the default locale. Also add a test for build_tree_shape to selftest.
64
        filename = u'hell\u00d8'
1526.1.3 by Robert Collins
Merge from upstream.
65
        try:
66
            self.build_tree_contents([(filename, 'contents of hello')])
67
        except UnicodeEncodeError:
68
            raise TestSkipped("can't build unicode working tree in "
1185.33.97 by Martin Pool
MsgEditor tests should be skipped on platforms without unicode fs.
69
                "filesystem encoding %s" % sys.getfilesystemencoding())
1526.1.1 by Robert Collins
Run the test suite with no locale as well as the default locale. Also add a test for build_tree_shape to selftest.
70
        working_tree.add(filename)
71
        return working_tree
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
72
1185.33.72 by Martin Pool
Fix commit message template for non-ascii files, and add test for handling of
73
    def test_commit_template(self):
74
        """Test building a commit message template"""
1526.1.2 by Robert Collins
Fix typo in my msgeditor test changes.
75
        working_tree = self.make_uncommitted_tree()
2772.1.1 by Martin Pool
Merge commit --show-diff feature from Goffredo
76
        template = msgeditor.make_commit_message_template(working_tree,
2598.6.24 by ghigo
update on the basis of Aaron suggestions
77
                                                                 None)
2598.6.18 by ghigo
Update the tests to the new *_encoded() functions
78
        self.assertEqualDiff(template,
79
u"""\
80
added:
81
  hell\u00d8
82
""")
83
3968.1.1 by Colin D Bennett
Show all pending merge revisions in the commit message template.
84
    def make_multiple_pending_tree(self):
85
        from bzrlib import config
86
        config.GlobalConfig().set_user_option('email',
87
                                              'Bilbo Baggins <bb@hobbit.net>')
88
        tree = self.make_branch_and_tree('a')
89
        tree.commit('Initial checkin.', timestamp=1230912900, timezone=0)
90
        tree2 = tree.bzrdir.clone('b').open_workingtree()
91
        tree.commit('Minor tweak.', timestamp=1231977840, timezone=0)
92
        tree2.commit('Feature X work.', timestamp=1233186240, timezone=0)
93
        tree3 = tree2.bzrdir.clone('c').open_workingtree()
94
        tree2.commit('Feature X finished.', timestamp=1233187680, timezone=0)
95
        tree3.commit('Feature Y, based on initial X work.',
96
                     timestamp=1233285960, timezone=0)
97
        tree.merge_from_branch(tree2.branch)
4721.3.2 by Vincent Ladeuil
Simplify mutable_tree.has_changes() and update call sites.
98
        tree.merge_from_branch(tree3.branch, force=True)
3968.1.1 by Colin D Bennett
Show all pending merge revisions in the commit message template.
99
        return tree
100
101
    def test_commit_template_pending_merges(self):
102
        """Test building a commit message template when there are pending
103
        merges.  The commit message should show all pending merge revisions,
104
        as does 'status -v', not only the merge tips.
105
        """
106
        working_tree = self.make_multiple_pending_tree()
107
        template = msgeditor.make_commit_message_template(working_tree, None)
108
        self.assertEqualDiff(template,
109
u"""\
110
pending merges:
111
  Bilbo Baggins 2009-01-29 Feature X finished.
112
    Bilbo Baggins 2009-01-28 Feature X work.
113
  Bilbo Baggins 2009-01-30 Feature Y, based on initial X work.
114
""")
115
2598.6.18 by ghigo
Update the tests to the new *_encoded() functions
116
    def test_commit_template_encoded(self):
117
        """Test building a commit message template"""
118
        working_tree = self.make_uncommitted_tree()
2598.6.24 by ghigo
update on the basis of Aaron suggestions
119
        template = make_commit_message_template_encoded(working_tree,
120
                                                        None,
121
                                                        output_encoding='utf8')
1185.33.72 by Martin Pool
Fix commit message template for non-ascii files, and add test for handling of
122
        self.assertEqualDiff(template,
123
u"""\
124
added:
125
  hell\u00d8
2598.6.14 by ghigo
Update the test
126
""".encode("utf8"))
1185.85.9 by John Arbash Meinel
[patch] Alexander Belchenko: test spawning a msg editor
127
2598.6.18 by ghigo
Update the tests to the new *_encoded() functions
128
2598.6.2 by ghigo
Add testcase
129
    def test_commit_template_and_diff(self):
130
        """Test building a commit message template"""
131
        working_tree = self.make_uncommitted_tree()
2598.6.24 by ghigo
update on the basis of Aaron suggestions
132
        template = make_commit_message_template_encoded(working_tree,
133
                                                        None,
134
                                                        diff=True,
135
                                                        output_encoding='utf8')
2598.6.2 by ghigo
Add testcase
136
2598.6.10 by ghigo
In the commit dialog, the diff is stored as 8-bit raw data
137
        self.assertTrue("""\
2598.6.2 by ghigo
Add testcase
138
@@ -0,0 +1,1 @@
139
+contents of hello
2598.6.14 by ghigo
Update the test
140
""" in template)
2598.6.3 by ghigo
Add test case
141
        self.assertTrue(u"""\
142
added:
143
  hell\u00d8
2598.6.14 by ghigo
Update the test
144
""".encode('utf8') in template)
2598.6.2 by ghigo
Add testcase
145
3910.1.1 by Andrew Bennetts
Improve error handling in msgeditor._run_editor.
146
    def make_do_nothing_editor(self):
1185.85.9 by John Arbash Meinel
[patch] Alexander Belchenko: test spawning a msg editor
147
        if sys.platform == "win32":
148
            f = file('fed.bat', 'w')
149
            f.write('@rem dummy fed')
150
            f.close()
3910.1.1 by Andrew Bennetts
Improve error handling in msgeditor._run_editor.
151
            return 'fed.bat'
1185.85.9 by John Arbash Meinel
[patch] Alexander Belchenko: test spawning a msg editor
152
        else:
153
            f = file('fed.sh', 'wb')
154
            f.write('#!/bin/sh\n')
155
            f.close()
156
            os.chmod('fed.sh', 0755)
3910.1.1 by Andrew Bennetts
Improve error handling in msgeditor._run_editor.
157
            return './fed.sh'
1185.85.9 by John Arbash Meinel
[patch] Alexander Belchenko: test spawning a msg editor
158
3910.1.1 by Andrew Bennetts
Improve error handling in msgeditor._run_editor.
159
    def test_run_editor(self):
160
        os.environ['BZR_EDITOR'] = self.make_do_nothing_editor()
2772.1.1 by Martin Pool
Merge commit --show-diff feature from Goffredo
161
        self.assertEqual(True, msgeditor._run_editor(''),
1185.85.9 by John Arbash Meinel
[patch] Alexander Belchenko: test spawning a msg editor
162
                         'Unable to run dummy fake editor')
163
2625.9.5 by Daniel Watkins
Modified test_msgeditor.make_fake_editor to allow a custom message to be inserted.
164
    def make_fake_editor(self, message='test message from fed\\n'):
2258.3.2 by James Westby
Allow an empty start message.
165
        """Set up environment so that an editor will be a known script.
166
167
        Sets up BZR_EDITOR so that if an editor is spawned it will run a
168
        script that just adds a known message to the start of the file.
169
        """
1185.85.9 by John Arbash Meinel
[patch] Alexander Belchenko: test spawning a msg editor
170
        f = file('fed.py', 'wb')
171
        f.write('#!%s\n' % sys.executable)
172
        f.write("""\
2625.9.5 by Daniel Watkins
Modified test_msgeditor.make_fake_editor to allow a custom message to be inserted.
173
# coding=utf-8
1185.85.9 by John Arbash Meinel
[patch] Alexander Belchenko: test spawning a msg editor
174
import sys
175
if len(sys.argv) == 2:
176
    fn = sys.argv[1]
177
    f = file(fn, 'rb')
178
    s = f.read()
179
    f.close()
180
    f = file(fn, 'wb')
2625.9.9 by Daniel Watkins
Used format string as suggested by abentley.
181
    f.write('%s')
1185.85.9 by John Arbash Meinel
[patch] Alexander Belchenko: test spawning a msg editor
182
    f.write(s)
183
    f.close()
2625.9.9 by Daniel Watkins
Used format string as suggested by abentley.
184
""" % (message, ))
1185.85.9 by John Arbash Meinel
[patch] Alexander Belchenko: test spawning a msg editor
185
        f.close()
186
        if sys.platform == "win32":
187
            # [win32] make batch file and set BZR_EDITOR
188
            f = file('fed.bat', 'w')
189
            f.write("""\
190
@echo off
1711.4.2 by jfmeinel
current python may be running in a path that has a space, so properly quote the python exe name. for test_msgeditor
191
"%s" fed.py %%1
1185.85.9 by John Arbash Meinel
[patch] Alexander Belchenko: test spawning a msg editor
192
""" % sys.executable)
193
            f.close()
194
            os.environ['BZR_EDITOR'] = 'fed.bat'
195
        else:
196
            # [non-win32] make python script executable and set BZR_EDITOR
197
            os.chmod('fed.py', 0755)
198
            os.environ['BZR_EDITOR'] = './fed.py'
199
2258.3.2 by James Westby
Allow an empty start message.
200
    def test_edit_commit_message(self):
201
        working_tree = self.make_uncommitted_tree()
202
        self.make_fake_editor()
203
1185.85.9 by John Arbash Meinel
[patch] Alexander Belchenko: test spawning a msg editor
204
        mutter('edit_commit_message without infotext')
205
        self.assertEqual('test message from fed\n',
2772.1.1 by Martin Pool
Merge commit --show-diff feature from Goffredo
206
                         msgeditor.edit_commit_message(''))
1185.85.9 by John Arbash Meinel
[patch] Alexander Belchenko: test spawning a msg editor
207
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
208
        mutter('edit_commit_message with ascii string infotext')
209
        self.assertEqual('test message from fed\n',
210
                         msgeditor.edit_commit_message('spam'))
211
1185.85.9 by John Arbash Meinel
[patch] Alexander Belchenko: test spawning a msg editor
212
        mutter('edit_commit_message with unicode infotext')
213
        self.assertEqual('test message from fed\n',
2772.1.1 by Martin Pool
Merge commit --show-diff feature from Goffredo
214
                         msgeditor.edit_commit_message(u'\u1234'))
2598.6.18 by ghigo
Update the tests to the new *_encoded() functions
215
2598.6.27 by ghigo
small cleanup (line lenght)
216
        tmpl = edit_commit_message_encoded(u'\u1234'.encode("utf8"))
217
        self.assertEqual('test message from fed\n', tmpl)
1185.85.14 by John Arbash Meinel
Change exception handling for msgeditor.py to only catch specific exceptions.
218
2258.3.2 by James Westby
Allow an empty start message.
219
    def test_start_message(self):
220
        self.make_uncommitted_tree()
221
        self.make_fake_editor()
2258.3.1 by James Westby
Add a way to specify a template commit message.
222
        self.assertEqual('test message from fed\nstart message\n',
2772.1.1 by Martin Pool
Merge commit --show-diff feature from Goffredo
223
                         msgeditor.edit_commit_message('',
2258.3.1 by James Westby
Add a way to specify a template commit message.
224
                                              start_message='start message\n'))
2258.3.2 by James Westby
Allow an empty start message.
225
        self.assertEqual('test message from fed\n',
2772.1.1 by Martin Pool
Merge commit --show-diff feature from Goffredo
226
                         msgeditor.edit_commit_message('',
2258.3.2 by James Westby
Allow an empty start message.
227
                                              start_message=''))
2258.3.1 by James Westby
Add a way to specify a template commit message.
228
1185.85.14 by John Arbash Meinel
Change exception handling for msgeditor.py to only catch specific exceptions.
229
    def test_deleted_commit_message(self):
230
        working_tree = self.make_uncommitted_tree()
231
232
        if sys.platform == 'win32':
1711.4.1 by John Arbash Meinel
del is not an executable program on win32, you must use cmd /c del
233
            os.environ['BZR_EDITOR'] = 'cmd.exe /c del'
1185.85.14 by John Arbash Meinel
Change exception handling for msgeditor.py to only catch specific exceptions.
234
        else:
235
            os.environ['BZR_EDITOR'] = 'rm'
236
2772.1.1 by Martin Pool
Merge commit --show-diff feature from Goffredo
237
        self.assertRaises((IOError, OSError), msgeditor.edit_commit_message, '')
1185.85.14 by John Arbash Meinel
Change exception handling for msgeditor.py to only catch specific exceptions.
238
1185.50.93 by John Arbash Meinel
Added a test for the new list of editors.
239
    def test__get_editor(self):
5345.1.13 by Vincent Ladeuil
Cleanup test_msgeditor.
240
        os.environ['BZR_EDITOR'] = 'bzr_editor'
241
        os.environ['VISUAL'] = 'visual'
242
        os.environ['EDITOR'] = 'editor'
243
5345.1.26 by Vincent Ladeuil
Merge lockable-config-files into remove-gratuitous-ensure-config-dir-exist-calls resolving conflicts
244
        conf = config.GlobalConfig.from_string('editor = config_editor\n',
245
                                               save=True)
5345.1.13 by Vincent Ladeuil
Cleanup test_msgeditor.
246
247
        editors = list(msgeditor._get_editor())
248
        editors = [editor for (editor, cfg_src) in editors]
249
250
        self.assertEqual(['bzr_editor', 'config_editor', 'visual', 'editor'],
251
                         editors[:4])
252
253
        if sys.platform == 'win32':
254
            self.assertEqual(['wordpad.exe', 'notepad.exe'], editors[4:])
255
        else:
256
            self.assertEqual(['/usr/bin/editor', 'vi', 'pico', 'nano', 'joe'],
257
                             editors[4:])
258
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
259
3910.1.1 by Andrew Bennetts
Improve error handling in msgeditor._run_editor.
260
    def test__run_editor_EACCES(self):
261
        """If running a configured editor raises EACESS, the user is warned."""
262
        os.environ['BZR_EDITOR'] = 'eacces.py'
263
        f = file('eacces.py', 'wb')
264
        f.write('# Not a real editor')
265
        f.close()
266
        # Make the fake editor unreadable (and unexecutable)
267
        os.chmod('eacces.py', 0)
268
        # Set $EDITOR so that _run_editor will terminate before trying real
269
        # editors.
270
        os.environ['EDITOR'] = self.make_do_nothing_editor()
271
        # Call _run_editor, capturing mutter.warning calls.
272
        warnings = []
273
        def warning(*args):
4789.23.1 by John Arbash Meinel
Spawning a non-executable file raises ENOEXEC on windows, not EACCESS.
274
            if len(args) > 1:
275
                warnings.append(args[0] % args[1:])
276
            else:
277
                warnings.append(args[0])
3910.1.1 by Andrew Bennetts
Improve error handling in msgeditor._run_editor.
278
        _warning = trace.warning
279
        trace.warning = warning
280
        try:
281
            msgeditor._run_editor('')
282
        finally:
283
            trace.warning = _warning
3910.1.3 by Andrew Bennetts
Tweak warning slightly.
284
        self.assertStartsWith(warnings[0], 'Could not start editor "eacces.py"')
3910.1.1 by Andrew Bennetts
Improve error handling in msgeditor._run_editor.
285
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
286
    def test__create_temp_file_with_commit_template(self):
287
        # check that commit template written properly
288
        # and has platform native line-endings (CRLF on win32)
2772.1.1 by Martin Pool
Merge commit --show-diff feature from Goffredo
289
        create_file = msgeditor._create_temp_file_with_commit_template
2472.4.2 by Alexander Belchenko
unwrapping long lines in tests
290
        msgfilename, hasinfo = create_file('infotext','----','start message')
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
291
        self.assertNotEqual(None, msgfilename)
292
        self.assertTrue(hasinfo)
2472.4.2 by Alexander Belchenko
unwrapping long lines in tests
293
        expected = os.linesep.join(['start message',
294
                                    '',
295
                                    '',
296
                                    '----',
297
                                    '',
298
                                    'infotext'])
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
299
        self.assertFileEqual(expected, msgfilename)
300
3004.1.1 by Daniel Watkins
Added (failing) test to check if a temp file containing a commit message can be created in a folder with a Unicode name.
301
    def test__create_temp_file_with_commit_template_in_unicode_dir(self):
3477.1.2 by John Arbash Meinel
Rename UnicodeFilename => UnicodeFilenameFeature
302
        self.requireFeature(tests.UnicodeFilenameFeature)
3004.1.7 by Daniel Watkins
test__create_temp_file_with_commit_template_in_unicode_dir now uses EncodingTestAdapter info.
303
        if hasattr(self, 'info'):
304
            os.mkdir(self.info['directory'])
305
            os.chdir(self.info['directory'])
306
            msgeditor._create_temp_file_with_commit_template('infotext')
307
        else:
3004.1.8 by Daniel Watkins
Changed TestSkipped to TestNotApplicable as suggested by Aaron.
308
            raise TestNotApplicable('Test run elsewhere with non-ascii data.')
3004.1.1 by Daniel Watkins
Added (failing) test to check if a temp file containing a commit message can be created in a folder with a Unicode name.
309
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
310
    def test__create_temp_file_with_empty_commit_template(self):
311
        # empty file
2772.1.1 by Martin Pool
Merge commit --show-diff feature from Goffredo
312
        create_file = msgeditor._create_temp_file_with_commit_template
2472.4.2 by Alexander Belchenko
unwrapping long lines in tests
313
        msgfilename, hasinfo = create_file('')
2472.4.1 by Alexander Belchenko
Bugfix #110901: commit message template written with native line-endings; corresponding unit tests added
314
        self.assertNotEqual(None, msgfilename)
315
        self.assertFalse(hasinfo)
316
        self.assertFileEqual('', msgfilename)
2625.9.6 by Daniel Watkins
Added test to ensure correct error message is thrown when an unencodable commit message is entered through the editor.
317
318
    def test_unsupported_encoding_commit_message(self):
319
        old_env = osutils.set_or_unset_env('LANG', 'C')
2625.9.8 by Daniel Watkins
Updated as per poolie's !tweak.
320
        try:
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
321
            # LANG env variable has no effect on Windows
322
            # but some characters anyway cannot be represented
323
            # in default user encoding
3224.5.4 by Andrew Bennetts
Fix test suite, mainly weeding out uses of bzrlib.user_encoding.
324
            char = probe_bad_non_ascii(osutils.get_user_encoding())
2839.6.2 by Alexander Belchenko
changes after Martin's review
325
            if char is None:
326
                raise TestSkipped('Cannot find suitable non-ascii character '
3224.5.4 by Andrew Bennetts
Fix test suite, mainly weeding out uses of bzrlib.user_encoding.
327
                    'for user_encoding (%s)' % osutils.get_user_encoding())
2804.4.1 by Alexander Belchenko
some win32-specific fixes for selftest
328
329
            self.make_fake_editor(message=char)
2625.9.6 by Daniel Watkins
Added test to ensure correct error message is thrown when an unencodable commit message is entered through the editor.
330
2625.9.8 by Daniel Watkins
Updated as per poolie's !tweak.
331
            working_tree = self.make_uncommitted_tree()
332
            self.assertRaises(errors.BadCommitMessageEncoding,
2772.1.1 by Martin Pool
Merge commit --show-diff feature from Goffredo
333
                              msgeditor.edit_commit_message, '')
2625.9.8 by Daniel Watkins
Updated as per poolie's !tweak.
334
        finally:
335
            osutils.set_or_unset_env('LANG', old_env)
3642.2.2 by Jelmer Vernooij
Add tests for commit_message_template hooks.
336
337
    def test_generate_commit_message_template_no_hooks(self):
338
        commit_obj = commit.Commit()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
339
        self.assertIs(None,
3642.2.2 by Jelmer Vernooij
Add tests for commit_message_template hooks.
340
            msgeditor.generate_commit_message_template(commit_obj))
341
342
    def test_generate_commit_message_template_hook(self):
343
        msgeditor.hooks.install_named_hook("commit_message_template",
344
                lambda commit_obj, msg: "save me some typing\n", None)
345
        commit_obj = commit.Commit()
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
346
        self.assertEquals("save me some typing\n",
3642.2.2 by Jelmer Vernooij
Add tests for commit_message_template hooks.
347
            msgeditor.generate_commit_message_template(commit_obj))
4789.23.3 by Martin
Test that msgeditor errno workarounds for windows are actually required
348
349
350
# GZ 2009-11-17: This wants moving to osutils when the errno checking code is
351
class TestPlatformErrnoWorkarounds(TestCaseInTempDir):
352
    """Ensuring workarounds enshrined in code actually serve a purpose"""
4805.1.4 by John Arbash Meinel
Document a bit more what 193 means, and why we are testing it.
353
354
    def test_subprocess_call_bad_file(self):
4789.23.3 by Martin
Test that msgeditor errno workarounds for windows are actually required
355
        if sys.platform != "win32":
4805.1.4 by John Arbash Meinel
Document a bit more what 193 means, and why we are testing it.
356
            raise TestNotApplicable("Workarounds for windows only")
4789.23.3 by Martin
Test that msgeditor errno workarounds for windows are actually required
357
        import subprocess, errno
358
        ERROR_BAD_EXE_FORMAT = 193
359
        file("textfile.txt", "w").close()
360
        e = self.assertRaises(WindowsError, subprocess.call, "textfile.txt")
4805.1.4 by John Arbash Meinel
Document a bit more what 193 means, and why we are testing it.
361
        # Python2.4 used the 'winerror' as the errno, which confuses a lot of
362
        # our error trapping code. Make sure that we understand the mapping
363
        # correctly.
364
        if sys.version_info >= (2, 5):
4789.23.3 by Martin
Test that msgeditor errno workarounds for windows are actually required
365
            self.assertEqual(e.errno, errno.ENOEXEC)
366
            self.assertEqual(e.winerror, ERROR_BAD_EXE_FORMAT)
367
        else:
368
            self.assertEqual(e.errno, ERROR_BAD_EXE_FORMAT)