Skip to content

Commit 62ec95b

Browse files
author
Anselm Kruis
committed
Cleanups, Python 3.3 compatibility, a few additional signature test cases
1 parent 3340e87 commit 62ec95b

File tree

3 files changed

+214
-81
lines changed

3 files changed

+214
-81
lines changed

stackless_testsuite/v3_1/tasklet/test_functionality.py

Lines changed: 126 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@
2626
import stackless_testsuite.v3_1.tasklet # @NoMove @UnusedImport
2727
__package__ = "stackless_testsuite.v3_1.tasklet" # @ReservedAssignment
2828

29+
try:
30+
xrange
31+
except NameError:
32+
xrange = range
33+
34+
2935
if hasattr(threading, "main_thread"):
3036
# Python 3.4 and later
3137
def main_thread_id():
@@ -51,85 +57,133 @@ class TaskletTest(StacklessTestCase):
5157
# Test method signatures
5258
#
5359
def testSig_constructor(self):
54-
self.assertIsInstance(stackless.tasklet(), stackless.tasklet)
55-
self.assertIsInstance(stackless.tasklet(func=nop, args=(), kwargs={}), stackless.tasklet)
56-
self.assertRaisesRegexp(TypeError, r"takes at most 3 arguments", stackless.tasklet, None, None, None, None)
60+
self.skipTest("crash, see https://bitbucket.org/stackless-dev/stackless/issues/77/null-pointer-access-in-stackless-module")
61+
# tasklet(func=None, args=None, kwargs=None)
62+
for ret in self.checkSignatureNamedArgs(stackless.tasklet, 0, None, "func", None, "args", None, "kwargs", None):
63+
self.assertIsInstance(ret, stackless.tasklet)
5764

5865
def testSig_bind(self):
59-
def f():
60-
pass
66+
# tasklet.bind(func=None, args=None, kwargs=None)
6167
t = stackless.tasklet()
62-
self.assertIsInstance(t.bind(), stackless.tasklet)
63-
self.assertIsInstance(t.bind(func=nop, args=(), kwargs={}), stackless.tasklet)
64-
self.assertRaisesRegexp(TypeError, r"takes at most 3 arguments", t.bind, None, None, None, None)
68+
for ret in self.checkSignatureNamedArgs(t.bind, 0, None, "func", nop, "args", (), "kwargs", {}):
69+
self.assertIsInstance(ret, stackless.tasklet)
6570

6671
def testSig_setup(self):
72+
# setup(*args, **kw)
6773
t = stackless.tasklet(nop)
68-
self.assertIsInstance(t.setup(), stackless.tasklet)
69-
t.remove().bind(nop)
70-
# test for setup(*args, **kw)
71-
t.setup(*range(20), completely_nonsense_name=True, another_name=False)
72-
t.kill()
74+
self.addCleanup(t.kill)
75+
for res in self.checkSignatureArbitraryArgsAndKw(t.setup, 0, *range(20)):
76+
self.assertIsInstance(res, stackless.tasklet)
77+
t.remove().bind(nop)
78+
79+
def testSig___call__(self):
80+
# __call__(*args, **kw)
81+
t = stackless.tasklet(nop)
82+
self.addCleanup(t.kill)
83+
for res in self.checkSignatureArbitraryArgsAndKw(t, 0, *range(20)):
84+
self.assertIsInstance(res, stackless.tasklet)
85+
t.remove().bind(nop)
7386

7487
def testSig_insert(self):
7588
t = stackless.tasklet(nop, ())
76-
self.assertRaisesRegexp(TypeError, r"takes no arguments", t.insert, None)
77-
t.insert()
89+
self.assertCallableWith0Args(t.insert)
90+
self.assertIs(t, t.insert())
7891
t.kill()
7992

8093
def testSig_remove(self):
8194
t = stackless.tasklet(nop)()
82-
self.assertRaisesRegexp(TypeError, r"takes no arguments", t.remove, None)
83-
t.remove()
95+
self.assertCallableWith0Args(t.remove)
96+
self.assertIs(t, t.remove())
8497
t.kill()
8598

8699
def testSig_run(self):
87100
t = stackless.tasklet(nop)()
88-
self.assertRaisesRegexp(TypeError, r"takes no arguments", t.run, None)
89-
t.run()
101+
self.assertCallableWith0Args(t.run)
102+
o = object()
103+
stackless.current.tempval = o
104+
self.assertIs(o, t.run())
90105

91106
def testSig_switch(self):
92107
t = stackless.tasklet(nop)()
93-
self.assertRaisesRegexp(TypeError, r"takes no arguments", t.switch, None)
94-
t.switch()
108+
self.assertCallableWith0Args(t.switch)
109+
o = object()
110+
stackless.current.tempval = o
111+
self.assertIs(o, t.switch())
95112

96113
def testSig_raise_exception(self):
97114
# documented: raise_exception(exc_class, *args)
98115
# implemented: raise_exception(*args) with a check for args[0] being an Exception
99-
t = stackless.tasklet(nop)()
100-
# TypeError would be correct, bit Stackless Python raises ValueError
101-
self.assertRaises((TypeError, ValueError), t.raise_exception)
102-
self.assertRaisesRegexp(TypeError, r"unexpected keyword argument|takes no keyword arguments", t.raise_exception, foo_bar_blub=True)
103-
t.raise_exception(TaskletExit, *range(10))
116+
done = []
117+
118+
def f():
119+
while True:
120+
try:
121+
stackless.schedule_remove()
122+
except TestError:
123+
done.append(True)
124+
t = stackless.tasklet(f)()
125+
stackless.run()
126+
self.addCleanup(t.kill)
127+
for ret in self.checkSignatureArbitraryArgs(t.raise_exception, 1, "exc_class", TestError, *xrange(20)):
128+
self.assertIsNone(ret)
129+
self.assertTrue(done)
104130

105131
def testSig_throw(self):
106132
# throw(exc=None, val=None, tb=None, pending=False)
107-
t = stackless.tasklet(nop)()
108-
self.assertRaisesRegexp(TypeError, "Required argument 'exc' \(pos 1\) not found", t.throw)
109-
self.assertRaisesRegexp(TypeError, "takes at most 4 arguments", t.throw, TaskletExit, None, None, False, None)
110-
t.throw(exc=TaskletExit, val=TaskletExit(), tb=None, pending=False)
133+
done = []
134+
135+
def f():
136+
while True:
137+
try:
138+
stackless.schedule_remove()
139+
except TestError:
140+
done.append(True)
141+
t = stackless.tasklet(f)()
142+
stackless.run()
143+
self.addCleanup(t.kill)
144+
for ret in self.checkSignatureNamedArgs(t.throw, 1, None, "exc", TestError, "val", None, "tb", None, "pending", False):
145+
self.assertIsNone(ret)
146+
self.assertTrue(done)
111147

112148
def testSig_kill(self):
113149
# kill(pending=False)
114150
t = stackless.tasklet(nop)()
115-
t.kill()
116-
t = stackless.tasklet(nop)()
117-
self.assertRaisesRegexp(TypeError, "takes at most 1 argument", t.kill, False, None)
118-
t.kill(pending=False)
151+
t.tempval = 1
152+
for ret in self.checkSignatureNamedArgs(t.kill, 0, None, "pending", False):
153+
self.assertIsNone(ret)
154+
t = stackless.tasklet(nop)()
119155

120156
def testSig_set_atomic(self):
121157
# set_atomic(flag)
122158
# Stackless: keyword argument not supported
123159
t = stackless.tasklet()
124-
self.assertRaisesRegexp(TypeError, "takes exactly one argument", t.set_atomic)
160+
for ret in self.checkSignatureNamedArgs(t.set_atomic, 1, None, "flag", False):
161+
self.assertIsInstance(ret, bool)
125162

126163
def testSig_bind_thread(self):
127164
# bind_thread([thread_id])
128165
# Stackless: keyword argument not supported
129166
t = stackless.tasklet(nop, ())
130-
self.assertRaisesRegexp(TypeError, "takes at most 1 argument", t.bind_thread, None, None)
131-
t.bind_thread()
132-
t.bind_thread(-1)
167+
for ret in self.checkSignatureNamedArgs(t.bind_thread, 0, None, "thread_id", -1):
168+
self.assertIsNone(ret)
169+
170+
def testAttr_prev_next(self):
171+
t = stackless.tasklet()
172+
self.addCleanup(t.kill)
173+
self.assertIsNone(t.prev)
174+
self.assertIsNone(t.next)
175+
t.bind(nop)
176+
self.assertIsNone(t.prev)
177+
self.assertIsNone(t.next)
178+
t()
179+
self.assertIs(stackless.main, t.prev)
180+
self.assertIs(stackless.current, t.next)
181+
t2 = stackless.tasklet(nop)()
182+
self.addCleanup(t2.kill)
183+
self.assertIs(stackless.current, t.prev)
184+
self.assertIs(t2, t.next)
185+
self.assertIs(t, t2.prev)
186+
self.assertIs(stackless.current, t2.next)
133187

134188
#
135189
# Test state transitions from stackless/tasklets.html#tasklet-life-cycle
@@ -167,38 +221,56 @@ def check_tasklet_flags(self, tlet,
167221
self.check_flag(tlet, "is_main", is_main)
168222

169223
def assert_state_notalive(self, tlet, **kw):
170-
self.check_tasklet_flags(tlet, restorable=True, **kw)
224+
kw.setdefault("restorable", True)
225+
self.check_tasklet_flags(tlet, **kw)
171226
if kw.get("tempval") != "ignore":
172227
self.assertIsNone(tlet.tempval)
173228

174229
def assert_state_bound(self, tlet, func, **kw):
175-
self.check_tasklet_flags(tlet, restorable=True, **kw)
230+
kw.setdefault("restorable", True)
231+
self.check_tasklet_flags(tlet, **kw)
176232
if kw.get("tempval") != "ignore":
177233
self.assertIs(func, tlet.tempval)
178234

179235
def assert_state_scheduled(self, tlet, **kw):
180-
self.check_tasklet_flags(tlet, alive=True, scheduled=True, restorable=True, **kw)
236+
kw.setdefault("alive", True)
237+
kw.setdefault("scheduled", True)
238+
kw.setdefault("restorable", True)
239+
self.check_tasklet_flags(tlet, **kw)
181240
if kw.get("tempval") != "ignore":
182241
self.assertIsNone(tlet.tempval)
183242

184243
def assert_state_paused(self, tlet, **kw):
185-
self.check_tasklet_flags(tlet, alive=True, paused=True, restorable=True, **kw)
244+
kw.setdefault("alive", True)
245+
kw.setdefault("paused", True)
246+
kw.setdefault("restorable", True)
247+
self.check_tasklet_flags(tlet, **kw)
186248
if kw.get("tempval") != "ignore":
187249
self.assertIsNone(tlet.tempval)
188250

189251
def assert_state_current(self, tlet, **kw):
190-
self.check_tasklet_flags(tlet, alive=True, restorable=True, is_current=True, scheduled=True, **kw)
252+
kw.setdefault("alive", True)
253+
kw.setdefault("is_current", True)
254+
kw.setdefault("scheduled", True)
255+
kw.setdefault("restorable", True)
256+
self.check_tasklet_flags(tlet, **kw)
191257
if kw.get("tempval") != "ignore":
192258
self.assertIsNone(tlet.tempval)
193259

194260
def assert_state_scheduler(self, tlet, **kw):
195261
"""tasklet has called stackless.run()"""
196-
self.check_tasklet_flags(tlet, alive=True, paused=True, **kw)
262+
kw.setdefault("alive", True)
263+
kw.setdefault("paused", True)
264+
self.check_tasklet_flags(tlet, **kw)
197265
if kw.get("tempval") != "ignore":
198266
self.assertIsNone(tlet.tempval)
199267

200268
def assert_state_blocked(self, tlet, **kw):
201-
self.check_tasklet_flags(tlet, alive=True, restorable=True, blocked=True, scheduled=True, **kw)
269+
kw.setdefault("alive", True)
270+
kw.setdefault("scheduled", True)
271+
kw.setdefault("blocked", True)
272+
kw.setdefault("restorable", True)
273+
self.check_tasklet_flags(tlet, **kw)
202274
if kw.get("tempval") != "ignore":
203275
self.assertIsNone(tlet.tempval)
204276

@@ -375,9 +447,9 @@ def testLC_paused_current_notalive(self):
375447

376448
def f_run(self, other_tlet):
377449
self.assert_state_current(t)
378-
self.assert_state_scheduled(other_tlet, is_main=True)
450+
self.assert_state_scheduled(other_tlet, is_main=True, restorable="ignore")
379451
result.append(0)
380-
t.bind(f_run, (self, stackless.current)) # @UndefinedVariable
452+
t.bind(f_run, (self, stackless.current))
381453
# check state
382454
self.assert_state_paused(t)
383455
# change state
@@ -389,11 +461,11 @@ def f_run(self, other_tlet):
389461
# Variant using switch
390462
def f_switch(self, other_tlet):
391463
self.assert_state_current(t)
392-
self.assert_state_paused(other_tlet, is_main=True)
464+
self.assert_state_paused(other_tlet, is_main=True, restorable="ignore")
393465
result.append(1)
394466

395467
del result[:]
396-
t.bind(f_switch, (self, stackless.current)) # @UndefinedVariable
468+
t.bind(f_switch, (self, stackless.current))
397469
# check state
398470
self.assert_state_paused(t)
399471
# change state
@@ -409,9 +481,9 @@ def testLC_scheduled_current_notalive(self):
409481

410482
def f_run(self, other_tlet):
411483
self.assert_state_current(t)
412-
self.assert_state_scheduled(other_tlet, is_main=True)
484+
self.assert_state_scheduled(other_tlet, is_main=True, restorable="ignore")
413485
result.append(0)
414-
t.bind(f_run).setup(self, stackless.current) # @UndefinedVariable
486+
t.bind(f_run).setup(self, stackless.current)
415487
# check state
416488
self.assert_state_scheduled(t)
417489
# change state
@@ -423,11 +495,11 @@ def f_run(self, other_tlet):
423495
# Variant using switch
424496
def f_switch(self, other_tlet):
425497
self.assert_state_current(t)
426-
self.assert_state_paused(other_tlet, is_main=True)
498+
self.assert_state_paused(other_tlet, is_main=True, restorable="ignore")
427499
result.append(1)
428500

429501
del result[:]
430-
t.bind(f_switch).setup(self, stackless.current) # @UndefinedVariable
502+
t.bind(f_switch).setup(self, stackless.current)
431503
# check state
432504
self.assert_state_scheduled(t)
433505
# change state
@@ -443,7 +515,7 @@ def f_stackless_run(self, other_tlet):
443515
result.append(2)
444516

445517
del result[:]
446-
t.bind(f_stackless_run).setup(self, stackless.current) # @UndefinedVariable
518+
t.bind(f_stackless_run).setup(self, stackless.current)
447519
# check state
448520
self.assert_state_scheduled(t)
449521
# change state

stackless_testsuite/v3_1/tasklet/test_thread.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@
2727
from stackless_testsuite.util import StacklessTestCase, AsTaskletTestCase
2828
try:
2929
import threading
30-
import thread
30+
try:
31+
import thread
32+
except ImportError:
33+
import _thread as thread
3134
withThreads = True
3235
except:
3336
withThreads = False
@@ -537,6 +540,7 @@ def create_tasklet(self, action, *args, **kw):
537540
self.event.set()
538541

539542
def test_setup_from_other_thread(self):
543+
self.skipTest("crash, see https://bitbucket.org/stackless-dev/stackless/issue/60")
540544
theThread, t = self.create_thread_task()
541545
t.setup()
542546
theThread.join()

0 commit comments

Comments
 (0)