/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
2052.3.2 by John Arbash Meinel
Change Copyright .. by Canonical to Copyright ... Canonical
1
# Copyright (C) 2005 Canonical Ltd
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
2
# -*- coding: utf-8 -*-
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
3
#
720 by Martin Pool
- start moving external tests into the testsuite framework
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
8
#
720 by Martin Pool
- start moving external tests into the testsuite framework
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
1887.1.1 by Adeodato Simó
Do not separate paragraphs in the copyright statement with blank lines,
13
#
720 by Martin Pool
- start moving external tests into the testsuite framework
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
1185.46.9 by Aaron Bentley
Added verbose option to bzr add, to list all ignored files.
18
# Mr. Smoketoomuch: I'm sorry?
19
# Mr. Bounder: You'd better cut down a little then.
20
# Mr. Smoketoomuch: Oh, I see! Smoke too much so I'd better cut down a little
21
#                   then!
720 by Martin Pool
- start moving external tests into the testsuite framework
22
23
"""Black-box tests for bzr.
24
25
These check that it behaves properly when it's invoked through the regular
1403 by Robert Collins
merge from martin
26
command-line interface. This doesn't actually run a new interpreter but 
1393.1.45 by Martin Pool
doc
27
rather starts again from the run_bzr function.
720 by Martin Pool
- start moving external tests into the testsuite framework
28
"""
29
1393.1.45 by Martin Pool
doc
30
1185.33.14 by Martin Pool
doc
31
# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
32
# Note: Please don't add new tests here, it's too big and bulky.  Instead add
1512 by Robert Collins
Merge from Martin. Adjust check to work with HTTP again.
33
# them into small suites in bzrlib.tests.blackbox.test_FOO for the particular
34
# UI command/aspect that is being tested.
1185.33.14 by Martin Pool
doc
35
36
1185.1.25 by Robert Collins
merge David Clymer's patch for TestCaseInTestDir.runcmd
37
from cStringIO import StringIO
1185.1.41 by Robert Collins
massive patch from Alexander Belchenko - many PEP8 fixes, removes unused function uuid
38
import os
1185.16.43 by Martin Pool
- clean up handling of option objects
39
import re
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
40
import sys
1161 by Martin Pool
- add test that 'bzr add' reports the files as they're added
41
1666.1.4 by Robert Collins
* 'Metadir' is now the default disk format. This improves behaviour in
42
import bzrlib
1996.3.18 by John Arbash Meinel
Now that mkdtemp and rmtree are lazy, they should not be directly improted.
43
from bzrlib import (
44
    osutils,
45
    )
1161 by Martin Pool
- add test that 'bzr add' reports the files as they're added
46
from bzrlib.branch import Branch
1393.3.3 by Jelmer Vernooij
Add test for empty commit messages.
47
from bzrlib.errors import BzrCommandError
1692.3.5 by Robert Collins
Merge integration, fixing test failure in test_too_much due to terminal width changing.
48
from bzrlib.osutils import (
49
    has_symlinks,
50
    pathjoin,
51
    terminal_width,
52
    )
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
53
from bzrlib.tests.HTTPTestUtil import TestCaseWithWebserver
1530.1.7 by Robert Collins
merge integration.
54
from bzrlib.tests.test_sftp_transport import TestCaseWithSFTPServer
1513 by Robert Collins
Blackbox tests are maintained within the bzrlib.tests.blackbox directory.
55
from bzrlib.tests.blackbox import ExternalBase
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
56
from bzrlib.workingtree import WorkingTree
1142 by Martin Pool
- remove dead code from blackbox tests (pychecker)
57
1185.65.29 by Robert Collins
Implement final review suggestions.
58
1102 by Martin Pool
- merge test refactoring from robertc
59
class TestCommands(ExternalBase):
60
1185.35.14 by Aaron Bentley
Implemented nick command
61
    def test_nick_command(self):
62
        """bzr nick for viewing, setting nicknames"""
63
        os.mkdir('me.dev')
64
        os.chdir('me.dev')
65
        self.runbzr('init')
66
        nick = self.runbzr("nick",backtick=True)
67
        self.assertEqual(nick, 'me.dev\n')
68
        nick = self.runbzr("nick moo")
69
        nick = self.runbzr("nick",backtick=True)
70
        self.assertEqual(nick, 'moo\n')
71
1102 by Martin Pool
- merge test refactoring from robertc
72
    def test_invalid_commands(self):
1185.35.21 by Aaron Bentley
Changed error status to 3
73
        self.runbzr("pants", retcode=3)
74
        self.runbzr("--pants off", retcode=3)
75
        self.runbzr("diff --message foo", retcode=3)
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
76
1102 by Martin Pool
- merge test refactoring from robertc
77
    def test_revert(self):
78
        self.runbzr('init')
79
80
        file('hello', 'wt').write('foo')
81
        self.runbzr('add hello')
82
        self.runbzr('commit -m setup hello')
83
84
        file('goodbye', 'wt').write('baz')
85
        self.runbzr('add goodbye')
86
        self.runbzr('commit -m setup goodbye')
1092.2.18 by Robert Collins
merge from symlink branch
87
1102 by Martin Pool
- merge test refactoring from robertc
88
        file('hello', 'wt').write('bar')
89
        file('goodbye', 'wt').write('qux')
90
        self.runbzr('revert hello')
91
        self.check_file_contents('hello', 'foo')
92
        self.check_file_contents('goodbye', 'qux')
93
        self.runbzr('revert')
94
        self.check_file_contents('goodbye', 'baz')
95
96
        os.mkdir('revertdir')
97
        self.runbzr('add revertdir')
98
        self.runbzr('commit -m f')
99
        os.rmdir('revertdir')
100
        self.runbzr('revert')
101
1185.31.49 by John Arbash Meinel
Some corrections using the new osutils.rename. **ALL TESTS PASS**
102
        if has_symlinks():
103
            os.symlink('/unlikely/to/exist', 'symlink')
104
            self.runbzr('add symlink')
105
            self.runbzr('commit -m f')
106
            os.unlink('symlink')
107
            self.runbzr('revert')
108
            self.failUnlessExists('symlink')
109
            os.unlink('symlink')
110
            os.symlink('a-different-path', 'symlink')
111
            self.runbzr('revert')
112
            self.assertEqual('/unlikely/to/exist',
113
                             os.readlink('symlink'))
114
        else:
115
            self.log("skipping revert symlink tests")
1092.2.18 by Robert Collins
merge from symlink branch
116
        
1185.5.8 by John Arbash Meinel
Fixed bzr revert with the new RevisionSpec code.
117
        file('hello', 'wt').write('xyz')
118
        self.runbzr('commit -m xyz hello')
119
        self.runbzr('revert -r 1 hello')
120
        self.check_file_contents('hello', 'foo')
121
        self.runbzr('revert hello')
122
        self.check_file_contents('hello', 'xyz')
1185.8.5 by Aaron Bentley
Fixed non-tree-root bug in branch, revert, merge
123
        os.chdir('revertdir')
124
        self.runbzr('revert')
125
        os.chdir('..')
126
1102 by Martin Pool
- merge test refactoring from robertc
127
    def test_main_version(self):
128
        """Check output from version command and master option is reasonable"""
129
        # output is intentionally passed through to stdout so that we
130
        # can see the version being tested
131
        output = self.runbzr('version', backtick=1)
132
        self.log('bzr version output:')
133
        self.log(output)
1711.2.112 by John Arbash Meinel
Fix broken test
134
        self.assert_(output.startswith('Bazaar (bzr) '))
1102 by Martin Pool
- merge test refactoring from robertc
135
        self.assertNotEqual(output.index('Canonical'), -1)
136
        # make sure --version is consistent
137
        tmp_output = self.runbzr('--version', backtick=1)
138
        self.log('bzr --version output:')
139
        self.log(tmp_output)
140
        self.assertEquals(output, tmp_output)
906 by Martin Pool
- split out black-box ignore commands
141
1092.1.39 by Robert Collins
merge from mpool
142
    def example_branch(test):
143
        test.runbzr('init')
144
        file('hello', 'wt').write('foo')
145
        test.runbzr('add hello')
146
        test.runbzr('commit -m setup hello')
147
        file('goodbye', 'wt').write('baz')
148
        test.runbzr('add goodbye')
149
        test.runbzr('commit -m setup goodbye')
150
1185.32.2 by John Arbash Meinel
Refactor pull --verbose into a log.py function, add tests.
151
    def test_pull_verbose(self):
152
        """Pull changes from one branch to another and watch the output."""
153
154
        os.mkdir('a')
155
        os.chdir('a')
156
157
        bzr = self.runbzr
158
        self.example_branch()
159
160
        os.chdir('..')
161
        bzr('branch a b')
162
        os.chdir('b')
163
        open('b', 'wb').write('else\n')
164
        bzr('add b')
165
        bzr(['commit', '-m', 'added b'])
166
167
        os.chdir('../a')
168
        out = bzr('pull --verbose ../b', backtick=True)
169
        self.failIfEqual(out.find('Added Revisions:'), -1)
170
        self.failIfEqual(out.find('message:\n  added b'), -1)
1185.33.27 by Martin Pool
[merge] much integrated work from robert and john
171
        self.failIfEqual(out.find('added b'), -1)
1185.32.2 by John Arbash Meinel
Refactor pull --verbose into a log.py function, add tests.
172
1185.32.4 by John Arbash Meinel
[merge] up-to-date against bzr.dev
173
        # Check that --overwrite --verbose prints out the removed entries
1185.32.2 by John Arbash Meinel
Refactor pull --verbose into a log.py function, add tests.
174
        bzr('commit -m foo --unchanged')
175
        os.chdir('../b')
176
        bzr('commit -m baz --unchanged')
1185.33.27 by Martin Pool
[merge] much integrated work from robert and john
177
        bzr('pull ../a', retcode=3)
1185.32.4 by John Arbash Meinel
[merge] up-to-date against bzr.dev
178
        out = bzr('pull --overwrite --verbose ../a', backtick=1)
1185.32.2 by John Arbash Meinel
Refactor pull --verbose into a log.py function, add tests.
179
180
        remove_loc = out.find('Removed Revisions:')
181
        self.failIfEqual(remove_loc, -1)
182
        added_loc = out.find('Added Revisions:')
183
        self.failIfEqual(added_loc, -1)
184
185
        removed_message = out.find('message:\n  baz')
186
        self.failIfEqual(removed_message, -1)
187
        self.failUnless(remove_loc < removed_message < added_loc)
188
189
        added_message = out.find('message:\n  foo')
190
        self.failIfEqual(added_message, -1)
191
        self.failUnless(added_loc < added_message)
192
        
1185.12.11 by Aaron Bentley
Made pull only save the parent location if it is unset, or on --remember
193
    def test_locations(self):
194
        """Using and remembering different locations"""
195
        os.mkdir('a')
196
        os.chdir('a')
197
        self.runbzr('init')
198
        self.runbzr('commit -m unchanged --unchanged')
1185.35.21 by Aaron Bentley
Changed error status to 3
199
        self.runbzr('pull', retcode=3)
200
        self.runbzr('merge', retcode=3)
1185.12.11 by Aaron Bentley
Made pull only save the parent location if it is unset, or on --remember
201
        self.runbzr('branch . ../b')
202
        os.chdir('../b')
203
        self.runbzr('pull')
204
        self.runbzr('branch . ../c')
205
        self.runbzr('pull ../c')
1185.12.12 by Aaron Bentley
Made merge use pull location or die if no branch specified.
206
        self.runbzr('merge')
1185.12.11 by Aaron Bentley
Made pull only save the parent location if it is unset, or on --remember
207
        os.chdir('../a')
208
        self.runbzr('pull ../b')
209
        self.runbzr('pull')
210
        self.runbzr('pull ../c')
211
        self.runbzr('branch ../c ../d')
1996.3.18 by John Arbash Meinel
Now that mkdtemp and rmtree are lazy, they should not be directly improted.
212
        osutils.rmtree('../c')
1185.12.11 by Aaron Bentley
Made pull only save the parent location if it is unset, or on --remember
213
        self.runbzr('pull')
214
        os.chdir('../b')
215
        self.runbzr('pull')
216
        os.chdir('../d')
1185.35.21 by Aaron Bentley
Changed error status to 3
217
        self.runbzr('pull', retcode=3)
1185.12.11 by Aaron Bentley
Made pull only save the parent location if it is unset, or on --remember
218
        self.runbzr('pull ../a --remember')
219
        self.runbzr('pull')
974.1.74 by Aaron Bentley
Made pull work after remote branch has merged latest revision
220
        
1185.3.20 by Martin Pool
- run_bzr_captured also includes logged errors in
221
    def test_unknown_command(self):
222
        """Handling of unknown command."""
223
        out, err = self.run_bzr_captured(['fluffy-badger'],
1185.35.21 by Aaron Bentley
Changed error status to 3
224
                                         retcode=3)
1185.3.20 by Martin Pool
- run_bzr_captured also includes logged errors in
225
        self.assertEquals(out, '')
226
        err.index('unknown command')
1185.14.9 by Aaron Bentley
Added tests for 'bzr conflicts', 'bzr resolve'
227
1185.35.4 by Aaron Bentley
Implemented remerge
228
    def create_conflicts(self):
229
        """Create a conflicted tree"""
1185.14.9 by Aaron Bentley
Added tests for 'bzr conflicts', 'bzr resolve'
230
        os.mkdir('base')
231
        os.chdir('base')
232
        file('hello', 'wb').write("hi world")
233
        file('answer', 'wb').write("42")
234
        self.runbzr('init')
235
        self.runbzr('add')
236
        self.runbzr('commit -m base')
237
        self.runbzr('branch . ../other')
238
        self.runbzr('branch . ../this')
239
        os.chdir('../other')
240
        file('hello', 'wb').write("Hello.")
241
        file('answer', 'wb').write("Is anyone there?")
242
        self.runbzr('commit -m other')
243
        os.chdir('../this')
244
        file('hello', 'wb').write("Hello, world")
245
        self.runbzr('mv answer question')
246
        file('question', 'wb').write("What do you get when you multiply six"
247
                                   "times nine?")
248
        self.runbzr('commit -m this')
1185.35.4 by Aaron Bentley
Implemented remerge
249
1185.65.6 by Aaron Bentley
Fixed inner merges in status
250
    def test_status(self):
251
        os.mkdir('branch1')
252
        os.chdir('branch1')
253
        self.runbzr('init')
254
        self.runbzr('commit --unchanged --message f')
255
        self.runbzr('branch . ../branch2')
256
        self.runbzr('branch . ../branch3')
257
        self.runbzr('commit --unchanged --message peter')
258
        os.chdir('../branch2')
259
        self.runbzr('merge ../branch1')
260
        self.runbzr('commit --unchanged --message pumpkin')
261
        os.chdir('../branch3')
262
        self.runbzr('merge ../branch2')
263
        message = self.capture('status')
264
1185.35.4 by Aaron Bentley
Implemented remerge
265
266
    def test_conflicts(self):
267
        """Handling of merge conflicts"""
268
        self.create_conflicts()
1476 by Robert Collins
Merge now has a retcode of 1 when conflicts occur. (Robert Collins)
269
        self.runbzr('merge ../other --show-base', retcode=1)
1185.18.1 by Aaron Bentley
Added --show-base to merge
270
        conflict_text = file('hello').read()
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
271
        self.assert_('<<<<<<<' in conflict_text)
272
        self.assert_('>>>>>>>' in conflict_text)
273
        self.assert_('=======' in conflict_text)
274
        self.assert_('|||||||' in conflict_text)
275
        self.assert_('hi world' in conflict_text)
1185.18.1 by Aaron Bentley
Added --show-base to merge
276
        self.runbzr('revert')
277
        self.runbzr('resolve --all')
1476 by Robert Collins
Merge now has a retcode of 1 when conflicts occur. (Robert Collins)
278
        self.runbzr('merge ../other', retcode=1)
1185.18.1 by Aaron Bentley
Added --show-base to merge
279
        conflict_text = file('hello').read()
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
280
        self.assert_('|||||||' not in conflict_text)
281
        self.assert_('hi world' not in conflict_text)
1185.14.9 by Aaron Bentley
Added tests for 'bzr conflicts', 'bzr resolve'
282
        result = self.runbzr('conflicts', backtick=1)
1534.10.9 by Aaron Bentley
Switched display functions to conflict_lines
283
        self.assertEquals(result, "Text conflict in hello\nText conflict in"
284
                                  " question\n")
1185.14.11 by Aaron Bentley
moved conflict listing into status and stopped monkey-patching
285
        result = self.runbzr('status', backtick=1)
1534.10.9 by Aaron Bentley
Switched display functions to conflict_lines
286
        self.assert_("conflicts:\n  Text conflict in hello\n"
287
                     "  Text conflict in question\n" in result, result)
1185.14.10 by Aaron Bentley
Commit aborts with conflicts in the tree.
288
        self.runbzr('resolve hello')
1185.14.9 by Aaron Bentley
Added tests for 'bzr conflicts', 'bzr resolve'
289
        result = self.runbzr('conflicts', backtick=1)
1534.10.9 by Aaron Bentley
Switched display functions to conflict_lines
290
        self.assertEquals(result, "Text conflict in question\n")
1185.35.21 by Aaron Bentley
Changed error status to 3
291
        self.runbzr('commit -m conflicts', retcode=3)
1185.14.10 by Aaron Bentley
Commit aborts with conflicts in the tree.
292
        self.runbzr('resolve --all')
1185.14.9 by Aaron Bentley
Added tests for 'bzr conflicts', 'bzr resolve'
293
        result = self.runbzr('conflicts', backtick=1)
1185.14.10 by Aaron Bentley
Commit aborts with conflicts in the tree.
294
        self.runbzr('commit -m conflicts')
1185.14.9 by Aaron Bentley
Added tests for 'bzr conflicts', 'bzr resolve'
295
        self.assertEquals(result, "")
1185.3.20 by Martin Pool
- run_bzr_captured also includes logged errors in
296
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
297
    def test_push(self):
298
        # create a source branch
299
        os.mkdir('my-branch')
300
        os.chdir('my-branch')
301
        self.example_branch()
302
303
        # with no push target, fail
1185.35.21 by Aaron Bentley
Changed error status to 3
304
        self.runbzr('push', retcode=3)
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
305
        # with an explicit target work
306
        self.runbzr('push ../output-branch')
307
        # with an implicit target work
308
        self.runbzr('push')
309
        # nothing missing
310
        self.runbzr('missing ../output-branch')
311
        # advance this branch
312
        self.runbzr('commit --unchanged -m unchanged')
313
314
        os.chdir('../output-branch')
1185.50.6 by John Arbash Meinel
Fixed a broken test from my 'push updates local working tree' fix
315
        # There is no longer a difference as long as we have
316
        # access to the working tree
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
317
        self.runbzr('diff')
1185.50.6 by John Arbash Meinel
Fixed a broken test from my 'push updates local working tree' fix
318
319
        # But we should be missing a revision
320
        self.runbzr('missing ../my-branch', retcode=1)
321
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
322
        # diverge the branches
323
        self.runbzr('commit --unchanged -m unchanged')
324
        os.chdir('../my-branch')
325
        # cannot push now
1185.35.21 by Aaron Bentley
Changed error status to 3
326
        self.runbzr('push', retcode=3)
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
327
        # and there are difference
328
        self.runbzr('missing ../output-branch', retcode=1)
1185.35.30 by Aaron Bentley
Fixed missing --verbose
329
        self.runbzr('missing --verbose ../output-branch', retcode=1)
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
330
        # but we can force a push
331
        self.runbzr('push --overwrite')
332
        # nothing missing
333
        self.runbzr('missing ../output-branch')
1495 by Robert Collins
Add a --create-prefix to the new push command.
334
        
335
        # pushing to a new dir with no parent should fail
1185.35.21 by Aaron Bentley
Changed error status to 3
336
        self.runbzr('push ../missing/new-branch', retcode=3)
1495 by Robert Collins
Add a --create-prefix to the new push command.
337
        # unless we provide --create-prefix
338
        self.runbzr('push --create-prefix ../missing/new-branch')
339
        # nothing missing
340
        self.runbzr('missing ../missing/new-branch')
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
341
1185.31.3 by John Arbash Meinel
Fix ExternalCommand to not run random files in the current directory, unless it is truly in BZRPATH
342
    def test_external_command(self):
1588.1.1 by Martin Pool
Supress "hello from test-command" noise from test_external_command
343
        """Test that external commands can be run by setting the path
344
        """
345
        # We don't at present run bzr in a subprocess for blackbox tests, and so 
346
        # don't really capture stdout, only the internal python stream.
347
        # Therefore we don't use a subcommand that produces any output or does
348
        # anything -- we just check that it can be run successfully.  
1185.31.3 by John Arbash Meinel
Fix ExternalCommand to not run random files in the current directory, unless it is truly in BZRPATH
349
        cmd_name = 'test-command'
350
        if sys.platform == 'win32':
351
            cmd_name += '.bat'
352
        oldpath = os.environ.get('BZRPATH', None)
353
        bzr = self.capture
354
        try:
1963.2.1 by Robey Pointer
remove usage of has_key()
355
            if 'BZRPATH' in os.environ:
1185.31.3 by John Arbash Meinel
Fix ExternalCommand to not run random files in the current directory, unless it is truly in BZRPATH
356
                del os.environ['BZRPATH']
357
358
            f = file(cmd_name, 'wb')
359
            if sys.platform == 'win32':
360
                f.write('@echo off\n')
361
            else:
362
                f.write('#!/bin/sh\n')
1588.1.1 by Martin Pool
Supress "hello from test-command" noise from test_external_command
363
            # f.write('echo Hello from test-command')
1185.31.3 by John Arbash Meinel
Fix ExternalCommand to not run random files in the current directory, unless it is truly in BZRPATH
364
            f.close()
365
            os.chmod(cmd_name, 0755)
366
367
            # It should not find the command in the local 
368
            # directory by default, since it is not in my path
1185.33.27 by Martin Pool
[merge] much integrated work from robert and john
369
            bzr(cmd_name, retcode=3)
1185.31.3 by John Arbash Meinel
Fix ExternalCommand to not run random files in the current directory, unless it is truly in BZRPATH
370
371
            # Now put it into my path
372
            os.environ['BZRPATH'] = '.'
373
374
            bzr(cmd_name)
375
376
            # Make sure empty path elements are ignored
377
            os.environ['BZRPATH'] = os.pathsep
378
1185.33.27 by Martin Pool
[merge] much integrated work from robert and john
379
            bzr(cmd_name, retcode=3)
1185.31.3 by John Arbash Meinel
Fix ExternalCommand to not run random files in the current directory, unless it is truly in BZRPATH
380
381
        finally:
382
            if oldpath:
383
                os.environ['BZRPATH'] = oldpath
384
385
1092.2.6 by Robert Collins
symlink support updated to work
386
def listdir_sorted(dir):
387
    L = os.listdir(dir)
388
    L.sort()
389
    return L
1185.3.20 by Martin Pool
- run_bzr_captured also includes logged errors in
390
1092.2.12 by Robert Collins
merge from HEAD
391
904 by Martin Pool
- more selftest external-command fixes
392
class OldTests(ExternalBase):
1092.1.39 by Robert Collins
merge from mpool
393
    """old tests moved from ./testbzr."""
394
1102 by Martin Pool
- merge test refactoring from robertc
395
    def test_bzr(self):
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
396
        from os import chdir, mkdir
397
        from os.path import exists
398
904 by Martin Pool
- more selftest external-command fixes
399
        runbzr = self.runbzr
1185.3.26 by Martin Pool
- remove remaining external executions of bzr
400
        capture = self.capture
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
401
        progress = self.log
402
403
        progress("basic branch creation")
904 by Martin Pool
- more selftest external-command fixes
404
        mkdir('branch1')
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
405
        chdir('branch1')
898 by Martin Pool
- add new runbzr method for external tests
406
        runbzr('init')
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
407
1185.3.25 by Martin Pool
- run blackbox tests in-process
408
        self.assertEquals(capture('root').rstrip(),
1185.31.32 by John Arbash Meinel
Updated the bzr sourcecode to use bzrlib.osutils.pathjoin rather than os.path.join to enforce internal use of / instead of \
409
                          pathjoin(self.test_dir, 'branch1'))
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
410
411
        progress("status of new file")
412
413
        f = file('test.txt', 'wt')
414
        f.write('hello world!\n')
415
        f.close()
416
1185.3.25 by Martin Pool
- run blackbox tests in-process
417
        self.assertEquals(capture('unknowns'), 'test.txt\n')
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
418
1185.3.25 by Martin Pool
- run blackbox tests in-process
419
        out = capture("status")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
420
        self.assertEquals(out, 'unknown:\n  test.txt\n')
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
421
422
        f = file('test2.txt', 'wt')
423
        f.write('goodbye cruel world...\n')
424
        f.close()
425
1185.3.25 by Martin Pool
- run blackbox tests in-process
426
        out = capture("status test.txt")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
427
        self.assertEquals(out, "unknown:\n  test.txt\n")
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
428
1185.3.25 by Martin Pool
- run blackbox tests in-process
429
        out = capture("status")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
430
        self.assertEquals(out, ("unknown:\n" "  test.txt\n" "  test2.txt\n"))
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
431
432
        os.unlink('test2.txt')
433
434
        progress("command aliases")
1777.1.1 by Robert Collins
(robertc)Remove --all option from status and deprecate the underlying api.
435
        out = capture("st")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
436
        self.assertEquals(out, ("unknown:\n" "  test.txt\n"))
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
437
1185.3.25 by Martin Pool
- run blackbox tests in-process
438
        out = capture("stat")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
439
        self.assertEquals(out, ("unknown:\n" "  test.txt\n"))
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
440
441
        progress("command help")
898 by Martin Pool
- add new runbzr method for external tests
442
        runbzr("help st")
443
        runbzr("help")
444
        runbzr("help commands")
1185.35.21 by Aaron Bentley
Changed error status to 3
445
        runbzr("help slartibartfast", 3)
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
446
1185.3.25 by Martin Pool
- run blackbox tests in-process
447
        out = capture("help ci")
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
448
        out.index('aliases: ')
449
450
        f = file('hello.txt', 'wt')
451
        f.write('some nice new content\n')
452
        f.close()
453
1846.1.1 by Wouter van Heyst
Don't fail on 'bzr mv', extract move tests from OldTests.
454
        runbzr("add hello.txt")
455
        
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
456
        f = file('msg.tmp', 'wt')
1185.12.25 by Aaron Bentley
Added one-line log format
457
        f.write('this is my new commit\nand it has multiple lines, for fun')
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
458
        f.close()
459
898 by Martin Pool
- add new runbzr method for external tests
460
        runbzr('commit -F msg.tmp')
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
461
1846.1.1 by Wouter van Heyst
Don't fail on 'bzr mv', extract move tests from OldTests.
462
        self.assertEquals(capture('revno'), '1\n')
463
        runbzr('export -r 1 export-1.tmp')
898 by Martin Pool
- add new runbzr method for external tests
464
        runbzr('export export.tmp')
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
465
898 by Martin Pool
- add new runbzr method for external tests
466
        runbzr('log')
467
        runbzr('log -v')
909.1.5 by Aaron Bentley
Fixed log -v (mostly)
468
        runbzr('log -v --forward')
1185.35.21 by Aaron Bentley
Changed error status to 3
469
        runbzr('log -m', retcode=3)
1185.3.25 by Martin Pool
- run blackbox tests in-process
470
        log_out = capture('log -m commit')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
471
        self.assert_("this is my new commit\n  and" in log_out)
472
        self.assert_("rename nested" not in log_out)
473
        self.assert_('revision-id' not in log_out)
474
        self.assert_('revision-id' in capture('log --show-ids -m commit'))
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
475
1185.12.25 by Aaron Bentley
Added one-line log format
476
        log_out = capture('log --line')
1692.3.5 by Robert Collins
Merge integration, fixing test failure in test_too_much due to terminal width changing.
477
        # determine the widest line we want
478
        max_width = terminal_width() - 1
1185.12.25 by Aaron Bentley
Added one-line log format
479
        for line in log_out.splitlines():
1692.3.5 by Robert Collins
Merge integration, fixing test failure in test_too_much due to terminal width changing.
480
            self.assert_(len(line) <= max_width, len(line))
1740.2.5 by Aaron Bentley
Merge from bzr.dev
481
        self.assert_("this is my new commit and" not in log_out)
482
        self.assert_("this is my new commit" in log_out)
1185.12.25 by Aaron Bentley
Added one-line log format
483
736 by Martin Pool
- move old blackbox code from testbzr into bzrlib.selftest.blackbox
484
        progress("file with spaces in name")
485
        mkdir('sub directory')
486
        file('sub directory/file with spaces ', 'wt').write('see how this works\n')
898 by Martin Pool
- add new runbzr method for external tests
487
        runbzr('add .')
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
488
        runbzr('diff', retcode=1)
898 by Martin Pool
- add new runbzr method for external tests
489
        runbzr('commit -m add-spaces')
490
        runbzr('check')
491
492
        runbzr('log')
493
        runbzr('log --forward')
494
495
        runbzr('info')
1092.1.35 by Robert Collins
merge from mpool up to rev 1110
496
1092.2.6 by Robert Collins
symlink support updated to work
497
        if has_symlinks():
498
            progress("symlinks")
499
            mkdir('symlinks')
500
            chdir('symlinks')
501
            runbzr('init')
502
            os.symlink("NOWHERE1", "link1")
503
            runbzr('add link1')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
504
            self.assertEquals(self.capture('unknowns'), '')
1092.2.6 by Robert Collins
symlink support updated to work
505
            runbzr(['commit', '-m', '1: added symlink link1'])
506
    
507
            mkdir('d1')
508
            runbzr('add d1')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
509
            self.assertEquals(self.capture('unknowns'), '')
1092.2.6 by Robert Collins
symlink support updated to work
510
            os.symlink("NOWHERE2", "d1/link2")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
511
            self.assertEquals(self.capture('unknowns'), 'd1/link2\n')
1092.2.6 by Robert Collins
symlink support updated to work
512
            # is d1/link2 found when adding d1
513
            runbzr('add d1')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
514
            self.assertEquals(self.capture('unknowns'), '')
1092.2.6 by Robert Collins
symlink support updated to work
515
            os.symlink("NOWHERE3", "d1/link3")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
516
            self.assertEquals(self.capture('unknowns'), 'd1/link3\n')
1092.2.6 by Robert Collins
symlink support updated to work
517
            runbzr(['commit', '-m', '2: added dir, symlink'])
518
    
519
            runbzr('rename d1 d2')
520
            runbzr('move d2/link2 .')
521
            runbzr('move link1 d2')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
522
            self.assertEquals(os.readlink("./link2"), "NOWHERE2")
523
            self.assertEquals(os.readlink("d2/link1"), "NOWHERE1")
1092.2.6 by Robert Collins
symlink support updated to work
524
            runbzr('add d2/link3')
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
525
            runbzr('diff', retcode=1)
1092.2.6 by Robert Collins
symlink support updated to work
526
            runbzr(['commit', '-m', '3: rename of dir, move symlinks, add link3'])
527
    
528
            os.unlink("link2")
529
            os.symlink("TARGET 2", "link2")
530
            os.unlink("d2/link1")
531
            os.symlink("TARGET 1", "d2/link1")
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
532
            runbzr('diff', retcode=1)
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
533
            self.assertEquals(self.capture("relpath d2/link1"), "d2/link1\n")
1092.2.6 by Robert Collins
symlink support updated to work
534
            runbzr(['commit', '-m', '4: retarget of two links'])
535
    
536
            runbzr('remove d2/link1')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
537
            self.assertEquals(self.capture('unknowns'), 'd2/link1\n')
1092.2.20 by Robert Collins
symlink and weaves, whaddya know
538
            runbzr(['commit', '-m', '5: remove d2/link1'])
1424 by Robert Collins
add rm alias to remove
539
            # try with the rm alias
540
            runbzr('add d2/link1')
541
            runbzr(['commit', '-m', '6: add d2/link1'])
542
            runbzr('rm d2/link1')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
543
            self.assertEquals(self.capture('unknowns'), 'd2/link1\n')
1424 by Robert Collins
add rm alias to remove
544
            runbzr(['commit', '-m', '7: remove d2/link1'])
1092.2.6 by Robert Collins
symlink support updated to work
545
    
546
            os.mkdir("d1")
547
            runbzr('add d1')
548
            runbzr('rename d2/link3 d1/link3new')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
549
            self.assertEquals(self.capture('unknowns'), 'd2/link1\n')
1424 by Robert Collins
add rm alias to remove
550
            runbzr(['commit', '-m', '8: remove d2/link1, move/rename link3'])
1092.2.6 by Robert Collins
symlink support updated to work
551
            
552
            runbzr(['check'])
553
            
554
            runbzr(['export', '-r', '1', 'exp1.tmp'])
555
            chdir("exp1.tmp")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
556
            self.assertEquals(listdir_sorted("."), [ "link1" ])
557
            self.assertEquals(os.readlink("link1"), "NOWHERE1")
1092.2.6 by Robert Collins
symlink support updated to work
558
            chdir("..")
559
            
560
            runbzr(['export', '-r', '2', 'exp2.tmp'])
561
            chdir("exp2.tmp")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
562
            self.assertEquals(listdir_sorted("."), [ "d1", "link1" ])
1092.2.6 by Robert Collins
symlink support updated to work
563
            chdir("..")
564
            
565
            runbzr(['export', '-r', '3', 'exp3.tmp'])
566
            chdir("exp3.tmp")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
567
            self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
568
            self.assertEquals(listdir_sorted("d2"), [ "link1", "link3" ])
569
            self.assertEquals(os.readlink("d2/link1"), "NOWHERE1")
570
            self.assertEquals(os.readlink("link2")   , "NOWHERE2")
1092.2.6 by Robert Collins
symlink support updated to work
571
            chdir("..")
572
            
573
            runbzr(['export', '-r', '4', 'exp4.tmp'])
574
            chdir("exp4.tmp")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
575
            self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
576
            self.assertEquals(os.readlink("d2/link1"), "TARGET 1")
577
            self.assertEquals(os.readlink("link2")   , "TARGET 2")
578
            self.assertEquals(listdir_sorted("d2"), [ "link1", "link3" ])
1092.2.6 by Robert Collins
symlink support updated to work
579
            chdir("..")
580
            
581
            runbzr(['export', '-r', '5', 'exp5.tmp'])
582
            chdir("exp5.tmp")
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
583
            self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
584
            self.assert_(os.path.islink("link2"))
585
            self.assert_(listdir_sorted("d2")== [ "link3" ])
1092.2.6 by Robert Collins
symlink support updated to work
586
            chdir("..")
587
            
1424 by Robert Collins
add rm alias to remove
588
            runbzr(['export', '-r', '8', 'exp6.tmp'])
1092.2.6 by Robert Collins
symlink support updated to work
589
            chdir("exp6.tmp")
1424 by Robert Collins
add rm alias to remove
590
            self.assertEqual(listdir_sorted("."), [ "d1", "d2", "link2"])
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
591
            self.assertEquals(listdir_sorted("d1"), [ "link3new" ])
592
            self.assertEquals(listdir_sorted("d2"), [])
593
            self.assertEquals(os.readlink("d1/link3new"), "NOWHERE3")
1092.2.6 by Robert Collins
symlink support updated to work
594
            chdir("..")
595
        else:
596
            progress("skipping symlink tests")
1400.1.1 by Robert Collins
implement a basic test for the ui branch command from http servers
597
598
1524.1.1 by Robert Collins
Test sftp with relative, absolute-in-homedir and absolute-not-in-homedir
599
class RemoteTests(object):
1400.1.1 by Robert Collins
implement a basic test for the ui branch command from http servers
600
    """Test bzr ui commands against remote branches."""
601
602
    def test_branch(self):
603
        os.mkdir('from')
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
604
        wt = self.make_branch_and_tree('from')
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
605
        branch = wt.branch
606
        wt.commit('empty commit for nonsense', allow_pointless=True)
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
607
        url = self.get_readonly_url('from')
1400.1.1 by Robert Collins
implement a basic test for the ui branch command from http servers
608
        self.run_bzr('branch', url, 'to')
609
        branch = Branch.open('to')
610
        self.assertEqual(1, len(branch.revision_history()))
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
611
        # the branch should be set in to to from
612
        self.assertEqual(url + '/', branch.get_parent())
1185.16.48 by mbp at sourcefrog
- more refactoring of and tests for option parsing
613
1442.1.64 by Robert Collins
Branch.open_containing now returns a tuple (Branch, relative-path).
614
    def test_log(self):
615
        self.build_tree(['branch/', 'branch/file'])
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
616
        self.capture('init branch')
617
        self.capture('add branch/file')
618
        self.capture('commit -m foo branch')
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
619
        url = self.get_readonly_url('branch/file')
1442.1.64 by Robert Collins
Branch.open_containing now returns a tuple (Branch, relative-path).
620
        output = self.capture('log %s' % url)
1185.35.17 by Aaron Bentley
Added branch nicks to long-format logs
621
        self.assertEqual(8, len(output.split('\n')))
1442.1.64 by Robert Collins
Branch.open_containing now returns a tuple (Branch, relative-path).
622
        
1510 by Robert Collins
Merge from mpool, adjusting check to retain HTTP support.
623
    def test_check(self):
624
        self.build_tree(['branch/', 'branch/file'])
1534.4.26 by Robert Collins
Move working tree initialisation out from Branch.initialize, deprecated Branch.initialize to Branch.create.
625
        self.capture('init branch')
626
        self.capture('add branch/file')
627
        self.capture('commit -m foo branch')
1534.4.50 by Robert Collins
Got the bzrdir api straightened out, plenty of refactoring to use it pending, but the api is up and running.
628
        url = self.get_readonly_url('branch/')
1510 by Robert Collins
Merge from mpool, adjusting check to retain HTTP support.
629
        self.run_bzr('check', url)
1524.1.1 by Robert Collins
Test sftp with relative, absolute-in-homedir and absolute-not-in-homedir
630
    
1563.1.6 by Robert Collins
Add tests for sftp push, and NonLocalTets for BzrDir.create_branch_convenience, before fixing the failure of it to work on non-local urls.
631
    def test_push(self):
632
        # create a source branch
633
        os.mkdir('my-branch')
634
        os.chdir('my-branch')
635
        self.run_bzr('init')
636
        file('hello', 'wt').write('foo')
637
        self.run_bzr('add', 'hello')
638
        self.run_bzr('commit', '-m', 'setup')
639
640
        # with an explicit target work
641
        self.run_bzr('push', self.get_url('output-branch'))
642
1524.1.1 by Robert Collins
Test sftp with relative, absolute-in-homedir and absolute-not-in-homedir
643
    
644
class HTTPTests(TestCaseWithWebserver, RemoteTests):
645
    """Test various commands against a HTTP server."""
646
    
647
    
648
class SFTPTestsAbsolute(TestCaseWithSFTPServer, RemoteTests):
649
    """Test various commands against a SFTP server using abs paths."""
650
651
    
652
class SFTPTestsAbsoluteSibling(TestCaseWithSFTPServer, RemoteTests):
653
    """Test various commands against a SFTP server using abs paths."""
654
655
    def setUp(self):
656
        super(SFTPTestsAbsoluteSibling, self).setUp()
657
        self._override_home = '/dev/noone/runs/tests/here'
658
659
    
660
class SFTPTestsRelative(TestCaseWithSFTPServer, RemoteTests):
661
    """Test various commands against a SFTP server using homedir rel paths."""
662
663
    def setUp(self):
664
        super(SFTPTestsRelative, self).setUp()
665
        self._get_remote_is_absolute = False