26
26
import stackless_testsuite .v3_1 .tasklet # @NoMove @UnusedImport
27
27
__package__ = "stackless_testsuite.v3_1.tasklet" # @ReservedAssignment
28
28
29
+ try :
30
+ xrange
31
+ except NameError :
32
+ xrange = range
33
+
34
+
29
35
if hasattr (threading , "main_thread" ):
30
36
# Python 3.4 and later
31
37
def main_thread_id ():
@@ -51,85 +57,133 @@ class TaskletTest(StacklessTestCase):
51
57
# Test method signatures
52
58
#
53
59
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 )
57
64
58
65
def testSig_bind (self ):
59
- def f ():
60
- pass
66
+ # tasklet.bind(func=None, args=None, kwargs=None)
61
67
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 )
65
70
66
71
def testSig_setup (self ):
72
+ # setup(*args, **kw)
67
73
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 )
73
86
74
87
def testSig_insert (self ):
75
88
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 () )
78
91
t .kill ()
79
92
80
93
def testSig_remove (self ):
81
94
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 () )
84
97
t .kill ()
85
98
86
99
def testSig_run (self ):
87
100
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 ())
90
105
91
106
def testSig_switch (self ):
92
107
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 ())
95
112
96
113
def testSig_raise_exception (self ):
97
114
# documented: raise_exception(exc_class, *args)
98
115
# 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 )
104
130
105
131
def testSig_throw (self ):
106
132
# 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 )
111
147
112
148
def testSig_kill (self ):
113
149
# kill(pending=False)
114
150
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 )( )
119
155
120
156
def testSig_set_atomic (self ):
121
157
# set_atomic(flag)
122
158
# Stackless: keyword argument not supported
123
159
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 )
125
162
126
163
def testSig_bind_thread (self ):
127
164
# bind_thread([thread_id])
128
165
# Stackless: keyword argument not supported
129
166
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 )
133
187
134
188
#
135
189
# Test state transitions from stackless/tasklets.html#tasklet-life-cycle
@@ -167,38 +221,56 @@ def check_tasklet_flags(self, tlet,
167
221
self .check_flag (tlet , "is_main" , is_main )
168
222
169
223
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 )
171
226
if kw .get ("tempval" ) != "ignore" :
172
227
self .assertIsNone (tlet .tempval )
173
228
174
229
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 )
176
232
if kw .get ("tempval" ) != "ignore" :
177
233
self .assertIs (func , tlet .tempval )
178
234
179
235
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 )
181
240
if kw .get ("tempval" ) != "ignore" :
182
241
self .assertIsNone (tlet .tempval )
183
242
184
243
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 )
186
248
if kw .get ("tempval" ) != "ignore" :
187
249
self .assertIsNone (tlet .tempval )
188
250
189
251
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 )
191
257
if kw .get ("tempval" ) != "ignore" :
192
258
self .assertIsNone (tlet .tempval )
193
259
194
260
def assert_state_scheduler (self , tlet , ** kw ):
195
261
"""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 )
197
265
if kw .get ("tempval" ) != "ignore" :
198
266
self .assertIsNone (tlet .tempval )
199
267
200
268
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 )
202
274
if kw .get ("tempval" ) != "ignore" :
203
275
self .assertIsNone (tlet .tempval )
204
276
@@ -375,9 +447,9 @@ def testLC_paused_current_notalive(self):
375
447
376
448
def f_run (self , other_tlet ):
377
449
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" )
379
451
result .append (0 )
380
- t .bind (f_run , (self , stackless .current )) # @UndefinedVariable
452
+ t .bind (f_run , (self , stackless .current ))
381
453
# check state
382
454
self .assert_state_paused (t )
383
455
# change state
@@ -389,11 +461,11 @@ def f_run(self, other_tlet):
389
461
# Variant using switch
390
462
def f_switch (self , other_tlet ):
391
463
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" )
393
465
result .append (1 )
394
466
395
467
del result [:]
396
- t .bind (f_switch , (self , stackless .current )) # @UndefinedVariable
468
+ t .bind (f_switch , (self , stackless .current ))
397
469
# check state
398
470
self .assert_state_paused (t )
399
471
# change state
@@ -409,9 +481,9 @@ def testLC_scheduled_current_notalive(self):
409
481
410
482
def f_run (self , other_tlet ):
411
483
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" )
413
485
result .append (0 )
414
- t .bind (f_run ).setup (self , stackless .current ) # @UndefinedVariable
486
+ t .bind (f_run ).setup (self , stackless .current )
415
487
# check state
416
488
self .assert_state_scheduled (t )
417
489
# change state
@@ -423,11 +495,11 @@ def f_run(self, other_tlet):
423
495
# Variant using switch
424
496
def f_switch (self , other_tlet ):
425
497
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" )
427
499
result .append (1 )
428
500
429
501
del result [:]
430
- t .bind (f_switch ).setup (self , stackless .current ) # @UndefinedVariable
502
+ t .bind (f_switch ).setup (self , stackless .current )
431
503
# check state
432
504
self .assert_state_scheduled (t )
433
505
# change state
@@ -443,7 +515,7 @@ def f_stackless_run(self, other_tlet):
443
515
result .append (2 )
444
516
445
517
del result [:]
446
- t .bind (f_stackless_run ).setup (self , stackless .current ) # @UndefinedVariable
518
+ t .bind (f_stackless_run ).setup (self , stackless .current )
447
519
# check state
448
520
self .assert_state_scheduled (t )
449
521
# change state
0 commit comments