Skip to content

Commit fe23cc7

Browse files
committed
Align routing tests with filesystem responses
1 parent 41ebeda commit fe23cc7

2 files changed

Lines changed: 14 additions & 12 deletions

File tree

src/kernel/lib/browser_routing/routing.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,8 +209,10 @@ def install_stale_direct_vm_auth_eviction(client: httpx.Client, *, cache: Browse
209209
whose body read fails — the read error surfaces from `send()` instead and the
210210
dead route would stay cached, wedging every later call for that session. A
211211
response event hook runs after the status is known and before any body is
212-
read, which keeps eviction independent of the body. It is prepended so that a
213-
caller-supplied hook cannot pre-empt it by reading a failing body or raising.
212+
read, which keeps eviction independent of the body. For a caller-supplied
213+
`http_client`, the hook is installed into that client's `event_hooks` and
214+
prepended so an existing hook cannot pre-empt eviction by reading a failing
215+
body or raising.
214216
"""
215217
hooks = client.event_hooks.setdefault("response", [])
216218
if _has_eviction_hook(hooks, cache):

tests/test_browser_routing.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -751,7 +751,7 @@ def test_fs_read_file_routes_binary_response_from_vm(monkeypatch: pytest.MonkeyP
751751
def test_fs_write_file_routes_binary_body_to_vm(monkeypatch: pytest.MonkeyPatch) -> None:
752752
monkeypatch.delenv("KERNEL_BROWSER_ROUTING_SUBRESOURCES", raising=False)
753753
write_file = respx.put("http://browser-session.test/browser/kernel/fs/write_file").mock(
754-
return_value=httpx.Response(204)
754+
return_value=httpx.Response(201)
755755
)
756756
with Kernel(base_url=base_url, api_key=api_key, _strict_response_validation=True) as client:
757757
_cache_browser(client)
@@ -769,7 +769,7 @@ def test_fs_write_file_routes_binary_body_to_vm(monkeypatch: pytest.MonkeyPatch)
769769
@respx.mock
770770
def test_fs_upload_routes_indexed_multipart_to_vm(monkeypatch: pytest.MonkeyPatch) -> None:
771771
monkeypatch.delenv("KERNEL_BROWSER_ROUTING_SUBRESOURCES", raising=False)
772-
upload = respx.post("http://browser-session.test/browser/kernel/fs/upload").mock(return_value=httpx.Response(204))
772+
upload = respx.post("http://browser-session.test/browser/kernel/fs/upload").mock(return_value=httpx.Response(201))
773773
with Kernel(base_url=base_url, api_key=api_key, _strict_response_validation=True) as client:
774774
_cache_browser(client)
775775
client.browsers.fs.upload(
@@ -905,7 +905,7 @@ def test_stale_direct_vm_jwt_replays_buffered_fs_body_on_control_plane(
905905
vm = respx.put("http://browser-session.test/browser/kernel/fs/write_file").mock(
906906
return_value=httpx.Response(401, text="Invalid JWT")
907907
)
908-
api = respx.put(f"{base_url}/browsers/sess-1/fs/write_file").mock(return_value=httpx.Response(204))
908+
api = respx.put(f"{base_url}/browsers/sess-1/fs/write_file").mock(return_value=httpx.Response(201))
909909
with Kernel(base_url=base_url, api_key=api_key, _strict_response_validation=True) as client:
910910
_cache_browser(client)
911911
client.browsers.fs.write_file("sess-1", b"payload", path="/tmp/x")
@@ -928,7 +928,7 @@ def test_stale_direct_vm_jwt_does_not_replay_streamed_fs_body(
928928
vm = respx.put("http://browser-session.test/browser/kernel/fs/write_file").mock(
929929
return_value=httpx.Response(401, text="Invalid JWT")
930930
)
931-
api = respx.put(f"{base_url}/browsers/sess-1/fs/write_file").mock(return_value=httpx.Response(204))
931+
api = respx.put(f"{base_url}/browsers/sess-1/fs/write_file").mock(return_value=httpx.Response(201))
932932
with Kernel(base_url=base_url, api_key=api_key, _strict_response_validation=True) as client:
933933
_cache_browser(client)
934934
with pytest.raises(AuthenticationError):
@@ -950,7 +950,7 @@ async def test_async_stale_direct_vm_jwt_does_not_replay_streamed_fs_body(
950950
vm = respx.put("http://browser-session.test/browser/kernel/fs/write_file").mock(
951951
return_value=httpx.Response(401, text="Invalid JWT")
952952
)
953-
api = respx.put(f"{base_url}/browsers/sess-1/fs/write_file").mock(return_value=httpx.Response(204))
953+
api = respx.put(f"{base_url}/browsers/sess-1/fs/write_file").mock(return_value=httpx.Response(201))
954954

955955
async def _chunks() -> AsyncIterator[bytes]:
956956
yield b"chunk-one"
@@ -978,7 +978,7 @@ def test_stale_direct_vm_jwt_replays_multipart_upload_on_control_plane(
978978
vm = respx.post("http://browser-session.test/browser/kernel/fs/upload").mock(
979979
return_value=httpx.Response(403, text="Invalid JWT")
980980
)
981-
api = respx.post(f"{base_url}/browsers/sess-1/fs/upload").mock(return_value=httpx.Response(204))
981+
api = respx.post(f"{base_url}/browsers/sess-1/fs/upload").mock(return_value=httpx.Response(201))
982982
upload = tmp_path / "one.txt"
983983
upload.write_bytes(b"file-bytes")
984984

@@ -1094,7 +1094,7 @@ def test_stale_direct_vm_jwt_does_not_replay_multipart_that_cannot_rewind(
10941094
vm = respx.post("http://browser-session.test/browser/kernel/fs/upload").mock(
10951095
return_value=httpx.Response(401, text="Invalid JWT")
10961096
)
1097-
api = respx.post(f"{base_url}/browsers/sess-1/fs/upload").mock(return_value=httpx.Response(204))
1097+
api = respx.post(f"{base_url}/browsers/sess-1/fs/upload").mock(return_value=httpx.Response(201))
10981098
with Kernel(base_url=base_url, api_key=api_key, _strict_response_validation=True) as client:
10991099
_cache_browser(client)
11001100
with pytest.raises(AuthenticationError):
@@ -1123,7 +1123,7 @@ async def test_async_stale_direct_vm_jwt_does_not_replay_multipart_that_cannot_r
11231123
vm = respx.post("http://browser-session.test/browser/kernel/fs/upload").mock(
11241124
return_value=httpx.Response(403, text="Invalid JWT")
11251125
)
1126-
api = respx.post(f"{base_url}/browsers/sess-1/fs/upload").mock(return_value=httpx.Response(204))
1126+
api = respx.post(f"{base_url}/browsers/sess-1/fs/upload").mock(return_value=httpx.Response(201))
11271127
async with AsyncKernel(base_url=base_url, api_key=api_key, _strict_response_validation=True) as client:
11281128
route = browser_route_from_browser(_fake_browser())
11291129
assert route is not None
@@ -1152,7 +1152,7 @@ def test_stale_direct_vm_jwt_evicts_route_without_retries_for_buffered_body(
11521152
vm = respx.put("http://browser-session.test/browser/kernel/fs/write_file").mock(
11531153
return_value=httpx.Response(401, text="Invalid JWT")
11541154
)
1155-
api = respx.put(f"{base_url}/browsers/sess-1/fs/write_file").mock(return_value=httpx.Response(204))
1155+
api = respx.put(f"{base_url}/browsers/sess-1/fs/write_file").mock(return_value=httpx.Response(201))
11561156
with Kernel(base_url=base_url, api_key=api_key, max_retries=0, _strict_response_validation=True) as client:
11571157
_cache_browser(client)
11581158
with pytest.raises(AuthenticationError):
@@ -1178,7 +1178,7 @@ async def test_async_stale_direct_vm_jwt_evicts_route_without_retries_for_stream
11781178
vm = respx.put("http://browser-session.test/browser/kernel/fs/write_file").mock(
11791179
return_value=httpx.Response(403, text="Invalid JWT")
11801180
)
1181-
api = respx.put(f"{base_url}/browsers/sess-1/fs/write_file").mock(return_value=httpx.Response(204))
1181+
api = respx.put(f"{base_url}/browsers/sess-1/fs/write_file").mock(return_value=httpx.Response(201))
11821182

11831183
async def _chunks() -> AsyncIterator[bytes]:
11841184
yield b"chunk-one"

0 commit comments

Comments
 (0)