~bzr-pqm/bzr/bzr.dev

2052.3.2 by John Arbash Meinel
Change Copyright .. by Canonical to Copyright ... Canonical
1
# Copyright (C) 2006 Canonical Ltd
1711.3.2 by John Arbash Meinel
Add the read_bundle_from_url command, which handles lots of exceptions
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1711.3.2 by John Arbash Meinel
Add the read_bundle_from_url command, which handles lots of exceptions
16
17
"""Test read_bundle works properly across various transports."""
18
19
import cStringIO
20
import os
21
22
import bzrlib.bundle
23
from bzrlib.bundle.serializer import write_bundle
24
import bzrlib.bzrdir
25
import bzrlib.errors as errors
3988.2.1 by Vincent Ladeuil
Workaround SSLFile wrong readline prototype and fix bogus tests.
26
from bzrlib.symbol_versioning import deprecated_in
3251.4.11 by Aaron Bentley
Fix wrong local lookups
27
from bzrlib import tests
1871.1.2 by Robert Collins
Reduce code duplication in transport-parameterised tests.
28
from bzrlib.tests.test_transport import TestTransportImplementation
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
29
from bzrlib.tests.test_transport_implementations import transport_test_permutations
1711.3.2 by John Arbash Meinel
Add the read_bundle_from_url command, which handles lots of exceptions
30
import bzrlib.transport
31
from bzrlib.transport.memory import MemoryTransport
32
import bzrlib.urlutils
33
34
3302.9.22 by Vincent Ladeuil
bzrlib.tests.test_read_bundle use load_tests.
35
def load_tests(standard_tests, module, loader):
36
    """Multiply tests for tranport implementations."""
3988.2.1 by Vincent Ladeuil
Workaround SSLFile wrong readline prototype and fix bogus tests.
37
    transport_tests, remaining_tests = tests.split_suite_by_condition(
4084.5.1 by Robert Collins
Bulk update all test adaptation into a single approach, using multiply_tests rather than test adapters.
38
        standard_tests, tests.condition_isinstance(TestReadBundleFromURL))
39
    return tests.multiply_tests(transport_tests, transport_test_permutations(),
40
        remaining_tests)
3302.9.22 by Vincent Ladeuil
bzrlib.tests.test_read_bundle use load_tests.
41
42
3251.4.11 by Aaron Bentley
Fix wrong local lookups
43
def create_bundle_file(test_case):
44
    test_case.build_tree(['tree/', 'tree/a', 'tree/subdir/'])
45
46
    format = bzrlib.bzrdir.BzrDirFormat.get_default_format()
47
48
    bzrdir = format.initialize('tree')
49
    repo = bzrdir.create_repository()
50
    branch = repo.bzrdir.create_branch()
51
    wt = branch.bzrdir.create_workingtree()
52
53
    wt.add(['a', 'subdir/'])
54
    wt.commit('new project', rev_id='commit-1')
55
56
    out = cStringIO.StringIO()
57
    rev_ids = write_bundle(wt.branch.repository,
58
                           wt.get_parent_ids()[0], 'null:', out)
59
    out.seek(0)
60
    return out, wt
61
62
3988.2.1 by Vincent Ladeuil
Workaround SSLFile wrong readline prototype and fix bogus tests.
63
class TestDeprecations(tests.TestCaseInTempDir):
64
65
    def create_test_bundle(self):
66
        out, wt = create_bundle_file(self)
67
        f = open('test_bundle', 'wb')
3988.2.4 by Vincent Ladeuil
Fixed as per Martin's review.
68
        try:
69
            f.write(out.getvalue())
70
        finally:
71
            f.close()
3988.2.1 by Vincent Ladeuil
Workaround SSLFile wrong readline prototype and fix bogus tests.
72
        return wt
73
74
    def test_read_bundle_from_url_deprecated(self):
75
        wt = self.create_test_bundle()
76
        t = bzrlib.transport.get_transport(self.test_dir)
77
        url = t.abspath('test_bundle')
78
        self.callDeprecated([deprecated_in((1, 12, 0))
79
                             % 'bzrlib.bundle.read_bundle_from_url'],
80
                            bzrlib.bundle.read_bundle_from_url,
81
                            url)
82
83
1871.1.2 by Robert Collins
Reduce code duplication in transport-parameterised tests.
84
class TestReadBundleFromURL(TestTransportImplementation):
1711.3.2 by John Arbash Meinel
Add the read_bundle_from_url command, which handles lots of exceptions
85
    """Test that read_bundle works properly across multiple transports"""
86
87
    def get_url(self, relpath=''):
88
        return bzrlib.urlutils.join(self._server.get_url(), relpath)
89
90
    def create_test_bundle(self):
3251.4.11 by Aaron Bentley
Fix wrong local lookups
91
        out, wt = create_bundle_file(self)
1752.2.26 by Martin Pool
test_read_bundle doesn't need to specially hold a connection open anymore
92
        if self.get_transport().is_readonly():
1711.3.2 by John Arbash Meinel
Add the read_bundle_from_url command, which handles lots of exceptions
93
            f = open('test_bundle', 'wb')
3988.2.4 by Vincent Ladeuil
Fixed as per Martin's review.
94
            try:
95
                f.write(out.getvalue())
96
            finally:
97
                f.close()
1711.3.2 by John Arbash Meinel
Add the read_bundle_from_url command, which handles lots of exceptions
98
        else:
1752.2.83 by Andrew Bennetts
Merge from bzr.dev
99
            self.get_transport().put_file('test_bundle', out)
1711.3.2 by John Arbash Meinel
Add the read_bundle_from_url command, which handles lots of exceptions
100
            self.log('Put to: %s', self.get_url('test_bundle'))
101
        return wt
102
3988.2.1 by Vincent Ladeuil
Workaround SSLFile wrong readline prototype and fix bogus tests.
103
    def test_read_mergeable_from_url(self):
2402.1.2 by Andrew Bennetts
Deal with review comments.
104
        self._captureVar('BZR_NO_SMART_VFS', None)
1711.3.2 by John Arbash Meinel
Add the read_bundle_from_url command, which handles lots of exceptions
105
        wt = self.create_test_bundle()
106
        if wt is None:
107
            return
3988.2.1 by Vincent Ladeuil
Workaround SSLFile wrong readline prototype and fix bogus tests.
108
        # read_mergeable_from_url will invoke get_transport which may *not*
109
        # respect self._transport (i.e. returns a transport that is different
110
        # from the one we want to test, so we must inject a correct transport
111
        # into possible_transports first.
112
        t = self.get_transport('test_bundle')
113
        possible_transports = [t]
114
        info = bzrlib.bundle.read_mergeable_from_url(
115
                    unicode(self.get_url('test_bundle')),
116
                    possible_transports=possible_transports)
2520.4.82 by Aaron Bentley
Fix tests to stop expecting bundles to build trees
117
        revision = info.real_revisions[-1]
118
        self.assertEqual('commit-1', revision.revision_id)
1711.3.2 by John Arbash Meinel
Add the read_bundle_from_url command, which handles lots of exceptions
119
120
    def test_read_fail(self):
121
        # Trying to read from a directory, or non-bundle file
122
        # should fail with NotABundle
2402.1.2 by Andrew Bennetts
Deal with review comments.
123
        self._captureVar('BZR_NO_SMART_VFS', None)
1711.3.2 by John Arbash Meinel
Add the read_bundle_from_url command, which handles lots of exceptions
124
        wt = self.create_test_bundle()
125
        if wt is None:
126
            return
127
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
128
        self.assertRaises(errors.NotABundle,
3988.2.1 by Vincent Ladeuil
Workaround SSLFile wrong readline prototype and fix bogus tests.
129
            bzrlib.bundle.read_mergeable_from_url,
1711.3.2 by John Arbash Meinel
Add the read_bundle_from_url command, which handles lots of exceptions
130
            self.get_url('tree'))
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
131
        self.assertRaises(errors.NotABundle,
3988.2.1 by Vincent Ladeuil
Workaround SSLFile wrong readline prototype and fix bogus tests.
132
            bzrlib.bundle.read_mergeable_from_url,
1711.3.2 by John Arbash Meinel
Add the read_bundle_from_url command, which handles lots of exceptions
133
            self.get_url('tree/a'))
3251.4.10 by Aaron Bentley
Pull of launchpad locations works (abentley, #181945)
134
3988.2.1 by Vincent Ladeuil
Workaround SSLFile wrong readline prototype and fix bogus tests.
135
    def test_read_mergeable_respects_possible_transports(self):
136
        t = self.get_transport('test_bundle')
137
        if not isinstance(t, bzrlib.transport.ConnectedTransport):
138
            # There is no point testing transport reuse for not connected
139
            # transports (the test will fail even).
140
            return
3251.4.10 by Aaron Bentley
Pull of launchpad locations works (abentley, #181945)
141
        self._captureVar('BZR_NO_SMART_VFS', None)
142
        wt = self.create_test_bundle()
143
        if wt is None:
144
            return
3988.2.1 by Vincent Ladeuil
Workaround SSLFile wrong readline prototype and fix bogus tests.
145
        # read_mergeable_from_url will invoke get_transport which may *not*
146
        # respect self._transport (i.e. returns a transport that is different
147
        # from the one we want to test, so we must inject a correct transport
148
        # into possible_transports first.
149
        possible_transports = [t]
3251.4.10 by Aaron Bentley
Pull of launchpad locations works (abentley, #181945)
150
        url = unicode(self.get_url('test_bundle'))
151
        info = bzrlib.bundle.read_mergeable_from_url(url,
152
            possible_transports=possible_transports)
153
        self.assertEqual(1, len(possible_transports))