/brz/remove-bazaar

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