~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Matt Nordhoff
  • Date: 2009-06-23 05:12:07 UTC
  • mto: This revision was merged to the branch mainline in revision 4474.
  • Revision ID: mnordhoff@mattnordhoff.com-20090623051207-fksdtbzkwtnrw9dd
Update _add_text docstrings that still referred to add_text.

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'))
384
326
 
385
327
    def assertPublished(self, branch_revid, stacked_on):
386
328
        """Assert that the branch 'published' has been published correctly."""
387
 
        published_branch = branch.Branch.open('published')
 
329
        published_branch = Branch.open('published')
388
330
        # The published branch refers to the mainline
389
331
        self.assertEqual(stacked_on, published_branch.get_stacked_on_url())
390
332
        # and the branch's work was pushed
412
354
        self.assertEqual('', out)
413
355
        self.assertEqual('Created new stacked branch referring to %s.\n' %
414
356
            trunk_tree.branch.base, err)
415
 
        self.assertPublished(branch_tree.last_revision(),
416
 
                             trunk_tree.branch.base)
 
357
        self.assertPublished(branch_tree.last_revision(), trunk_tree.branch.base)
417
358
 
418
359
    def test_push_new_branch_stacked_uses_parent_public(self):
419
360
        """Pushing a new branch with --stacked creates a stacked branch."""
420
361
        trunk_tree, branch_tree = self.create_trunk_and_feature_branch()
421
362
        # the trunk is published on a web server
422
 
        self.transport_readonly_server = http_server.HttpServer
 
363
        self.transport_readonly_server = HttpServer
423
364
        trunk_public = self.make_branch('public_trunk', format='1.9')
424
365
        trunk_public.pull(trunk_tree.branch)
425
366
        trunk_public_url = self.get_readonly_url('public_trunk')
457
398
        self.make_bzrdir('.').get_config().set_default_stack_on('stack_on')
458
399
        self.make_branch('from', format='pack-0.92')
459
400
        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())
 
401
        branch = Branch.open('to')
 
402
        self.assertEqual('../stack_on', branch.get_stacked_on_url())
462
403
 
463
404
    def test_push_does_not_change_format_with_default_if_target_cannot(self):
464
405
        self.make_branch('stack_on', format='pack-0.92')
465
406
        self.make_bzrdir('.').get_config().set_default_stack_on('stack_on')
466
407
        self.make_branch('from', format='pack-0.92')
467
408
        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)
 
409
        branch = Branch.open('to')
 
410
        self.assertRaises(errors.UnstackableBranchFormat,
 
411
            branch.get_stacked_on_url)
470
412
 
471
413
    def test_push_doesnt_create_broken_branch(self):
472
414
        """Pushing a new standalone branch works even when there's a default
513
455
        # subsequent log is accurate
514
456
        self.assertNotContainsRe(out, 'rev1')
515
457
 
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):
 
458
 
 
459
class RedirectingMemoryTransport(MemoryTransport):
527
460
 
528
461
    def mkdir(self, relpath, mode=None):
 
462
        from bzrlib.trace import mutter
 
463
        mutter('cwd: %r, rel: %r, abs: %r' % (self._cwd, relpath, abspath))
529
464
        if self._cwd == '/source/':
530
465
            raise errors.RedirectRequested(self.abspath(relpath),
531
466
                                           self.abspath('../target'),
538
473
            return super(RedirectingMemoryTransport, self).mkdir(
539
474
                relpath, mode)
540
475
 
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
476
    def _redirected_to(self, source, target):
550
477
        # We do accept redirections
551
478
        return transport.get_transport(target)
552
479
 
553
480
 
554
 
class RedirectingMemoryServer(memory.MemoryServer):
 
481
class RedirectingMemoryServer(MemoryServer):
555
482
 
556
483
    def setUp(self):
557
484
        self._dirs = {'/': None}
571
498
        transport.unregister_transport(self._scheme, self._memory_factory)
572
499
 
573
500
 
574
 
class TestPushRedirect(tests.TestCaseWithTransport):
 
501
class TestPushRedirect(ExternalBase):
575
502
 
576
503
    def setUp(self):
577
 
        tests.TestCaseWithTransport.setUp(self)
 
504
        ExternalBase.setUp(self)
578
505
        self.memory_server = RedirectingMemoryServer()
579
 
        self.start_server(self.memory_server)
 
506
        self.memory_server.setUp()
 
507
        self.addCleanup(self.memory_server.tearDown)
 
508
 
580
509
        # Make the branch and tree that we'll be pushing.
581
510
        t = self.make_branch_and_tree('tree')
582
511
        self.build_tree(['tree/file'])
592
521
        destination_url = self.memory_server.get_url() + 'source'
593
522
        self.run_bzr(['push', '-d', 'tree', destination_url])
594
523
 
595
 
        local_revision = branch.Branch.open('tree').last_revision()
596
 
        remote_revision = branch.Branch.open(
 
524
        local_revision = Branch.open('tree').last_revision()
 
525
        remote_revision = Branch.open(
597
526
            self.memory_server.get_url() + 'target').last_revision()
598
527
        self.assertEqual(remote_revision, local_revision)
599
528
 
607
536
             % re.escape(destination_url)],
608
537
            ['push', '-d', 'tree', destination_url], retcode=3)
609
538
        self.assertEqual('', out)
610
 
 
611
 
 
612
 
class TestPushStrictMixin(object):
613
 
 
614
 
    def make_local_branch_and_tree(self):
615
 
        self.tree = self.make_branch_and_tree('local')
616
 
        self.build_tree_contents([('local/file', 'initial')])
617
 
        self.tree.add('file')
618
 
        self.tree.commit('adding file', rev_id='added')
619
 
        self.build_tree_contents([('local/file', 'modified')])
620
 
        self.tree.commit('modify file', rev_id='modified')
621
 
 
622
 
    def set_config_push_strict(self, value):
623
 
        # set config var (any of bazaar.conf, locations.conf, branch.conf
624
 
        # should do)
625
 
        conf = self.tree.branch.get_config()
626
 
        conf.set_user_option('push_strict', value)
627
 
 
628
 
    _default_command = ['push', '../to']
629
 
    _default_wd = 'local'
630
 
    _default_errors = ['Working tree ".*/local/" has uncommitted '
631
 
                       'changes \(See bzr status\)\.',]
632
 
    _default_pushed_revid = 'modified'
633
 
 
634
 
    def assertPushFails(self, args):
635
 
        self.run_bzr_error(self._default_errors, self._default_command + args,
636
 
                           working_dir=self._default_wd, retcode=3)
637
 
 
638
 
    def assertPushSucceeds(self, args, pushed_revid=None):
639
 
        self.run_bzr(self._default_command + args,
640
 
                     working_dir=self._default_wd)
641
 
        if pushed_revid is None:
642
 
            pushed_revid = self._default_pushed_revid
643
 
        tree_to = workingtree.WorkingTree.open('to')
644
 
        repo_to = tree_to.branch.repository
645
 
        self.assertTrue(repo_to.has_revision(pushed_revid))
646
 
        self.assertEqual(tree_to.branch.last_revision_info()[1], pushed_revid)
647
 
 
648
 
 
649
 
 
650
 
class TestPushStrictWithoutChanges(tests.TestCaseWithTransport,
651
 
                                   TestPushStrictMixin):
652
 
 
653
 
    def setUp(self):
654
 
        super(TestPushStrictWithoutChanges, self).setUp()
655
 
        self.make_local_branch_and_tree()
656
 
 
657
 
    def test_push_default(self):
658
 
        self.assertPushSucceeds([])
659
 
 
660
 
    def test_push_strict(self):
661
 
        self.assertPushSucceeds(['--strict'])
662
 
 
663
 
    def test_push_no_strict(self):
664
 
        self.assertPushSucceeds(['--no-strict'])
665
 
 
666
 
    def test_push_config_var_strict(self):
667
 
        self.set_config_push_strict('true')
668
 
        self.assertPushSucceeds([])
669
 
 
670
 
    def test_push_config_var_no_strict(self):
671
 
        self.set_config_push_strict('false')
672
 
        self.assertPushSucceeds([])
673
 
 
674
 
 
675
 
class TestPushStrictWithChanges(tests.TestCaseWithTransport,
676
 
                                TestPushStrictMixin):
677
 
 
678
 
    _changes_type = None # Set by load_tests
679
 
 
680
 
    def setUp(self):
681
 
        super(TestPushStrictWithChanges, self).setUp()
682
 
        getattr(self, self._changes_type)()
683
 
 
684
 
    def _uncommitted_changes(self):
685
 
        self.make_local_branch_and_tree()
686
 
        # Make a change without committing it
687
 
        self.build_tree_contents([('local/file', 'in progress')])
688
 
 
689
 
    def _pending_merges(self):
690
 
        self.make_local_branch_and_tree()
691
 
        # Create 'other' branch containing a new file
692
 
        other_bzrdir = self.tree.bzrdir.sprout('other')
693
 
        other_tree = other_bzrdir.open_workingtree()
694
 
        self.build_tree_contents([('other/other-file', 'other')])
695
 
        other_tree.add('other-file')
696
 
        other_tree.commit('other commit', rev_id='other')
697
 
        # Merge and revert, leaving a pending merge
698
 
        self.tree.merge_from_branch(other_tree.branch)
699
 
        self.tree.revert(filenames=['other-file'], backups=False)
700
 
 
701
 
    def _out_of_sync_trees(self):
702
 
        self.make_local_branch_and_tree()
703
 
        self.run_bzr(['checkout', '--lightweight', 'local', 'checkout'])
704
 
        # Make a change and commit it
705
 
        self.build_tree_contents([('local/file', 'modified in local')])
706
 
        self.tree.commit('modify file', rev_id='modified-in-local')
707
 
        # Exercise commands from the checkout directory
708
 
        self._default_wd = 'checkout'
709
 
        self._default_errors = ["Working tree is out of date, please run"
710
 
                                " 'bzr update'\.",]
711
 
        self._default_pushed_revid = 'modified-in-local'
712
 
 
713
 
    def test_push_default(self):
714
 
        self.assertPushFails([])
715
 
 
716
 
    def test_push_with_revision(self):
717
 
        self.assertPushSucceeds(['-r', 'revid:added'], pushed_revid='added')
718
 
 
719
 
    def test_push_no_strict(self):
720
 
        self.assertPushSucceeds(['--no-strict'])
721
 
 
722
 
    def test_push_strict_with_changes(self):
723
 
        self.assertPushFails(['--strict'])
724
 
 
725
 
    def test_push_respect_config_var_strict(self):
726
 
        self.set_config_push_strict('true')
727
 
        self.assertPushFails([])
728
 
 
729
 
    def test_push_bogus_config_var_ignored(self):
730
 
        self.set_config_push_strict("I don't want you to be strict")
731
 
        self.assertPushFails([])
732
 
 
733
 
    def test_push_no_strict_command_line_override_config(self):
734
 
        self.set_config_push_strict('yES')
735
 
        self.assertPushFails([])
736
 
        self.assertPushSucceeds(['--no-strict'])
737
 
 
738
 
    def test_push_strict_command_line_override_config(self):
739
 
        self.set_config_push_strict('oFF')
740
 
        self.assertPushFails(['--strict'])
741
 
        self.assertPushSucceeds([])