~bzr-pqm/bzr/bzr.dev

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