~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
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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
3251.4.11 by Aaron Bentley
Fix wrong local lookups
26
from bzrlib import tests
1871.1.2 by Robert Collins
Reduce code duplication in transport-parameterised tests.
27
from bzrlib.tests.test_transport import TestTransportImplementation
3302.9.22 by Vincent Ladeuil
bzrlib.tests.test_read_bundle use load_tests.
28
from bzrlib.tests.test_transport_implementations import TransportTestProviderAdapter
1711.3.2 by John Arbash Meinel
Add the read_bundle_from_url command, which handles lots of exceptions
29
import bzrlib.transport
30
from bzrlib.transport.memory import MemoryTransport
31
import bzrlib.urlutils
32
33
3302.9.22 by Vincent Ladeuil
bzrlib.tests.test_read_bundle use load_tests.
34
def load_tests(standard_tests, module, loader):
35
    """Multiply tests for tranport implementations."""
36
    result = loader.suiteClass()
37
    adapter = TransportTestProviderAdapter()
38
    for test in tests.iter_suite_tests(standard_tests):
39
        result.addTests(adapter.adapt(test))
40
    return result
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
1871.1.2 by Robert Collins
Reduce code duplication in transport-parameterised tests.
63
class TestReadBundleFromURL(TestTransportImplementation):
1711.3.2 by John Arbash Meinel
Add the read_bundle_from_url command, which handles lots of exceptions
64
    """Test that read_bundle works properly across multiple transports"""
65
66
    def get_url(self, relpath=''):
67
        return bzrlib.urlutils.join(self._server.get_url(), relpath)
68
69
    def create_test_bundle(self):
3251.4.11 by Aaron Bentley
Fix wrong local lookups
70
        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
71
        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
72
            f = open('test_bundle', 'wb')
73
            f.write(out.getvalue())
74
            f.close()
75
        else:
1752.2.83 by Andrew Bennetts
Merge from bzr.dev
76
            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
77
            self.log('Put to: %s', self.get_url('test_bundle'))
78
        return wt
79
80
    def test_read_bundle_from_url(self):
2402.1.2 by Andrew Bennetts
Deal with review comments.
81
        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
82
        wt = self.create_test_bundle()
83
        if wt is None:
84
            return
1793.2.2 by Aaron Bentley
Move BundleReader into v07 serializer
85
        info = bzrlib.bundle.read_bundle_from_url(
2167.2.1 by Aaron Bentley
Fix reading bundles from http URLs
86
                    unicode(self.get_url('test_bundle')))
2520.4.82 by Aaron Bentley
Fix tests to stop expecting bundles to build trees
87
        revision = info.real_revisions[-1]
88
        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
89
90
    def test_read_fail(self):
91
        # Trying to read from a directory, or non-bundle file
92
        # should fail with NotABundle
2402.1.2 by Andrew Bennetts
Deal with review comments.
93
        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
94
        wt = self.create_test_bundle()
95
        if wt is None:
96
            return
97
98
        self.assertRaises(errors.NotABundle, 
99
            bzrlib.bundle.read_bundle_from_url, 
100
            self.get_url('tree'))
101
        self.assertRaises(errors.NotABundle, 
102
            bzrlib.bundle.read_bundle_from_url, 
103
            self.get_url('tree/a'))
3251.4.10 by Aaron Bentley
Pull of launchpad locations works (abentley, #181945)
104
105
    def test_read_mergeable_populates_possible_transports(self):
106
        self._captureVar('BZR_NO_SMART_VFS', None)
107
        wt = self.create_test_bundle()
108
        if wt is None:
109
            return
110
        possible_transports = []
111
        url = unicode(self.get_url('test_bundle'))
112
        info = bzrlib.bundle.read_mergeable_from_url(url,
113
            possible_transports=possible_transports)
114
        self.assertEqual(1, len(possible_transports))