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