Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gevent
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
gevent
Commits
ea983355
Commit
ea983355
authored
Jan 15, 2018
by
Jason Madden
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactor test__queue for easier debugging. Solve a couple issues with leaktests and FFI
parent
30fe4b99
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
97 additions
and
68 deletions
+97
-68
src/gevent/_ffi/loop.py
src/gevent/_ffi/loop.py
+10
-1
src/gevent/_ffi/watcher.py
src/gevent/_ffi/watcher.py
+1
-4
src/gevent/libev/corecext.ppyx
src/gevent/libev/corecext.ppyx
+3
-1
src/gevent/libev/corecffi.py
src/gevent/libev/corecffi.py
+1
-1
src/gevent/libuv/loop.py
src/gevent/libuv/loop.py
+1
-1
src/gevent/queue.py
src/gevent/queue.py
+5
-1
src/greentest/greentest.py
src/greentest/greentest.py
+20
-23
src/greentest/test__queue.py
src/greentest/test__queue.py
+55
-35
src/greentest/util.py
src/greentest/util.py
+1
-1
No files found.
src/gevent/_ffi/loop.py
View file @
ea983355
...
@@ -531,11 +531,20 @@ class AbstractLoop(object):
...
@@ -531,11 +531,20 @@ class AbstractLoop(object):
pass
pass
def
now
(
self
):
def
now
(
self
):
"Return the loop's notion of the current time."
raise
NotImplementedError
()
raise
NotImplementedError
()
def
update
(
self
):
def
update_now
(
self
):
"Update the loop's notion of the current time."
raise
NotImplementedError
()
raise
NotImplementedError
()
def
update
(
self
):
import
warnings
warnings
.
warn
(
"'update' is deprecated; use 'update_now'"
,
DeprecationWarning
,
stacklevel
=
2
)
self
.
update_now
()
def
__repr__
(
self
):
def
__repr__
(
self
):
return
'<%s at 0x%x %s>'
%
(
self
.
__class__
.
__name__
,
id
(
self
),
self
.
_format
())
return
'<%s at 0x%x %s>'
%
(
self
.
__class__
.
__name__
,
id
(
self
),
self
.
_format
())
...
...
src/gevent/_ffi/watcher.py
View file @
ea983355
...
@@ -443,12 +443,9 @@ class TimerMixin(object):
...
@@ -443,12 +443,9 @@ class TimerMixin(object):
# good idea."
# good idea."
# 1.3 changed the default for this to False. Note that
# 1.3 changed the default for this to False. Note that
# starting Timeout objects internally still sets this to true.
# starting Timeout objects internally still sets this to true.
self
.
_update_now
()
self
.
loop
.
update
()
super
(
TimerMixin
,
self
).
start
(
callback
,
*
args
)
super
(
TimerMixin
,
self
).
start
(
callback
,
*
args
)
def
_update_now
(
self
):
raise
NotImplementedError
()
def
again
(
self
,
callback
,
*
args
,
**
kw
):
def
again
(
self
,
callback
,
*
args
,
**
kw
):
raise
NotImplementedError
()
raise
NotImplementedError
()
...
...
src/gevent/libev/corecext.ppyx
View file @
ea983355
...
@@ -420,10 +420,12 @@ cdef public class loop [object PyGeventLoopObject, type PyGeventLoop_Type]:
...
@@ -420,10 +420,12 @@ cdef public class loop [object PyGeventLoopObject, type PyGeventLoop_Type]:
CHECK_LOOP2(self)
CHECK_LOOP2(self)
return libev.ev_now(self._ptr)
return libev.ev_now(self._ptr)
def update(self):
def update
_now
(self):
CHECK_LOOP2(self)
CHECK_LOOP2(self)
libev.ev_now_update(self._ptr)
libev.ev_now_update(self._ptr)
update = update_now # Old name, deprecated.
def __repr__(self):
def __repr__(self):
return '<%s at 0x%x %s>' % (self.__class__.__name__, id(self), self._format())
return '<%s at 0x%x %s>' % (self.__class__.__name__, id(self), self._format())
...
...
src/gevent/libev/corecffi.py
View file @
ea983355
...
@@ -334,7 +334,7 @@ class loop(AbstractLoop):
...
@@ -334,7 +334,7 @@ class loop(AbstractLoop):
def
now
(
self
):
def
now
(
self
):
return
libev
.
ev_now
(
self
.
_ptr
)
return
libev
.
ev_now
(
self
.
_ptr
)
def
update
(
self
):
def
update
_now
(
self
):
libev
.
ev_now_update
(
self
.
_ptr
)
libev
.
ev_now_update
(
self
.
_ptr
)
def
__repr__
(
self
):
def
__repr__
(
self
):
...
...
src/gevent/libuv/loop.py
View file @
ea983355
...
@@ -389,7 +389,7 @@ class loop(AbstractLoop):
...
@@ -389,7 +389,7 @@ class loop(AbstractLoop):
def
now
(
self
):
def
now
(
self
):
return
libuv
.
uv_now
(
self
.
_ptr
)
return
libuv
.
uv_now
(
self
.
_ptr
)
def
update
(
self
):
def
update
_now
(
self
):
libuv
.
uv_update_time
(
self
.
_ptr
)
libuv
.
uv_update_time
(
self
.
_ptr
)
@
property
@
property
...
...
src/gevent/queue.py
View file @
ea983355
...
@@ -75,6 +75,8 @@ class Queue(object):
...
@@ -75,6 +75,8 @@ class Queue(object):
previously anyway, but that wasn't the case for PyPy.
previously anyway, but that wasn't the case for PyPy.
"""
"""
_warn_depth
=
2
def
__init__
(
self
,
maxsize
=
None
,
items
=
None
):
def
__init__
(
self
,
maxsize
=
None
,
items
=
None
):
if
maxsize
is
not
None
and
maxsize
<=
0
:
if
maxsize
is
not
None
and
maxsize
<=
0
:
self
.
maxsize
=
None
self
.
maxsize
=
None
...
@@ -83,7 +85,7 @@ class Queue(object):
...
@@ -83,7 +85,7 @@ class Queue(object):
warnings
.
warn
(
warnings
.
warn
(
'Queue(0) now equivalent to Queue(None); if you want a channel, use Channel'
,
'Queue(0) now equivalent to Queue(None); if you want a channel, use Channel'
,
DeprecationWarning
,
DeprecationWarning
,
stacklevel
=
2
)
stacklevel
=
self
.
_warn_depth
)
else
:
else
:
self
.
maxsize
=
maxsize
self
.
maxsize
=
maxsize
# Explicitly maintain order for getters and putters that block
# Explicitly maintain order for getters and putters that block
...
@@ -425,6 +427,8 @@ class JoinableQueue(Queue):
...
@@ -425,6 +427,8 @@ class JoinableQueue(Queue):
:meth:`task_done` and :meth:`join` methods.
:meth:`task_done` and :meth:`join` methods.
"""
"""
_warn_depth
=
3
def
__init__
(
self
,
maxsize
=
None
,
items
=
None
,
unfinished_tasks
=
None
):
def
__init__
(
self
,
maxsize
=
None
,
items
=
None
,
unfinished_tasks
=
None
):
"""
"""
...
...
src/greentest/greentest.py
View file @
ea983355
...
@@ -270,6 +270,11 @@ def wrap_refcount(method):
...
@@ -270,6 +270,11 @@ def wrap_refcount(method):
# Some builtin things that we ignore
# Some builtin things that we ignore
IGNORED_TYPES
=
(
tuple
,
dict
,
types
.
FrameType
,
types
.
TracebackType
)
IGNORED_TYPES
=
(
tuple
,
dict
,
types
.
FrameType
,
types
.
TracebackType
)
try
:
callback_kind
=
gevent
.
core
.
callback
except
AttributeError
:
# Must be using FFI.
from
gevent._ffi.callback
import
callback
as
callback_kind
def
type_hist
():
def
type_hist
():
import
collections
import
collections
...
@@ -278,7 +283,7 @@ def wrap_refcount(method):
...
@@ -278,7 +283,7 @@ def wrap_refcount(method):
k
=
type
(
x
)
k
=
type
(
x
)
if
k
in
IGNORED_TYPES
:
if
k
in
IGNORED_TYPES
:
continue
continue
if
k
==
gevent
.
core
.
callback
and
x
.
callback
is
None
and
x
.
args
is
None
:
if
k
==
callback_kind
and
x
.
callback
is
None
and
x
.
args
is
None
:
# these represent callbacks that have been stopped, but
# these represent callbacks that have been stopped, but
# the event loop hasn't cycled around to run them. The only
# the event loop hasn't cycled around to run them. The only
# known cause of this is killing greenlets before they get a chance
# known cause of this is killing greenlets before they get a chance
...
@@ -488,6 +493,13 @@ class TestCase(TestCaseMetaClass("NewBase", (BaseTestCase,), {})):
...
@@ -488,6 +493,13 @@ class TestCase(TestCaseMetaClass("NewBase", (BaseTestCase,), {})):
def
setUp
(
self
):
def
setUp
(
self
):
super
(
TestCase
,
self
).
setUp
()
super
(
TestCase
,
self
).
setUp
()
# Especially if we're running in leakcheck mode, where
# the same test gets executed repeatedly, we need to update the
# current time. Tests don't always go through the full event loop,
# so that doesn't always happen. test__pool.py:TestPoolYYY.test_async
# tends to show timeouts that are too short if we don't.
# XXX: Should some core part of the loop call this?
gevent
.
get_hub
().
loop
.
update_now
()
self
.
close_on_teardown
=
[]
self
.
close_on_teardown
=
[]
def
tearDown
(
self
):
def
tearDown
(
self
):
...
@@ -606,20 +618,6 @@ class TestCase(TestCaseMetaClass("NewBase", (BaseTestCase,), {})):
...
@@ -606,20 +618,6 @@ class TestCase(TestCaseMetaClass("NewBase", (BaseTestCase,), {})):
self
.
assertLessEqual
(
delay
,
max_time
)
self
.
assertLessEqual
(
delay
,
max_time
)
self
.
assertGreaterEqual
(
delay
,
min_time
)
self
.
assertGreaterEqual
(
delay
,
min_time
)
if
not
hasattr
(
BaseTestCase
,
'assertIsNot'
):
# Methods added in 3.1, backport for 2.7
def
assertIs
(
self
,
expr1
,
expr2
,
msg
=
None
):
"""Just like self.assertTrue(a is b), but with a nicer default message."""
if
expr1
is
not
expr2
:
standardMsg
=
'%s is not %s'
%
(
safe_repr
(
expr1
),
safe_repr
(
expr2
))
self
.
fail
(
self
.
_formatMessage
(
msg
,
standardMsg
))
def
assertIsNot
(
self
,
expr1
,
expr2
,
msg
=
None
):
"""Just like self.assertTrue(a is not b), but with a nicer default message."""
if
expr1
is
expr2
:
standardMsg
=
'unexpectedly identical: %s'
%
(
safe_repr
(
expr1
),)
self
.
fail
(
self
.
_formatMessage
(
msg
,
standardMsg
))
def
assertMonkeyPatchedFuncSignatures
(
self
,
mod_name
,
func_names
=
(),
exclude
=
()):
def
assertMonkeyPatchedFuncSignatures
(
self
,
mod_name
,
func_names
=
(),
exclude
=
()):
# We use inspect.getargspec because it's the only thing available
# We use inspect.getargspec because it's the only thing available
...
@@ -739,12 +737,10 @@ class _DelayWaitMixin(object):
...
@@ -739,12 +737,10 @@ class _DelayWaitMixin(object):
def
test_outer_timeout_is_not_lost
(
self
):
def
test_outer_timeout_is_not_lost
(
self
):
timeout
=
gevent
.
Timeout
.
start_new
(
0.001
,
ref
=
False
)
timeout
=
gevent
.
Timeout
.
start_new
(
0.001
,
ref
=
False
)
try
:
try
:
try
:
with
self
.
assertRaises
(
gevent
.
Timeout
)
as
exc
:
result
=
self
.
wait
(
timeout
=
1
)
result
=
self
.
wait
(
timeout
=
1
)
except
gevent
.
Timeout
as
ex
:
assert
ex
is
timeout
,
(
ex
,
timeout
)
self
.
assertIs
(
exc
.
exception
,
timeout
)
else
:
raise
AssertionError
(
'must raise Timeout (returned %r)'
%
(
result
,
))
finally
:
finally
:
timeout
.
cancel
()
timeout
.
cancel
()
...
@@ -775,7 +771,8 @@ class GenericGetTestCase(_DelayWaitMixin, TestCase):
...
@@ -775,7 +771,8 @@ class GenericGetTestCase(_DelayWaitMixin, TestCase):
pass
pass
def
test_raises_timeout_number
(
self
):
def
test_raises_timeout_number
(
self
):
self
.
assertRaises
(
self
.
Timeout
,
self
.
_wait_and_check
,
timeout
=
0.01
)
with
self
.
assertRaises
(
self
.
Timeout
):
self
.
_wait_and_check
(
timeout
=
0.01
)
# get raises Timeout after timeout expired
# get raises Timeout after timeout expired
self
.
cleanup
()
self
.
cleanup
()
...
@@ -784,7 +781,7 @@ class GenericGetTestCase(_DelayWaitMixin, TestCase):
...
@@ -784,7 +781,7 @@ class GenericGetTestCase(_DelayWaitMixin, TestCase):
try
:
try
:
self
.
_wait_and_check
(
timeout
=
timeout
)
self
.
_wait_and_check
(
timeout
=
timeout
)
except
gevent
.
Timeout
as
ex
:
except
gevent
.
Timeout
as
ex
:
assert
ex
is
timeout
,
(
ex
,
timeout
)
self
.
assertIs
(
ex
,
timeout
)
self
.
cleanup
()
self
.
cleanup
()
def
test_raises_timeout_Timeout_exc_customized
(
self
):
def
test_raises_timeout_Timeout_exc_customized
(
self
):
...
@@ -793,7 +790,7 @@ class GenericGetTestCase(_DelayWaitMixin, TestCase):
...
@@ -793,7 +790,7 @@ class GenericGetTestCase(_DelayWaitMixin, TestCase):
try
:
try
:
self
.
_wait_and_check
(
timeout
=
timeout
)
self
.
_wait_and_check
(
timeout
=
timeout
)
except
RuntimeError
as
ex
:
except
RuntimeError
as
ex
:
assert
ex
is
error
,
(
ex
,
error
)
self
.
assertIs
(
ex
,
error
)
self
.
cleanup
()
self
.
cleanup
()
...
...
src/greentest/test__queue.py
View file @
ea983355
...
@@ -107,7 +107,7 @@ class TestQueue(TestCase):
...
@@ -107,7 +107,7 @@ class TestQueue(TestCase):
sendings
=
[
'1'
,
'2'
,
'3'
,
'4'
]
sendings
=
[
'1'
,
'2'
,
'3'
,
'4'
]
evts
=
[
AsyncResult
()
for
x
in
sendings
]
evts
=
[
AsyncResult
()
for
x
in
sendings
]
for
i
,
x
in
enumerate
(
sendings
):
for
i
,
_
in
enumerate
(
sendings
):
gevent
.
spawn
(
waiter
,
q
,
evts
[
i
])
# XXX use waitall for them
gevent
.
spawn
(
waiter
,
q
,
evts
[
i
])
# XXX use waitall for them
gevent
.
sleep
(
0.01
)
# get 'em all waiting
gevent
.
sleep
(
0.01
)
# get 'em all waiting
...
@@ -244,22 +244,24 @@ class TestChannel(TestCase):
...
@@ -244,22 +244,24 @@ class TestChannel(TestCase):
self
.
assertEqual
([
'waiting'
,
'sending hello'
,
'hello'
,
'sending world'
,
'world'
,
'sent world'
],
events
)
self
.
assertEqual
([
'waiting'
,
'sending hello'
,
'hello'
,
'sending world'
,
'world'
,
'sent world'
],
events
)
g
.
get
()
g
.
get
()
def
test_task_done
(
self
):
channel
=
queue
.
JoinableQueue
(
0
)
X
=
object
()
gevent
.
spawn
(
channel
.
put
,
X
)
result
=
channel
.
get
()
assert
result
is
X
,
(
result
,
X
)
assert
channel
.
unfinished_tasks
==
1
,
channel
.
unfinished_tasks
channel
.
task_done
()
assert
channel
.
unfinished_tasks
==
0
,
channel
.
unfinished_tasks
def
test_iterable
(
self
):
def
test_iterable
(
self
):
channel
=
queue
.
Channel
()
channel
=
queue
.
Channel
()
gevent
.
spawn
(
channel
.
put
,
StopIteration
)
gevent
.
spawn
(
channel
.
put
,
StopIteration
)
r
=
list
(
channel
)
r
=
list
(
channel
)
self
.
assertEqual
(
r
,
[])
self
.
assertEqual
(
r
,
[])
class
TestJoinableQueue
(
TestCase
):
def
test_task_done
(
self
):
channel
=
queue
.
JoinableQueue
()
X
=
object
()
gevent
.
spawn
(
channel
.
put
,
X
)
result
=
channel
.
get
()
self
.
assertIs
(
result
,
X
)
self
.
assertEqual
(
1
,
channel
.
unfinished_tasks
)
channel
.
task_done
()
self
.
assertEqual
(
0
,
channel
.
unfinished_tasks
)
class
TestNoWait
(
TestCase
):
class
TestNoWait
(
TestCase
):
...
@@ -370,44 +372,62 @@ class TestJoinEmpty(TestCase):
...
@@ -370,44 +372,62 @@ class TestJoinEmpty(TestCase):
q
.
join
()
q
.
join
()
def
make_get_interrupt
(
queue_type
):
class
TestGetInterrupt
(
GenericGetTestCase
):
Timeout
=
Empty
kind
=
queue
.
Queue
def
wait
(
self
,
timeout
):
return
self
.
_makeOne
().
get
(
timeout
=
timeout
)
def
_makeOne
(
self
):
return
self
.
kind
()
class
TestGetInterruptJoinableQueue
(
TestGetInterrupt
):
kind
=
queue
.
JoinableQueue
class
TestGetInterrupt
(
GenericGetTestCase
):
class
TestGetInterruptLifoQueue
(
TestGetInterrupt
):
kind
=
queue
.
LifoQueue
Timeout
=
Empty
class
TestGetInterruptPriorityQueue
(
TestGetInterrupt
):
kind
=
queue
.
PriorityQueue
def
wait
(
self
,
timeou
t
):
class
TestGetInterruptChannel
(
TestGetInterrup
t
):
return
queue_type
().
get
(
timeout
=
timeout
)
kind
=
queue
.
Channel
TestGetInterrupt
.
__name__
+=
'_'
+
queue_type
.
__name__
return
TestGetInterrupt
class
TestPutInterrupt
(
GenericGetTestCase
):
kind
=
queue
.
Queue
Timeout
=
Full
for
queue_type
in
[
queue
.
Queue
,
queue
.
JoinableQueue
,
queue
.
LifoQueue
,
queue
.
PriorityQueue
,
queue
.
Channel
]:
def
setUp
(
self
):
klass
=
make_get_interrupt
(
queue_type
)
super
(
TestPutInterrupt
,
self
).
setUp
()
globals
()[
klass
.
__name__
]
=
klass
self
.
queue
=
self
.
_makeOne
()
del
klass
,
queue_type
def
wait
(
self
,
timeout
):
while
not
self
.
queue
.
full
():
self
.
queue
.
put
(
1
)
return
self
.
queue
.
put
(
2
,
timeout
=
timeout
)
def
make_put_interrupt
(
queue
):
def
_makeOne
(
self
):
return
self
.
kind
(
1
)
class
TestPutInterrupt
(
GenericGetTestCase
):
Timeout
=
Full
class
TestPutInterruptJoinableQueue
(
TestPutInterrupt
):
kind
=
queue
.
JoinableQueue
def
wait
(
self
,
timeout
):
class
TestPutInterruptLifoQueue
(
TestPutInterrupt
):
while
not
queue
.
full
():
kind
=
queue
.
LifoQueue
queue
.
put
(
1
)
return
queue
.
put
(
2
,
timeout
=
timeout
)
TestPutInterrupt
.
__name__
+=
'_'
+
queue
.
__class__
.
__name__
class
TestPutInterruptPriorityQueue
(
TestPutInterrupt
):
return
TestPutInterrupt
kind
=
queue
.
PriorityQueue
class
TestPutInterruptChannel
(
TestPutInterrupt
):
kind
=
queue
.
Channel
for
obj
in
[
queue
.
Queue
(
1
),
queue
.
JoinableQueue
(
1
),
queue
.
LifoQueue
(
1
),
queue
.
PriorityQueue
(
1
),
queue
.
Channel
()]:
def
_makeOne
(
self
):
klass
=
make_put_interrupt
(
obj
)
return
self
.
kind
()
globals
()[
klass
.
__name__
]
=
klass
del
klass
,
obj
del
GenericGetTestCase
del
GenericGetTestCase
...
...
src/greentest/util.py
View file @
ea983355
...
@@ -110,7 +110,7 @@ def getname(command, env=None, setenv=None):
...
@@ -110,7 +110,7 @@ def getname(command, env=None, setenv=None):
env
.
update
(
setenv
or
{})
env
.
update
(
setenv
or
{})
for
key
,
value
in
sorted
(
env
.
items
()):
for
key
,
value
in
sorted
(
env
.
items
()):
if
key
.
startswith
(
'GEVENT
_'
)
or
key
.
startswith
(
'GEVENTARES_
'
):
if
key
.
startswith
(
'GEVENT'
):
result
.
append
(
'%s=%s'
%
(
key
,
value
))
result
.
append
(
'%s=%s'
%
(
key
,
value
))
if
isinstance
(
command
,
six
.
string_types
):
if
isinstance
(
command
,
six
.
string_types
):
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment