Skip to content

Commit f553452

Browse files
committed
Tests
1 parent 4af8545 commit f553452

11 files changed

Lines changed: 239 additions & 82 deletions

tests/cert/test_host.crt

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDpzCCAo+gAwIBAgIUFQHnJmB2KlSTwlRhUJy2uag5VkQwDQYJKoZIhvcNAQEL
3+
BQAwYzELMAkGA1UEBhMCUlUxEDAOBgNVBAgMB0l2YW5vdm8xEDAOBgNVBAcMB0l2
4+
YW5vdm8xDTALBgNVBAoMBEhPTUUxDTALBgNVBAsMBEhPTUUxEjAQBgNVBAMMCTEy
5+
Ny4wLjAuMTAeFw0yMDExMDYxMTI0MjFaFw0yMTExMDYxMTI0MjFaMGMxCzAJBgNV
6+
BAYTAlJVMRAwDgYDVQQIDAdJdmFub3ZvMRAwDgYDVQQHDAdJdmFub3ZvMQ0wCwYD
7+
VQQKDARIT01FMQ0wCwYDVQQLDARIT01FMRIwEAYDVQQDDAkxMjcuMC4wLjEwggEi
8+
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDBJ2rpYPJllOSJK3F+A8tEqWVP
9+
oI6ovV5iCXhjoP5gwYPD6zo+NAi89N69bLTerskHvFKAMBq0MKecM/qANzy5Q9qJ
10+
jCti7wlr11zGSeWrrIpmHSZkK6yUIYYrljff52zZRoyGb1U5/+9VDj09aR6nPDHz
11+
nde1/g9sf1LrcB+oGbbSakFtJUcN3bFGvA27c9K45CnJbZT3OliEsKNuuN+ttvGd
12+
ReNN+L8Bnvv+MbjLh3dPfwqDjXi8qW2wHeUqeE3H4Awx8ZbObiVoGu29rYxzxA1d
13+
+Xw2r7CqJ/o+n8MvPLigyx/6HEkXBYwlPl7beRB5xoxtbGacjVg9BjwM+BovAgMB
14+
AAGjUzBRMB0GA1UdDgQWBBQqn3568hW0GAW6CudMrBWnQoAoajAfBgNVHSMEGDAW
15+
gBQqn3568hW0GAW6CudMrBWnQoAoajAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
16+
DQEBCwUAA4IBAQBuA5AxLz8eqIlwRsAyjnZZw2k1+Vm1t8LWBozDXdq3wk/xrmWt
17+
A/BdcMEnp+3/cx0h5QCEF12fXf3aahMcDhlOSOFbxTMpZptAdLOzu4ZI6HV4q1YF
18+
DHSlEFu6n3wQNTa0dyGB3rOOqK2hXH2/mcXlIX6Rd69FeR7s4zldBVFY7bm4BVo4
19+
dQxyonk1rBjYYxWT1I2kxXcOY8ZakAsnkr9H5Y7sRyprZgk7B/turDLqWwjR5MYz
20+
Nq/+zwksKShBZW1bDYvAVMJcOeZMbZY4Ha8oM1Cpd6hODVEkqjCGTTROpefwBqVM
21+
E0KKqheb9kzJ9rZpqKWTCnvUPRSs9RC/3lEN
22+
-----END CERTIFICATE-----

tests/cert/test_host.key

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
-----BEGIN PRIVATE KEY-----
2+
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDBJ2rpYPJllOSJ
3+
K3F+A8tEqWVPoI6ovV5iCXhjoP5gwYPD6zo+NAi89N69bLTerskHvFKAMBq0MKec
4+
M/qANzy5Q9qJjCti7wlr11zGSeWrrIpmHSZkK6yUIYYrljff52zZRoyGb1U5/+9V
5+
Dj09aR6nPDHznde1/g9sf1LrcB+oGbbSakFtJUcN3bFGvA27c9K45CnJbZT3OliE
6+
sKNuuN+ttvGdReNN+L8Bnvv+MbjLh3dPfwqDjXi8qW2wHeUqeE3H4Awx8ZbObiVo
7+
Gu29rYxzxA1d+Xw2r7CqJ/o+n8MvPLigyx/6HEkXBYwlPl7beRB5xoxtbGacjVg9
8+
BjwM+BovAgMBAAECggEAd5r3Awj7UJfAZIg4QPYMeroCeCpN7ING3KJMoDTjD/sE
9+
ot8YM8h42Lkw7E9SOMo2xcmBtMsU3ht6zqkJJzgNLBOuUZowi5TFWrgDRO4hgArZ
10+
sJ3AVisNNLUFphvhAY8GwgyDnAN43O90vlCQ72QWjSwjKl3FY3atClxVdmD52Vbu
11+
ymhYeW2fNwdHYmkGDRk2uz5UQExPQvjwfqsFf4Nrl9RtZx4cv0ZO3XuYzeCTFnay
12+
OsOumxMwFoBZ1s2aJcscs8O/uz9Z5rM9/U85rR7wkVbvpfMKP+BZtF6Ehi6n3dJt
13+
/XDcIgmL0bKOnBxa3v5c5x7cKroAlUujzDQpMMXYAQKBgQDvolrE1FHgh6R4n45Q
14+
DcmeWUnaEogiUiLSZCWPf8vnZTi/vT2eIq1LGpCq6SZJ9iKbIX7k444FHxaYxiJC
15+
VM9W7ncV6QGw2oSz1O3hUdvT4kkU35hmKgpF/666d2OjCVxTrwNd3d5guT8hIsmD
16+
YGqlSmssx0kyfP0Kbc0SfUk4LwKBgQDOWG0IL8Sl15I3CkP7FO9bN3AgDuerzUYh
17+
5F2u0mTlCQUBmExf4cjlpBj9COyXoOk29VP/71gJcAaFsCpWCs4amUPl7X++WXeJ
18+
xQ29rgn6xw2HjvPwrHrdNLkbnXrKhGja1Uy2f18DnCX5EP9EGamNDP3DowUrEbJi
19+
+xdEDMS+AQKBgHCiSy/A7Esw9mmL9YRDNsUrCr9pfntDSALD97OfSeQVe7sD4/Z0
20+
Lifi8KSkuc6B1no8IDzNiG930VM1rdynqF0f8PFnd9f8nes45ibGJyFMdzVMc4Fx
21+
uSp1p1cVzstPFwpudJKmOmQULkwQ4c7Sfs36UK3XbdxBS16fhYhvQv8ZAoGAMM1h
22+
HCqQC9ksT7Ax29Rbt+soraxYxp1KFQH51jsUecbkVDg8+ABij018S3ws2L/J6KGl
23+
OEbXP4QrRrsfiDIOBORy1pKRP+fRCdh9I3tiCNnDLWh18VoZxO+PSCS6weMHGZqR
24+
BiihxCzOHlYSyXx4SU/lRLvtoP4Sfq58FjAe6AECgYBfmporP6jvb1erYiWxEOkJ
25+
X4FPDYEGsPXldNklm09R9bvDk2kcHT1RuuskawRDD8gr/RywM0B0ysqQY4qFzy5p
26+
R5VN9GdphpFy50B+w9U64lvY+2+h+nrhjV3Z3N3zpJuWRTS/9Gf7h/GRKP7kM7R5
27+
WG7atAiHPDm6EX4TJ+v2vQ==
28+
-----END PRIVATE KEY-----

tests/cert/test_host.pem

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDpzCCAo+gAwIBAgIUFQHnJmB2KlSTwlRhUJy2uag5VkQwDQYJKoZIhvcNAQEL
3+
BQAwYzELMAkGA1UEBhMCUlUxEDAOBgNVBAgMB0l2YW5vdm8xEDAOBgNVBAcMB0l2
4+
YW5vdm8xDTALBgNVBAoMBEhPTUUxDTALBgNVBAsMBEhPTUUxEjAQBgNVBAMMCTEy
5+
Ny4wLjAuMTAeFw0yMDExMDYxMTI0MjFaFw0yMTExMDYxMTI0MjFaMGMxCzAJBgNV
6+
BAYTAlJVMRAwDgYDVQQIDAdJdmFub3ZvMRAwDgYDVQQHDAdJdmFub3ZvMQ0wCwYD
7+
VQQKDARIT01FMQ0wCwYDVQQLDARIT01FMRIwEAYDVQQDDAkxMjcuMC4wLjEwggEi
8+
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDBJ2rpYPJllOSJK3F+A8tEqWVP
9+
oI6ovV5iCXhjoP5gwYPD6zo+NAi89N69bLTerskHvFKAMBq0MKecM/qANzy5Q9qJ
10+
jCti7wlr11zGSeWrrIpmHSZkK6yUIYYrljff52zZRoyGb1U5/+9VDj09aR6nPDHz
11+
nde1/g9sf1LrcB+oGbbSakFtJUcN3bFGvA27c9K45CnJbZT3OliEsKNuuN+ttvGd
12+
ReNN+L8Bnvv+MbjLh3dPfwqDjXi8qW2wHeUqeE3H4Awx8ZbObiVoGu29rYxzxA1d
13+
+Xw2r7CqJ/o+n8MvPLigyx/6HEkXBYwlPl7beRB5xoxtbGacjVg9BjwM+BovAgMB
14+
AAGjUzBRMB0GA1UdDgQWBBQqn3568hW0GAW6CudMrBWnQoAoajAfBgNVHSMEGDAW
15+
gBQqn3568hW0GAW6CudMrBWnQoAoajAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
16+
DQEBCwUAA4IBAQBuA5AxLz8eqIlwRsAyjnZZw2k1+Vm1t8LWBozDXdq3wk/xrmWt
17+
A/BdcMEnp+3/cx0h5QCEF12fXf3aahMcDhlOSOFbxTMpZptAdLOzu4ZI6HV4q1YF
18+
DHSlEFu6n3wQNTa0dyGB3rOOqK2hXH2/mcXlIX6Rd69FeR7s4zldBVFY7bm4BVo4
19+
dQxyonk1rBjYYxWT1I2kxXcOY8ZakAsnkr9H5Y7sRyprZgk7B/turDLqWwjR5MYz
20+
Nq/+zwksKShBZW1bDYvAVMJcOeZMbZY4Ha8oM1Cpd6hODVEkqjCGTTROpefwBqVM
21+
E0KKqheb9kzJ9rZpqKWTCnvUPRSs9RC/3lEN
22+
-----END CERTIFICATE-----
23+
-----BEGIN PRIVATE KEY-----
24+
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDBJ2rpYPJllOSJ
25+
K3F+A8tEqWVPoI6ovV5iCXhjoP5gwYPD6zo+NAi89N69bLTerskHvFKAMBq0MKec
26+
M/qANzy5Q9qJjCti7wlr11zGSeWrrIpmHSZkK6yUIYYrljff52zZRoyGb1U5/+9V
27+
Dj09aR6nPDHznde1/g9sf1LrcB+oGbbSakFtJUcN3bFGvA27c9K45CnJbZT3OliE
28+
sKNuuN+ttvGdReNN+L8Bnvv+MbjLh3dPfwqDjXi8qW2wHeUqeE3H4Awx8ZbObiVo
29+
Gu29rYxzxA1d+Xw2r7CqJ/o+n8MvPLigyx/6HEkXBYwlPl7beRB5xoxtbGacjVg9
30+
BjwM+BovAgMBAAECggEAd5r3Awj7UJfAZIg4QPYMeroCeCpN7ING3KJMoDTjD/sE
31+
ot8YM8h42Lkw7E9SOMo2xcmBtMsU3ht6zqkJJzgNLBOuUZowi5TFWrgDRO4hgArZ
32+
sJ3AVisNNLUFphvhAY8GwgyDnAN43O90vlCQ72QWjSwjKl3FY3atClxVdmD52Vbu
33+
ymhYeW2fNwdHYmkGDRk2uz5UQExPQvjwfqsFf4Nrl9RtZx4cv0ZO3XuYzeCTFnay
34+
OsOumxMwFoBZ1s2aJcscs8O/uz9Z5rM9/U85rR7wkVbvpfMKP+BZtF6Ehi6n3dJt
35+
/XDcIgmL0bKOnBxa3v5c5x7cKroAlUujzDQpMMXYAQKBgQDvolrE1FHgh6R4n45Q
36+
DcmeWUnaEogiUiLSZCWPf8vnZTi/vT2eIq1LGpCq6SZJ9iKbIX7k444FHxaYxiJC
37+
VM9W7ncV6QGw2oSz1O3hUdvT4kkU35hmKgpF/666d2OjCVxTrwNd3d5guT8hIsmD
38+
YGqlSmssx0kyfP0Kbc0SfUk4LwKBgQDOWG0IL8Sl15I3CkP7FO9bN3AgDuerzUYh
39+
5F2u0mTlCQUBmExf4cjlpBj9COyXoOk29VP/71gJcAaFsCpWCs4amUPl7X++WXeJ
40+
xQ29rgn6xw2HjvPwrHrdNLkbnXrKhGja1Uy2f18DnCX5EP9EGamNDP3DowUrEbJi
41+
+xdEDMS+AQKBgHCiSy/A7Esw9mmL9YRDNsUrCr9pfntDSALD97OfSeQVe7sD4/Z0
42+
Lifi8KSkuc6B1no8IDzNiG930VM1rdynqF0f8PFnd9f8nes45ibGJyFMdzVMc4Fx
43+
uSp1p1cVzstPFwpudJKmOmQULkwQ4c7Sfs36UK3XbdxBS16fhYhvQv8ZAoGAMM1h
44+
HCqQC9ksT7Ax29Rbt+soraxYxp1KFQH51jsUecbkVDg8+ABij018S3ws2L/J6KGl
45+
OEbXP4QrRrsfiDIOBORy1pKRP+fRCdh9I3tiCNnDLWh18VoZxO+PSCS6weMHGZqR
46+
BiihxCzOHlYSyXx4SU/lRLvtoP4Sfq58FjAe6AECgYBfmporP6jvb1erYiWxEOkJ
47+
X4FPDYEGsPXldNklm09R9bvDk2kcHT1RuuskawRDD8gr/RywM0B0ysqQY4qFzy5p
48+
R5VN9GdphpFy50B+w9U64lvY+2+h+nrhjV3Z3N3zpJuWRTS/9Gf7h/GRKP7kM7R5
49+
WG7atAiHPDm6EX4TJ+v2vQ==
50+
-----END PRIVATE KEY-----

tests/config.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@
6868
TEST_PORT_IPV4 = 8889
6969
TEST_PORT_IPV6 = 8889
7070

71+
TEST_PORT_IPV4_HTTPS = 8890
72+
7173
TEST_URL_IPV4 = 'http://{host}:{port}/ip'.format(
7274
host=TEST_HOST_NAME_IPV4,
7375
port=TEST_PORT_IPV4
@@ -77,3 +79,18 @@
7779
host=TEST_HOST_NAME_IPV6,
7880
port=TEST_PORT_IPV6
7981
)
82+
83+
TEST_URL_IPV4_HTTPS = 'https://{host}:{port}/ip'.format(
84+
host=TEST_HOST_NAME_IPV4,
85+
port=TEST_PORT_IPV4_HTTPS
86+
)
87+
88+
89+
def resolve_path(path):
90+
return os.path.normpath(
91+
os.path.join(os.path.dirname(os.path.realpath(__file__)), path))
92+
93+
94+
TEST_HOST_CERT_FILE = resolve_path('./cert/test_host.crt')
95+
TEST_HOST_KEY_FILE = resolve_path('./cert/test_host.key')
96+
TEST_HOST_PEM_FILE = resolve_path('./cert/test_host.pem')

tests/conftest.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
HTTP_PROXY_PORT,
1717
SOCKS4_PORT_NO_AUTH, SOCKS4_PROXY_PORT,
1818
SOCKS5_PROXY_PORT_NO_AUTH, TEST_PORT_IPV4, TEST_PORT_IPV6, TEST_HOST_IPV4,
19-
TEST_HOST_IPV6,
19+
TEST_HOST_IPV6, TEST_PORT_IPV4_HTTPS, TEST_HOST_CERT_FILE,
20+
TEST_HOST_KEY_FILE,
2021
)
2122
from tests.http_server import HttpServer, HttpServerConfig
2223
from tests.mocks import sync_resolve_factory, async_resolve_factory
@@ -119,7 +120,13 @@ def web_server():
119120
config = [
120121
HttpServerConfig(
121122
host=TEST_HOST_IPV4,
122-
port=TEST_PORT_IPV4
123+
port=TEST_PORT_IPV4,
124+
),
125+
HttpServerConfig(
126+
host=TEST_HOST_IPV4,
127+
port=TEST_PORT_IPV4_HTTPS,
128+
certfile=TEST_HOST_CERT_FILE,
129+
keyfile=TEST_HOST_KEY_FILE,
123130
)
124131
]
125132

tests/http_app.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import ssl
12
import flask # noqa
23
from flask import request # noqa
34

@@ -9,7 +10,13 @@ def ip():
910
return request.remote_addr
1011

1112

12-
def run_app(host, port, ssl_context=None):
13+
def run_app(host: str, port: int, certfile: str = None, keyfile: str = None):
14+
if certfile and keyfile:
15+
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS)
16+
ssl_context.load_cert_chain(certfile, keyfile)
17+
else:
18+
ssl_context = None
19+
1320
print('Starting http server on {}:{}...'.format(host, port))
1421
app.run(debug=False, host=host, port=port, threaded=True,
1522
ssl_context=ssl_context)

tests/http_server.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
class HttpServerConfig(typing.NamedTuple):
1010
host: str
1111
port: int
12+
certfile: str = None
13+
keyfile: str = None
1214

1315
def to_dict(self):
1416
d = {}

tests/test_core_socks_async_aio.py

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,11 @@
2121
from tests.config import (
2222
PROXY_HOST_IPV4, SOCKS5_PROXY_PORT, LOGIN, PASSWORD, SKIP_IPV6_TESTS,
2323
SOCKS5_IPV4_URL, SOCKS5_IPV4_URL_WO_AUTH, SOCKS5_IPV6_URL, SOCKS4_URL,
24-
HTTP_PROXY_URL, TEST_URL_IPV4, SOCKS5_IPV4_HOSTNAME_URL
24+
HTTP_PROXY_URL, TEST_URL_IPV4, SOCKS5_IPV4_HOSTNAME_URL,
25+
TEST_HOST_PEM_FILE, TEST_URL_IPV4_HTTPS
2526
)
2627

2728

28-
# TEST_URL = 'https://httpbin.org/ip'
29-
# TEST_URL = 'https://check-host.net/ip'
30-
31-
3229
async def make_request(proxy: AsyncProxy,
3330
url: str, resolve_host=False, timeout=None):
3431
loop = asyncio.get_event_loop()
@@ -48,7 +45,9 @@ async def make_request(proxy: AsyncProxy,
4845

4946
ssl_context = None
5047
if url.scheme == 'https':
51-
ssl_context = ssl.create_default_context()
48+
ssl_context = ssl.SSLContext(ssl.PROTOCOL_TLS)
49+
ssl_context.verify_mode = ssl.CERT_REQUIRED
50+
ssl_context.load_verify_locations(TEST_HOST_PEM_FILE)
5251

5352
# noinspection PyTypeChecker
5453
reader, writer = await asyncio.open_connection(
@@ -77,31 +76,34 @@ async def make_request(proxy: AsyncProxy,
7776
return int(status_code)
7877

7978

79+
@pytest.mark.parametrize('url', (TEST_URL_IPV4, TEST_URL_IPV4_HTTPS))
8080
@pytest.mark.parametrize('rdns', (True, False))
8181
@pytest.mark.parametrize('resolve_host', (True, False))
8282
@pytest.mark.asyncio
83-
async def test_socks5_proxy_ipv4(rdns, resolve_host):
83+
async def test_socks5_proxy_ipv4(url, rdns, resolve_host):
8484
proxy = Proxy.from_url(SOCKS5_IPV4_URL, rdns=rdns)
8585
status_code = await make_request(
8686
proxy=proxy,
87-
url=TEST_URL_IPV4,
87+
url=url,
8888
resolve_host=resolve_host
8989
)
9090
assert status_code == 200
9191

9292

93+
@pytest.mark.parametrize('url', (TEST_URL_IPV4, TEST_URL_IPV4_HTTPS))
9394
@pytest.mark.asyncio
94-
async def test_socks5_proxy_hostname_ipv4():
95+
async def test_socks5_proxy_hostname_ipv4(url):
9596
proxy = Proxy.from_url(SOCKS5_IPV4_HOSTNAME_URL)
96-
status_code = await make_request(proxy=proxy, url=TEST_URL_IPV4, )
97+
status_code = await make_request(proxy=proxy, url=url)
9798
assert status_code == 200
9899

99100

101+
@pytest.mark.parametrize('url', (TEST_URL_IPV4, TEST_URL_IPV4_HTTPS))
100102
@pytest.mark.parametrize('rdns', (None, True, False))
101103
@pytest.mark.asyncio
102-
async def test_socks5_proxy_ipv4_with_auth_none(rdns):
104+
async def test_socks5_proxy_ipv4_with_auth_none(url, rdns):
103105
proxy = Proxy.from_url(SOCKS5_IPV4_URL_WO_AUTH, rdns=rdns)
104-
status_code = await make_request(proxy=proxy, url=TEST_URL_IPV4)
106+
status_code = await make_request(proxy=proxy, url=url)
105107
assert status_code == 200
106108

107109

@@ -144,41 +146,45 @@ async def test_socks5_proxy_with_invalid_proxy_port(unused_tcp_port):
144146
await make_request(proxy=proxy, url=TEST_URL_IPV4)
145147

146148

147-
@pytest.mark.skipif(SKIP_IPV6_TESTS, reason='TravisCI doesn`t support ipv6')
149+
@pytest.mark.parametrize('url', (TEST_URL_IPV4, TEST_URL_IPV4_HTTPS))
150+
@pytest.mark.skipif(SKIP_IPV6_TESTS, reason="TravisCI doesn't support ipv6")
148151
@pytest.mark.asyncio
149-
async def test_socks5_proxy_ipv6():
152+
async def test_socks5_proxy_ipv6(url):
150153
proxy = Proxy.from_url(SOCKS5_IPV6_URL)
151-
status_code = await make_request(proxy=proxy, url=TEST_URL_IPV4)
154+
status_code = await make_request(proxy=proxy, url=url)
152155
assert status_code == 200
153156

154157

158+
@pytest.mark.parametrize('url', (TEST_URL_IPV4, TEST_URL_IPV4_HTTPS))
155159
@pytest.mark.parametrize('rdns', (None, True, False))
156160
@pytest.mark.parametrize('resolve_host', (True, False))
157161
@pytest.mark.asyncio
158-
async def test_socks4_proxy(rdns, resolve_host):
162+
async def test_socks4_proxy(url, rdns, resolve_host):
159163
proxy = Proxy.from_url(SOCKS4_URL, rdns=rdns)
160164
status_code = await make_request(
161165
proxy=proxy,
162-
url=TEST_URL_IPV4,
166+
url=url,
163167
resolve_host=resolve_host
164168
)
165169
assert status_code == 200
166170

167171

172+
@pytest.mark.parametrize('url', (TEST_URL_IPV4, TEST_URL_IPV4_HTTPS))
168173
@pytest.mark.asyncio
169-
async def test_http_proxy():
174+
async def test_http_proxy(url):
170175
proxy = Proxy.from_url(HTTP_PROXY_URL)
171-
status_code = await make_request(proxy=proxy, url=TEST_URL_IPV4)
176+
status_code = await make_request(proxy=proxy, url=url)
172177
assert status_code == 200
173178

174179

180+
@pytest.mark.parametrize('url', (TEST_URL_IPV4, TEST_URL_IPV4_HTTPS))
175181
@pytest.mark.asyncio
176-
async def test_proxy_chain():
182+
async def test_proxy_chain(url):
177183
proxy = ProxyChain([
178184
Proxy.from_url(SOCKS5_IPV4_URL),
179185
Proxy.from_url(SOCKS4_URL),
180186
Proxy.from_url(HTTP_PROXY_URL),
181187
])
182188
# noinspection PyTypeChecker
183-
status_code = await make_request(proxy=proxy, url=TEST_URL_IPV4)
189+
status_code = await make_request(proxy=proxy, url=url)
184190
assert status_code == 200

0 commit comments

Comments
 (0)