/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/tests/branch_implementations/test_hooks.py

  • Committer: John Arbash Meinel
  • Date: 2008-07-08 14:55:19 UTC
  • mfrom: (3530 +trunk)
  • mto: This revision was merged to the branch mainline in revision 3532.
  • Revision ID: john@arbash-meinel.com-20080708145519-paqg4kjwbpgs2xmq
Merge bzr.dev 3530

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 
17
17
"""Tests that branch classes implement hook callouts correctly."""
18
18
 
19
 
from bzrlib.branch import Branch
 
19
from bzrlib.branch import Branch, ChangeBranchTipParams
 
20
from bzrlib.revision import NULL_REVISION
20
21
from bzrlib.tests import TestCaseWithMemoryTransport
21
22
 
22
23
 
36
37
 
37
38
    def test_set_rh_empty_history(self):
38
39
        branch = self.make_branch('source')
39
 
        Branch.hooks.install_hook('set_rh', self.capture_set_rh_hook)
 
40
        Branch.hooks.install_named_hook('set_rh', self.capture_set_rh_hook,
 
41
                                        None)
40
42
        branch.set_revision_history([])
41
43
        self.assertEqual(self.hook_calls,
42
44
            [('set_rh', branch, [], True)])
49
51
        tree.commit('empty commit', rev_id='foo')
50
52
        tree.unlock()
51
53
        branch = tree.branch
52
 
        Branch.hooks.install_hook('set_rh', self.capture_set_rh_hook)
 
54
        Branch.hooks.install_named_hook('set_rh', self.capture_set_rh_hook,
 
55
                                        None)
53
56
        # some branches require that their history be set to a revision in the
54
57
        # repository
55
58
        branch.set_revision_history(['f\xc2\xb5'])
58
61
 
59
62
    def test_set_rh_branch_is_locked(self):
60
63
        branch = self.make_branch('source')
61
 
        Branch.hooks.install_hook('set_rh', self.capture_set_rh_hook)
 
64
        Branch.hooks.install_named_hook('set_rh', self.capture_set_rh_hook,
 
65
                                        None)
62
66
        branch.set_revision_history([])
63
67
        self.assertEqual(self.hook_calls,
64
68
            [('set_rh', branch, [], True)])
65
69
 
66
70
    def test_set_rh_calls_all_hooks_no_errors(self):
67
71
        branch = self.make_branch('source')
68
 
        Branch.hooks.install_hook('set_rh', self.capture_set_rh_hook)
69
 
        Branch.hooks.install_hook('set_rh', self.capture_set_rh_hook)
 
72
        Branch.hooks.install_named_hook('set_rh', self.capture_set_rh_hook,
 
73
                                        None)
 
74
        Branch.hooks.install_named_hook('set_rh', self.capture_set_rh_hook,
 
75
                                        None)
70
76
        branch.set_revision_history([])
71
77
        self.assertEqual(self.hook_calls,
72
78
            [('set_rh', branch, [], True),
73
79
             ('set_rh', branch, [], True),
74
80
            ])
 
81
 
 
82
 
 
83
class ChangeBranchTipTestCase(TestCaseWithMemoryTransport):
 
84
    """Base TestCase for testing pre/post_change_branch_tip hooks."""
 
85
 
 
86
    def install_logging_hook(self, prefix):
 
87
        """Add a hook that logs calls made to it.
 
88
        
 
89
        :returns: the list that the calls will be appended to.
 
90
        """
 
91
        hook_calls = []
 
92
        Branch.hooks.install_named_hook(
 
93
            'pre_change_branch_tip', hook_calls.append, None)
 
94
        return hook_calls
 
95
 
 
96
    def make_branch_with_revision_ids(self, *revision_ids):
 
97
        """Makes a branch with the given commits."""
 
98
        tree = self.make_branch_and_memory_tree('source')
 
99
        tree.lock_write()
 
100
        tree.add('')
 
101
        for revision_id in revision_ids:
 
102
            tree.commit('Message of ' + revision_id, rev_id=revision_id)
 
103
        tree.unlock()
 
104
        branch = tree.branch
 
105
        return branch
 
106
 
 
107
 
 
108
class TestPreChangeBranchTip(ChangeBranchTipTestCase):
 
109
    """Tests for pre_change_branch_tip hook.
 
110
    
 
111
    Most of these tests are very similar to the tests in
 
112
    TestPostChangeBranchTip.
 
113
    """
 
114
 
 
115
    def test_hook_runs_before_change(self):
 
116
        """The hook runs *before* the branch's last_revision_info has changed.
 
117
        """
 
118
        branch = self.make_branch_with_revision_ids('revid-one')
 
119
        def assertBranchAtRevision1(params):
 
120
            self.assertEquals(
 
121
                (1, 'revid-one'), params.branch.last_revision_info())
 
122
        Branch.hooks.install_named_hook(
 
123
            'pre_change_branch_tip', assertBranchAtRevision1, None)
 
124
        branch.set_last_revision_info(0, NULL_REVISION)
 
125
 
 
126
    def test_reject_by_hook(self):
 
127
        """If a hook raises an exception, the change does not take effect.
 
128
        
 
129
        Also, the exception will be propogated.
 
130
        """
 
131
        branch = self.make_branch_with_revision_ids(
 
132
            'one-\xc2\xb5', 'two-\xc2\xb5')
 
133
        class PearShapedError(Exception):
 
134
            pass
 
135
        def hook_that_raises(params):
 
136
            raise PearShapedError()
 
137
        Branch.hooks.install_named_hook(
 
138
            'pre_change_branch_tip', hook_that_raises, None)
 
139
        self.assertRaises(
 
140
            PearShapedError, branch.set_last_revision_info, 0, NULL_REVISION)
 
141
        # The revision info is unchanged.
 
142
        self.assertEqual((2, 'two-\xc2\xb5'), branch.last_revision_info())
 
143
        
 
144
    def test_empty_history(self):
 
145
        branch = self.make_branch('source')
 
146
        hook_calls = self.install_logging_hook('pre')
 
147
        branch.set_last_revision_info(0, NULL_REVISION)
 
148
        expected_params = ChangeBranchTipParams(
 
149
            branch, 0, 0, NULL_REVISION, NULL_REVISION)
 
150
        self.assertEqual([expected_params], hook_calls)
 
151
 
 
152
    def test_nonempty_history(self):
 
153
        # some branches require that their history be set to a revision in the
 
154
        # repository, so we need to make a branch with non-empty history for
 
155
        # this test.
 
156
        branch = self.make_branch_with_revision_ids(
 
157
            'one-\xc2\xb5', 'two-\xc2\xb5')
 
158
        hook_calls = self.install_logging_hook('pre')
 
159
        branch.set_last_revision_info(1, 'one-\xc2\xb5')
 
160
        expected_params = ChangeBranchTipParams(
 
161
            branch, 2, 1, 'two-\xc2\xb5', 'one-\xc2\xb5')
 
162
        self.assertEqual([expected_params], hook_calls)
 
163
 
 
164
    def test_branch_is_locked(self):
 
165
        branch = self.make_branch('source')
 
166
        def assertBranchIsLocked(params):
 
167
            self.assertTrue(params.branch.is_locked())
 
168
        Branch.hooks.install_named_hook(
 
169
            'pre_change_branch_tip', assertBranchIsLocked, None)
 
170
        branch.set_last_revision_info(0, NULL_REVISION)
 
171
 
 
172
    def test_calls_all_hooks_no_errors(self):
 
173
        """If multiple hooks are registered, all are called (if none raise
 
174
        errors).
 
175
        """
 
176
        branch = self.make_branch('source')
 
177
        hook_calls_1 = self.install_logging_hook('pre')
 
178
        hook_calls_2 = self.install_logging_hook('pre')
 
179
        self.assertIsNot(hook_calls_1, hook_calls_2)
 
180
        branch.set_last_revision_info(0, NULL_REVISION)
 
181
        # Both hooks are called.
 
182
        self.assertEqual(len(hook_calls_1), 1)
 
183
        self.assertEqual(len(hook_calls_2), 1)
 
184
 
 
185
 
 
186
class TestPostChangeBranchTip(ChangeBranchTipTestCase):
 
187
    """Tests for post_change_branch_tip hook.
 
188
 
 
189
    Most of these tests are very similar to the tests in
 
190
    TestPostChangeBranchTip.
 
191
    """
 
192
 
 
193
    def test_hook_runs_after_change(self):
 
194
        """The hook runs *after* the branch's last_revision_info has changed.
 
195
        """
 
196
        branch = self.make_branch_with_revision_ids('revid-one')
 
197
        def assertBranchAtRevision1(params):
 
198
            self.assertEquals(
 
199
                (0, NULL_REVISION), params.branch.last_revision_info())
 
200
        Branch.hooks.install_named_hook(
 
201
            'post_change_branch_tip', assertBranchAtRevision1, None)
 
202
        branch.set_last_revision_info(0, NULL_REVISION)
 
203
 
 
204
    def test_empty_history(self):
 
205
        branch = self.make_branch('source')
 
206
        hook_calls = self.install_logging_hook('post')
 
207
        branch.set_last_revision_info(0, NULL_REVISION)
 
208
        expected_params = ChangeBranchTipParams(
 
209
            branch, 0, 0, NULL_REVISION, NULL_REVISION)
 
210
        self.assertEqual([expected_params], hook_calls)
 
211
 
 
212
    def test_nonempty_history(self):
 
213
        # some branches require that their history be set to a revision in the
 
214
        # repository, so we need to make a branch with non-empty history for
 
215
        # this test.
 
216
        branch = self.make_branch_with_revision_ids(
 
217
            'one-\xc2\xb5', 'two-\xc2\xb5')
 
218
        hook_calls = self.install_logging_hook('post')
 
219
        branch.set_last_revision_info(1, 'one-\xc2\xb5')
 
220
        expected_params = ChangeBranchTipParams(
 
221
            branch, 2, 1, 'two-\xc2\xb5', 'one-\xc2\xb5')
 
222
        self.assertEqual([expected_params], hook_calls)
 
223
 
 
224
    def test_branch_is_locked(self):
 
225
        """The branch passed to the hook is locked."""
 
226
        branch = self.make_branch('source')
 
227
        def assertBranchIsLocked(params):
 
228
            self.assertTrue(params.branch.is_locked())
 
229
        Branch.hooks.install_named_hook(
 
230
            'post_change_branch_tip', assertBranchIsLocked, None)
 
231
        branch.set_last_revision_info(0, NULL_REVISION)
 
232
 
 
233
    def test_calls_all_hooks_no_errors(self):
 
234
        """If multiple hooks are registered, all are called (if none raise
 
235
        errors).
 
236
        """
 
237
        branch = self.make_branch('source')
 
238
        hook_calls_1 = self.install_logging_hook('post')
 
239
        hook_calls_2 = self.install_logging_hook('post')
 
240
        self.assertIsNot(hook_calls_1, hook_calls_2)
 
241
        branch.set_last_revision_info(0, NULL_REVISION)
 
242
        # Both hooks are called.
 
243
        self.assertEqual(len(hook_calls_1), 1)
 
244
        self.assertEqual(len(hook_calls_2), 1)