Skip to content

Commit e25063a

Browse files
authored
test(middleware-websocket): improve integ test for websocket (#7718)
1 parent e64db5e commit e25063a

File tree

3 files changed

+57
-53
lines changed

3 files changed

+57
-53
lines changed

packages-internal/middleware-websocket/src/WebSocketFetchHandler.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import type { HttpRequest } from "@smithy/protocol-http";
55
import { HttpResponse } from "@smithy/protocol-http";
66
import type { Logger, Provider, RequestHandler, RequestHandlerMetadata } from "@smithy/types";
77
import { fromBase64 } from "@smithy/util-base64";
8-
import { fromUtf8 } from "@smithy/util-utf8";
98

109
import { isWebSocketRequest } from "./utils";
1110

packages-internal/middleware-websocket/src/middleware-websocket.integ.spec.ts

Lines changed: 56 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,6 @@ describe("middleware-websocket", () => {
7272
const logSink = vi.fn();
7373
const eventStreamCodec = new EventStreamCodec(toUtf8, fromUtf8);
7474

75-
function toInt32(n: number): number[] {
76-
const uint32 = new Uint8Array(4);
77-
const dv = new DataView(uint32.buffer, 0, 4);
78-
dv.setUint32(0, n);
79-
return Array.from(uint32);
80-
}
81-
8275
const flintstone = new BedrockRuntime({
8376
credentials: {
8477
accessKeyId: "INTEG",
@@ -118,6 +111,41 @@ describe("middleware-websocket", () => {
118111
it("should transform user input asyncIterable to socket events", async () => {
119112
const server = new WS(mockUrl);
120113

114+
const body: Uint8Array = fromUtf8(
115+
JSON.stringify({
116+
bytes: Buffer.from(new Uint8Array([48, 49, 50, 51, 52, 56, 57, 57, 57])).toString("base64"),
117+
})
118+
);
119+
120+
const event = {
121+
headers: {
122+
":event-type": {
123+
type: "string",
124+
value: "chunk",
125+
},
126+
":content-type": {
127+
type: "string",
128+
value: "application/json",
129+
},
130+
":message-type": {
131+
type: "string",
132+
value: "event",
133+
},
134+
},
135+
body,
136+
} as const;
137+
138+
/**
139+
* Byte alignment:
140+
* 4 - message size
141+
* 4 - header size
142+
* 4 - prelude crc32
143+
* variable - headers
144+
* variable - body
145+
* 4 message crc32
146+
*/
147+
const bytes = eventStreamCodec.encode(event);
148+
121149
let receiveCount = 0;
122150
const [serverConfirmation, resolve, reject] = (() => {
123151
let resolve: (value?: unknown) => void;
@@ -129,47 +157,15 @@ describe("middleware-websocket", () => {
129157
return [p, resolve, reject];
130158
})();
131159

132-
server.on("connection", (socket) => {
133-
socket.on("message", async (data) => {
134-
{
135-
const body: Uint8Array = fromUtf8(
136-
JSON.stringify({
137-
chunk: {
138-
bytes: Buffer.from("012345678999").toString("base64"),
139-
},
140-
})
141-
);
160+
server.on("connection", async (socket) => {
161+
await server.connected;
142162

143-
const event = {
144-
headers: {
145-
":event-type": {
146-
type: "string",
147-
value: "chunk",
148-
},
149-
":content-type": {
150-
type: "string",
151-
value: "application/json",
152-
},
153-
":message-type": {
154-
type: "string",
155-
value: "event",
156-
},
157-
},
158-
body,
159-
} as const;
163+
socket.send(toBase64(bytes));
164+
socket.send(toBase64(bytes));
165+
socket.send(toBase64(bytes));
160166

161-
/**
162-
* Byte alignment:
163-
* 4 - message size
164-
* 4 - header size
165-
* 4 - prelude crc32
166-
* variable - headers
167-
* variable - body
168-
* 4 message crc32
169-
*/
170-
const bytes = eventStreamCodec.encode(event);
171-
server.send(toBase64(bytes));
172-
}
167+
socket.on("message", async (data) => {
168+
socket.send(toBase64(bytes));
173169

174170
try {
175171
const decoded = eventStreamCodec.decode(data as any);
@@ -238,24 +234,33 @@ describe("middleware-websocket", () => {
238234
bytes: new Uint8Array([8, 9, 10, 11]),
239235
},
240236
};
237+
238+
// holds socket open for a bit after final input.
239+
// to receive server events.
240+
await new Promise((r) => setTimeout(r, 2000));
241241
},
242242
},
243243
});
244244

245-
await server.connected;
245+
server.send(toBase64(bytes));
246246

247247
expect(logSink).toHaveBeenCalledWith("@aws-sdk - ws connecting ws://localhost:6855/mock-websocket");
248248
await serverConfirmation;
249249

250+
server.send(toBase64(bytes));
251+
server.send(toBase64(bytes));
252+
250253
const responseChunks = [];
251254
for await (const event of websocketResponse.body) {
252255
responseChunks.push(event);
256+
expect(event).toEqual({
257+
chunk: {
258+
bytes: new Uint8Array([48, 49, 50, 51, 52, 56, 57, 57, 57]),
259+
},
260+
});
253261
}
254262

255-
expect(responseChunks).toHaveLength(4);
256-
257-
// TODO: fix mock WS server response format.
258-
// expect(responseChunks).toEqual([{ bytes: new Uint8Array([]) }]);
263+
expect(responseChunks.length).toBe(10);
259264
});
260265
});
261266
});

packages-internal/middleware-websocket/vitest.config.integ.mts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,6 @@ import { defineConfig } from "vitest/config";
33
export default defineConfig({
44
test: {
55
include: ["**/*.integ.spec.ts"],
6-
environment: "node",
6+
environment: "happy-dom",
77
},
88
});

0 commit comments

Comments
 (0)