Skip to content

Commit 841ef82

Browse files
juliandescottesmarcoscaceres
authored andcommitted
[wdspec] add network interception invalidation tests for all remaining methods
Synced from #42667 Differential Revision: https://phabricator.services.mozilla.com/D196424 bugzilla-url: https://bugzilla.mozilla.org/show_bug.cgi?id=1870032 gecko-commit: d3a29d02b3dd8d8cfbfff6fcad00d94226e102e8 gecko-reviewers: webdriver-reviewers, whimboo
1 parent c8ddd27 commit 841ef82

File tree

11 files changed

+486
-9
lines changed

11 files changed

+486
-9
lines changed

tools/webdriver/webdriver/bidi/modules/network.py

+81
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@
33
from ._module import BidiModule, command
44

55

6+
class AuthCredentials(Dict[str, Any]):
7+
def __init__(self, username: str, password: str):
8+
dict.__init__(self, type="password", username=username, password=password)
9+
10+
611
class URLPatternPattern(Dict[str, Any]):
712
def __init__(
813
self,
@@ -57,11 +62,87 @@ def _add_intercept(self, result: Mapping[str, Any]) -> Any:
5762
assert result["intercept"] is not None
5863
return result["intercept"]
5964

65+
@command
66+
def continue_with_auth(
67+
self,
68+
request: str,
69+
action: str,
70+
credentials: Optional[AuthCredentials] = None
71+
) -> Mapping[str, Any]:
72+
params: MutableMapping[str, Any] = {
73+
"request": request,
74+
"action": action,
75+
}
76+
77+
if action == "provideCredentials" and credentials is not None:
78+
params["credentials"] = credentials
79+
80+
return params
81+
82+
@command
83+
def continue_request(self,
84+
request: str,
85+
method: Optional[str] = None,
86+
url: Optional[str] = None) -> Mapping[str, Any]:
87+
params: MutableMapping[str, Any] = {
88+
"request": request,
89+
}
90+
91+
if method is not None:
92+
params["method"] = method
93+
94+
if url is not None:
95+
params["url"] = url
96+
97+
# TODO: Add support for missing parameters: body, cookies, headers
98+
99+
return params
100+
101+
@command
102+
def continue_response(
103+
self,
104+
request: str,
105+
reason_phrase: Optional[str] = None,
106+
status_code: Optional[int] = None) -> Mapping[str, Any]:
107+
params: MutableMapping[str, Any] = {
108+
"request": request,
109+
}
110+
111+
if reason_phrase is not None:
112+
params["reasonPhrase"] = reason_phrase
113+
114+
if status_code is not None:
115+
params["statusCode"] = status_code
116+
117+
# TODO: Add support for missing parameters: body, credentials, headers
118+
119+
return params
120+
60121
@command
61122
def fail_request(self, request: str) -> Mapping[str, Any]:
62123
params: MutableMapping[str, Any] = {"request": request}
63124
return params
64125

126+
@command
127+
def provide_response(
128+
self,
129+
request: str,
130+
reason_phrase: Optional[str] = None,
131+
status_code: Optional[int] = None) -> Mapping[str, Any]:
132+
params: MutableMapping[str, Any] = {
133+
"request": request,
134+
}
135+
136+
if reason_phrase is not None:
137+
params["reasonPhrase"] = reason_phrase
138+
139+
if status_code is not None:
140+
params["statusCode"] = status_code
141+
142+
# TODO: Add support for missing parameters: body, cookies, headers
143+
144+
return params
145+
65146
@command
66147
def remove_intercept(self, intercept: str) -> Mapping[str, Any]:
67148
params: MutableMapping[str, Any] = {"intercept": intercept}

webdriver/tests/bidi/network/conftest.py

+35-1
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import json
22

3+
import asyncio
34
import pytest
45
import pytest_asyncio
56

67
from webdriver.bidi.error import NoSuchInterceptException
78
from webdriver.bidi.modules.script import ContextTarget
89

9-
from . import PAGE_EMPTY_HTML, RESPONSE_COMPLETED_EVENT
10+
from . import PAGE_EMPTY_HTML, PAGE_EMPTY_TEXT, RESPONSE_COMPLETED_EVENT
1011

1112

1213
@pytest_asyncio.fixture
@@ -124,3 +125,36 @@ async def on_event(method, data, event=event):
124125
# cleanup
125126
for remove_listener in listeners:
126127
remove_listener()
128+
129+
130+
@pytest_asyncio.fixture
131+
async def setup_blocked_request(
132+
setup_network_test, url, add_intercept, fetch, wait_for_event
133+
):
134+
async def setup_blocked_request(phase):
135+
await setup_network_test(events=[f"network.{phase}"])
136+
137+
if phase == "authRequired":
138+
blocked_url = url(
139+
"/webdriver/tests/support/http_handlers/authentication.py?realm=testrealm"
140+
)
141+
else:
142+
blocked_url = url(PAGE_EMPTY_TEXT)
143+
144+
await add_intercept(
145+
phases=[phase],
146+
url_patterns=[
147+
{
148+
"type": "string",
149+
"pattern": blocked_url,
150+
}
151+
],
152+
)
153+
154+
asyncio.ensure_future(fetch(blocked_url))
155+
event = await wait_for_event(f"network.{phase}")
156+
request = event["request"]["request"]
157+
158+
return request
159+
160+
return setup_blocked_request

webdriver/tests/bidi/network/continue_request/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import pytest
2+
import webdriver.bidi.error as error
3+
4+
from .. import PAGE_EMPTY_TEXT, RESPONSE_COMPLETED_EVENT
5+
6+
pytestmark = pytest.mark.asyncio
7+
8+
9+
@pytest.mark.parametrize("value", [False, 42, {}, []])
10+
async def test_params_method_invalid_type(setup_blocked_request, bidi_session, value):
11+
request = await setup_blocked_request("beforeRequestSent")
12+
13+
with pytest.raises(error.InvalidArgumentException):
14+
await bidi_session.network.continue_request(request=request, method=value)
15+
16+
17+
@pytest.mark.parametrize("value", [None, False, 42, {}, []])
18+
async def test_params_request_invalid_type(bidi_session, value):
19+
with pytest.raises(error.InvalidArgumentException):
20+
await bidi_session.network.continue_request(request=value)
21+
22+
23+
@pytest.mark.parametrize("value", ["", "foo"])
24+
async def test_params_request_invalid_value(bidi_session, value):
25+
with pytest.raises(error.NoSuchRequestException):
26+
await bidi_session.network.continue_request(request=value)
27+
28+
29+
async def test_params_request_no_such_request(
30+
bidi_session, setup_network_test, wait_for_event, fetch, url
31+
):
32+
await setup_network_test(
33+
events=[
34+
RESPONSE_COMPLETED_EVENT,
35+
]
36+
)
37+
on_response_completed = wait_for_event(RESPONSE_COMPLETED_EVENT)
38+
39+
text_url = url(PAGE_EMPTY_TEXT)
40+
await fetch(text_url)
41+
42+
response_completed_event = await on_response_completed
43+
request = response_completed_event["request"]["request"]
44+
45+
with pytest.raises(error.NoSuchRequestException):
46+
await bidi_session.network.continue_request(request=request)
47+
48+
49+
@pytest.mark.parametrize("value", [False, 42, {}, []])
50+
async def test_params_url_invalid_type(setup_blocked_request, bidi_session, value):
51+
request = await setup_blocked_request("beforeRequestSent")
52+
53+
with pytest.raises(error.InvalidArgumentException):
54+
await bidi_session.network.continue_request(request=request, url=value)
55+
56+
57+
@pytest.mark.parametrize("protocol", ["http", "https"])
58+
@pytest.mark.parametrize("value", [":invalid", "#invalid"])
59+
async def test_params_url_invalid_value(
60+
setup_blocked_request, bidi_session, protocol, value
61+
):
62+
request = await setup_blocked_request("beforeRequestSent")
63+
64+
with pytest.raises(error.InvalidArgumentException):
65+
await bidi_session.network.continue_request(
66+
request=request, url=f"{protocol}://{value}"
67+
)

webdriver/tests/bidi/network/continue_response/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
import pytest
2+
import webdriver.bidi.error as error
3+
4+
from .. import PAGE_EMPTY_TEXT, RESPONSE_COMPLETED_EVENT
5+
6+
pytestmark = pytest.mark.asyncio
7+
8+
9+
async def test_params_request_invalid_phase(setup_blocked_request, bidi_session):
10+
request = await setup_blocked_request("beforeRequestSent")
11+
12+
with pytest.raises(error.InvalidArgumentException):
13+
await bidi_session.network.continue_response(request=request)
14+
15+
16+
@pytest.mark.parametrize("value", [None, False, 42, {}, []])
17+
async def test_params_request_invalid_type(bidi_session, value):
18+
with pytest.raises(error.InvalidArgumentException):
19+
await bidi_session.network.continue_response(request=value)
20+
21+
22+
@pytest.mark.parametrize("value", ["", "foo"])
23+
async def test_params_request_invalid_value(bidi_session, value):
24+
with pytest.raises(error.NoSuchRequestException):
25+
await bidi_session.network.continue_response(request=value)
26+
27+
28+
async def test_params_request_no_such_request(
29+
bidi_session, setup_network_test, wait_for_event, fetch, url
30+
):
31+
await setup_network_test(
32+
events=[
33+
RESPONSE_COMPLETED_EVENT,
34+
]
35+
)
36+
on_response_completed = wait_for_event(RESPONSE_COMPLETED_EVENT)
37+
38+
text_url = url(PAGE_EMPTY_TEXT)
39+
await fetch(text_url)
40+
41+
response_completed_event = await on_response_completed
42+
request = response_completed_event["request"]["request"]
43+
44+
with pytest.raises(error.NoSuchRequestException):
45+
await bidi_session.network.continue_response(request=request)
46+
47+
48+
@pytest.mark.parametrize("value", [False, 42, {}, []])
49+
async def test_params_reason_phrase_invalid_type(
50+
setup_blocked_request, bidi_session, value
51+
):
52+
request = await setup_blocked_request("responseStarted")
53+
54+
with pytest.raises(error.InvalidArgumentException):
55+
await bidi_session.network.continue_response(
56+
request=request, reason_phrase=value
57+
)
58+
59+
60+
@pytest.mark.parametrize("value", [False, "foo", {}, []])
61+
async def test_params_status_code_invalid_type(
62+
setup_blocked_request, bidi_session, value
63+
):
64+
request = await setup_blocked_request("responseStarted")
65+
66+
with pytest.raises(error.InvalidArgumentException):
67+
await bidi_session.network.continue_response(request=request, status_code=value)
68+
69+
70+
@pytest.mark.parametrize("value", [-1, 4.3])
71+
async def test_params_status_code_invalid_value(
72+
setup_blocked_request, bidi_session, value
73+
):
74+
request = await setup_blocked_request("responseStarted")
75+
76+
with pytest.raises(error.InvalidArgumentException):
77+
await bidi_session.network.continue_response(request=request, status_code=value)

webdriver/tests/bidi/network/continue_with_auth/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)