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
0996f427
Commit
0996f427
authored
Mar 03, 2018
by
Jason Madden
Committed by
GitHub
Mar 03, 2018
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1132 from gevent/update-3.7.0b2
Update to 3.7.0b2
parents
e97ed2aa
88e772ca
Changes
25
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
25 changed files
with
579 additions
and
186 deletions
+579
-186
.travis.yml
.travis.yml
+1
-1
CHANGES.rst
CHANGES.rst
+1
-1
Makefile
Makefile
+4
-3
ci-requirements.txt
ci-requirements.txt
+1
-1
scripts/install.sh
scripts/install.sh
+2
-2
src/gevent/_ffi/loop.py
src/gevent/_ffi/loop.py
+5
-3
src/gevent/_socket3.py
src/gevent/_socket3.py
+24
-1
src/gevent/_socketcommon.py
src/gevent/_socketcommon.py
+7
-7
src/gevent/_ssl3.py
src/gevent/_ssl3.py
+35
-4
src/gevent/event.py
src/gevent/event.py
+1
-4
src/gevent/libuv/_corecffi_cdef.c
src/gevent/libuv/_corecffi_cdef.c
+4
-0
src/gevent/libuv/_corecffi_source.c
src/gevent/libuv/_corecffi_source.c
+1
-0
src/gevent/libuv/watcher.py
src/gevent/libuv/watcher.py
+10
-6
src/gevent/socket.py
src/gevent/socket.py
+1
-1
src/greentest/3.7/test_ftplib.py
src/greentest/3.7/test_ftplib.py
+6
-0
src/greentest/3.7/test_socket.py
src/greentest/3.7/test_socket.py
+88
-0
src/greentest/3.7/test_ssl.py
src/greentest/3.7/test_ssl.py
+342
-113
src/greentest/3.7/test_subprocess.py
src/greentest/3.7/test_subprocess.py
+1
-32
src/greentest/3.7/version
src/greentest/3.7/version
+1
-1
src/greentest/greentest/patched_tests_setup.py
src/greentest/greentest/patched_tests_setup.py
+15
-1
src/greentest/greentest/testrunner.py
src/greentest/greentest/testrunner.py
+7
-0
src/greentest/known_failures.py
src/greentest/known_failures.py
+10
-0
src/greentest/test__local.py
src/greentest/test__local.py
+6
-4
src/greentest/test__pywsgi.py
src/greentest/test__pywsgi.py
+2
-1
src/greentest/tests_that_dont_use_resolver.txt
src/greentest/tests_that_dont_use_resolver.txt
+4
-0
No files found.
.travis.yml
View file @
0996f427
...
...
@@ -17,10 +17,10 @@ env:
matrix
:
# These are ordered to get as much diversity in the
# first group of parallel runs (4) as posible
-
TASK=test-py37
-
TASK=test-py27
-
TASK=test-pypy
-
TASK=test-py36
-
TASK=test-py37
-
TASK=test-py27-noembed
-
TASK=test-pypy3
-
TASK=test-py35
...
...
CHANGES.rst
View file @
0996f427
...
...
@@ -29,7 +29,7 @@
- The internal, undocumented class ``gevent._socket3._fileobject`` has
been removed. See :issue:`1084`.
- Travis CI tests on Python 3.7.0b
1
and PyPy 2.7 5.10.0 and PyPy 3.5
- Travis CI tests on Python 3.7.0b
2
and PyPy 2.7 5.10.0 and PyPy 3.5
5.10.1.
- Support the ``capture_output`` argument added to Python 3.7 in
...
...
Makefile
View file @
0996f427
...
...
@@ -108,7 +108,7 @@ leaktest: test_prelim
@
${PYTHON}
scripts/travis.py fold_end default
bench
:
${PYTHON}
benchmarks/bench_sendall.py
--loops
3
--processes
2
--values
2
--warmups
2
${PYTHON}
benchmarks/bench_sendall.py
--loops
3
--processes
2
--values
2
--warmups
2
--quiet
travis_test_linters
:
make lint
...
...
@@ -131,7 +131,7 @@ PY27=$(BUILD_RUNTIMES)/snakepit/python2.7.14
PY34
=
$(BUILD_RUNTIMES)
/snakepit/python3.4.7
PY35
=
$(BUILD_RUNTIMES)
/snakepit/python3.5.4
PY36
=
$(BUILD_RUNTIMES)
/snakepit/python3.6.4
PY37
=
$(BUILD_RUNTIMES)
/snakepit/python3.7.0b
1
PY37
=
$(BUILD_RUNTIMES)
/snakepit/python3.7.0b
2
PYPY
=
$(BUILD_RUNTIMES)
/snakepit/pypy5100
PYPY3
=
$(BUILD_RUNTIMES)
/snakepit/pypy3.5_5101
...
...
@@ -180,6 +180,7 @@ develop:
# We need wheel>=0.26 on Python 3.5. See previous revisions.
time
${PYTHON}
-m
pip
install
-U
-r
ci-requirements.txt
GEVENTSETUP_EV_VERIFY
=
3
time
${PYTHON}
-m
pip
install
-U
-e
.
${PYTHON}
-m
pip
freeze
ccache
-s
@${PYTHON}
scripts/travis.py
fold_end
install
...
...
@@ -196,7 +197,7 @@ test-py36: $(PY36)
PYTHON
=
python3.6.4
PATH
=
$(BUILD_RUNTIMES)
/versions/python3.6.4/bin:
$(PATH)
make develop allbackendtest
test-py37
:
$(PY37)
LD_LIBRARY_PATH
=
$(BUILD_RUNTIMES)
/versions/python3.7.0b
1/openssl/lib
PYTHON
=
python3.7.0b1
PATH
=
$(BUILD_RUNTIMES)
/versions/python3.7.0b1
/bin:
$(PATH)
make develop allbackendtest
LD_LIBRARY_PATH
=
$(BUILD_RUNTIMES)
/versions/python3.7.0b
2/openssl/lib
PYTHON
=
python3.7.0b2
PATH
=
$(BUILD_RUNTIMES)
/versions/python3.7.0b2
/bin:
$(PATH)
make develop allbackendtest
test-pypy
:
$(PYPY)
PYTHON
=
$(PYPY)
PATH
=
$(BUILD_RUNTIMES)
/versions/pypy5100/bin:
$(PATH)
make develop cffibackendtest
...
...
ci-requirements.txt
View file @
0996f427
...
...
@@ -16,7 +16,7 @@ prospector[with_pyroma] ; python_version < '3.7'
coverage
>=4.0
coveralls
>=1.0
# See version requirements in setup.py
cffi
; platform_python_implementation == "CPython"
cffi
>= 1.11.5
; platform_python_implementation == "CPython"
futures
dnspython
idna
...
...
scripts/install.sh
View file @
0996f427
...
...
@@ -49,7 +49,7 @@ PYENV=$BASE/pyenv
# The file for 3.7b1 shipped with pyenv on Feb 6 2018
# won't compile on Travis. So we use a forked version that
# compiles openssl for us.
# compiles openssl for us.
We also beat them to the punch for 3.7b2
# https://github.com/travis-ci/travis-ci/issues/9069
if
[
!
-d
"
$PYENV
/.git"
]
;
then
...
...
@@ -104,7 +104,7 @@ for var in "$@"; do
install
3.6.4 python3.6.4
;;
3.7
)
install
3.7.0b
1 python3.7.0b1
install
3.7.0b
2 python3.7.0b2
;;
pypy
)
install
pypy2.7-5.10.0 pypy5100
...
...
src/gevent/_ffi/loop.py
View file @
0996f427
...
...
@@ -208,7 +208,10 @@ class AbstractCallbacks(object):
watcher
.
loop
.
handle_error
(
None
,
t
,
v
,
tb
)
return
1
else
:
raise
v
# Raising it causes a lot of noise from CFFI
print
(
"WARNING: gevent: Unhandled error with no watcher"
,
file
=
sys
.
stderr
)
traceback
.
print_exception
(
t
,
v
,
tb
)
def
python_stop
(
self
,
handle
):
if
not
handle
:
# pragma: no cover
...
...
@@ -220,8 +223,7 @@ class AbstractCallbacks(object):
# NOTE: Raising exceptions here does nothing, they're swallowed by CFFI.
# Since the C level passed in a null pointer, even dereferencing the handle
# will just produce some exceptions.
if
GEVENT_DEBUG_LEVEL
<
CRITICAL
:
return
return
_dbg
(
"python_stop: stopping watcher with handle"
,
handle
)
watcher
=
self
.
from_handle
(
handle
)
watcher
.
stop
()
...
...
src/gevent/_socket3.py
View file @
0996f427
...
...
@@ -10,17 +10,26 @@ from __future__ import absolute_import
import
io
import
os
import
sys
import
time
from
gevent
import
_socketcommon
from
gevent._util
import
copy_globals
from
gevent._compat
import
PYPY
import
_socket
from
os
import
dup
copy_globals
(
_socketcommon
,
globals
(),
names_to_ignore
=
_socketcommon
.
__extensions__
,
dunder_names_to_keep
=
())
try
:
from
errno
import
EHOSTUNREACH
from
errno
import
ECONNREFUSED
except
ImportError
:
EHOSTUNREACH
=
-
1
ECONNREFUSED
=
-
1
__socket__
=
_socketcommon
.
__socket__
__implements__
=
_socketcommon
.
_implements
__extensions__
=
_socketcommon
.
__extensions__
...
...
@@ -337,11 +346,25 @@ class socket(object):
if
err
:
raise
error
(
err
,
strerror
(
err
))
result
=
_socket
.
socket
.
connect_ex
(
self
.
_sock
,
address
)
if
not
result
or
result
==
EISCONN
:
break
elif
(
result
in
(
EWOULDBLOCK
,
EINPROGRESS
,
EALREADY
))
or
(
result
==
EINVAL
and
is_windows
):
self
.
_wait
(
self
.
_write_event
)
else
:
if
(
isinstance
(
address
,
tuple
)
and
address
[
0
]
==
'fe80::1'
and
result
==
EHOSTUNREACH
):
# On Python 3.7 on mac, we see EHOSTUNREACH
# returned for this link-local address, but it really is
# supposed to be ECONNREFUSED according to the standard library
# tests (test_socket.NetworkConnectionNoServer.test_create_connection)
# (On previous versions, that code passed the '127.0.0.1' IPv4 address, so
# ipv6 link locals were never a factor; 3.7 passes 'localhost'.)
# It is something of a mystery how the stdlib socket code doesn't
# produce EHOSTUNREACH---I (JAM) can't see how socketmodule.c would avoid
# that. The normal connect just calls connect_ex much like we do.
result
=
ECONNREFUSED
raise
error
(
result
,
strerror
(
result
))
def
connect_ex
(
self
,
address
):
...
...
src/gevent/_socketcommon.py
View file @
0996f427
...
...
@@ -157,15 +157,15 @@ def wait(io, timeout=None, timeout_exc=_NONE):
"""
if
io
.
callback
is
not
None
:
raise
ConcurrentObjectUseError
(
'This socket is already used by another greenlet: %r'
%
(
io
.
callback
,
))
if
timeout
is
not
None
:
timeout_exc
=
timeout_exc
if
timeout_exc
is
not
_NONE
else
_timeout_error
(
'timed out'
)
timeout
=
Timeout
.
start_new
(
timeout
,
timeout_exc
)
timeout
=
Timeout
.
_start_new_or_dummy
(
timeout
,
(
timeout_exc
if
timeout_exc
is
not
_NONE
or
timeout
is
None
else
_timeout_error
(
'timed out'
)))
try
:
with
timeout
:
return
get_hub
().
wait
(
io
)
finally
:
if
timeout
is
not
None
:
timeout
.
cancel
()
# rename "io" to "watcher" because wait() works with any watcher
...
...
src/gevent/_ssl3.py
View file @
0996f427
...
...
@@ -87,6 +87,16 @@ class SSLContext(orig_SSLContext):
def
verify_mode
(
self
,
value
):
super
(
orig_SSLContext
,
orig_SSLContext
).
verify_mode
.
__set__
(
self
,
value
)
if
hasattr
(
orig_SSLContext
,
'minimum_version'
):
# Like the above, added in 3.7
@
orig_SSLContext
.
minimum_version
.
setter
def
minimum_version
(
self
,
value
):
super
(
orig_SSLContext
,
orig_SSLContext
).
minimum_version
.
__set__
(
self
,
value
)
@
orig_SSLContext
.
maximum_version
.
setter
def
maximum_version
(
self
,
value
):
super
(
orig_SSLContext
,
orig_SSLContext
).
maximum_version
.
__set__
(
self
,
value
)
class
_contextawaresock
(
socket
.
_gevent_sock_class
):
# Python 2: pylint:disable=slots-on-old-class
# We have to pass the raw stdlib socket to SSLContext.wrap_socket.
...
...
@@ -127,6 +137,23 @@ class _contextawaresock(socket._gevent_sock_class): # Python 2: pylint:disable=s
pass
raise
AttributeError
(
name
)
try
:
_SSLObject_factory
=
SSLObject
except
NameError
:
# 3.4 and below do not have SSLObject, something
# we magically import through copy_globals
pass
else
:
if
hasattr
(
SSLObject
,
'_create'
):
# 3.7 is making thing difficult and won't let you
# actually construct an object
def
_SSLObject_factory
(
sslobj
,
owner
=
None
,
session
=
None
):
s
=
SSLObject
.
__new__
(
SSLObject
)
s
.
_sslobj
=
sslobj
s
.
_sslobj
.
owner
=
owner
or
s
if
session
is
not
None
:
s
.
_sslobj
.
session
=
session
return
s
class
SSLSocket
(
socket
):
"""
...
...
@@ -224,8 +251,9 @@ class SSLSocket(socket):
try
:
self
.
_sslobj
=
self
.
_context
.
_wrap_socket
(
self
.
_sock
,
server_side
,
server_hostname
)
if
_session
is
not
None
:
# 3.6
self
.
_sslobj
=
SSLObject
(
self
.
_sslobj
,
owner
=
self
,
session
=
self
.
_session
)
if
_session
is
not
None
:
# 3.6+
self
.
_sslobj
=
_SSLObject_factory
(
self
.
_sslobj
,
owner
=
self
,
session
=
self
.
_session
)
if
do_handshake_on_connect
:
timeout
=
self
.
gettimeout
()
if
timeout
==
0.0
:
...
...
@@ -585,8 +613,8 @@ class SSLSocket(socket):
if
self
.
_connected
:
raise
ValueError
(
"attempt to connect already-connected SSLSocket!"
)
self
.
_sslobj
=
self
.
_context
.
_wrap_socket
(
self
.
_sock
,
False
,
self
.
server_hostname
)
if
self
.
_session
is
not
None
:
# 3.6
self
.
_sslobj
=
SSLObject
(
self
.
_sslobj
,
owner
=
self
,
session
=
self
.
_session
)
if
self
.
_session
is
not
None
:
# 3.6
+
self
.
_sslobj
=
_SSLObject_factory
(
self
.
_sslobj
,
owner
=
self
,
session
=
self
.
_session
)
try
:
if
connect_ex
:
rc
=
socket
.
connect_ex
(
self
,
addr
)
...
...
@@ -629,6 +657,9 @@ class SSLSocket(socket):
if the requested `cb_type` is not supported. Return bytes of the data
or None if the data is not available (e.g. before the handshake).
"""
if
hasattr
(
self
.
_sslobj
,
'get_channel_binding'
):
# 3.7+, and sslobj is not None
return
self
.
_sslobj
.
get_channel_binding
(
cb_type
)
if
cb_type
not
in
CHANNEL_BINDING_TYPES
:
raise
ValueError
(
"Unsupported channel binding type"
)
if
cb_type
!=
"tls-unique"
:
...
...
src/gevent/event.py
View file @
0996f427
...
...
@@ -100,8 +100,7 @@ class _AbstractLinkable(object):
switch
=
getcurrent
().
switch
self
.
rawlink
(
switch
)
try
:
timer
=
Timeout
.
_start_new_or_dummy
(
timeout
)
try
:
with
Timeout
.
_start_new_or_dummy
(
timeout
)
as
timer
:
try
:
result
=
self
.
hub
.
switch
()
if
result
is
not
self
:
# pragma: no cover
...
...
@@ -113,8 +112,6 @@ class _AbstractLinkable(object):
# test_set_and_clear and test_timeout in test_threading
# rely on the exact return values, not just truthish-ness
return
False
finally
:
timer
.
close
()
finally
:
self
.
unlink
(
switch
)
...
...
src/gevent/libuv/_corecffi_cdef.c
View file @
0996f427
...
...
@@ -164,6 +164,8 @@ typedef struct uv_fs_event_s uv_fs_event_t;
typedef
struct
uv_fs_poll_s
uv_fs_poll_t
;
size_t
uv_handle_size
(
uv_handle_type
);
// callbacks with the same signature
// XXX: Note that these, and all callbacks, are defined to take
// a void* or handle* instead of the more specific, correct,
...
...
@@ -338,6 +340,8 @@ int uv_fs_poll_start(void*, uv_fs_poll_cb, const char* path, unsigned int);
int
uv_fs_poll_stop
(
void
*
);
/* Standard library */
void
*
memset
(
void
*
b
,
int
c
,
size_t
len
);
/* gevent callbacks */
...
...
src/gevent/libuv/_corecffi_source.c
View file @
0996f427
#include <string.h>
#include "uv.h"
static
int
python_callback
(
void
*
handle
,
int
revents
);
...
...
src/gevent/libuv/watcher.py
View file @
0996f427
...
...
@@ -120,7 +120,7 @@ class watcher(_base.watcher):
# Instead, this is arranged as a callback to GC when the
# watcher class dies. Obviously it's important to keep the ffi
# watcher alive.
_dbg
(
"Request to close handle"
,
ffi_watcher
)
_dbg
(
"Request to close handle"
,
ffi
.
cast
(
'void*'
,
ffi_watcher
),
ffi
_watcher
)
# We can pass in "subclasses" if uv_handle_t that line up at the C level,
# but that don't in CFFI without a cast. But be careful what we use the cast
# for, don't pass it back to C.
...
...
@@ -729,12 +729,16 @@ class OneShotCheck(check):
_watcher_skip_ffi
=
True
def
__make_cb
(
self
,
func
):
stop
=
self
.
stop
@
functools
.
wraps
(
func
)
def
cb
(
*
args
):
stop
()
return
func
(
*
args
)
return
cb
def
start
(
self
,
callback
,
*
args
):
@
functools
.
wraps
(
callback
)
def
_callback
(
*
args
):
self
.
stop
()
return
callback
(
*
args
)
return
check
.
start
(
self
,
_callback
,
*
args
)
return
check
.
start
(
self
,
self
.
__make_cb
(
callback
),
*
args
)
class
prepare
(
_base
.
PrepareMixin
,
watcher
):
pass
src/gevent/socket.py
View file @
0996f427
...
...
@@ -75,7 +75,7 @@ def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT, source_address=N
host
,
port
=
address
# getaddrinfo is documented as returning a list, but our interface
# is pluggable, so be sure it does.
addrs
=
list
(
getaddrinfo
(
host
,
port
,
0
if
has_ipv6
else
AF_INET
,
SOCK_STREAM
))
addrs
=
list
(
getaddrinfo
(
host
,
port
,
0
,
SOCK_STREAM
))
if
not
addrs
:
raise
error
(
"getaddrinfo returns an empty list"
)
...
...
src/greentest/3.7/test_ftplib.py
View file @
0996f427
...
...
@@ -312,6 +312,8 @@ if ssl is not None:
def
secure_connection
(
self
):
context
=
ssl
.
SSLContext
()
# TODO: fix TLSv1.3 support
context
.
options
|=
ssl
.
OP_NO_TLSv1_3
context
.
load_cert_chain
(
CERTFILE
)
socket
=
context
.
wrap_socket
(
self
.
socket
,
suppress_ragged_eofs
=
False
,
...
...
@@ -908,6 +910,8 @@ class TestTLS_FTPClass(TestCase):
def
test_context
(
self
):
self
.
client
.
quit
()
ctx
=
ssl
.
SSLContext
(
ssl
.
PROTOCOL_TLS_CLIENT
)
# TODO: fix TLSv1.3 support
ctx
.
options
|=
ssl
.
OP_NO_TLSv1_3
ctx
.
check_hostname
=
False
ctx
.
verify_mode
=
ssl
.
CERT_NONE
self
.
assertRaises
(
ValueError
,
ftplib
.
FTP_TLS
,
keyfile
=
CERTFILE
,
...
...
@@ -940,6 +944,8 @@ class TestTLS_FTPClass(TestCase):
def
test_check_hostname
(
self
):
self
.
client
.
quit
()
ctx
=
ssl
.
SSLContext
(
ssl
.
PROTOCOL_TLS_CLIENT
)
# TODO: fix TLSv1.3 support
ctx
.
options
|=
ssl
.
OP_NO_TLSv1_3
self
.
assertEqual
(
ctx
.
verify_mode
,
ssl
.
CERT_REQUIRED
)
self
.
assertEqual
(
ctx
.
check_hostname
,
True
)
ctx
.
load_verify_locations
(
CAFILE
)
...
...
src/greentest/3.7/test_socket.py
View file @
0996f427
...
...
@@ -1594,6 +1594,72 @@ class GeneralModuleTests(unittest.TestCase):
with
socket
.
socket
(
socket
.
AF_INET6
,
socket
.
SOCK_STREAM
)
as
s
:
self
.
assertRaises
(
OverflowError
,
s
.
bind
,
(
support
.
HOSTv6
,
0
,
-
10
))
@
unittest
.
skipUnless
(
support
.
IPV6_ENABLED
,
'IPv6 required for this test.'
)
def
test_getaddrinfo_ipv6_basic
(
self
):
((
*
_
,
sockaddr
),)
=
socket
.
getaddrinfo
(
'ff02::1de:c0:face:8D'
,
# Note capital letter `D`.
1234
,
socket
.
AF_INET6
,
socket
.
SOCK_DGRAM
,
socket
.
IPPROTO_UDP
)
self
.
assertEqual
(
sockaddr
,
(
'ff02::1de:c0:face:8d'
,
1234
,
0
,
0
))
@
unittest
.
skipUnless
(
support
.
IPV6_ENABLED
,
'IPv6 required for this test.'
)
@
unittest
.
skipUnless
(
hasattr
(
socket
,
'if_nameindex'
),
'if_nameindex is not supported'
)
def
test_getaddrinfo_ipv6_scopeid_symbolic
(
self
):
# Just pick up any network interface (Linux, Mac OS X)
(
ifindex
,
test_interface
)
=
socket
.
if_nameindex
()[
0
]
((
*
_
,
sockaddr
),)
=
socket
.
getaddrinfo
(
'ff02::1de:c0:face:8D%'
+
test_interface
,
1234
,
socket
.
AF_INET6
,
socket
.
SOCK_DGRAM
,
socket
.
IPPROTO_UDP
)
# Note missing interface name part in IPv6 address
self
.
assertEqual
(
sockaddr
,
(
'ff02::1de:c0:face:8d'
,
1234
,
0
,
ifindex
))
@
unittest
.
skipUnless
(
support
.
IPV6_ENABLED
,
'IPv6 required for this test.'
)
@
unittest
.
skipUnless
(
sys
.
platform
==
'win32'
,
'Numeric scope id does not work or undocumented'
)
def
test_getaddrinfo_ipv6_scopeid_numeric
(
self
):
# Also works on Linux and Mac OS X, but is not documented (?)
# Windows, Linux and Max OS X allow nonexistent interface numbers here.
ifindex
=
42
((
*
_
,
sockaddr
),)
=
socket
.
getaddrinfo
(
'ff02::1de:c0:face:8D%'
+
str
(
ifindex
),
1234
,
socket
.
AF_INET6
,
socket
.
SOCK_DGRAM
,
socket
.
IPPROTO_UDP
)
# Note missing interface name part in IPv6 address
self
.
assertEqual
(
sockaddr
,
(
'ff02::1de:c0:face:8d'
,
1234
,
0
,
ifindex
))
@
unittest
.
skipUnless
(
support
.
IPV6_ENABLED
,
'IPv6 required for this test.'
)
@
unittest
.
skipUnless
(
hasattr
(
socket
,
'if_nameindex'
),
'if_nameindex is not supported'
)
def
test_getnameinfo_ipv6_scopeid_symbolic
(
self
):
# Just pick up any network interface.
(
ifindex
,
test_interface
)
=
socket
.
if_nameindex
()[
0
]
sockaddr
=
(
'ff02::1de:c0:face:8D'
,
1234
,
0
,
ifindex
)
# Note capital letter `D`.
nameinfo
=
socket
.
getnameinfo
(
sockaddr
,
socket
.
NI_NUMERICHOST
|
socket
.
NI_NUMERICSERV
)
self
.
assertEqual
(
nameinfo
,
(
'ff02::1de:c0:face:8d%'
+
test_interface
,
'1234'
))
@
unittest
.
skipUnless
(
support
.
IPV6_ENABLED
,
'IPv6 required for this test.'
)
@
unittest
.
skipUnless
(
sys
.
platform
==
'win32'
,
'Numeric scope id does not work or undocumented'
)
def
test_getnameinfo_ipv6_scopeid_numeric
(
self
):
# Also works on Linux (undocumented), but does not work on Mac OS X
# Windows and Linux allow nonexistent interface numbers here.
ifindex
=
42
sockaddr
=
(
'ff02::1de:c0:face:8D'
,
1234
,
0
,
ifindex
)
# Note capital letter `D`.
nameinfo
=
socket
.
getnameinfo
(
sockaddr
,
socket
.
NI_NUMERICHOST
|
socket
.
NI_NUMERICSERV
)
self
.
assertEqual
(
nameinfo
,
(
'ff02::1de:c0:face:8d%'
+
str
(
ifindex
),
'1234'
))
def
test_str_for_enums
(
self
):
# Make sure that the AF_* and SOCK_* constants have enum-like string
# reprs.
...
...
@@ -5879,6 +5945,27 @@ class LinuxKernelCryptoAPI(unittest.TestCase):
with
self
.
assertRaises
(
TypeError
):
sock
.
sendmsg_afalg
(
op
=
socket
.
ALG_OP_ENCRYPT
,
assoclen
=-
1
)
@
unittest
.
skipUnless
(
sys
.
platform
.
startswith
(
"win"
),
"requires Windows"
)
class
TestMSWindowsTCPFlags
(
unittest
.
TestCase
):
knownTCPFlags
=
{
# avaliable since long time ago
'TCP_MAXSEG'
,
'TCP_NODELAY'
,
# available starting with Windows 10 1607
'TCP_FASTOPEN'
,
# available starting with Windows 10 1703
'TCP_KEEPCNT'
,
# available starting with Windows 10 1709
'TCP_KEEPIDLE'
,
'TCP_KEEPINTVL'
}
def
test_new_tcp_flags
(
self
):
provided
=
[
s
for
s
in
dir
(
socket
)
if
s
.
startswith
(
'TCP'
)]
unknown
=
[
s
for
s
in
provided
if
s
not
in
self
.
knownTCPFlags
]
self
.
assertEqual
([],
unknown
,
"New TCP flags were discovered. See bpo-32394 for more information"
)
def
test_main
():
tests
=
[
GeneralModuleTests
,
BasicTCPTest
,
TCPCloserTest
,
TCPTimeoutTest
,
...
...
@@ -5939,6 +6026,7 @@ def test_main():
SendfileUsingSendTest
,
SendfileUsingSendfileTest
,
])
tests
.
append
(
TestMSWindowsTCPFlags
)
thread_info
=
support
.
threading_setup
()
support
.
run_unittest
(
*
tests
)
...
...
src/greentest/3.7/test_ssl.py
View file @
0996f427
This diff is collapsed.
Click to expand it.
src/greentest/3.7/test_subprocess.py
View file @
0996f427
...
...
@@ -1179,7 +1179,7 @@ class ProcessTestCase(BaseTestCase):
msvcrt.CrtSetReportFile(report_type, msvcrt.CRTDBG_FILE_STDERR)
try:
subprocess.Popen(
[cmd]
,
subprocess.Popen(
cmd
,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
except OSError:
...
...
@@ -1475,37 +1475,6 @@ class RunFuncTestCase(BaseTestCase):
env
=
newenv
)
self
.
assertEqual
(
cp
.
returncode
,
33
)
def
test_run_with_pathlike_path
(
self
):
# bpo-31961: test run(pathlike_object)
class
Path
:
def
__fspath__
(
self
):
# the name of a command that can be run without
# any argumenets that exit fast
return
'dir'
if
mswindows
else
'ls'
path
=
Path
()
if
mswindows
:
res
=
subprocess
.
run
(
path
,
stdout
=
subprocess
.
DEVNULL
,
shell
=
True
)
else
:
res
=
subprocess
.
run
(
path
,
stdout
=
subprocess
.
DEVNULL
)
self
.
assertEqual
(
res
.
returncode
,
0
)
def
test_run_with_pathlike_path_and_arguments
(
self
):
# bpo-31961: test run([pathlike_object, 'additional arguments'])
class
Path
:
def
__fspath__
(
self
):
# the name of a command that can be run without
# any argumenets that exits fast
return
sys
.
executable
path
=
Path
()
args
=
[
path
,
'-c'
,
'import sys; sys.exit(57)'
]
res
=
subprocess
.
run
(
args
)
self
.
assertEqual
(
res
.
returncode
,
57
)
def
test_capture_output
(
self
):
cp
=
self
.
run_python
((
"import sys;"
"sys.stdout.write('BDFL'); "
...
...
src/greentest/3.7/version
View file @
0996f427
3.7.0b
1
3.7.0b
2
src/greentest/greentest/patched_tests_setup.py
View file @
0996f427
...
...
@@ -243,7 +243,12 @@ if LIBUV:
]
if
PYPY
:
disabled_tests
+=
[
# This seems to crash the interpreter. I cannot reproduce
# on macOS or local Linux VM.
# See https://travis-ci.org/gevent/gevent/jobs/348661604#L709
'test_smtplib.TooLongLineTests.testLineTooLong'
,
]
if
ARES
:
disabled_tests
+=
[
...
...
@@ -913,6 +918,15 @@ if PY37:
# This wants to check that the underlying fileno is blocking,
# but it isn't.
'test_socket.NonBlockingTCPTests.testSetBlocking'
,
# 3.7b2 made it impossible to instantiate SSLSocket objects
# directly, and this tests for that, but we don't follow that change.
'test_ssl.BasicSocketTests.test_private_init'
,
# 3.7b2 made a change to this test that on the surface looks incorrect,
# but it passes when they run it and fails when we do. It's not
# clear why.
'test_ssl.ThreadedTests.test_check_hostname_idn'
,
]
# if 'signalfd' in os.environ.get('GEVENT_BACKEND', ''):
...
...
src/greentest/greentest/testrunner.py
View file @
0996f427
...
...
@@ -15,6 +15,7 @@ from greentest.util import log
from
greentest.sysinfo
import
RUNNING_ON_CI
from
greentest.sysinfo
import
PYPY
from
greentest.sysinfo
import
RESOLVER_ARES
from
greentest.sysinfo
import
LIBUV
from
greentest
import
six
...
...
@@ -35,6 +36,12 @@ RUN_ALONE = [
'test__examples.py'
,
]
if
RUNNING_ON_CI
and
PYPY
and
LIBUV
:
RUN_ALONE
+=
[
# https://bitbucket.org/pypy/pypy/issues/2769/systemerror-unexpected-internal-exception
'test__pywsgi.py'
,
]
# tests that can't be run when coverage is enabled
IGNORE_COVERAGE
=
[
# Hangs forever
...
...
src/greentest/known_failures.py
View file @
0996f427
...
...
@@ -169,6 +169,16 @@ if PYPY:
'FLAKY test__example_udp_client.py'
,
]
if
LIBUV
:
IGNORED_TESTS
+=
[
# This has started crashing with a SystemError.
# I cannot reproduce with the same version on macOS
# and I cannot reproduce with the same version in a Linux vm.
# Commenting out individual tests just moves the crash around.
# https://bitbucket.org/pypy/pypy/issues/2769/systemerror-unexpected-internal-exception
'test__pywsgi.py'
,
]
if
PY3
and
TRAVIS
:
FAILING_TESTS
+=
[
## ---
...
...
src/greentest/test__local.py
View file @
0996f427
...
...
@@ -274,7 +274,10 @@ class TestGeventLocal(greentest.TestCase):
# The sentinels should be gone too
self
.
assertEqual
(
len
(
deleted_sentinels
),
len
(
greenlets
))
@
greentest
.
skipOnLibuvOnPyPyOnWin
(
"GC makes this non-deterministic, especially on Windows"
)
def
test_locals_collected_when_unreferenced_even_in_running_greenlet
(
self
):
# In fact only on Windows do we see GC being an issue;
# pypy2 5.0 on macos and travis don't have a problem.
# https://github.com/gevent/gevent/issues/981
import
gevent
import
gc
...
...
@@ -308,17 +311,16 @@ class TestGeventLocal(greentest.TestCase):
self
.
assertEqual
(
count
,
len
(
deleted_sentinels
))
@
greentest
.
skipOnPyPy
(
"GC makes this non-deterministic, especially on Windows"
)
def
test_local_dicts_for_greenlet
(
self
):
# In fact, only on Windows do we see gc being an issue;
# pypy2 5.10 on macOS and Travis don't have a problem.
import
gevent
from
gevent.local
import
all_local_dicts_for_greenlet
x
=
MyLocal
()
x
.
foo
=
42
del
x
.
sentinel
if
greentest
.
PYPY
:
import
gc
gc
.
collect
()
results
=
all_local_dicts_for_greenlet
(
gevent
.
getcurrent
())
self
.
assertEqual
(
results
,
[((
MyLocal
,
id
(
x
)),
{
'foo'
:
42
})])
...
...
src/greentest/test__pywsgi.py
View file @
0996f427
...
...
@@ -1562,16 +1562,17 @@ class TestInputRaw(greentest.BaseTestCase):
i
=
self
.
make_input
(
"2
\
r
\
n
1"
,
chunked_input
=
True
)
self
.
assertRaises
(
IOError
,
i
.
readline
)
@
greentest
.
skipOnLibuvOnCIOnPyPy
(
"Crashes. See https://github.com/gevent/gevent/issues/1130"
)
def
test_32bit_overflow
(
self
):
# https://github.com/gevent/gevent/issues/289
# Should not raise an OverflowError on Python 2
print
(
"BEGIN 32bit"
)
data
=
b'asdf
\
n
ghij
\
n
'
long_data
=
b'a'
*
(
pywsgi
.
MAX_REQUEST_LINE
+
10
)
long_data
+=
b'
\
n
'
data
=
data
+
long_data
partial_data
=
b'qjk
\
n
'
# Note terminating \n
n
=
25
*
1000000000
print
(
"N"
,
n
,
"Data len"
,
len
(
data
))
if
hasattr
(
n
,
'bit_length'
):
self
.
assertEqual
(
n
.
bit_length
(),
35
)
if
not
PY3
and
not
PYPY
:
...
...
src/greentest/tests_that_dont_use_resolver.txt
View file @
0996f427
...
...
@@ -128,3 +128,7 @@ test___config.py
test__destroy_default_loop.py
test__util.py
test___ident.py
test__issue639.py
test__issue_728.py
test__refcount_core.py
test__api.py
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