1
# Copyright (C) 2005 Canonical Ltd
1
# Copyright (C) 2005 by Canonical Ltd
2
2
# -*- coding: utf-8 -*-
4
4
# This program is free software; you can redistribute it and/or modify
5
5
# it under the terms of the GNU General Public License as published by
6
6
# the Free Software Foundation; either version 2 of the License, or
7
7
# (at your option) any later version.
9
9
# This program is distributed in the hope that it will be useful,
10
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
12
# GNU General Public License for more details.
14
14
# You should have received a copy of the GNU General Public License
15
15
# along with this program; if not, write to the Free Software
16
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
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
23
19
"""Black-box tests for bzr.
25
21
These check that it behaves properly when it's invoked through the regular
26
command-line interface. This doesn't actually run a new interpreter but
27
rather starts again from the run_bzr function.
22
command-line interface.
24
This always reinvokes bzr through a new Python interpreter, which is a
25
bit inefficient but arguably tests in a way more representative of how
26
it's normally invoked.
31
# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
32
# Note: Please don't add new tests here, it's too big and bulky. Instead add
33
# them into small suites in bzrlib.tests.blackbox.test_FOO for the particular
34
# UI command/aspect that is being tested.
37
from cStringIO import StringIO
32
from bzrlib.selftest import TestCaseInTempDir, BzrTestBase
46
33
from bzrlib.branch import Branch
47
from bzrlib.errors import BzrCommandError
48
from bzrlib.osutils import (
53
from bzrlib.tests.HTTPTestUtil import TestCaseWithWebserver
54
from bzrlib.tests.test_sftp_transport import TestCaseWithSFTPServer
55
from bzrlib.tests.blackbox import ExternalBase
56
from bzrlib.workingtree import WorkingTree
34
from bzrlib.commands import run_bzr
37
class ExternalBase(TestCaseInTempDir):
38
def runbzr(self, args, retcode=0,backtick=False):
39
if isinstance(args, basestring):
43
return self.backtick(['python', self.BZRPATH,] + args,
46
return self.runcmd(['python', self.BZRPATH,] + args,
59
50
class TestCommands(ExternalBase):
52
def test_help_commands(self):
55
self.runbzr('help commands')
56
self.runbzr('help help')
57
self.runbzr('commit -h')
59
def test_init_branch(self):
62
def test_whoami(self):
63
# this should always identify something, if only "john@localhost"
65
self.runbzr("whoami --email")
67
self.assertEquals(self.runbzr("whoami --email",
68
backtick=True).count('@'), 1)
70
def test_whoami_branch(self):
71
"""branch specific user identity works."""
73
f = file('.bzr/email', 'wt')
74
f.write('Branch Identity <branch@identi.ty>')
76
whoami = self.runbzr("whoami",backtick=True)
77
whoami_email = self.runbzr("whoami --email",backtick=True)
78
self.assertTrue(whoami.startswith('Branch Identity <branch@identi.ty>'))
79
self.assertTrue(whoami_email.startswith('branch@identi.ty'))
61
81
def test_invalid_commands(self):
62
self.runbzr("pants", retcode=3)
63
self.runbzr("--pants off", retcode=3)
64
self.runbzr("diff --message foo", retcode=3)
82
self.runbzr("pants", retcode=1)
83
self.runbzr("--pants off", retcode=1)
84
self.runbzr("diff --message foo", retcode=1)
86
def test_empty_commit(self):
88
self.build_tree(['hello.txt'])
89
self.runbzr("commit -m empty", retcode=1)
90
self.runbzr("add hello.txt")
91
self.runbzr("commit -m added")
93
def test_ignore_patterns(self):
94
from bzrlib.branch import Branch
96
b = Branch('.', init=True)
97
self.assertEquals(list(b.unknowns()), [])
99
file('foo.tmp', 'wt').write('tmp files are ignored')
100
self.assertEquals(list(b.unknowns()), [])
101
assert self.backtick('bzr unknowns') == ''
103
file('foo.c', 'wt').write('int main() {}')
104
self.assertEquals(list(b.unknowns()), ['foo.c'])
105
assert self.backtick('bzr unknowns') == 'foo.c\n'
107
self.runbzr(['add', 'foo.c'])
108
assert self.backtick('bzr unknowns') == ''
110
# 'ignore' works when creating the .bzignore file
111
file('foo.blah', 'wt').write('blah')
112
self.assertEquals(list(b.unknowns()), ['foo.blah'])
113
self.runbzr('ignore *.blah')
114
self.assertEquals(list(b.unknowns()), [])
115
assert file('.bzrignore', 'rb').read() == '*.blah\n'
117
# 'ignore' works when then .bzrignore file already exists
118
file('garh', 'wt').write('garh')
119
self.assertEquals(list(b.unknowns()), ['garh'])
120
assert self.backtick('bzr unknowns') == 'garh\n'
121
self.runbzr('ignore garh')
122
self.assertEquals(list(b.unknowns()), [])
123
assert file('.bzrignore', 'rb').read() == '*.blah\ngarh\n'
66
125
def test_revert(self):
67
126
self.runbzr('init')
137
184
test.runbzr('add goodbye')
138
185
test.runbzr('commit -m setup goodbye')
140
def test_pull_verbose(self):
141
"""Pull changes from one branch to another and watch the output."""
187
def test_revert(self):
147
188
self.example_branch()
152
open('b', 'wb').write('else\n')
154
bzr(['commit', '-m', 'added b'])
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)
160
self.failIfEqual(out.find('added b'), -1)
162
# Check that --overwrite --verbose prints out the removed entries
163
bzr('commit -m foo --unchanged')
165
bzr('commit -m baz --unchanged')
166
bzr('pull ../a', retcode=3)
167
out = bzr('pull --overwrite --verbose ../a', backtick=1)
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)
174
removed_message = out.find('message:\n baz')
175
self.failIfEqual(removed_message, -1)
176
self.failUnless(remove_loc < removed_message < added_loc)
178
added_message = out.find('message:\n foo')
179
self.failIfEqual(added_message, -1)
180
self.failUnless(added_loc < added_message)
189
file('hello', 'wt').write('bar')
190
file('goodbye', 'wt').write('qux')
191
self.runbzr('revert hello')
192
self.check_file_contents('hello', 'foo')
193
self.check_file_contents('goodbye', 'qux')
194
self.runbzr('revert')
195
self.check_file_contents('goodbye', 'baz')
197
def test_merge(self):
198
from bzrlib.branch import Branch
182
def test_locations(self):
183
"""Using and remembering different locations"""
187
self.runbzr('commit -m unchanged --unchanged')
188
self.runbzr('pull', retcode=3)
189
self.runbzr('merge', retcode=3)
190
self.runbzr('branch . ../b')
193
self.runbzr('branch . ../c')
194
self.runbzr('pull ../c')
202
self.example_branch()
204
self.runbzr('branch a b')
206
file('goodbye', 'wt').write('quux')
207
self.runbzr(['commit', '-m', "more u's are always good"])
210
file('hello', 'wt').write('quuux')
211
# We can't merge when there are in-tree changes
212
self.runbzr('merge ../b', retcode=1)
213
self.runbzr(['commit', '-m', "Like an epidemic of u's"])
214
self.runbzr('merge ../b')
215
self.check_file_contents('goodbye', 'quux')
216
# Merging a branch pulls its revision into the tree
219
a.get_revision_xml(b.last_patch())
220
self.log('pending merges: %s', a.pending_merges())
221
# assert a.pending_merges() == [b.last_patch()], "Assertion %s %s" \
222
# % (a.pending_merges(), b.last_patch())
225
"""Pull changes from one branch to another."""
229
self.example_branch()
230
self.runbzr('pull', retcode=1)
231
self.runbzr('missing', retcode=1)
232
self.runbzr('missing .')
233
self.runbzr('missing')
235
self.runbzr('pull /', retcode=1)
239
self.runbzr('branch a b')
242
self.runbzr('commit -m blah --unchanged')
246
assert a.revision_history() == b.revision_history()[:-1]
197
247
self.runbzr('pull ../b')
199
self.runbzr('pull ../c')
200
self.runbzr('branch ../c ../d')
201
osutils.rmtree('../c')
206
self.runbzr('pull', retcode=3)
207
self.runbzr('pull ../a --remember')
210
def test_unknown_command(self):
211
"""Handling of unknown command."""
212
out, err = self.run_bzr_captured(['fluffy-badger'],
214
self.assertEquals(out, '')
215
err.index('unknown command')
217
def create_conflicts(self):
218
"""Create a conflicted tree"""
221
file('hello', 'wb').write("hi world")
222
file('answer', 'wb').write("42")
225
self.runbzr('commit -m base')
226
self.runbzr('branch . ../other')
227
self.runbzr('branch . ../this')
229
file('hello', 'wb').write("Hello.")
230
file('answer', 'wb').write("Is anyone there?")
231
self.runbzr('commit -m other')
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"
237
self.runbzr('commit -m this')
239
def test_status(self):
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')
255
def test_conflicts(self):
256
"""Handling of merge conflicts"""
257
self.create_conflicts()
258
self.runbzr('merge ../other --show-base', retcode=1)
259
conflict_text = file('hello').read()
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)
265
self.runbzr('revert')
266
self.runbzr('resolve --all')
267
self.runbzr('merge ../other', retcode=1)
268
conflict_text = file('hello').read()
269
self.assert_('|||||||' not in conflict_text)
270
self.assert_('hi world' not in conflict_text)
271
result = self.runbzr('conflicts', backtick=1)
272
self.assertEquals(result, "Text conflict in hello\nText conflict in"
274
result = self.runbzr('status', backtick=1)
275
self.assert_("conflicts:\n Text conflict in hello\n"
276
" Text conflict in question\n" in result, result)
277
self.runbzr('resolve hello')
278
result = self.runbzr('conflicts', backtick=1)
279
self.assertEquals(result, "Text conflict in question\n")
280
self.runbzr('commit -m conflicts', retcode=3)
281
self.runbzr('resolve --all')
282
result = self.runbzr('conflicts', backtick=1)
283
self.runbzr('commit -m conflicts')
284
self.assertEquals(result, "")
287
# create a source branch
288
os.mkdir('my-branch')
289
os.chdir('my-branch')
290
self.example_branch()
292
# with no push target, fail
293
self.runbzr('push', retcode=3)
294
# with an explicit target work
295
self.runbzr('push ../output-branch')
296
# with an implicit target work
299
self.runbzr('missing ../output-branch')
300
# advance this branch
301
self.runbzr('commit --unchanged -m unchanged')
303
os.chdir('../output-branch')
304
# There is no longer a difference as long as we have
305
# access to the working tree
308
# But we should be missing a revision
309
self.runbzr('missing ../my-branch', retcode=1)
311
# diverge the branches
312
self.runbzr('commit --unchanged -m unchanged')
313
os.chdir('../my-branch')
315
self.runbzr('push', retcode=3)
316
# and there are difference
317
self.runbzr('missing ../output-branch', retcode=1)
318
self.runbzr('missing --verbose ../output-branch', retcode=1)
319
# but we can force a push
320
self.runbzr('push --overwrite')
322
self.runbzr('missing ../output-branch')
324
# pushing to a new dir with no parent should fail
325
self.runbzr('push ../missing/new-branch', retcode=3)
326
# unless we provide --create-prefix
327
self.runbzr('push --create-prefix ../missing/new-branch')
329
self.runbzr('missing ../missing/new-branch')
331
def test_external_command(self):
332
"""Test that external commands can be run by setting the path
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.
338
cmd_name = 'test-command'
339
if sys.platform == 'win32':
341
oldpath = os.environ.get('BZRPATH', None)
344
if 'BZRPATH' in os.environ:
345
del os.environ['BZRPATH']
347
f = file(cmd_name, 'wb')
348
if sys.platform == 'win32':
349
f.write('@echo off\n')
351
f.write('#!/bin/sh\n')
352
# f.write('echo Hello from test-command')
354
os.chmod(cmd_name, 0755)
356
# It should not find the command in the local
357
# directory by default, since it is not in my path
358
bzr(cmd_name, retcode=3)
360
# Now put it into my path
361
os.environ['BZRPATH'] = '.'
365
# Make sure empty path elements are ignored
366
os.environ['BZRPATH'] = os.pathsep
368
bzr(cmd_name, retcode=3)
372
os.environ['BZRPATH'] = oldpath
375
def listdir_sorted(dir):
248
assert a.revision_history() == b.revision_history()
249
self.runbzr('commit -m blah2 --unchanged')
251
self.runbzr('commit -m blah3 --unchanged')
252
self.runbzr('pull ../a', retcode=1)
254
self.runbzr('merge ../b')
255
self.runbzr('commit -m blah4 --unchanged')
257
self.runbzr('pull ../a')
258
assert a.revision_history()[-1] == b.revision_history()[-1]
261
def test_add_reports(self):
262
"""add command prints the names of added files."""
263
b = Branch('.', init=True)
264
self.build_tree(['top.txt', 'dir/', 'dir/sub.txt'])
266
from cStringIO import StringIO
269
ret = self.apply_redirected(None, out, None,
272
self.assertEquals(ret, 0)
274
# the ordering is not defined at the moment
275
results = sorted(out.getvalue().rstrip('\n').split('\n'))
276
self.assertEquals(['added dir',
381
282
class OldTests(ExternalBase):
403
304
f.write('hello world!\n')
406
self.assertEquals(capture('unknowns'), 'test.txt\n')
408
out = capture("status")
409
self.assertEquals(out, 'unknown:\n test.txt\n')
307
out = backtick("bzr unknowns")
308
self.assertEquals(out, 'test.txt\n')
310
out = backtick("bzr status")
311
assert out == 'unknown:\n test.txt\n'
313
out = backtick("bzr status --all")
314
assert out == "unknown:\n test.txt\n"
316
out = backtick("bzr status test.txt --all")
317
assert out == "unknown:\n test.txt\n"
411
319
f = file('test2.txt', 'wt')
412
320
f.write('goodbye cruel world...\n')
415
out = capture("status test.txt")
416
self.assertEquals(out, "unknown:\n test.txt\n")
323
out = backtick("bzr status test.txt")
324
assert out == "unknown:\n test.txt\n"
418
out = capture("status")
419
self.assertEquals(out, ("unknown:\n" " test.txt\n" " test2.txt\n"))
326
out = backtick("bzr status")
327
assert out == ("unknown:\n"
421
331
os.unlink('test2.txt')
423
333
progress("command aliases")
425
self.assertEquals(out, ("unknown:\n" " test.txt\n"))
334
out = backtick("bzr st --all")
335
assert out == ("unknown:\n"
427
out = capture("stat")
428
self.assertEquals(out, ("unknown:\n" " test.txt\n"))
338
out = backtick("bzr stat")
339
assert out == ("unknown:\n"
430
342
progress("command help")
431
343
runbzr("help st")
433
345
runbzr("help commands")
434
runbzr("help slartibartfast", 3)
436
out = capture("help ci")
437
out.index('aliases: ci, checkin\n')
346
runbzr("help slartibartfast", 1)
348
out = backtick("bzr help ci")
349
out.index('aliases: ')
351
progress("can't rename unversioned file")
352
runbzr("rename test.txt new-test.txt", 1)
354
progress("adding a file")
356
runbzr("add test.txt")
357
assert backtick("bzr unknowns") == ''
358
assert backtick("bzr status --all") == ("added:\n"
361
progress("rename newly-added file")
362
runbzr("rename test.txt hello.txt")
363
assert os.path.exists("hello.txt")
364
assert not os.path.exists("test.txt")
366
assert backtick("bzr revno") == '0\n'
368
progress("add first revision")
369
runbzr(['commit', '-m', 'add first revision'])
371
progress("more complex renames")
373
runbzr("rename hello.txt sub1", 1)
374
runbzr("rename hello.txt sub1/hello.txt", 1)
375
runbzr("move hello.txt sub1", 1)
378
runbzr("rename sub1 sub2")
379
runbzr("move hello.txt sub2")
380
assert backtick("bzr relpath sub2/hello.txt") == os.path.join("sub2", "hello.txt\n")
382
assert exists("sub2")
383
assert exists("sub2/hello.txt")
384
assert not exists("sub1")
385
assert not exists("hello.txt")
387
runbzr(['commit', '-m', 'commit with some things moved to subdirs'])
391
runbzr('move sub2/hello.txt sub1')
392
assert not exists('sub2/hello.txt')
393
assert exists('sub1/hello.txt')
394
runbzr('move sub2 sub1')
395
assert not exists('sub2')
396
assert exists('sub1/sub2')
398
runbzr(['commit', '-m', 'rename nested subdirectories'])
401
self.assertEquals(backtick('bzr root')[:-1],
402
os.path.join(self.test_dir, 'branch1'))
403
runbzr('move ../hello.txt .')
404
assert exists('./hello.txt')
405
assert backtick('bzr relpath hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
406
assert backtick('bzr relpath ../../sub1/sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
407
runbzr(['commit', '-m', 'move to parent directory'])
409
assert backtick('bzr relpath sub2/hello.txt') == os.path.join('sub1', 'sub2', 'hello.txt\n')
411
runbzr('move sub2/hello.txt .')
412
assert exists('hello.txt')
439
414
f = file('hello.txt', 'wt')
440
415
f.write('some nice new content\n')
443
runbzr("add hello.txt")
445
418
f = file('msg.tmp', 'wt')
446
f.write('this is my new commit\nand it has multiple lines, for fun')
419
f.write('this is my new commit\n')
449
422
runbzr('commit -F msg.tmp')
451
self.assertEquals(capture('revno'), '1\n')
452
runbzr('export -r 1 export-1.tmp')
424
assert backtick('bzr revno') == '5\n'
425
runbzr('export -r 5 export-5.tmp')
453
426
runbzr('export export.tmp')
457
430
runbzr('log -v --forward')
458
runbzr('log -m', retcode=3)
459
log_out = capture('log -m commit')
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'))
431
runbzr('log -m', retcode=1)
432
log_out = backtick('bzr log -m commit')
433
assert "this is my new commit" in log_out
434
assert "rename nested" not in log_out
435
assert 'revision-id' not in log_out
436
assert 'revision-id' in backtick('bzr log --show-ids -m commit')
465
log_out = capture('log --line')
466
# determine the widest line we want
467
max_width = terminal_width() - 1
468
for line in log_out.splitlines():
469
self.assert_(len(line) <= max_width, len(line))
470
self.assert_("this is my new commit and" not in log_out)
471
self.assert_("this is my new commit" in log_out)
473
439
progress("file with spaces in name")
474
440
mkdir('sub directory')
475
441
file('sub directory/file with spaces ', 'wt').write('see how this works\n')
477
runbzr('diff', retcode=1)
478
444
runbzr('commit -m add-spaces')
491
os.symlink("NOWHERE1", "link1")
493
self.assertEquals(self.capture('unknowns'), '')
494
runbzr(['commit', '-m', '1: added symlink link1'])
498
self.assertEquals(self.capture('unknowns'), '')
499
os.symlink("NOWHERE2", "d1/link2")
500
self.assertEquals(self.capture('unknowns'), 'd1/link2\n')
501
# is d1/link2 found when adding d1
503
self.assertEquals(self.capture('unknowns'), '')
504
os.symlink("NOWHERE3", "d1/link3")
505
self.assertEquals(self.capture('unknowns'), 'd1/link3\n')
506
runbzr(['commit', '-m', '2: added dir, symlink'])
508
runbzr('rename d1 d2')
509
runbzr('move d2/link2 .')
510
runbzr('move link1 d2')
511
self.assertEquals(os.readlink("./link2"), "NOWHERE2")
512
self.assertEquals(os.readlink("d2/link1"), "NOWHERE1")
513
runbzr('add d2/link3')
514
runbzr('diff', retcode=1)
515
runbzr(['commit', '-m', '3: rename of dir, move symlinks, add link3'])
518
os.symlink("TARGET 2", "link2")
519
os.unlink("d2/link1")
520
os.symlink("TARGET 1", "d2/link1")
521
runbzr('diff', retcode=1)
522
self.assertEquals(self.capture("relpath d2/link1"), "d2/link1\n")
523
runbzr(['commit', '-m', '4: retarget of two links'])
525
runbzr('remove --keep d2/link1')
526
self.assertEquals(self.capture('unknowns'), 'd2/link1\n')
527
runbzr(['commit', '-m', '5: remove d2/link1'])
528
# try with the rm alias
529
runbzr('add d2/link1')
530
runbzr(['commit', '-m', '6: add d2/link1'])
531
runbzr('rm --keep d2/link1')
532
self.assertEquals(self.capture('unknowns'), 'd2/link1\n')
533
runbzr(['commit', '-m', '7: remove d2/link1'])
537
runbzr('rename d2/link3 d1/link3new')
538
self.assertEquals(self.capture('unknowns'), 'd2/link1\n')
539
runbzr(['commit', '-m', '8: remove d2/link1, move/rename link3'])
543
runbzr(['export', '-r', '1', 'exp1.tmp'])
545
self.assertEquals(listdir_sorted("."), [ "link1" ])
546
self.assertEquals(os.readlink("link1"), "NOWHERE1")
549
runbzr(['export', '-r', '2', 'exp2.tmp'])
551
self.assertEquals(listdir_sorted("."), [ "d1", "link1" ])
554
runbzr(['export', '-r', '3', 'exp3.tmp'])
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")
562
runbzr(['export', '-r', '4', 'exp4.tmp'])
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" ])
570
runbzr(['export', '-r', '5', 'exp5.tmp'])
572
self.assertEquals(listdir_sorted("."), [ "d2", "link2" ])
573
self.assert_(os.path.islink("link2"))
574
self.assert_(listdir_sorted("d2")== [ "link3" ])
577
runbzr(['export', '-r', '8', 'exp6.tmp'])
579
self.assertEqual(listdir_sorted("."), [ "d1", "d2", "link2"])
580
self.assertEquals(listdir_sorted("d1"), [ "link3new" ])
581
self.assertEquals(listdir_sorted("d2"), [])
582
self.assertEquals(os.readlink("d1/link3new"), "NOWHERE3")
585
progress("skipping symlink tests")
588
class RemoteTests(object):
589
"""Test bzr ui commands against remote branches."""
591
def test_branch(self):
593
wt = self.make_branch_and_tree('from')
595
wt.commit('empty commit for nonsense', allow_pointless=True)
596
url = self.get_readonly_url('from')
597
self.run_bzr('branch', url, 'to')
598
branch = Branch.open('to')
599
self.assertEqual(1, len(branch.revision_history()))
600
# the branch should be set in to to from
601
self.assertEqual(url + '/', branch.get_parent())
604
self.build_tree(['branch/', 'branch/file'])
605
self.capture('init branch')
606
self.capture('add branch/file')
607
self.capture('commit -m foo branch')
608
url = self.get_readonly_url('branch/file')
609
output = self.capture('log %s' % url)
610
self.assertEqual(8, len(output.split('\n')))
612
def test_check(self):
613
self.build_tree(['branch/', 'branch/file'])
614
self.capture('init branch')
615
self.capture('add branch/file')
616
self.capture('commit -m foo branch')
617
url = self.get_readonly_url('branch/')
618
self.run_bzr('check', url)
621
# create a source branch
622
os.mkdir('my-branch')
623
os.chdir('my-branch')
625
file('hello', 'wt').write('foo')
626
self.run_bzr('add', 'hello')
627
self.run_bzr('commit', '-m', 'setup')
629
# with an explicit target work
630
self.run_bzr('push', self.get_url('output-branch'))
633
class HTTPTests(TestCaseWithWebserver, RemoteTests):
634
"""Test various commands against a HTTP server."""
637
class SFTPTestsAbsolute(TestCaseWithSFTPServer, RemoteTests):
638
"""Test various commands against a SFTP server using abs paths."""
641
class SFTPTestsAbsoluteSibling(TestCaseWithSFTPServer, RemoteTests):
642
"""Test various commands against a SFTP server using abs paths."""
645
super(SFTPTestsAbsoluteSibling, self).setUp()
646
self._override_home = '/dev/noone/runs/tests/here'
649
class SFTPTestsRelative(TestCaseWithSFTPServer, RemoteTests):
650
"""Test various commands against a SFTP server using homedir rel paths."""
653
super(SFTPTestsRelative, self).setUp()
654
self._get_remote_is_absolute = False