~bzr-pqm/bzr/bzr.dev

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