Rev 3176: More robust test serialization. in file:///v/home/vila/src/bzr/experimental/selftest/

Vincent Ladeuil v.ladeuil+lp at free.fr
Thu Jan 10 19:54:04 GMT 2008


At file:///v/home/vila/src/bzr/experimental/selftest/

------------------------------------------------------------
revno: 3176
revision-id:v.ladeuil+lp at free.fr-20080110195359-wg1nrabfxb0poh24
parent: v.ladeuil+lp at free.fr-20080110162307-4ccv5e7140qf8cig
committer: Vincent Ladeuil <v.ladeuil+lp at free.fr>
branch nick: selftest
timestamp: Thu 2008-01-10 20:53:59 +0100
message:
  More robust test serialization.
  
  * bzrlib/tests/test_selftest.py:
  (TestSelftestLoader): Add a test for unpickable tests.
  
  * bzrlib/tests/__init__.py:
  (save_test_list): Protect against unpickable tests.
modified:
  bzrlib/tests/__init__.py       selftest.py-20050531073622-8d0e3c8845c97a64
  bzrlib/tests/test_selftest.py  test_selftest.py-20051202044319-c110a115d8c0456a
-------------- next part --------------
=== modified file 'bzrlib/tests/__init__.py'
--- a/bzrlib/tests/__init__.py	2008-01-10 16:23:07 +0000
+++ b/bzrlib/tests/__init__.py	2008-01-10 19:53:59 +0000
@@ -2701,11 +2701,19 @@
     return suite
 
 
-def save_test_list(suite, file_name):
+def save_test_list(suite, file_name, stream=sys.stderr):
     ftest = open(file_name, 'wb')
     pickler = cPickle.Pickler(ftest, cPickle.HIGHEST_PROTOCOL)
+    fpos = ftest.tell()
     for t in iter_suite_tests(suite):
-        pickler.dump(t)
+        try:
+            pickler.dump(t)
+        except cPickle.PicklingError, e:
+            ftest.truncate(fpos) # Get rid of partial pickle
+            ftest.seek(fpos, 0)
+            stream.write('Excluding %s: %s\n' % (t, e))
+        else:
+            fpos = ftest.tell()
     ftest.close()
 
 
@@ -2718,6 +2726,7 @@
             raise
         else:
             raise errors.NoSuchFile(file_name)
+
     pick = cPickle.Unpickler(ftest)
     suite = TestUtil.TestSuite()
     while True:

=== modified file 'bzrlib/tests/test_selftest.py'
--- a/bzrlib/tests/test_selftest.py	2008-01-10 16:23:07 +0000
+++ b/bzrlib/tests/test_selftest.py	2008-01-10 19:53:59 +0000
@@ -18,6 +18,7 @@
 
 import cStringIO
 import cPickle
+import doctest
 import os
 from StringIO import StringIO
 import sys
@@ -1884,8 +1885,6 @@
         suite = self._create_test_list()
         ref_test_id = tests.iter_suite_tests(suite).next().id()
 
-        out = StringIO()
-        err = StringIO()
         result, runned_suite = self._run_suite(suite)
         runned_tests =  list(tests.iter_suite_tests(runned_suite))
         self.assertEqual(1, len(runned_tests))
@@ -1918,3 +1917,18 @@
         reloaded_tests =  list(tests.iter_suite_tests(reloaded_suite))
         self.assertEqual(1, len(reloaded_tests))
 
+    def test_cannot_save_unpickable_test(self):
+
+        class InnerStub(TestCase):
+            def test_bar(self):
+                pass
+
+        suite = tests.TestSuite()
+        unpickable = InnerStub('test_bar')
+        suite.addTest(unpickable)
+        partial_fname = 'partial'
+        out = StringIO()
+        tests.save_test_list(suite, partial_fname, stream=out)
+        self.assertContainsRe(out.getvalue(), r"Excluding test_bar.*InnerStub")
+        # Since no test was saved, the file size should be 0
+        self.assertEquals(0, os.stat(partial_fname)[6])



More information about the bazaar-commits mailing list