~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/blackbox/test_push.py

  • Committer: Vincent Ladeuil
  • Date: 2009-05-05 15:31:34 UTC
  • mto: (4343.1.1 integration)
  • mto: This revision was merged to the branch mainline in revision 4344.
  • Revision ID: v.ladeuil+lp@free.fr-20090505153134-q4bp4is9gywsmzrv
Clean up test for log formats.

* bzrlib/tests/blackbox/test_logformats.py:
Update tests to actual style.

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
 
18
18
"""Black-box tests for bzr push."""
19
19
 
 
20
import os
20
21
import re
21
22
 
22
23
from bzrlib import (
23
 
    branch,
24
 
    bzrdir,
25
24
    errors,
26
 
    osutils,
27
 
    tests,
28
25
    transport,
29
 
    uncommit,
30
26
    urlutils,
31
 
    workingtree
32
27
    )
33
 
from bzrlib.repofmt import knitrepo
34
 
from bzrlib.tests import http_server
35
 
from bzrlib.transport import memory
36
 
 
37
 
 
38
 
def load_tests(standard_tests, module, loader):
39
 
    """Multiply tests for the push command."""
40
 
    result = loader.suiteClass()
41
 
 
42
 
    # one for each king of change
43
 
    changes_tests, remaining_tests = tests.split_suite_by_condition(
44
 
        standard_tests, tests.condition_isinstance((
45
 
                TestPushStrictWithChanges,
46
 
                )))
47
 
    changes_scenarios = [
48
 
        ('uncommitted',
49
 
         dict(_changes_type= '_uncommitted_changes')),
50
 
        ('pending-merges',
51
 
         dict(_changes_type= '_pending_merges')),
52
 
        ('out-of-sync-trees',
53
 
         dict(_changes_type= '_out_of_sync_trees')),
54
 
        ]
55
 
    tests.multiply_tests(changes_tests, changes_scenarios, result)
56
 
    # No parametrization for the remaining tests
57
 
    result.addTests(remaining_tests)
58
 
 
59
 
    return result
60
 
 
61
 
 
62
 
class TestPush(tests.TestCaseWithTransport):
 
28
from bzrlib.branch import Branch
 
29
from bzrlib.bzrdir import BzrDirMetaFormat1
 
30
from bzrlib.osutils import abspath
 
31
from bzrlib.repofmt.knitrepo import RepositoryFormatKnit1
 
32
from bzrlib.smart import client, server
 
33
from bzrlib.tests.blackbox import ExternalBase
 
34
from bzrlib.tests.http_server import HttpServer
 
35
from bzrlib.transport.memory import MemoryServer, MemoryTransport
 
36
from bzrlib.uncommit import uncommit
 
37
from bzrlib.urlutils import local_path_from_url
 
38
from bzrlib.workingtree import WorkingTree
 
39
 
 
40
 
 
41
class TestPush(ExternalBase):
63
42
 
64
43
    def test_push_error_on_vfs_http(self):
65
44
        """ pushing a branch to a HTTP server fails cleanly. """
66
45
        # the trunk is published on a web server
67
 
        self.transport_readonly_server = http_server.HttpServer
 
46
        self.transport_readonly_server = HttpServer
68
47
        self.make_branch('source')
69
48
        public_url = self.get_readonly_url('target')
70
49
        self.run_bzr_error(['http does not support mkdir'],
93
72
        self.assertEqual(None, branch_b.get_push_location())
94
73
 
95
74
        # test push for failure without push location set
96
 
        out = self.run_bzr('push', working_dir='branch_a', retcode=3)
 
75
        os.chdir('branch_a')
 
76
        out = self.run_bzr('push', retcode=3)
97
77
        self.assertEquals(out,
98
78
                ('','bzr: ERROR: No push location known or specified.\n'))
99
79
 
100
80
        # test not remembered if cannot actually push
101
 
        self.run_bzr('push path/which/doesnt/exist',
102
 
                     working_dir='branch_a', retcode=3)
103
 
        out = self.run_bzr('push', working_dir='branch_a', retcode=3)
 
81
        self.run_bzr('push ../path/which/doesnt/exist', retcode=3)
 
82
        out = self.run_bzr('push', retcode=3)
104
83
        self.assertEquals(
105
84
                ('', 'bzr: ERROR: No push location known or specified.\n'),
106
85
                out)
107
86
 
108
87
        # test implicit --remember when no push location set, push fails
109
 
        out = self.run_bzr('push ../branch_b',
110
 
                           working_dir='branch_a', retcode=3)
 
88
        out = self.run_bzr('push ../branch_b', retcode=3)
111
89
        self.assertEquals(out,
112
90
                ('','bzr: ERROR: These branches have diverged.  '
113
 
                 'See "bzr help diverged-branches" for more information.\n'))
114
 
        self.assertEquals(osutils.abspath(branch_a.get_push_location()),
115
 
                          osutils.abspath(branch_b.bzrdir.root_transport.base))
 
91
                    'Try using "merge" and then "push".\n'))
 
92
        self.assertEquals(abspath(branch_a.get_push_location()),
 
93
                          abspath(branch_b.bzrdir.root_transport.base))
116
94
 
117
95
        # test implicit --remember after resolving previous failure
118
 
        uncommit.uncommit(branch=branch_b, tree=tree_b)
 
96
        uncommit(branch=branch_b, tree=tree_b)
119
97
        transport.delete('branch_b/c')
120
 
        out, err = self.run_bzr('push', working_dir='branch_a')
 
98
        out, err = self.run_bzr('push')
121
99
        path = branch_a.get_push_location()
122
100
        self.assertEquals(out,
123
101
                          'Using saved push location: %s\n'
124
 
                          % urlutils.local_path_from_url(path))
 
102
                          % local_path_from_url(path))
125
103
        self.assertEqual(err,
126
104
                         'All changes applied successfully.\n'
127
105
                         'Pushed up to revision 2.\n')
128
106
        self.assertEqual(path,
129
107
                         branch_b.bzrdir.root_transport.base)
130
108
        # test explicit --remember
131
 
        self.run_bzr('push ../branch_c --remember', working_dir='branch_a')
 
109
        self.run_bzr('push ../branch_c --remember')
132
110
        self.assertEquals(branch_a.get_push_location(),
133
111
                          branch_c.bzrdir.root_transport.base)
134
112
 
138
116
        out, err = self.run_bzr('push pushed-location')
139
117
        self.assertEqual('', out)
140
118
        self.assertEqual('Created new branch.\n', err)
141
 
        b2 = branch.Branch.open('pushed-location')
 
119
        b2 = Branch.open('pushed-location')
142
120
        self.assertEndsWith(b2.base, 'pushed-location/')
143
121
 
144
122
    def test_push_new_branch_revision_count(self):
149
127
        self.build_tree(['tree/file'])
150
128
        t.add('file')
151
129
        t.commit('commit 1')
152
 
        out, err = self.run_bzr('push -d tree pushed-to')
 
130
        os.chdir('tree')
 
131
        out, err = self.run_bzr('push pushed-to')
 
132
        os.chdir('..')
153
133
        self.assertEqual('', out)
154
134
        self.assertEqual('Created new branch.\n', err)
155
135
 
156
136
    def test_push_only_pushes_history(self):
157
137
        # Knit branches should only push the history for the current revision.
158
 
        format = bzrdir.BzrDirMetaFormat1()
159
 
        format.repository_format = knitrepo.RepositoryFormatKnit1()
 
138
        format = BzrDirMetaFormat1()
 
139
        format.repository_format = RepositoryFormatKnit1()
160
140
        shared_repo = self.make_repository('repo', format=format, shared=True)
161
141
        shared_repo.set_make_working_trees(True)
162
142
 
163
143
        def make_shared_tree(path):
164
144
            shared_repo.bzrdir.root_transport.mkdir(path)
165
145
            shared_repo.bzrdir.create_branch_convenience('repo/' + path)
166
 
            return workingtree.WorkingTree.open('repo/' + path)
 
146
            return WorkingTree.open('repo/' + path)
167
147
        tree_a = make_shared_tree('a')
168
148
        self.build_tree(['repo/a/file'])
169
149
        tree_a.add('file')
184
164
 
185
165
        # Now that we have a repository with shared files, make sure
186
166
        # that things aren't copied out by a 'push'
187
 
        self.run_bzr('push ../../push-b', working_dir='repo/b')
188
 
        pushed_tree = workingtree.WorkingTree.open('push-b')
 
167
        os.chdir('repo/b')
 
168
        self.run_bzr('push ../../push-b')
 
169
        pushed_tree = WorkingTree.open('../../push-b')
189
170
        pushed_repo = pushed_tree.branch.repository
190
171
        self.assertFalse(pushed_repo.has_revision('a-1'))
191
172
        self.assertFalse(pushed_repo.has_revision('a-2'))
193
174
 
194
175
    def test_push_funky_id(self):
195
176
        t = self.make_branch_and_tree('tree')
196
 
        self.build_tree(['tree/filename'])
 
177
        os.chdir('tree')
 
178
        self.build_tree(['filename'])
197
179
        t.add('filename', 'funky-chars<>%&;"\'')
198
180
        t.commit('commit filename')
199
 
        self.run_bzr('push -d tree new-tree')
 
181
        self.run_bzr('push ../new-tree')
200
182
 
201
183
    def test_push_dash_d(self):
202
184
        t = self.make_branch_and_tree('from')
236
218
        # become necessary for this use case. Please do not adjust this number
237
219
        # upwards without agreement from bzr's network support maintainers.
238
220
        self.assertLength(14, self.hpss_calls)
239
 
        remote = branch.Branch.open('public')
 
221
        remote = Branch.open('public')
240
222
        self.assertEndsWith(remote.get_stacked_on_url(), '/parent')
241
223
 
242
 
    def test_push_smart_tags_streaming_acceptance(self):
243
 
        self.setup_smart_server_with_call_log()
244
 
        t = self.make_branch_and_tree('from')
245
 
        rev_id = t.commit(allow_pointless=True, message='first commit')
246
 
        t.branch.tags.set_tag('new-tag', rev_id)
247
 
        self.reset_smart_call_log()
248
 
        self.run_bzr(['push', self.get_url('to-one')], working_dir='from')
249
 
        # This figure represent the amount of work to perform this use case. It
250
 
        # is entirely ok to reduce this number if a test fails due to rpc_count
251
 
        # being too low. If rpc_count increases, more network roundtrips have
252
 
        # become necessary for this use case. Please do not adjust this number
253
 
        # upwards without agreement from bzr's network support maintainers.
254
 
        self.assertLength(11, self.hpss_calls)
255
 
 
256
 
    def test_push_smart_with_default_stacking_url_path_segment(self):
257
 
        # If the default stacked-on location is a path element then branches
258
 
        # we push there over the smart server are stacked and their
259
 
        # stacked_on_url is that exact path segment. Added to nail bug 385132.
260
 
        self.setup_smart_server_with_call_log()
261
 
        self.make_branch('stack-on', format='1.9')
262
 
        self.make_bzrdir('.').get_config().set_default_stack_on(
263
 
            '/stack-on')
264
 
        self.make_branch('from', format='1.9')
265
 
        out, err = self.run_bzr(['push', '-d', 'from', self.get_url('to')])
266
 
        b = branch.Branch.open(self.get_url('to'))
267
 
        self.assertEqual('/extra/stack-on', b.get_stacked_on_url())
268
 
 
269
 
    def test_push_smart_with_default_stacking_relative_path(self):
270
 
        # If the default stacked-on location is a relative path then branches
271
 
        # we push there over the smart server are stacked and their
272
 
        # stacked_on_url is a relative path. Added to nail bug 385132.
273
 
        self.setup_smart_server_with_call_log()
274
 
        self.make_branch('stack-on', format='1.9')
275
 
        self.make_bzrdir('.').get_config().set_default_stack_on('stack-on')
276
 
        self.make_branch('from', format='1.9')
277
 
        out, err = self.run_bzr(['push', '-d', 'from', self.get_url('to')])
278
 
        b = branch.Branch.open(self.get_url('to'))
279
 
        self.assertEqual('../stack-on', b.get_stacked_on_url())
280
 
 
281
224
    def create_simple_tree(self):
282
225
        tree = self.make_branch_and_tree('tree')
283
226
        self.build_tree(['tree/a'])
294
237
                           working_dir='tree')
295
238
        self.run_bzr('push ../new/tree --create-prefix',
296
239
                     working_dir='tree')
297
 
        new_tree = workingtree.WorkingTree.open('new/tree')
 
240
        new_tree = WorkingTree.open('new/tree')
298
241
        self.assertEqual(tree.last_revision(), new_tree.last_revision())
299
242
        self.failUnlessExists('new/tree/a')
300
243
 
314
257
        self.run_bzr('push --use-existing-dir ../target',
315
258
                     working_dir='tree')
316
259
 
317
 
        new_tree = workingtree.WorkingTree.open('target')
 
260
        new_tree = WorkingTree.open('target')
318
261
        self.assertEqual(tree.last_revision(), new_tree.last_revision())
319
262
        # The push should have created target/a
320
263
        self.failUnlessExists('target/a')
330
273
        # Pushing onto an existing bzrdir will create a repository and
331
274
        # branch as needed, but will only create a working tree if there was
332
275
        # no BzrDir before.
333
 
        self.assertRaises(errors.NoWorkingTree,
334
 
                          workingtree.WorkingTree.open, 'repo')
335
 
        new_branch = branch.Branch.open('repo')
 
276
        self.assertRaises(errors.NoWorkingTree, WorkingTree.open, 'repo')
 
277
        new_branch = Branch.open('repo')
336
278
        self.assertEqual(tree.last_revision(), new_branch.last_revision())
337
279
 
338
280
    def test_push_onto_just_bzrdir(self):
357
299
 
358
300
        self.run_bzr('push -r1 ../to', working_dir='from')
359
301
 
360
 
        tree_to = workingtree.WorkingTree.open('to')
 
302
        tree_to = WorkingTree.open('to')
361
303
        repo_to = tree_to.branch.repository
362
304
        self.assertTrue(repo_to.has_revision('from-1'))
363
305
        self.assertFalse(repo_to.has_revision('from-2'))
364
306
        self.assertEqual(tree_to.branch.last_revision_info()[1], 'from-1')
365
307
 
366
308
        self.run_bzr_error(
367
 
            ['bzr: ERROR: bzr push --revision '
368
 
             'takes exactly one revision identifier\n'],
 
309
            "bzr: ERROR: bzr push --revision takes one value.\n",
369
310
            'push -r0..2 ../to', working_dir='from')
370
311
 
371
312
    def create_trunk_and_feature_branch(self):
384
325
 
385
326
    def assertPublished(self, branch_revid, stacked_on):
386
327
        """Assert that the branch 'published' has been published correctly."""
387
 
        published_branch = branch.Branch.open('published')
 
328
        published_branch = Branch.open('published')
388
329
        # The published branch refers to the mainline
389
330
        self.assertEqual(stacked_on, published_branch.get_stacked_on_url())
390
331
        # and the branch's work was pushed
412
353
        self.assertEqual('', out)
413
354
        self.assertEqual('Created new stacked branch referring to %s.\n' %
414
355
            trunk_tree.branch.base, err)
415
 
        self.assertPublished(branch_tree.last_revision(),
416
 
                             trunk_tree.branch.base)
 
356
        self.assertPublished(branch_tree.last_revision(), trunk_tree.branch.base)
417
357
 
418
358
    def test_push_new_branch_stacked_uses_parent_public(self):
419
359
        """Pushing a new branch with --stacked creates a stacked branch."""
420
360
        trunk_tree, branch_tree = self.create_trunk_and_feature_branch()
421
361
        # the trunk is published on a web server
422
 
        self.transport_readonly_server = http_server.HttpServer
 
362
        self.transport_readonly_server = HttpServer
423
363
        trunk_public = self.make_branch('public_trunk', format='1.9')
424
364
        trunk_public.pull(trunk_tree.branch)
425
365
        trunk_public_url = self.get_readonly_url('public_trunk')
457
397
        self.make_bzrdir('.').get_config().set_default_stack_on('stack_on')
458
398
        self.make_branch('from', format='pack-0.92')
459
399
        out, err = self.run_bzr('push -d from to')
460
 
        b = branch.Branch.open('to')
461
 
        self.assertEqual('../stack_on', b.get_stacked_on_url())
 
400
        branch = Branch.open('to')
 
401
        self.assertEqual('../stack_on', branch.get_stacked_on_url())
462
402
 
463
403
    def test_push_does_not_change_format_with_default_if_target_cannot(self):
464
404
        self.make_branch('stack_on', format='pack-0.92')
465
405
        self.make_bzrdir('.').get_config().set_default_stack_on('stack_on')
466
406
        self.make_branch('from', format='pack-0.92')
467
407
        out, err = self.run_bzr('push -d from to')
468
 
        b = branch.Branch.open('to')
469
 
        self.assertRaises(errors.UnstackableBranchFormat, b.get_stacked_on_url)
 
408
        branch = Branch.open('to')
 
409
        self.assertRaises(errors.UnstackableBranchFormat,
 
410
            branch.get_stacked_on_url)
470
411
 
471
412
    def test_push_doesnt_create_broken_branch(self):
472
413
        """Pushing a new standalone branch works even when there's a default
513
454
        # subsequent log is accurate
514
455
        self.assertNotContainsRe(out, 'rev1')
515
456
 
516
 
    def test_push_from_subdir(self):
517
 
        t = self.make_branch_and_tree('tree')
518
 
        self.build_tree(['tree/dir/', 'tree/dir/file'])
519
 
        t.add('dir', 'dir/file')
520
 
        t.commit('r1')
521
 
        out, err = self.run_bzr('push ../../pushloc', working_dir='tree/dir')
522
 
        self.assertEqual('', out)
523
 
        self.assertEqual('Created new branch.\n', err)
524
 
 
525
 
 
526
 
class RedirectingMemoryTransport(memory.MemoryTransport):
 
457
 
 
458
class RedirectingMemoryTransport(MemoryTransport):
527
459
 
528
460
    def mkdir(self, relpath, mode=None):
 
461
        from bzrlib.trace import mutter
 
462
        mutter('cwd: %r, rel: %r, abs: %r' % (self._cwd, relpath, abspath))
529
463
        if self._cwd == '/source/':
530
464
            raise errors.RedirectRequested(self.abspath(relpath),
531
465
                                           self.abspath('../target'),
538
472
            return super(RedirectingMemoryTransport, self).mkdir(
539
473
                relpath, mode)
540
474
 
541
 
    def get(self, relpath):
542
 
        if self.clone(relpath)._cwd == '/infinite-loop/':
543
 
            raise errors.RedirectRequested(self.abspath(relpath),
544
 
                                           self.abspath('../infinite-loop'),
545
 
                                           is_permanent=True)
546
 
        else:
547
 
            return super(RedirectingMemoryTransport, self).get(relpath)
548
 
 
549
475
    def _redirected_to(self, source, target):
550
476
        # We do accept redirections
551
477
        return transport.get_transport(target)
552
478
 
553
479
 
554
 
class RedirectingMemoryServer(memory.MemoryServer):
 
480
class RedirectingMemoryServer(MemoryServer):
555
481
 
556
482
    def setUp(self):
557
483
        self._dirs = {'/': None}
571
497
        transport.unregister_transport(self._scheme, self._memory_factory)
572
498
 
573
499
 
574
 
class TestPushRedirect(tests.TestCaseWithTransport):
 
500
class TestPushRedirect(ExternalBase):
575
501
 
576
502
    def setUp(self):
577
 
        tests.TestCaseWithTransport.setUp(self)
 
503
        ExternalBase.setUp(self)
578
504
        self.memory_server = RedirectingMemoryServer()
579
505
        self.memory_server.setUp()
580
506
        self.addCleanup(self.memory_server.tearDown)
594
520
        destination_url = self.memory_server.get_url() + 'source'
595
521
        self.run_bzr(['push', '-d', 'tree', destination_url])
596
522
 
597
 
        local_revision = branch.Branch.open('tree').last_revision()
598
 
        remote_revision = branch.Branch.open(
 
523
        local_revision = Branch.open('tree').last_revision()
 
524
        remote_revision = Branch.open(
599
525
            self.memory_server.get_url() + 'target').last_revision()
600
526
        self.assertEqual(remote_revision, local_revision)
601
527
 
609
535
             % re.escape(destination_url)],
610
536
            ['push', '-d', 'tree', destination_url], retcode=3)
611
537
        self.assertEqual('', out)
612
 
 
613
 
 
614
 
class TestPushStrictMixin(object):
615
 
 
616
 
    def make_local_branch_and_tree(self):
617
 
        self.tree = self.make_branch_and_tree('local')
618
 
        self.build_tree_contents([('local/file', 'initial')])
619
 
        self.tree.add('file')
620
 
        self.tree.commit('adding file', rev_id='added')
621
 
        self.build_tree_contents([('local/file', 'modified')])
622
 
        self.tree.commit('modify file', rev_id='modified')
623
 
 
624
 
    def set_config_push_strict(self, value):
625
 
        # set config var (any of bazaar.conf, locations.conf, branch.conf
626
 
        # should do)
627
 
        conf = self.tree.branch.get_config()
628
 
        conf.set_user_option('push_strict', value)
629
 
 
630
 
    _default_command = ['push', '../to']
631
 
    _default_wd = 'local'
632
 
    _default_errors = ['Working tree ".*/local/" has uncommitted '
633
 
                       'changes \(See bzr status\)\.',]
634
 
    _default_pushed_revid = 'modified'
635
 
 
636
 
    def assertPushFails(self, args):
637
 
        self.run_bzr_error(self._default_errors, self._default_command + args,
638
 
                           working_dir=self._default_wd, retcode=3)
639
 
 
640
 
    def assertPushSucceeds(self, args, pushed_revid=None):
641
 
        self.run_bzr(self._default_command + args,
642
 
                     working_dir=self._default_wd)
643
 
        if pushed_revid is None:
644
 
            pushed_revid = self._default_pushed_revid
645
 
        tree_to = workingtree.WorkingTree.open('to')
646
 
        repo_to = tree_to.branch.repository
647
 
        self.assertTrue(repo_to.has_revision(pushed_revid))
648
 
        self.assertEqual(tree_to.branch.last_revision_info()[1], pushed_revid)
649
 
 
650
 
 
651
 
 
652
 
class TestPushStrictWithoutChanges(tests.TestCaseWithTransport,
653
 
                                   TestPushStrictMixin):
654
 
 
655
 
    def setUp(self):
656
 
        super(TestPushStrictWithoutChanges, self).setUp()
657
 
        self.make_local_branch_and_tree()
658
 
 
659
 
    def test_push_default(self):
660
 
        self.assertPushSucceeds([])
661
 
 
662
 
    def test_push_strict(self):
663
 
        self.assertPushSucceeds(['--strict'])
664
 
 
665
 
    def test_push_no_strict(self):
666
 
        self.assertPushSucceeds(['--no-strict'])
667
 
 
668
 
    def test_push_config_var_strict(self):
669
 
        self.set_config_push_strict('true')
670
 
        self.assertPushSucceeds([])
671
 
 
672
 
    def test_push_config_var_no_strict(self):
673
 
        self.set_config_push_strict('false')
674
 
        self.assertPushSucceeds([])
675
 
 
676
 
 
677
 
class TestPushStrictWithChanges(tests.TestCaseWithTransport,
678
 
                                TestPushStrictMixin):
679
 
 
680
 
    _changes_type = None # Set by load_tests
681
 
 
682
 
    def setUp(self):
683
 
        super(TestPushStrictWithChanges, self).setUp()
684
 
        getattr(self, self._changes_type)()
685
 
 
686
 
    def _uncommitted_changes(self):
687
 
        self.make_local_branch_and_tree()
688
 
        # Make a change without committing it
689
 
        self.build_tree_contents([('local/file', 'in progress')])
690
 
 
691
 
    def _pending_merges(self):
692
 
        self.make_local_branch_and_tree()
693
 
        # Create 'other' branch containing a new file
694
 
        other_bzrdir = self.tree.bzrdir.sprout('other')
695
 
        other_tree = other_bzrdir.open_workingtree()
696
 
        self.build_tree_contents([('other/other-file', 'other')])
697
 
        other_tree.add('other-file')
698
 
        other_tree.commit('other commit', rev_id='other')
699
 
        # Merge and revert, leaving a pending merge
700
 
        self.tree.merge_from_branch(other_tree.branch)
701
 
        self.tree.revert(filenames=['other-file'], backups=False)
702
 
 
703
 
    def _out_of_sync_trees(self):
704
 
        self.make_local_branch_and_tree()
705
 
        self.run_bzr(['checkout', '--lightweight', 'local', 'checkout'])
706
 
        # Make a change and commit it
707
 
        self.build_tree_contents([('local/file', 'modified in local')])
708
 
        self.tree.commit('modify file', rev_id='modified-in-local')
709
 
        # Exercise commands from the checkout directory
710
 
        self._default_wd = 'checkout'
711
 
        self._default_errors = ["Working tree is out of date, please run"
712
 
                                " 'bzr update'\.",]
713
 
        self._default_pushed_revid = 'modified-in-local'
714
 
 
715
 
    def test_push_default(self):
716
 
        self.assertPushFails([])
717
 
 
718
 
    def test_push_with_revision(self):
719
 
        self.assertPushSucceeds(['-r', 'revid:added'], pushed_revid='added')
720
 
 
721
 
    def test_push_no_strict(self):
722
 
        self.assertPushSucceeds(['--no-strict'])
723
 
 
724
 
    def test_push_strict_with_changes(self):
725
 
        self.assertPushFails(['--strict'])
726
 
 
727
 
    def test_push_respect_config_var_strict(self):
728
 
        self.set_config_push_strict('true')
729
 
        self.assertPushFails([])
730
 
 
731
 
    def test_push_bogus_config_var_ignored(self):
732
 
        self.set_config_push_strict("I don't want you to be strict")
733
 
        self.assertPushFails([])
734
 
 
735
 
    def test_push_no_strict_command_line_override_config(self):
736
 
        self.set_config_push_strict('yES')
737
 
        self.assertPushFails([])
738
 
        self.assertPushSucceeds(['--no-strict'])
739
 
 
740
 
    def test_push_strict_command_line_override_config(self):
741
 
        self.set_config_push_strict('oFF')
742
 
        self.assertPushFails(['--strict'])
743
 
        self.assertPushSucceeds([])