~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

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

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2007-03-28 06:58:22 UTC
  • mfrom: (2379.2.3 hpss-chroot)
  • Revision ID: pqm@pqm.ubuntu.com-20070328065822-999550a858a3ced3
(robertc) Fix chroot urls to not expose the url of the transport they are protecting, allowing regular url operations to work on them. (Robert Collins, Andrew Bennetts)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005-2012, 2016 Canonical Ltd
 
1
# Copyright (C) 2005 Canonical Ltd
 
2
# -*- coding: utf-8 -*-
2
3
#
3
4
# This program is free software; you can redistribute it and/or modify
4
5
# it under the terms of the GNU General Public License as published by
12
13
#
13
14
# You should have received a copy of the GNU General Public License
14
15
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
 
17
18
 
18
19
"""Black-box tests for bzr cat.
19
20
"""
20
21
 
21
 
from bzrlib import tests
22
 
from bzrlib.tests.matchers import ContainsNoVfsCalls
23
 
from bzrlib.transport import memory
24
 
 
25
 
 
26
 
class TestCat(tests.TestCaseWithTransport):
 
22
import os
 
23
 
 
24
from bzrlib.tests.blackbox import TestCaseWithTransport
 
25
 
 
26
class TestCat(TestCaseWithTransport):
27
27
 
28
28
    def test_cat(self):
29
 
        tree = self.make_branch_and_tree('branch')
30
 
        self.build_tree_contents([('branch/a', 'foo\n')])
31
 
        tree.add('a')
 
29
 
 
30
        def bzr(*args, **kwargs):
 
31
            return self.run_bzr_subprocess(*args, **kwargs)[0]
 
32
 
 
33
        os.mkdir('branch')
 
34
        os.chdir('branch')
 
35
        bzr('init')
 
36
        open('a', 'wb').write('foo\n')
 
37
        bzr('add', 'a')
 
38
 
32
39
        # 'bzr cat' without an option should cat the last revision
33
 
        self.run_bzr(['cat', 'a'], retcode=3, working_dir='branch')
34
 
 
35
 
        tree.commit(message='1')
36
 
        self.build_tree_contents([('branch/a', 'baz\n')])
37
 
 
38
 
        self.assertEqual('foo\n',
39
 
                          self.run_bzr(['cat', 'a'], working_dir='branch')[0])
40
 
 
41
 
        # On Windows, we used to have a bug where newlines got changed into
42
 
        # crlf, whereas cat ought to write out the file exactly as it's
43
 
        # recorded (by default.)  That problem can't be reproduced in-process,
44
 
        # so we need just one test here that 
45
 
        self.assertEqual('foo\n',
46
 
                          self.run_bzr_subprocess(['cat', 'a'],
47
 
                                                  working_dir='branch')[0])
48
 
 
49
 
        tree.commit(message='2')
50
 
        self.assertEqual(
51
 
            'baz\n', self.run_bzr(['cat', 'a'], working_dir='branch')[0])
52
 
        self.assertEqual(
53
 
            'foo\n', self.run_bzr(['cat', 'a', '-r', '1'],
54
 
                                  working_dir='branch')[0])
55
 
        self.assertEqual(
56
 
            'baz\n', self.run_bzr(['cat', 'a', '-r', '-1'],
57
 
                                  working_dir='branch')[0])
58
 
 
59
 
        rev_id = tree.branch.last_revision()
60
 
 
61
 
        self.assertEqual(
62
 
            'baz\n', self.run_bzr(['cat', 'a', '-r', 'revid:%s' % rev_id],
63
 
                                  working_dir='branch')[0])
64
 
 
65
 
        self.assertEqual('foo\n',
66
 
                          self.run_bzr(['cat', 'branch/a',
67
 
                                        '-r', 'revno:1:branch'])[0])
68
 
        self.run_bzr(['cat', 'a'], retcode=3)
69
 
        self.run_bzr(['cat', 'a', '-r', 'revno:1:branch-that-does-not-exist'],
70
 
                     retcode=3)
71
 
 
 
40
        bzr('cat', 'a', retcode=3)
 
41
 
 
42
        bzr('commit', '-m', '1')
 
43
        open('a', 'wb').write('baz\n')
 
44
 
 
45
        self.assertEquals(bzr('cat', 'a'), 'foo\n')
 
46
 
 
47
        bzr('commit', '-m', '2')
 
48
        self.assertEquals(bzr('cat', 'a'), 'baz\n')
 
49
        self.assertEquals(bzr('cat', 'a', '-r', '1'), 'foo\n')
 
50
        self.assertEquals(bzr('cat', 'a', '-r', '-1'), 'baz\n')
 
51
 
 
52
        rev_id = bzr('revision-history').strip().split('\n')[-1]
 
53
 
 
54
        self.assertEquals(bzr('cat', 'a', '-r', 'revid:%s' % rev_id), 'baz\n')
 
55
        
 
56
        os.chdir('..')
 
57
        
 
58
        self.assertEquals(bzr('cat', 'branch/a', '-r', 'revno:1:branch'),
 
59
                          'foo\n')
 
60
        bzr('cat', 'a', retcode=3)
 
61
        bzr('cat', 'a', '-r', 'revno:1:branch-that-does-not-exist', retcode=3)
 
62
        
72
63
    def test_cat_different_id(self):
73
64
        """'cat' works with old and new files"""
74
 
        self.disable_missing_extensions_warning()
75
65
        tree = self.make_branch_and_tree('.')
76
66
        # the files are named after their path in the revision and
77
67
        # current trees later in the test case
78
68
        # a-rev-tree is special because it appears in both the revision
79
69
        # tree and the working tree
80
70
        self.build_tree_contents([('a-rev-tree', 'foo\n'),
81
 
            ('c-rev', 'baz\n'), ('d-rev', 'bar\n'), ('e-rev', 'qux\n')])
 
71
            ('c-rev', 'baz\n'), ('d-rev', 'bar\n')])
82
72
        tree.lock_write()
83
73
        try:
84
 
            tree.add(['a-rev-tree', 'c-rev', 'd-rev', 'e-rev'])
85
 
            tree.commit('add test files', rev_id='first')
86
 
            # remove currently uses self._write_inventory -
 
74
            tree.add(['a-rev-tree', 'c-rev', 'd-rev'])
 
75
            tree.commit('add test files')
 
76
            # remove currently uses self._write_inventory - 
87
77
            # work around that for now.
88
78
            tree.flush()
89
79
            tree.remove(['d-rev'])
90
80
            tree.rename_one('a-rev-tree', 'b-tree')
91
81
            tree.rename_one('c-rev', 'a-rev-tree')
92
 
            tree.rename_one('e-rev', 'old-rev')
93
 
            self.build_tree_contents([('e-rev', 'new\n')])
94
 
            tree.add(['e-rev'])
 
82
 
 
83
            # 'b-tree' is not present in the old tree.
 
84
            self.run_bzr_error([], 'cat', 'b-tree', '--name-from-revision')
 
85
 
 
86
            # get to the old file automatically
 
87
            out, err = self.run_bzr('cat', 'd-rev')
 
88
            self.assertEqual('bar\n', out)
 
89
            self.assertEqual('', err)
 
90
 
 
91
            out, err = self.run_bzr('cat', 'a-rev-tree',
 
92
                                    '--name-from-revision')
 
93
            self.assertEqual('foo\n', out)
 
94
            self.assertEqual('', err)
 
95
 
 
96
            out, err = self.run_bzr('cat', 'a-rev-tree')
 
97
            self.assertEqual('baz\n', out)
 
98
            self.assertEqual('', err)
95
99
        finally:
96
 
            # calling bzr as another process require free lock on win32
97
100
            tree.unlock()
98
101
 
99
 
        # 'b-tree' is not present in the old tree.
100
 
        self.run_bzr_error(["^bzr: ERROR: u?'b-tree' "
101
 
                            "is not present in revision .+$"],
102
 
                           'cat b-tree --name-from-revision')
103
 
 
104
 
        # get to the old file automatically
105
 
        out, err = self.run_bzr('cat d-rev')
106
 
        self.assertEqual('bar\n', out)
107
 
        self.assertEqual('', err)
108
 
 
109
 
        out, err = \
110
 
                self.run_bzr('cat a-rev-tree --name-from-revision')
111
 
        self.assertEqual('foo\n', out)
112
 
        self.assertEqual('', err)
113
 
 
114
 
        out, err = self.run_bzr('cat a-rev-tree')
115
 
        self.assertEqual('baz\n', out)
116
 
        self.assertEqual('', err)
117
 
 
118
 
        # the actual file-id for e-rev doesn't exist in the old tree
119
 
        out, err = self.run_bzr('cat e-rev -rrevid:first')
120
 
        self.assertEqual('qux\n', out)
121
 
        self.assertEqual('', err)
122
 
 
123
102
    def test_remote_cat(self):
124
103
        wt = self.make_branch_and_tree('.')
125
104
        self.build_tree(['README'])
127
106
        wt.commit('Making sure there is a basis_tree available')
128
107
 
129
108
        url = self.get_readonly_url() + '/README'
130
 
        out, err = self.run_bzr(['cat', url])
131
 
        self.assertEqual('contents of README\n', out)
132
 
 
133
 
    def test_cat_branch_revspec(self):
134
 
        wt = self.make_branch_and_tree('a')
135
 
        self.build_tree(['a/README'])
136
 
        wt.add('README')
137
 
        wt.commit('Making sure there is a basis_tree available')
138
 
        wt = self.make_branch_and_tree('b')
139
 
 
140
 
        out, err = self.run_bzr(['cat', '-r', 'branch:../a', 'README'],
141
 
                                working_dir='b')
142
 
        self.assertEqual('contents of a/README\n', out)
143
 
 
144
 
    def test_cat_filters(self):
145
 
        wt = self.make_branch_and_tree('.')
146
 
        self.build_tree(['README'])
147
 
        wt.add('README')
148
 
        wt.commit('Making sure there is a basis_tree available')
149
 
        url = self.get_readonly_url() + '/README'
150
 
 
151
 
        # Test unfiltered output
152
 
        out, err = self.run_bzr(['cat', url])
153
 
        self.assertEqual('contents of README\n', out)
154
 
 
155
 
        # Test --filters option is legal but has no impact if no filters
156
 
        out, err = self.run_bzr(['cat', '--filters', url])
157
 
        self.assertEqual('contents of README\n', out)
158
 
 
159
 
    def test_cat_filters_applied(self):
160
 
        # Test filtering applied to output. This is tricky to do in a
161
 
        # subprocess because we really need to patch in a plugin that
162
 
        # registers the filters. Instead, we patch in a custom
163
 
        # filter_stack and use run_bzr() ...
164
 
        from cStringIO import StringIO
165
 
        from bzrlib.commands import run_bzr
166
 
        from bzrlib.tests.test_filters import _stack_2
167
 
        from bzrlib.trace import mutter
168
 
        from bzrlib.tree import Tree
169
 
        wt = self.make_branch_and_tree('.')
170
 
        self.build_tree_contents([
171
 
            ('README', "junk\nline 1 of README\nline 2 of README\n"),
172
 
            ])
173
 
        wt.add('README')
174
 
        wt.commit('Making sure there is a basis_tree available')
175
 
        url = self.get_readonly_url() + '/README'
176
 
        real_content_filter_stack = Tree._content_filter_stack
177
 
        def _custom_content_filter_stack(tree, path=None, file_id=None):
178
 
            return _stack_2
179
 
        Tree._content_filter_stack = _custom_content_filter_stack
180
 
        try:
181
 
            out, err = self.run_bzr(['cat', url, '--filters'])
182
 
            # The filter stack will remove the first line and swapcase the rest
183
 
            self.assertEqual('LINE 1 OF readme\nLINE 2 OF readme\n', out)
184
 
            self.assertEqual('', err)
185
 
        finally:
186
 
            Tree._content_filter_stack = real_content_filter_stack
 
109
        out, err = self.run_bzr('cat', url)
 
110
        self.assertEqual('contents of README\n', out)
187
111
 
188
112
    def test_cat_no_working_tree(self):
189
113
        wt = self.make_branch_and_tree('.')
193
117
        wt.branch.bzrdir.destroy_workingtree()
194
118
 
195
119
        url = self.get_readonly_url() + '/README'
196
 
        out, err = self.run_bzr(['cat', url])
 
120
        out, err = self.run_bzr('cat', url)
197
121
        self.assertEqual('contents of README\n', out)
198
 
 
199
 
    def test_cat_nonexistent_branch(self):
200
 
        self.vfs_transport_factory = memory.MemoryServer
201
 
        self.run_bzr_error(['^bzr: ERROR: Not a branch'],
202
 
                           ['cat', self.get_url()])
203
 
 
204
 
    def test_cat_directory(self):
205
 
        wt = self.make_branch_and_tree('a')
206
 
        self.build_tree(['a/README'])
207
 
        wt.add('README')
208
 
        wt.commit('Making sure there is a basis_tree available')
209
 
 
210
 
        out, err = self.run_bzr(['cat', '--directory=a', 'README'])
211
 
        self.assertEqual('contents of a/README\n', out)
212
 
 
213
 
    def test_cat_remote_directory(self):
214
 
        wt = self.make_branch_and_tree('a')
215
 
        self.build_tree(['a/README'])
216
 
        wt.add('README')
217
 
        wt.commit('Making sure there is a basis_tree available')
218
 
 
219
 
        url = self.get_readonly_url() + '/a'
220
 
        out, err = self.run_bzr(['cat', '-d', url, 'README'])
221
 
        self.assertEqual('contents of a/README\n', out)
222
 
 
223
 
 
224
 
class TestSmartServerCat(tests.TestCaseWithTransport):
225
 
 
226
 
    def test_simple_branch_cat(self):
227
 
        self.setup_smart_server_with_call_log()
228
 
        t = self.make_branch_and_tree('branch')
229
 
        self.build_tree_contents([('branch/foo', 'thecontents')])
230
 
        t.add("foo")
231
 
        t.commit("message")
232
 
        self.reset_smart_call_log()
233
 
        out, err = self.run_bzr(['cat', "%s/foo" % self.get_url('branch')])
234
 
        # This figure represent the amount of work to perform this use case. It
235
 
        # is entirely ok to reduce this number if a test fails due to rpc_count
236
 
        # being too low. If rpc_count increases, more network roundtrips have
237
 
        # become necessary for this use case. Please do not adjust this number
238
 
        # upwards without agreement from bzr's network support maintainers.
239
 
        self.assertLength(9, self.hpss_calls)
240
 
        self.assertLength(1, self.hpss_connections)
241
 
        self.assertThat(self.hpss_calls, ContainsNoVfsCalls)
 
122