mirror of
https://github.com/denoland/deno.git
synced 2024-11-23 15:16:54 -05:00
576d0db372
Deno.serve's fast streaming implementation was not keeping the request
body resource ID alive. We were taking the `Rc<Resource>` from the
resource table during the response, so a hairpin duplex response that
fed back the request body would work.
However, if any JS code attempted to read from the request body (which
requires the resource ID to be valid), the response would fail with a
difficult-to-diagnose "EOF" error.
This was affecting more complex duplex uses of `Deno.fetch` (though as
far as I can tell was unreported).
Simple test:
```ts
const reader = request.body.getReader();
return new Response(
new ReadableStream({
async pull(controller) {
const { done, value } = await reader.read();
if (done) {
controller.close();
} else {
controller.enqueue(value);
}
},
}),
```
And then attempt to use the stream in duplex mode:
```ts
async function testDuplex(
reader: ReadableStreamDefaultReader<Uint8Array>,
writable: WritableStreamDefaultWriter<Uint8Array>,
) {
await writable.write(new Uint8Array([1]));
const chunk1 = await reader.read();
assert(!chunk1.done);
assertEquals(chunk1.value, new Uint8Array([1]));
await writable.write(new Uint8Array([2]));
const chunk2 = await reader.read();
assert(!chunk2.done);
assertEquals(chunk2.value, new Uint8Array([2]));
await writable.close();
const chunk3 = await reader.read();
assert(chunk3.done);
}
```
In older versions of Deno, this would just lock up. I believe after
|
||
---|---|---|
.. | ||
abort_controller_test.ts | ||
blob_test.ts | ||
body_test.ts | ||
broadcast_channel_test.ts | ||
buffer_test.ts | ||
build_test.ts | ||
cache_api_test.ts | ||
chmod_test.ts | ||
chown_test.ts | ||
command_test.ts | ||
console_test.ts | ||
copy_file_test.ts | ||
custom_event_test.ts | ||
dir_test.ts | ||
dom_exception_test.ts | ||
error_stack_test.ts | ||
error_test.ts | ||
esnext_test.ts | ||
event_target_test.ts | ||
event_test.ts | ||
fetch_test.ts | ||
ffi_test.ts | ||
file_test.ts | ||
filereader_test.ts | ||
files_test.ts | ||
flock_test.ts | ||
fs_events_test.ts | ||
get_random_values_test.ts | ||
globals_test.ts | ||
headers_test.ts | ||
http_test.ts | ||
internals_test.ts | ||
intl_test.ts | ||
io_test.ts | ||
kv_queue_undelivered_test.ts | ||
kv_test.ts | ||
link_test.ts | ||
make_temp_test.ts | ||
message_channel_test.ts | ||
metrics_test.ts | ||
mkdir_test.ts | ||
navigator_test.ts | ||
net_test.ts | ||
network_interfaces_test.ts | ||
opcall_test.ts | ||
os_test.ts | ||
path_from_url_test.ts | ||
performance_test.ts | ||
permissions_test.ts | ||
process_test.ts | ||
progressevent_test.ts | ||
promise_hooks_test.ts | ||
read_dir_test.ts | ||
read_file_test.ts | ||
read_link_test.ts | ||
read_text_file_test.ts | ||
README.md | ||
real_path_test.ts | ||
ref_unref_test.ts | ||
remove_test.ts | ||
rename_test.ts | ||
request_test.ts | ||
resources_test.ts | ||
response_test.ts | ||
serve_test.ts | ||
signal_test.ts | ||
stat_test.ts | ||
stdio_test.ts | ||
streams_test.ts | ||
structured_clone_test.ts | ||
symlink_test.ts | ||
sync_test.ts | ||
test_util.ts | ||
testing_test.ts | ||
text_encoding_test.ts | ||
timers_test.ts | ||
tls_test.ts | ||
truncate_test.ts | ||
tty_color_test.ts | ||
tty_test.ts | ||
umask_test.ts | ||
url_search_params_test.ts | ||
url_test.ts | ||
urlpattern_test.ts | ||
utime_test.ts | ||
version_test.ts | ||
wasm_test.ts | ||
webcrypto_test.ts | ||
websocket_test.ts | ||
webstorage_test.ts | ||
worker_permissions_test.ts | ||
worker_types.ts | ||
write_file_test.ts | ||
write_text_file_test.ts |
Deno runtime tests
Files in this directory are unit tests for Deno runtime.
Testing Deno runtime code requires checking API under different runtime
permissions. To accomplish this all tests exercised are created using
Deno.test()
function.
import {} from "./test_util.ts";
Deno.test(function simpleTestFn(): void {
// test code here
});
Deno.test(
{
ignore: Deno.build.os === "windows",
permissions: { read: true, write: true },
},
function complexTestFn(): void {
// test code here
},
);
Running tests
There are two ways to run unit_test_runner.ts
:
# Run all tests.
cargo run --bin deno -- test --allow-all --unstable --location=http://js-unit-tests/foo/bar cli/tests/unit/
# Run a specific test module
cargo run --bin deno -- test --allow-all --unstable --location=http://js-unit-tests/foo/bar cli/tests/unit/files_test.ts
Http server
target/debug/test_server
is required to run when one's running unit tests.
During CI it's spawned automatically, but if you want to run tests manually make
sure that server is spawned otherwise there'll be cascade of test failures.