Skip to content

Commit 437a870

Browse files
committed
Tests for request timeout
1 parent 35396f4 commit 437a870

File tree

2 files changed

+126
-0
lines changed

2 files changed

+126
-0
lines changed

src/client/index.test.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
ListToolsRequestSchema,
1515
CreateMessageRequestSchema,
1616
ListRootsRequestSchema,
17+
ErrorCode,
1718
} from "../types.js";
1819
import { Transport } from "../shared/transport.js";
1920
import { Server } from "../server/index.js";
@@ -491,3 +492,58 @@ test("should handle client cancelling a request", async () => {
491492
// Request should be rejected
492493
await expect(listResourcesPromise).rejects.toBe("Cancelled by test");
493494
});
495+
496+
test("should handle request timeout", async () => {
497+
const server = new Server(
498+
{
499+
name: "test server",
500+
version: "1.0",
501+
},
502+
{
503+
capabilities: {
504+
resources: {},
505+
},
506+
},
507+
);
508+
509+
// Set up server with a delayed response
510+
server.setRequestHandler(
511+
ListResourcesRequestSchema,
512+
async (_request, extra) => {
513+
const timer = new Promise((resolve) => {
514+
const timeout = setTimeout(resolve, 100);
515+
extra.signal.addEventListener("abort", () => clearTimeout(timeout));
516+
});
517+
518+
await timer;
519+
return {
520+
resources: [],
521+
};
522+
},
523+
);
524+
525+
const [clientTransport, serverTransport] =
526+
InMemoryTransport.createLinkedPair();
527+
528+
const client = new Client(
529+
{
530+
name: "test client",
531+
version: "1.0",
532+
},
533+
{
534+
capabilities: {},
535+
},
536+
);
537+
538+
await Promise.all([
539+
client.connect(clientTransport),
540+
server.connect(serverTransport),
541+
]);
542+
543+
// Request with 0 msec timeout should fail immediately
544+
await expect(
545+
client.listResources(undefined, { timeout: 0 }),
546+
).rejects.toMatchObject({
547+
code: ErrorCode.RequestTimeout,
548+
});
549+
});

src/server/index.test.ts

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
ListResourcesRequestSchema,
1515
ListToolsRequestSchema,
1616
SetLevelRequestSchema,
17+
ErrorCode,
1718
} from "../types.js";
1819
import { Transport } from "../shared/transport.js";
1920
import { InMemoryTransport } from "../inMemory.js";
@@ -475,3 +476,72 @@ test("should handle server cancelling a request", async () => {
475476
// Request should be rejected
476477
await expect(createMessagePromise).rejects.toBe("Cancelled by test");
477478
});
479+
test("should handle request timeout", async () => {
480+
const server = new Server(
481+
{
482+
name: "test server",
483+
version: "1.0",
484+
},
485+
{
486+
capabilities: {
487+
sampling: {},
488+
},
489+
},
490+
);
491+
492+
// Set up client that delays responses
493+
const client = new Client(
494+
{
495+
name: "test client",
496+
version: "1.0",
497+
},
498+
{
499+
capabilities: {
500+
sampling: {},
501+
},
502+
},
503+
);
504+
505+
client.setRequestHandler(
506+
CreateMessageRequestSchema,
507+
async (_request, extra) => {
508+
await new Promise((resolve, reject) => {
509+
const timeout = setTimeout(resolve, 100);
510+
extra.signal.addEventListener("abort", () => {
511+
clearTimeout(timeout);
512+
reject(extra.signal.reason);
513+
});
514+
});
515+
516+
return {
517+
model: "test",
518+
role: "assistant",
519+
content: {
520+
type: "text",
521+
text: "Test response",
522+
},
523+
};
524+
},
525+
);
526+
527+
const [clientTransport, serverTransport] =
528+
InMemoryTransport.createLinkedPair();
529+
530+
await Promise.all([
531+
client.connect(clientTransport),
532+
server.connect(serverTransport),
533+
]);
534+
535+
// Request with 0 msec timeout should fail immediately
536+
await expect(
537+
server.createMessage(
538+
{
539+
messages: [],
540+
maxTokens: 10,
541+
},
542+
{ timeout: 0 },
543+
),
544+
).rejects.toMatchObject({
545+
code: ErrorCode.RequestTimeout,
546+
});
547+
});

0 commit comments

Comments
 (0)