14
0
forked from pool/python-pycurl

Accepting request 855776 from home:mcepl:branches:devel:tools:scm

- Add remove_nose.patch to remove dependency on nose
  (gh#pycurl/pycurl#655).

OBS-URL: https://build.opensuse.org/request/show/855776
OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-pycurl?expand=0&rev=74
This commit is contained in:
2020-12-15 11:17:18 +00:00
committed by Git OBS Bridge
parent 2a83c29997
commit 7c52be85c5
3 changed files with 949 additions and 8 deletions

View File

@@ -1,3 +1,9 @@
-------------------------------------------------------------------
Mon Dec 14 14:15:29 UTC 2020 - Matej Cepl <mcepl@suse.com>
- Add remove_nose.patch to remove dependency on nose
(gh#pycurl/pycurl#655).
-------------------------------------------------------------------
Mon Jun 22 08:25:46 UTC 2020 - Callum Farmer <callumjfarmer13@gmail.com>

View File

@@ -40,6 +40,9 @@ Patch1: pycurl-libssh.patch
# PATCH-FIX-OPENSUSE python-pycurl-7.43.0-tls-backend.patch -- do not run runtime tests to compare linked libs
Patch2: python-pycurl-7.43.0-tls-backend.patch
Patch3: disable_randomly_failing_tests.patch
# PATCH-FEATURE-UPSTREAM remove_nose.patch gh#pycurl/pycurl#655 mcepl@suse.com
# remove dependency on nose
Patch4: remove_nose.patch
BuildRequires: %{python_module devel}
BuildRequires: %{python_module setuptools}
BuildRequires: fdupes
@@ -50,7 +53,7 @@ BuildRequires: pkgconfig(openssl)
%if %{with test}
BuildRequires: %{python_module bottle}
BuildRequires: %{python_module flaky}
BuildRequires: %{python_module nose}
BuildRequires: %{python_module pytest}
%endif
%ifpython2
Provides: %{oldpython}-curl = %{version}
@@ -103,19 +106,18 @@ rm -f *.so
make %{?_smp_mflags}
popd
# exclude certain tests
test_flags='!online,!occasionally_failing'
test_flags='online or occasionally_failing'
if ! pkg-config --variable=supported_features libcurl|grep -qw HTTP2; then
test_flags="$test_flags,\!http2"
test_flags="$test_flags or http2"
fi
if ! pkg-config --variable=supported_protocols libcurl|grep -qw SCP; then
test_flags="$test_flags,\!ssh"
test_flags="$test_flags or ssh"
fi
# test_getinfo are failing with new bottle
%{python_expand PYTHONPATH=%{buildroot}%{$python_sitearch} \
nosetests-%{$python_bin_suffix} -v --with-flaky -a "$test_flags" -e 'test_getinfo'
}
%pytest_arch -k "not ($test_flags or test_getinfo)"
rm -rf %{buildroot}%{_prefix}/lib/debug %{buildroot}%{_libdir}/python*
%endif # test
# test
%endif
%if ! %{with test}
%files %{python_files}

933
remove_nose.patch Normal file
View File

@@ -0,0 +1,933 @@
From 67d656ab89a3056eb91cecadd521cc028129a794 Mon Sep 17 00:00:00 2001
From: Steve Kowalik <steven@wedontsleep.org>
Date: Mon, 14 Sep 2020 15:42:16 +1000
Subject: [PATCH 1/2] Switch from nose to pytest
With nose being unmaintained for a long while, switch to pytest to run
the test suite.
---
Makefile | 2 +-
README.rst | 4 ++--
appveyor.yml | 2 +-
pytest.ini | 9 ++++++++
requirements-dev.txt | 7 ++-----
tests/certinfo_test.py | 5 ++---
tests/curl_object_test.py | 22 ++++++++------------
tests/global_init_test.py | 9 ++++----
tests/header_test.py | 10 ++++-----
tests/multi_test.py | 10 ++++-----
tests/option_constants_test.py | 25 +++++++++++-----------
tests/procmgr.py | 6 +++---
tests/reload_test.py | 4 ++--
tests/resolve_test.py | 3 +--
tests/run.sh | 5 ++---
tests/setopt_string_test.py | 6 +++---
tests/setopt_test.py | 14 ++++++-------
tests/setopt_unicode_test.py | 6 +++---
tests/setup_test.py | 3 +--
tests/share_test.py | 10 ++++-----
tests/ssh_key_cb_test.py | 8 +++----
tests/util.py | 38 +++++++++++-----------------------
22 files changed, 95 insertions(+), 113 deletions(-)
create mode 100644 pytest.ini
--- a/Makefile
+++ b/Makefile
@@ -6,7 +6,7 @@
SHELL = /bin/sh
PYTHON = python
-NOSETESTS = nosetests
+PYTEST = pytest
PYFLAKES = pyflakes
# -c on linux
--- a/README.rst
+++ b/README.rst
@@ -93,7 +93,7 @@ PycURL comes with an automated test suit
make test
-The suite depends on packages `nose`_ and `bottle`_, as well as `vsftpd`_.
+The suite depends on packages `pytest`_ and `bottle`_, as well as `vsftpd`_.
Some tests use vsftpd configured to accept anonymous uploads. These tests
are not run by default. As configured, vsftpd will allow reads and writes to
@@ -106,7 +106,7 @@ vsftpd tests you must explicitly set PYC
# specify full path to vsftpd
export PYCURL_VSFTPD_PATH=/usr/local/libexec/vsftpd
-.. _nose: https://nose.readthedocs.org/
+.. _pytest: https://pytest.org/
.. _bottle: http://bottlepy.org/
.. _vsftpd: http://vsftpd.beasts.org/
--- /dev/null
+++ b/pytest.ini
@@ -0,0 +1,10 @@
+[pytest]
+python_files = tests/*.py
+norecursedirs = examples win
+markers =
+ ssh: mark a test as requiring ssh
+ online: mark a test as requiring internet access
+ gssapi: mark a test as requiring GSSAPI
+ http2: mark a test as requiring HTTP/2
+ standalone: mark a test as being standalone
+ occasionally_failing: mark a test as unstable
--- a/requirements-dev.txt
+++ b/requirements-dev.txt
@@ -1,10 +1,7 @@
# bottle 0.12.17 changed behavior
# https://github.com/pycurl/pycurl/issues/573
bottle==0.12.16
-# nose 1.3.1 is broken on python 3:
-# https://github.com/nose-devs/nose/issues/780
-nose>=1.3.2
flaky
pyflakes
-nose-show-skipped
-sphinx
\ No newline at end of file
+pytest>=5
+sphinx
--- a/tests/certinfo_test.py
+++ b/tests/certinfo_test.py
@@ -4,7 +4,6 @@
import pycurl
import unittest
-import nose.plugins.skip
from . import appmanager
from . import util
@@ -44,7 +43,7 @@ class CertinfoTest(unittest.TestCase):
def test_request_with_certinfo(self):
# CURLOPT_CERTINFO only works with OpenSSL
if 'openssl' not in pycurl.version.lower():
- raise nose.plugins.skip.SkipTest('libcurl does not use openssl')
+ raise unittest.SkipTest('libcurl does not use openssl')
self.curl.setopt(pycurl.URL, 'https://localhost:8383/success')
sio = util.BytesIO()
@@ -72,7 +71,7 @@ class CertinfoTest(unittest.TestCase):
def test_getinfo_raw_certinfo(self):
# CURLOPT_CERTINFO only works with OpenSSL
if 'openssl' not in pycurl.version.lower():
- raise nose.plugins.skip.SkipTest('libcurl does not use openssl')
+ raise unittest.SkipTest('libcurl does not use openssl')
self.curl.setopt(pycurl.URL, 'https://localhost:8383/success')
sio = util.BytesIO()
--- a/tests/curl_object_test.py
+++ b/tests/curl_object_test.py
@@ -3,8 +3,8 @@
# vi:ts=4:et
import pycurl
+import pytest
import unittest
-import nose.tools
class ExplicitConstructionCurlObjectTest(unittest.TestCase):
def test_close(self):
@@ -17,14 +17,14 @@ class ExplicitConstructionCurlObjectTest
c.close()
# positional arguments are rejected
- @nose.tools.raises(TypeError)
def test_positional_arguments(self):
- pycurl.Curl(1)
+ with pytest.raises(TypeError):
+ pycurl.Curl(1)
# keyword arguments are rejected
- @nose.tools.raises(TypeError)
def test_keyword_arguments(self):
- pycurl.Curl(a=1)
+ with pytest.raises(TypeError):
+ pycurl.Curl(a=1)
class CurlObjectTest(unittest.TestCase):
def setUp(self):
@@ -144,14 +144,10 @@ class CurlObjectTest(unittest.TestCase):
obj3 = cls()
self.assertEqual(old_value, getattr(obj3, name))
- # I would have liked to assert on the message of the exception,
- # but it appears nose has no support for this.
- @nose.tools.raises(AttributeError)
def test_bogus_attribute_access(self):
- self.curl.foo
+ with pytest.raises(AttributeError, match='trying to obtain.*'):
+ self.curl.foo
- # I would have liked to assert on the message of the exception,
- # but it appears nose has no support for this.
- @nose.tools.raises(AttributeError)
def test_bogus_attribute_delete(self):
- del self.curl.foo
+ with pytest.raises(AttributeError, match='trying to delete.*'):
+ del self.curl.foo
--- a/tests/global_init_test.py
+++ b/tests/global_init_test.py
@@ -3,9 +3,8 @@
# vi:ts=4:et
import pycurl
+import pytest
import unittest
-import nose.tools
-import nose.plugins.skip
from . import util
@@ -19,13 +18,13 @@ class GlobalInitTest(unittest.TestCase):
# the GLOBAL_ACK_EINTR flag was introduced in libcurl-7.30, but can also
# be backported for older versions of libcurl at the distribution level
if util.pycurl_version_less_than(7, 30) and not hasattr(pycurl, 'GLOBAL_ACK_EINTR'):
- raise nose.plugins.skip.SkipTest('libcurl < 7.30.0 or no GLOBAL_ACK_EINTR')
+ raise unittest.SkipTest('libcurl < 7.30.0 or no GLOBAL_ACK_EINTR')
# initialize libcurl with the GLOBAL_ACK_EINTR flag
pycurl.global_init(pycurl.GLOBAL_ACK_EINTR)
pycurl.global_cleanup()
- @nose.tools.raises(ValueError)
def test_global_init_bogus(self):
# initialize libcurl with bogus flags
- pycurl.global_init(0xffff)
+ with pytest.raises(ValueError):
+ pycurl.global_init(0xffff)
--- a/tests/header_test.py
+++ b/tests/header_test.py
@@ -3,9 +3,9 @@
# vi:ts=4:et
from . import localhost
+import pytest
import pycurl
import unittest
-import nose.tools
from . import appmanager
from . import util
@@ -30,13 +30,13 @@ class HeaderTest(unittest.TestCase):
# on python 2 unicode is accepted in strings because strings are byte strings
@util.only_python3
- @nose.tools.raises(UnicodeEncodeError)
def test_unicode_string_header(self):
- self.check('x-test-header: Москва', 'Москва')
+ with pytest.raises(UnicodeEncodeError):
+ self.check('x-test-header: Москва', 'Москва')
- @nose.tools.raises(UnicodeEncodeError)
def test_unicode_unicode_header(self):
- self.check(util.u('x-test-header: Москва'), util.u('Москва'))
+ with pytest.raises(UnicodeEncodeError):
+ self.check(util.u('x-test-header: Москва'), util.u('Москва'))
def test_encoded_unicode_header(self):
self.check(util.u('x-test-header: Москва').encode('utf-8'), util.u('Москва'))
--- a/tests/multi_test.py
+++ b/tests/multi_test.py
@@ -4,8 +4,8 @@
from . import localhost
import pycurl
+import pytest
import unittest
-import nose.tools
import select
from . import appmanager
@@ -370,11 +370,11 @@ class MultiTest(unittest.TestCase):
m.close()
# positional arguments are rejected
- @nose.tools.raises(TypeError)
def test_positional_arguments(self):
- pycurl.CurlMulti(1)
+ with pytest.raises(TypeError):
+ pycurl.CurlMulti(1)
# keyword arguments are rejected
- @nose.tools.raises(TypeError)
def test_keyword_arguments(self):
- pycurl.CurlMulti(a=1)
+ with pytest.raises(TypeError):
+ pycurl.CurlMulti(a=1)
--- a/tests/option_constants_test.py
+++ b/tests/option_constants_test.py
@@ -4,9 +4,8 @@
from . import localhost
import pycurl
+import pytest
import unittest
-import nose.plugins.attrib
-import nose.plugins.skip
from . import util
@@ -100,7 +99,7 @@ class OptionConstantsTest(unittest.TestC
# CURLOPT_SOCKS5_GSSAPI_SERVICE was introduced in libcurl-7.19.4
@util.min_libcurl(7, 19, 4)
- @nose.plugins.attrib.attr('gssapi')
+ @pytest.mark.gssapi
def test_socks5_gssapi_service_setopt(self):
curl = pycurl.Curl()
curl.setopt(curl.SOCKS5_GSSAPI_SERVICE, 'helloworld')
@@ -108,7 +107,7 @@ class OptionConstantsTest(unittest.TestC
# CURLOPT_SOCKS5_GSSAPI_NEC was introduced in libcurl-7.19.4
@util.min_libcurl(7, 19, 4)
- @nose.plugins.attrib.attr('gssapi')
+ @pytest.mark.gssapi
def test_socks5_gssapi_nec_setopt(self):
curl = pycurl.Curl()
curl.setopt(curl.SOCKS5_GSSAPI_NEC, True)
@@ -151,7 +150,7 @@ class OptionConstantsTest(unittest.TestC
curl.close()
@util.min_libcurl(7, 22, 0)
- @nose.plugins.attrib.attr('gssapi')
+ @pytest.mark.gssapi
def test_gssapi_delegation_options(self):
curl = pycurl.Curl()
curl.setopt(curl.GSSAPI_DELEGATION, curl.GSSAPI_DELEGATION_FLAG)
@@ -187,14 +186,14 @@ class OptionConstantsTest(unittest.TestC
curl.close()
@util.min_libcurl(7, 43, 0)
- @nose.plugins.attrib.attr('gssapi')
+ @pytest.mark.gssapi
def test_proxy_service_name(self):
curl = pycurl.Curl()
curl.setopt(curl.PROXY_SERVICE_NAME, 'fakehttp')
curl.close()
@util.min_libcurl(7, 43, 0)
- @nose.plugins.attrib.attr('gssapi')
+ @pytest.mark.gssapi
def test_service_name(self):
curl = pycurl.Curl()
curl.setopt(curl.SERVICE_NAME, 'fakehttp')
@@ -220,15 +219,15 @@ class OptionConstantsTest(unittest.TestC
curl.setopt(curl.UNIX_SOCKET_PATH, '/tmp/socket.sock')
curl.close()
- @nose.plugins.attrib.attr('http2')
@util.min_libcurl(7, 36, 0)
+ @pytest.mark.http2
def test_ssl_enable_alpn(self):
curl = pycurl.Curl()
curl.setopt(curl.SSL_ENABLE_ALPN, 1)
curl.close()
- @nose.plugins.attrib.attr('http2')
@util.min_libcurl(7, 36, 0)
+ @pytest.mark.http2
def test_ssl_enable_npn(self):
curl = pycurl.Curl()
curl.setopt(curl.SSL_ENABLE_NPN, 1)
@@ -449,23 +448,23 @@ class OptionConstantsSettingTest(unittes
self.curl.setopt(self.curl.HTTP_VERSION, self.curl.CURL_HTTP_VERSION_1_0)
self.curl.setopt(self.curl.HTTP_VERSION, self.curl.CURL_HTTP_VERSION_1_1)
- @nose.plugins.attrib.attr('http2')
@util.min_libcurl(7, 33, 0)
+ @pytest.mark.http2
def test_http_version_2_0(self):
self.curl.setopt(self.curl.HTTP_VERSION, self.curl.CURL_HTTP_VERSION_2_0)
- @nose.plugins.attrib.attr('http2')
@util.min_libcurl(7, 43, 0)
+ @pytest.mark.http2
def test_http_version_2(self):
self.curl.setopt(self.curl.HTTP_VERSION, self.curl.CURL_HTTP_VERSION_2)
- @nose.plugins.attrib.attr('http2')
@util.min_libcurl(7, 47, 0)
+ @pytest.mark.http2
def test_http_version_2tls(self):
self.curl.setopt(self.curl.HTTP_VERSION, self.curl.CURL_HTTP_VERSION_2TLS)
- @nose.plugins.attrib.attr('http2')
@util.min_libcurl(7, 49, 0)
+ @pytest.mark.http2
def test_http_version_2prior_knowledge(self):
self.curl.setopt(self.curl.HTTP_VERSION, self.curl.CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE)
--- a/tests/procmgr.py
+++ b/tests/procmgr.py
@@ -3,7 +3,7 @@ import subprocess
import os
import sys
import signal
-import nose.plugins.skip
+import unittest
from . import util, localhost
@@ -47,7 +47,7 @@ def start_setup(cmd):
return do_start
# Example on FreeBSD:
-# PYCURL_VSFTPD_PATH=/usr/local/libexec/vsftpd nosetests
+# PYCURL_VSFTPD_PATH=/usr/local/libexec/vsftpd pytest
if 'PYCURL_VSFTPD_PATH' in os.environ:
vsftpd_path = os.environ['PYCURL_VSFTPD_PATH']
@@ -76,7 +76,7 @@ def vsftpd_setup():
setup_module = start_setup(cmd)
def do_setup_module():
if vsftpd_path is None:
- raise nose.plugins.skip.SkipTest('PYCURL_VSFTPD_PATH environment variable not set')
+ raise unittest.SkipTest('PYCURL_VSFTPD_PATH environment variable not set')
try:
setup_module()
except OSError:
--- a/tests/reload_test.py
+++ b/tests/reload_test.py
@@ -3,11 +3,11 @@
# vi:ts=4:et
import pycurl
+import pytest
import unittest
-import nose.plugins.attrib
class ReloadTest(unittest.TestCase):
- @nose.plugins.attrib.attr('standalone')
+ @pytest.mark.standalone
def test_reloading(self):
try:
# python 2
--- a/tests/resolve_test.py
+++ b/tests/resolve_test.py
@@ -2,7 +2,6 @@
import pycurl
import unittest
-import nose.plugins.skip
from . import appmanager
from . import util
@@ -18,7 +17,7 @@ class ResolveTest(unittest.TestCase):
def test_resolve(self):
if util.pycurl_version_less_than(7, 21, 3) and not hasattr(pycurl, 'RESOLVE'):
- raise nose.plugins.skip.SkipTest('libcurl < 7.21.3 or no RESOLVE')
+ raise unittest.SkipTest('libcurl < 7.21.3 or no RESOLVE')
self.curl.setopt(pycurl.URL, 'http://p.localhost:8380/success')
self.curl.setopt(pycurl.RESOLVE, ['p.localhost:8380:127.0.0.1'])
--- a/tests/run.sh
+++ b/tests/run.sh
@@ -4,7 +4,7 @@ set -e
set -x
test -n "$PYTHON" || PYTHON=python
-test -n "$NOSETESTS" || NOSETESTS=nosetests
+test -n "$PYTEST" || PYTEST=pytest
mkdir -p tests/tmp
export PYTHONSUFFIX=$($PYTHON -V 2>&1 |awk '{print $2}' |awk -F. '{print $1 "." $2}')
@@ -25,5 +25,4 @@ if test "$CI" = true; then
fi
$PYTHON -c 'import pycurl; print(pycurl.version)'
-$NOSETESTS -a \!standalone"$extra_attrs" --with-flaky --show-skipped "$@"
-$NOSETESTS -a standalone --with-flaky --show-skipped "$@"
+$PYTEST
--- a/tests/setopt_string_test.py
+++ b/tests/setopt_string_test.py
@@ -3,9 +3,9 @@
# vi:ts=4:et
import pycurl
+import pytest
from . import localhost
import unittest
-import nose.tools
from . import appmanager
from . import util
@@ -26,6 +26,6 @@ class SetoptTest(unittest.TestCase):
self.curl.perform()
self.assertEqual('success', sio.getvalue().decode())
- @nose.tools.raises(TypeError)
def test_setopt_string_integer(self):
- self.curl.setopt_string(pycurl.VERBOSE, True)
+ with pytest.raises(TypeError):
+ self.curl.setopt_string(pycurl.VERBOSE, True)
--- a/tests/setopt_test.py
+++ b/tests/setopt_test.py
@@ -4,8 +4,8 @@
from . import localhost
import pycurl
+import pytest
import unittest
-import nose.tools
from . import appmanager
from . import util
@@ -27,21 +27,21 @@ class SetoptTest(unittest.TestCase):
# expect no exceptions raised
self.curl.setopt(pycurl.VERBOSE, 1)
- @nose.tools.raises(TypeError)
def test_string_value_for_integer_option(self):
- self.curl.setopt(pycurl.VERBOSE, "Hello, world!")
+ with pytest.raises(TypeError):
+ self.curl.setopt(pycurl.VERBOSE, "Hello, world!")
def test_string_value(self):
# expect no exceptions raised
self.curl.setopt(pycurl.URL, 'http://hello.world')
- @nose.tools.raises(TypeError)
def test_integer_value_for_string_option(self):
- self.curl.setopt(pycurl.URL, 1)
+ with pytest.raises(TypeError):
+ self.curl.setopt(pycurl.URL, 1)
- @nose.tools.raises(TypeError)
def test_float_value_for_integer_option(self):
- self.curl.setopt(pycurl.VERBOSE, 1.0)
+ with pytest.raises(TypeError):
+ self.curl.setopt(pycurl.VERBOSE, 1.0)
def test_httpheader_list(self):
self.curl.setopt(self.curl.HTTPHEADER, ['Accept:'])
--- a/tests/setopt_unicode_test.py
+++ b/tests/setopt_unicode_test.py
@@ -4,8 +4,8 @@
from . import localhost
import pycurl
+import pytest
import unittest
-import nose.tools
from . import appmanager
from . import util
@@ -22,9 +22,9 @@ class SetoptUnicodeTest(unittest.TestCas
def test_ascii_string(self):
self.check('p=test', 'test')
- @nose.tools.raises(UnicodeEncodeError)
def test_unicode_string(self):
- self.check(util.u('p=Москва'), util.u('Москва'))
+ with pytest.raises(UnicodeEncodeError):
+ self.check(util.u('p=Москва'), util.u('Москва'))
def test_unicode_encoded(self):
self.check(util.u('p=Москва').encode('utf8'), util.u('Москва'))
--- a/tests/setup_test.py
+++ b/tests/setup_test.py
@@ -6,7 +6,6 @@ from . import util
import setup as pycurl_setup
import unittest
import os, os.path, sys
-import nose.plugins.skip
import functools
try:
# Python 2
@@ -54,7 +53,7 @@ def min_python_version(*spec):
@functools.wraps(fn)
def decorated(*args, **kwargs):
if sys.version_info < spec:
- raise nose.plugins.skip.SkipTest('Minimum Python version %s required' % spec.join('.'))
+ raise unittest.SkipTest('Minimum Python version %s required' % spec.join('.'))
return fn(*args, **kwargs)
return decorated
--- a/tests/share_test.py
+++ b/tests/share_test.py
@@ -5,8 +5,8 @@
from . import localhost
import threading
import pycurl
+import pytest
import unittest
-import nose.tools
from . import appmanager
from . import util
@@ -58,11 +58,11 @@ class ShareTest(unittest.TestCase):
s.close()
# positional arguments are rejected
- @nose.tools.raises(TypeError)
def test_positional_arguments(self):
- pycurl.CurlShare(1)
+ with pytest.raises(TypeError):
+ pycurl.CurlShare(1)
# keyword arguments are rejected
- @nose.tools.raises(TypeError)
def test_keyword_arguments(self):
- pycurl.CurlShare(a=1)
+ with pytest.raises(TypeError):
+ pycurl.CurlShare(a=1)
--- a/tests/ssh_key_cb_test.py
+++ b/tests/ssh_key_cb_test.py
@@ -2,16 +2,16 @@
# -*- coding: utf-8 -*-
# vi:ts=4:et
-import nose
import unittest
import pycurl
+import pytest
from . import util
sftp_server = 'sftp://web.sourceforge.net'
-@nose.plugins.attrib.attr('online')
-@nose.plugins.attrib.attr('ssh')
+@pytest.mark.online
+@pytest.mark.ssh
class SshKeyCbTest(unittest.TestCase):
'''This test requires Internet access.'''
@@ -81,7 +81,7 @@ class SshKeyCbTest(unittest.TestCase):
self.assertEqual(pycurl.E_PEER_FAILED_VERIFICATION, e.args[0])
-@nose.plugins.attrib.attr('ssh')
+@pytest.mark.ssh
class SshKeyCbUnsetTest(unittest.TestCase):
def setUp(self):
self.curl = util.DefaultCurl()
--- a/tests/util.py
+++ b/tests/util.py
@@ -5,6 +5,7 @@ import tempfile
import os, sys, socket
import time as _time
import functools
+import unittest
py3 = sys.version_info[0] == 3
@@ -69,37 +70,31 @@ def pycurl_version_less_than(*spec):
return version_less_than_spec(version, spec)
def only_python2(fn):
- import nose.plugins.skip
-
@functools.wraps(fn)
def decorated(*args, **kwargs):
if sys.version_info[0] >= 3:
- raise nose.plugins.skip.SkipTest('python >= 3')
+ raise unittest.SkipTest('python >= 3')
return fn(*args, **kwargs)
return decorated
def only_python3(fn):
- import nose.plugins.skip
-
@functools.wraps(fn)
def decorated(*args, **kwargs):
if sys.version_info[0] < 3:
- raise nose.plugins.skip.SkipTest('python < 3')
+ raise unittest.SkipTest('python < 3')
return fn(*args, **kwargs)
return decorated
def min_python(major, minor):
- import nose.plugins.skip
-
def decorator(fn):
@functools.wraps(fn)
def decorated(*args, **kwargs):
if sys.version_info[0:2] < (major, minor):
- raise nose.plugins.skip.SkipTest('python < %d.%d' % (major, minor))
+ raise unittest.SkipTest('python < %d.%d' % (major, minor))
return fn(*args, **kwargs)
@@ -108,13 +103,11 @@ def min_python(major, minor):
return decorator
def min_libcurl(major, minor, patch):
- import nose.plugins.skip
-
def decorator(fn):
@functools.wraps(fn)
def decorated(*args, **kwargs):
if pycurl_version_less_than(major, minor, patch):
- raise nose.plugins.skip.SkipTest('libcurl < %d.%d.%d' % (major, minor, patch))
+ raise unittest.SkipTest('libcurl < %d.%d.%d' % (major, minor, patch))
return fn(*args, **kwargs)
@@ -123,7 +116,6 @@ def min_libcurl(major, minor, patch):
return decorator
def only_ssl(fn):
- import nose.plugins.skip
import pycurl
@functools.wraps(fn)
@@ -132,7 +124,7 @@ def only_ssl(fn):
# theoretically it is not the same test.
# pycurl.version_info()[8] is a tuple of protocols supported by libcurl
if 'https' not in pycurl.version_info()[8]:
- raise nose.plugins.skip.SkipTest('libcurl does not support ssl')
+ raise unittest.SkipTest('libcurl does not support ssl')
return fn(*args, **kwargs)
@@ -140,7 +132,6 @@ def only_ssl(fn):
def only_ssl_backends(*backends):
def decorator(fn):
- import nose.plugins.skip
import pycurl
@functools.wraps(fn)
@@ -149,7 +140,7 @@ def only_ssl_backends(*backends):
# theoretically it is not the same test.
# pycurl.version_info()[8] is a tuple of protocols supported by libcurl
if 'https' not in pycurl.version_info()[8]:
- raise nose.plugins.skip.SkipTest('libcurl does not support ssl')
+ raise unittest.SkipTest('libcurl does not support ssl')
# XXX move to pycurl library
if 'OpenSSL/' in pycurl.version:
@@ -161,7 +152,7 @@ def only_ssl_backends(*backends):
else:
current_backend = 'none'
if current_backend not in backends:
- raise nose.plugins.skip.SkipTest('SSL backend is %s' % current_backend)
+ raise unittest.SkipTest('SSL backend is %s' % current_backend)
return fn(*args, **kwargs)
@@ -169,25 +160,22 @@ def only_ssl_backends(*backends):
return decorator
def only_ipv6(fn):
- import nose.plugins.skip
import pycurl
@functools.wraps(fn)
def decorated(*args, **kwargs):
if not pycurl.version_info()[4] & pycurl.VERSION_IPV6:
- raise nose.plugins.skip.SkipTest('libcurl does not support ipv6')
+ raise unittest.SkipTest('libcurl does not support ipv6')
return fn(*args, **kwargs)
return decorated
def only_unix(fn):
- import nose.plugins.skip
-
@functools.wraps(fn)
def decorated(*args, **kwargs):
if sys.platform == 'win32':
- raise nose.plugins.skip.SkipTest('Unix only')
+ raise unittest.SkipTest('Unix only')
return fn(*args, **kwargs)
@@ -200,7 +188,6 @@ def guard_unknown_libcurl_option(fn):
where libcurl does not provide a way of detecting whether the
required libraries were compiled against.'''
- import nose.plugins.skip
import pycurl
@functools.wraps(fn)
@@ -211,7 +198,7 @@ def guard_unknown_libcurl_option(fn):
exc = sys.exc_info()[1]
# E_UNKNOWN_OPTION is available as of libcurl 7.21.5
if hasattr(pycurl, 'E_UNKNOWN_OPTION') and exc.args[0] == pycurl.E_UNKNOWN_OPTION:
- raise nose.plugins.skip.SkipTest('CURLE_UNKNOWN_OPTION, skipping test')
+ raise unittest.SkipTest('CURLE_UNKNOWN_OPTION, skipping test')
return decorated
@@ -286,12 +273,12 @@ def DefaultCurlLocalhost(port):
'''This is a default curl with localhost -> 127.0.0.1 name mapping
on windows systems, because they don't have it in the hosts file.
'''
-
+
curl = DefaultCurl()
-
+
if sys.platform == 'win32':
curl.setopt(curl.RESOLVE, ['localhost:%d:127.0.0.1' % port])
-
+
return curl
def with_real_write_file(fn):
--- a/tests/memory_mgmt_test.py
+++ b/tests/memory_mgmt_test.py
@@ -9,7 +9,7 @@ import unittest
import gc
import flaky
from . import util
-import nose
+import pytest
debug = False
@@ -18,7 +18,7 @@ if sys.platform == 'win32':
else:
devnull = '/dev/null'
-@nose.plugins.attrib.attr('occasionally_failing')
+@pytest.mark.occasionally_failing
@flaky.flaky(max_runs=3)
class MemoryMgmtTest(unittest.TestCase):
def maybe_enable_debug(self):
@@ -227,7 +227,7 @@ class MemoryMgmtTest(unittest.TestCase):
iters = 10000
else:
iters = 100000
-
+
try:
range_generator = xrange
except NameError:
@@ -284,7 +284,7 @@ class MemoryMgmtTest(unittest.TestCase):
new_object_count = len(gc.get_objects())
# it seems that GC sometimes collects something that existed
# before this test ran, GH issues #273/#274
- self.assertTrue(new_object_count in (object_count, object_count-1))
+ self.assertIn(new_object_count, (object_count, object_count-1))
def test_postfields_unicode_memory_leak_gh252(self):
# this test passed even before the memory leak was fixed,
@@ -330,13 +330,13 @@ class MemoryMgmtTest(unittest.TestCase):
del f
gc.collect()
assert ref()
-
+
for i in range(100):
assert ref()
c.setopt(option, ref())
gc.collect()
assert ref()
-
+
c.close()
gc.collect()
assert ref() is None
@@ -361,13 +361,13 @@ class MemoryMgmtTest(unittest.TestCase):
del f, fn
gc.collect()
assert ref()
-
+
for i in range(100):
assert ref()
c.setopt(option, ref())
gc.collect()
assert ref()
-
+
c.close()
gc.collect()
assert ref() is None
--- a/tests/multi_memory_mgmt_test.py
+++ b/tests/multi_memory_mgmt_test.py
@@ -7,21 +7,21 @@ import unittest
import gc
import flaky
import weakref
-import nose
+import pytest
from . import util
debug = False
-@nose.plugins.attrib.attr('occasionally_failing')
+@pytest.mark.occasionally_failing
@flaky.flaky(max_runs=3)
class MultiMemoryMgmtTest(unittest.TestCase):
def test_opensocketfunction_collection(self):
self.check_callback(pycurl.M_SOCKETFUNCTION)
-
+
def test_seekfunction_collection(self):
self.check_callback(pycurl.M_TIMERFUNCTION)
-
+
def check_callback(self, callback):
# Note: extracting a context manager seems to result in
# everything being garbage collected even if the C code
@@ -32,29 +32,29 @@ class MultiMemoryMgmtTest(unittest.TestC
# settles tracked object count for the actual test below
gc.collect()
object_count = len(gc.get_objects())
-
+
c = pycurl.CurlMulti()
c.setopt(callback, lambda x: True)
del c
-
+
gc.collect()
new_object_count = len(gc.get_objects())
# it seems that GC sometimes collects something that existed
# before this test ran, GH issues #273/#274
- self.assertTrue(new_object_count in (object_count, object_count-1))
+ self.assertIn(new_object_count, (object_count, object_count-1))
def test_curl_ref(self):
c = util.DefaultCurl()
m = pycurl.CurlMulti()
-
+
ref = weakref.ref(c)
m.add_handle(c)
del c
-
+
assert ref()
gc.collect()
assert ref()
-
+
m.remove_handle(ref())
gc.collect()
assert ref() is None
--- a/tests/multi_timer_test.py
+++ b/tests/multi_timer_test.py
@@ -5,7 +5,7 @@
from . import localhost
import pycurl
import unittest
-import nose
+import pytest
from . import appmanager
from . import util
@@ -24,7 +24,7 @@ def teardown_module(mod):
teardown_module_2(mod)
teardown_module_1(mod)
-@nose.plugins.attrib.attr('occasionally_failing')
+@pytest.mark.occasionally_failing
class MultiSocketTest(unittest.TestCase):
def test_multi_timer(self):
urls = [