try to improve test ws shutdown, merge ws tests

This commit is contained in:
Karl Seguin
2026-04-02 12:31:55 +08:00
parent 59df3bd7f0
commit 3a6f73b34e
6 changed files with 4 additions and 327 deletions

View File

@@ -31,18 +31,13 @@ pub fn init() TestWSServer {
}; };
} }
pub fn deinit(self: *TestWSServer) void {
if (self.listener) |socket| {
posix.close(socket);
self.listener = null;
}
}
pub fn stop(self: *TestWSServer) void { pub fn stop(self: *TestWSServer) void {
self.shutdown.store(true, .release); self.shutdown.store(true, .release);
if (self.listener) |socket| { if (self.listener) |socket| {
posix.close(socket); switch (@import("builtin").target.os.tag) {
self.listener = null; .linux => std.posix.shutdown(socket, .recv) catch {},
else => std.posix.close(socket),
}
} }
} }

View File

@@ -309,7 +309,6 @@
const state = await testing.async(); const state = await testing.async();
let received = []; let received = [];
console.warn('last-test');
let ws = new WebSocket('ws://127.0.0.1:9584/'); let ws = new WebSocket('ws://127.0.0.1:9584/');
ws.binaryType = 'arraybuffer'; ws.binaryType = 'arraybuffer';
@@ -328,7 +327,6 @@
}); });
await state.done(() => { await state.done(() => {
console.warn('aaa');
// 1 marker byte + 8 bytes (2 x 4-byte int32) // 1 marker byte + 8 bytes (2 x 4-byte int32)
testing.expectEqual([9], received); testing.expectEqual([9], received);
}); });

View File

@@ -1,233 +0,0 @@
<!DOCTYPE html>
<script src="../testing.js"></script>
<script id=binary_arraybuffer type=module>
{
const state = await testing.async();
let received = [];
let ws = new WebSocket('ws://127.0.0.1:9584/');
ws.binaryType = 'arraybuffer';
ws.addEventListener('open', () => {
const buffer = new ArrayBuffer(4);
const view = new Uint8Array(buffer);
view[0] = 10;
view[1] = 20;
view[2] = 30;
view[3] = 40;
ws.send(buffer);
});
ws.addEventListener('message', (e) => {
const arr = new Uint8Array(e.data);
received.push(arr.length);
received.push(arr[1]); // First byte of our data (after 0xEE marker)
received.push(arr[4]); // Last byte of our data
ws.close();
});
ws.addEventListener('close', () => {
state.resolve();
});
await state.done(() => {
testing.expectEqual([5, 10, 40], received);
});
}
</script>
<script id=binary_int32array type=module>
{
const state = await testing.async();
let received = [];
let ws = new WebSocket('ws://127.0.0.1:9584/');
ws.binaryType = 'arraybuffer';
ws.addEventListener('open', () => {
const arr = new Int32Array([0x01020304, 0x05060708]);
ws.send(arr);
});
ws.addEventListener('message', (e) => {
received.push(e.data.byteLength);
ws.close();
});
ws.addEventListener('close', () => {
state.resolve();
});
await state.done(() => {
// 1 marker byte + 8 bytes (2 x 4-byte int32)
testing.expectEqual([9], received);
});
}
</script>
<script id=binary_int32array22 type=module>
{
const state = await testing.async();
let received = [];
console.warn('last-test');
let ws = new WebSocket('ws://127.0.0.1:9584/');
ws.binaryType = 'arraybuffer';
ws.addEventListener('open', () => {
const arr = new Int32Array([0x01020304, 0x05060708]);
ws.send(arr);
});
ws.addEventListener('message', (e) => {
received.push(e.data.byteLength);
ws.close();
});
ws.addEventListener('close', () => {
state.resolve();
});
await state.done(() => {
console.warn('aaa');
// 1 marker byte + 8 bytes (2 x 4-byte int32)
testing.expectEqual([9], received);
});
}
</script>
<script id=binary_blob type=module>
{
const state = await testing.async();
let received = [];
let ws = new WebSocket('ws://127.0.0.1:9584/');
ws.binaryType = 'arraybuffer';
ws.addEventListener('open', () => {
const blob = new Blob(['hello'], { type: 'text/plain' });
ws.send(blob);
});
ws.addEventListener('message', (e) => {
const arr = new Uint8Array(e.data);
received.push(arr.length);
received.push(arr[0]); // 0xEE marker
// 'h' = 104, 'e' = 101, 'l' = 108
received.push(arr[1]); // 'h'
received.push(arr[2]); // 'e'
ws.close();
});
ws.addEventListener('close', () => {
state.resolve();
});
await state.done(() => {
testing.expectEqual([6, 0xEE, 104, 101], received);
});
}
</script>
<script id=server_close type=module>
{
const state = await testing.async();
let received = [];
let ws = new WebSocket('ws://127.0.0.1:9584/');
ws.addEventListener('open', () => {
ws.send('close:1001:going away');
});
ws.addEventListener('close', (e) => {
received.push(e.code);
received.push(e.reason);
received.push(e.wasClean);
state.resolve();
});
await state.done(() => {
testing.expectEqual([1001, 'going away', true], received);
});
}
</script>
<script id=force_close type=module>
{
const state = await testing.async();
let received = [];
let ws = new WebSocket('ws://127.0.0.1:9584/');
ws.addEventListener('open', () => {
ws.send('force-close');
});
ws.addEventListener('close', (e) => {
received.push('closed');
received.push(e.wasClean);
state.resolve();
});
ws.addEventListener('error', () => {
received.push('error');
});
await state.done(() => {
// Connection was not cleanly closed
testing.expectEqual(['closed', false], received);
});
}
</script>
<script id=ready_state type=module>
{
const state = await testing.async();
let states = [];
let ws = new WebSocket('ws://127.0.0.1:9584/');
states.push(ws.readyState); // CONNECTING = 0
ws.addEventListener('open', () => {
states.push(ws.readyState); // OPEN = 1
ws.close();
states.push(ws.readyState); // CLOSING = 2
});
ws.addEventListener('close', () => {
states.push(ws.readyState); // CLOSED = 3
state.resolve();
});
await state.done(() => {
testing.expectEqual([0, 1, 2, 3], states);
});
}
</script>
<script id=buffered_amount type=module>
{
const state = await testing.async();
let results = [];
let ws = new WebSocket('ws://127.0.0.1:9584/');
ws.addEventListener('open', () => {
results.push(ws.bufferedAmount); // Should be 0 initially
ws.send('test');
// bufferedAmount might be non-zero right after send
// but will go to 0 after message is sent
ws.close();
});
ws.addEventListener('close', () => {
state.resolve();
});
await state.done(() => {
testing.expectEqual([0], results);
});
}
</script>

View File

@@ -1,77 +0,0 @@
<!DOCTYPE html>
<script src="../testing.js"></script>
<script id=handler_properties type=module>
{
const state = await testing.async();
let received = [];
let ws = new WebSocket('ws://127.0.0.1:9584/');
ws.onopen = () => {
ws.send('handler-test');
};
ws.onmessage = (e) => {
received.push(e.data);
ws.close();
};
ws.onclose = () => {
received.push('closed');
state.resolve();
};
await state.done(() => {
testing.expectEqual(['echo-handler-test', 'closed'], received);
});
}
</script>
<script id=binary_type type=module>
{
const state = await testing.async();
let results = [];
let ws = new WebSocket('ws://127.0.0.1:9584/');
ws.addEventListener('open', () => {
results.push(ws.binaryType); // Default is 'blob'
ws.binaryType = 'arraybuffer';
results.push(ws.binaryType);
ws.binaryType = 'blob';
results.push(ws.binaryType);
ws.close();
});
ws.addEventListener('close', () => {
state.resolve();
});
await state.done(() => {
testing.expectEqual(['blob', 'arraybuffer', 'blob'], results);
});
}
</script>
<script id=url_property type=module>
{
const state = await testing.async();
let result = null;
let ws = new WebSocket('ws://127.0.0.1:9584/path');
ws.addEventListener('open', () => {
result = ws.url;
ws.close();
});
ws.addEventListener('close', () => {
state.resolve();
});
await state.done(() => {
testing.expectEqual('ws://127.0.0.1:9584/path', result);
});
}
</script>

View File

@@ -693,8 +693,5 @@ pub const JsApi = struct {
const testing = @import("../../../testing.zig"); const testing = @import("../../../testing.zig");
test "WebApi: WebSocket" { test "WebApi: WebSocket" {
// TEMP since we're currently limited to 10 concurrent connections
try testing.htmlRunner("net/websocket.html", .{}); try testing.htmlRunner("net/websocket.html", .{});
try testing.htmlRunner("net/websocket2.html", .{});
try testing.htmlRunner("net/websocket3.html", .{});
} }

View File

@@ -556,9 +556,6 @@ test "tests:afterAll" {
if (test_ws_server_thread) |thread| { if (test_ws_server_thread) |thread| {
thread.join(); thread.join();
} }
if (test_ws_server) |*server| {
server.deinit();
}
@import("root").v8_peak_memory = test_browser.env.isolate.getHeapStatistics().total_physical_size; @import("root").v8_peak_memory = test_browser.env.isolate.getHeapStatistics().total_physical_size;