2 from doctest
import DocTestSuite
3 from test
import test_support
11 def target(local
, weaklist
):
14 weaklist
.append(weakref
.ref(weak
))
16 class ThreadingLocalTest(unittest
.TestCase
):
18 def test_local_refs(self
):
23 def _local_refs(self
, n
):
24 local
= threading
.local()
27 t
= threading
.Thread(target
=target
, args
=(local
, weaklist
))
33 self
.assertEqual(len(weaklist
), n
)
35 # XXX threading.local keeps the local of the last stopped thread alive.
36 deadlist
= [weak
for weak
in weaklist
if weak() is None]
37 self
.assertEqual(len(deadlist
), n
-1)
39 # Assignment to the same thread local frees it sometimes (!)
40 local
.someothervar
= None
42 deadlist
= [weak
for weak
in weaklist
if weak() is None]
43 self
.assert_(len(deadlist
) in (n
-1, n
), (n
, len(deadlist
)))
45 def test_derived(self
):
46 # Issue 3088: if there is a threads switch inside the __init__
47 # of a threading.local derived class, the per-thread dictionary
48 # is created but not correctly set on the object.
49 # The first member set may be bogus.
51 class Local(threading
.local
):
58 # Simply check that the variable is correctly set
59 self
.assertEqual(local
.x
, i
)
63 t
= threading
.Thread(target
=f
, args
=(i
,))
72 suite
= unittest
.TestSuite()
73 suite
.addTest(DocTestSuite('_threading_local'))
74 suite
.addTest(unittest
.makeSuite(ThreadingLocalTest
))
77 from thread
import _local
81 import _threading_local
82 local_orig
= _threading_local
.local
84 _threading_local
.local
= _local
86 _threading_local
.local
= local_orig
87 suite
.addTest(DocTestSuite('_threading_local',
88 setUp
=setUp
, tearDown
=tearDown
)
91 test_support
.run_unittest(suite
)
93 if __name__
== '__main__':