blob: 7621b4481006d9e46283029c1e5ec444beef86e8 [file] [log] [blame]
import pytest
import random
from tests.support.sync import AsyncPoll
from .. import assert_response_event
PAGE_EMPTY_TEXT = "/webdriver/tests/bidi/network/support/empty.txt"
# The following tests are marked as tentative until
# https://github.com/w3c/webdriver-bidi/pull/204 is merged.
@pytest.mark.asyncio
async def test_cached(
bidi_session,
top_context,
wait_for_event,
url,
fetch,
setup_network_test,
):
network_events = await setup_network_test(
events=[
"network.responseCompleted",
]
)
events = network_events["network.responseCompleted"]
cached_url = url(
f"/webdriver/tests/support/http_handlers/cached.py?status=200&nocache={random.random()}"
)
on_response_completed = wait_for_event("network.responseCompleted")
await fetch(cached_url)
await on_response_completed
assert len(events) == 1
expected_request = {"method": "GET", "url": cached_url}
# The first request/response is used to fill the browser cache, so we expect
# fromCache to be False here.
expected_response = {
"url": cached_url,
"fromCache": False,
"status": 200,
}
assert_response_event(
events[0],
expected_request=expected_request,
expected_response=expected_response,
)
on_response_completed = wait_for_event("network.responseCompleted")
await fetch(cached_url)
await on_response_completed
assert len(events) == 2
# The second request for the same URL has to be read from the local cache.
expected_response = {
"url": cached_url,
"fromCache": True,
"status": 200,
}
assert_response_event(
events[1],
expected_request=expected_request,
expected_response=expected_response,
)
@pytest.mark.asyncio
async def test_cached_redirect(
bidi_session,
top_context,
wait_for_event,
url,
fetch,
setup_network_test,
):
network_events = await setup_network_test(
events=[
"network.responseCompleted",
]
)
events = network_events["network.responseCompleted"]
text_url = url(PAGE_EMPTY_TEXT)
cached_url = url(
f"/webdriver/tests/support/http_handlers/cached.py?status=301&location={text_url}&nocache={random.random()}"
)
await fetch(cached_url)
# Expect two events, one for the initial request and one for the redirect.
wait = AsyncPoll(bidi_session, timeout=2)
await wait.until(lambda _: len(events) >= 2)
assert len(events) == 2
# The first request/response is used to fill the cache, so we expect
# fromCache to be False here.
expected_request = {"method": "GET", "url": cached_url}
expected_response = {
"url": cached_url,
"fromCache": False,
"status": 301,
}
assert_response_event(
events[0],
expected_request=expected_request,
expected_response=expected_response,
)
# The second request is the redirect
redirected_request = {"method": "GET", "url": text_url}
redirected_response = {"url": text_url, "status": 200}
assert_response_event(
events[1],
expected_request=redirected_request,
expected_response=redirected_response,
)
await fetch(cached_url)
wait = AsyncPoll(bidi_session, timeout=2)
await wait.until(lambda _: len(events) >= 4)
assert len(events) == 4
# The third request hits cached_url again and has to be read from the local cache.
expected_response = {
"url": cached_url,
"fromCache": True,
"status": 301,
}
assert_response_event(
events[2],
expected_request=expected_request,
expected_response=expected_response,
)
# The fourth request is the redirect
assert_response_event(
events[3],
expected_request=redirected_request,
expected_response=redirected_response,
)
@pytest.mark.asyncio
async def test_cached_revalidate(
bidi_session, top_context, wait_for_event, url, fetch, setup_network_test
):
network_events = await setup_network_test(
events=[
"network.responseCompleted",
]
)
events = network_events["network.responseCompleted"]
revalidate_url = url(
f"/webdriver/tests/support/http_handlers/must-revalidate.py?nocache={random.random()}"
)
on_response_completed = wait_for_event("network.responseCompleted")
await fetch(revalidate_url)
await on_response_completed
assert len(events) == 1
expected_request = {"method": "GET", "url": revalidate_url}
expected_response = {
"url": revalidate_url,
"fromCache": False,
"status": 200,
}
assert_response_event(
events[0],
expected_request=expected_request,
expected_response=expected_response,
)
on_response_completed = wait_for_event("network.responseCompleted")
# Note that we pass a specific header so that the must-revalidate.py handler
# can decide to return a 304 without having to use another URL.
await fetch(revalidate_url, headers={"return-304": "true"})
await on_response_completed
assert len(events) == 2
# Here fromCache should still be false, because for a 304 response the response
# cache state is "validated" and fromCache is only true if cache state is "local"
expected_response = {
"url": revalidate_url,
"fromCache": False,
"status": 304,
}
assert_response_event(
events[1],
expected_request=expected_request,
expected_response=expected_response,
)