No subject


Wed Jan 21 23:15:58 GMT 2009


read_bundle tests that had very subtle bugs.

I ended up fixing them and deprecating read_bundle_from_url in
the process (see patch for detailed explanations or ask questions
during the review if needed).

       Vincent


--=-=-=
Content-Type: text/x-patch
Content-Disposition: inline; filename=httplib-broken-readline-3989.patch
Content-Description: BZR merge

# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: v.ladeuil+lp at free.fr-20090209182543-nb0220ksr5xa20pg
# target_branch: http://bazaar-vcs.org/bzr/bzr.dev/
# testament_sha1: 89000d4422dfcacd4d1f4c5e398070eb747d997b
# timestamp: 2009-02-09 20:20:34 +0100
# base_revision_id: pqm at pqm.ubuntu.com-20090209040048-4w0lmgdasmdw5xdn
# 
# Begin patch
=== modified file 'bzrlib/bundle/__init__.py'
--- bzrlib/bundle/__init__.py	2008-10-01 05:40:45 +0000
+++ bzrlib/bundle/__init__.py	2009-02-09 18:25:43 +0000
@@ -14,6 +14,7 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
+from bzrlib.symbol_versioning import deprecated_function, deprecated_in
 from bzrlib.lazy_import import lazy_import
 lazy_import(globals(), """
 from bzrlib import (
@@ -29,6 +30,7 @@
 from bzrlib.trace import note
 
 
+ at deprecated_function(deprecated_in((1, 12, 0)))
 def read_bundle_from_url(url):
     return read_mergeable_from_url(url, _do_directive=False)
 

=== modified file 'bzrlib/tests/test_read_bundle.py'
--- bzrlib/tests/test_read_bundle.py	2008-04-01 19:30:25 +0000
+++ bzrlib/tests/test_read_bundle.py	2009-02-09 18:25:43 +0000
@@ -23,6 +23,7 @@
 from bzrlib.bundle.serializer import write_bundle
 import bzrlib.bzrdir
 import bzrlib.errors as errors
+from bzrlib.symbol_versioning import deprecated_in
 from bzrlib import tests
 from bzrlib.tests.test_transport import TestTransportImplementation
 from bzrlib.tests.test_transport_implementations import TransportTestProviderAdapter
@@ -34,9 +35,15 @@
 def load_tests(standard_tests, module, loader):
     """Multiply tests for tranport implementations."""
     result = loader.suiteClass()
+    transport_tests, remaining_tests = tests.split_suite_by_condition(
+        standard_tests, tests.condition_isinstance((TestReadBundleFromURL)))
+
     adapter = TransportTestProviderAdapter()
-    for test in tests.iter_suite_tests(standard_tests):
-        result.addTests(adapter.adapt(test))
+    tests.adapt_tests(transport_tests, adapter, result)
+
+    # No parametrization for the remaining tests
+    result.addTests(remaining_tests)
+
     return result
 
 
@@ -60,6 +67,25 @@
     return out, wt
 
 
+class TestDeprecations(tests.TestCaseInTempDir):
+
+    def create_test_bundle(self):
+        out, wt = create_bundle_file(self)
+        f = open('test_bundle', 'wb')
+        f.write(out.getvalue())
+        f.close()
+        return wt
+
+    def test_read_bundle_from_url_deprecated(self):
+        wt = self.create_test_bundle()
+        t = bzrlib.transport.get_transport(self.test_dir)
+        url = t.abspath('test_bundle')
+        self.callDeprecated([deprecated_in((1, 12, 0))
+                             % 'bzrlib.bundle.read_bundle_from_url'],
+                            bzrlib.bundle.read_bundle_from_url,
+                            url)
+
+
 class TestReadBundleFromURL(TestTransportImplementation):
     """Test that read_bundle works properly across multiple transports"""
 
@@ -77,13 +103,20 @@
             self.log('Put to: %s', self.get_url('test_bundle'))
         return wt
 
-    def test_read_bundle_from_url(self):
+    def test_read_mergeable_from_url(self):
         self._captureVar('BZR_NO_SMART_VFS', None)
         wt = self.create_test_bundle()
         if wt is None:
             return
-        info = bzrlib.bundle.read_bundle_from_url(
-                    unicode(self.get_url('test_bundle')))
+        # read_mergeable_from_url will invoke get_transport which may *not*
+        # respect self._transport (i.e. returns a transport that is different
+        # from the one we want to test, so we must inject a correct transport
+        # into possible_transports first.
+        t = self.get_transport('test_bundle')
+        possible_transports = [t]
+        info = bzrlib.bundle.read_mergeable_from_url(
+                    unicode(self.get_url('test_bundle')),
+                    possible_transports=possible_transports)
         revision = info.real_revisions[-1]
         self.assertEqual('commit-1', revision.revision_id)
 
@@ -95,19 +128,28 @@
         if wt is None:
             return
 
-        self.assertRaises(errors.NotABundle, 
-            bzrlib.bundle.read_bundle_from_url, 
+        self.assertRaises(errors.NotABundle,
+            bzrlib.bundle.read_mergeable_from_url,
             self.get_url('tree'))
-        self.assertRaises(errors.NotABundle, 
-            bzrlib.bundle.read_bundle_from_url, 
+        self.assertRaises(errors.NotABundle,
+            bzrlib.bundle.read_mergeable_from_url,
             self.get_url('tree/a'))
 
-    def test_read_mergeable_populates_possible_transports(self):
+    def test_read_mergeable_respects_possible_transports(self):
+        t = self.get_transport('test_bundle')
+        if not isinstance(t, bzrlib.transport.ConnectedTransport):
+            # There is no point testing transport reuse for not connected
+            # transports (the test will fail even).
+            return
         self._captureVar('BZR_NO_SMART_VFS', None)
         wt = self.create_test_bundle()
         if wt is None:
             return
-        possible_transports = []
+        # read_mergeable_from_url will invoke get_transport which may *not*
+        # respect self._transport (i.e. returns a transport that is different
+        # from the one we want to test, so we must inject a correct transport
+        # into possible_transports first.
+        possible_transports = [t]
         url = unicode(self.get_url('test_bundle'))
         info = bzrlib.bundle.read_mergeable_from_url(url,
             possible_transports=possible_transports)

=== modified file 'bzrlib/transport/http/_urllib2_wrappers.py'
--- bzrlib/transport/http/_urllib2_wrappers.py	2009-01-29 14:27:28 +0000
+++ bzrlib/transport/http/_urllib2_wrappers.py	2009-02-09 18:25:43 +0000
@@ -79,8 +79,13 @@
         self._report_activity(len(s), 'read')
         return s
 
-    def readline(self, size=-1):
-        s = self.filesock.readline(size)
+    def readline(self):
+        # This should be readline(self, size=-1), but httplib in python 2.4 and
+        #  2.5 defines a SSLFile wrapper whose readline method lacks the size
+        #  parameter.  So until we drop support for 2.4 and 2.5 and since we
+        #  don't *need* the size parameter we'll stay with readline(self)
+        #  --  vila 20090209
+        s = self.filesock.readline()
         self._report_activity(len(s), 'read')
         return s
 

# Begin bundle
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

--=-=-=--



More information about the bazaar mailing list