]> granicus.if.org Git - python/commitdiff
Merged revisions 76196 via svnmerge from
authorAntoine Pitrou <solipsis@pitrou.net>
Tue, 10 Nov 2009 21:34:48 +0000 (21:34 +0000)
committerAntoine Pitrou <solipsis@pitrou.net>
Tue, 10 Nov 2009 21:34:48 +0000 (21:34 +0000)
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r76196 | antoine.pitrou | 2009-11-10 21:49:30 +0100 (mar., 10 nov. 2009) | 8 lines

  Issue #7197: Allow unittest.TextTestRunner objects to be pickled and
  unpickled. This fixes crashes under Windows when trying to run
  test_multiprocessing in verbose mode.

  Additionally, Test_TextTestRunner hadn't been enabled in test_unittest.
........

Lib/test/test_unittest.py
Lib/unittest/runner.py
Misc/NEWS

index b6100b15147e15374261280211d199b5ea672489..9cdca96f62fdc1c31a92fc7c58f7593b34532258 100644 (file)
@@ -17,6 +17,7 @@ from unittest import TestCase, TestProgram
 import types
 from copy import deepcopy
 import io
+import pickle
 
 ### Support code
 ################################################################
@@ -3441,6 +3442,17 @@ class Test_TextTestRunner(TestCase):
         expected = ['startTestRun', 'stopTestRun']
         self.assertEqual(events, expected)
 
+    def test_pickle_unpickle(self):
+        # Issue #7197: a TextTestRunner should be (un)pickleable. This is
+        # required by test_multiprocessing under Windows (in verbose mode).
+        stream = io.StringIO("foo")
+        runner = unittest.TextTestRunner(stream)
+        for protocol in range(2, pickle.HIGHEST_PROTOCOL + 1):
+            s = pickle.dumps(runner, protocol)
+            obj = pickle.loads(s)
+            # StringIO objects never compare equal, a cheap test instead.
+            self.assertEqual(obj.stream.getvalue(), stream.getvalue())
+
 
 class TestDiscovery(TestCase):
 
@@ -3729,7 +3741,7 @@ def test_main():
     support.run_unittest(Test_TestCase, Test_TestLoader,
         Test_TestSuite, Test_TestResult, Test_FunctionTestCase,
         Test_TestSkipping, Test_Assertions, TestLongMessage,
-        Test_TestProgram, TestCleanUp, TestDiscovery)
+        Test_TestProgram, TestCleanUp, TestDiscovery, Test_TextTestRunner)
 
 if __name__ == "__main__":
     test_main()
index ea3c5855c6f9212291d8440248595b7b0ef8076c..3ed9447164034d6946d88b87a081a9f77779c623 100644 (file)
@@ -12,6 +12,8 @@ class _WritelnDecorator(object):
         self.stream = stream
 
     def __getattr__(self, attr):
+        if attr in ('stream', '__getstate__'):
+            raise AttributeError(attr)
         return getattr(self.stream,attr)
 
     def writeln(self, arg=None):
index 978565a3aa5205449a2d7a456de63459d39ec65f..cf62a99761b11cd20a8b5929a930d628fec811c8 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -123,6 +123,10 @@ C-API
 Library
 -------
 
+- Issue #7197: Allow unittest.TextTestRunner objects to be pickled and
+  unpickled. This fixes crashes under Windows when trying to run
+  test_multiprocessing in verbose mode.
+
 - Issue #3001: Add a C implementation of recursive locks which is used by
   default when instantiating a `threading.RLock` object. This makes 
   recursive locks as fast as regular non-recursive locks (previously,