Skip to content

Commit 17db813

Browse files
authored
test: Refactored mcp tests to listen on new port for every streaming test, removed unncessary shutdown of process (#3420)
1 parent ceec8f9 commit 17db813

File tree

4 files changed

+26
-40
lines changed

4 files changed

+26
-40
lines changed

test/versioned/mcp-sdk/client-stdio.test.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,6 @@ test.beforeEach(async (ctx) => {
2525

2626
const { Client } = require('@modelcontextprotocol/sdk/client/index.js')
2727
const { StdioClientTransport } = require('@modelcontextprotocol/sdk/client/stdio.js')
28-
const pkgVersion = helper.readPackageVersion(__dirname, '@modelcontextprotocol/sdk')
29-
ctx.nr.pkgVersion = pkgVersion
30-
3128
ctx.nr.transport = new StdioClientTransport({
3229
command: 'node',
3330
args: ['stdio-server.js']
@@ -42,13 +39,15 @@ test.beforeEach(async (ctx) => {
4239
})
4340

4441
test.afterEach(async (ctx) => {
45-
ctx.nr.client.close()
42+
await ctx.nr.client.close()
43+
await ctx.nr.transport.close()
4644
helper.unloadAgent(ctx.nr.agent)
4745
removeModules(['@modelcontextprotocol/sdk/client/index.js', '@modelcontextprotocol/sdk/client/stdio.js'])
4846
})
4947

5048
test('should log tracking metrics', function(t) {
51-
const { agent, pkgVersion } = t.nr
49+
const { agent } = t.nr
50+
const pkgVersion = helper.readPackageVersion(__dirname, '@modelcontextprotocol/sdk')
5251
assertPackageMetrics({ agent, pkg: '@modelcontextprotocol/sdk', version: pkgVersion })
5352
})
5453

test/versioned/mcp-sdk/client-streaming.test.js

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@ const assert = require('node:assert')
1111
const { removeModules } = require('../../lib/cache-buster')
1212
const helper = require('../../lib/agent_helper')
1313
const { assertPackageMetrics, assertSegments, assertSpanKind } = require('../../lib/custom-assertions')
14-
const { readFile } = require('node:fs/promises')
15-
const path = require('node:path')
16-
1714
const {
1815
MCP
1916
} = require('../../../lib/metrics/names')
@@ -28,18 +25,14 @@ test.beforeEach(async (ctx) => {
2825

2926
const { Client } = require('@modelcontextprotocol/sdk/client/index.js')
3027
const { StreamableHTTPClientTransport } = require('@modelcontextprotocol/sdk/client/streamableHttp.js')
31-
const pkg = await readFile(path.join(__dirname, '/node_modules/@modelcontextprotocol/sdk/package.json'))
32-
const { version: pkgVersion } = JSON.parse(pkg.toString())
33-
ctx.nr.pkgVersion = pkgVersion
34-
3528
// Set up server
3629
const McpTestServer = require('./streaming-server')
3730
ctx.nr.mcpServer = new McpTestServer()
38-
await ctx.nr.mcpServer.start()
31+
const port = await ctx.nr.mcpServer.start()
3932

4033
// Set up client
4134
ctx.nr.transport = new StreamableHTTPClientTransport(
42-
new URL('http://localhost:3000/mcp')
35+
new URL(`http://localhost:${port}/mcp`)
4336
)
4437
ctx.nr.client = new Client(
4538
{
@@ -51,18 +44,24 @@ test.beforeEach(async (ctx) => {
5144
})
5245

5346
test.afterEach(async (ctx) => {
47+
await ctx.nr.client.close()
48+
await ctx.nr.transport.close()
5449
await ctx.nr.mcpServer.stop()
55-
ctx.nr.client.close()
5650
helper.unloadAgent(ctx.nr.agent)
5751
removeModules([
5852
'@modelcontextprotocol/sdk/client/index.js',
59-
'@modelcontextprotocol/sdk/client/streamableHttp.js',
60-
'./streaming-server.js'
53+
'@modelcontextprotocol/sdk/client/streamableHttp.js'
6154
])
6255
})
6356

57+
test('should log package tracking metrics', (t) => {
58+
const { agent } = t.nr
59+
const version = helper.readPackageVersion(__dirname, '@modelcontextprotocol/sdk')
60+
assertPackageMetrics({ agent, pkg: '@modelcontextprotocol/sdk', version })
61+
})
62+
6463
test('should create span for callTool', (t, end) => {
65-
const { agent, client, pkgVersion } = t.nr
64+
const { agent, client } = t.nr
6665
helper.runInTransaction(agent, async (tx) => {
6766
const result = await client.callTool({
6867
name: 'echo',
@@ -80,14 +79,13 @@ test('should create span for callTool', (t, end) => {
8079
{ name, kind: 'internal' }
8180
]
8281
})
83-
assertPackageMetrics({ agent, pkg: '@modelcontextprotocol/sdk', version: pkgVersion })
8482

8583
end()
8684
})
8785
})
8886

8987
test('should create span for readResource', (t, end) => {
90-
const { agent, client, pkgVersion } = t.nr
88+
const { agent, client } = t.nr
9189
helper.runInTransaction(agent, async (tx) => {
9290
const resource = await client.readResource({
9391
uri: 'echo://hello-world',
@@ -106,14 +104,12 @@ test('should create span for readResource', (t, end) => {
106104
]
107105
})
108106

109-
assertPackageMetrics({ agent, pkg: '@modelcontextprotocol/sdk', version: pkgVersion })
110-
111107
end()
112108
})
113109
})
114110

115111
test('should create span for getPrompt', (t, end) => {
116-
const { agent, client, pkgVersion } = t.nr
112+
const { agent, client } = t.nr
117113
helper.runInTransaction(agent, async (tx) => {
118114
const prompt = await client.getPrompt({
119115
name: 'echo',
@@ -135,8 +131,6 @@ test('should create span for getPrompt', (t, end) => {
135131
]
136132
})
137133

138-
assertPackageMetrics({ agent, pkg: '@modelcontextprotocol/sdk', version: pkgVersion })
139-
140134
end()
141135
})
142136
})

test/versioned/mcp-sdk/stdio-server.js

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,6 @@ async function main() {
1919
},
2020
})
2121

22-
// Set up auto-shutdown after first request
23-
const shutdown = () => {
24-
process.exit(0)
25-
}
26-
2722
server.registerResource(
2823
'echo',
2924
new ResourceTemplate('echo://{message}', { list: undefined }),
@@ -38,7 +33,6 @@ async function main() {
3833
text: `Resource echo: ${message}`
3934
}]
4035
}
41-
setTimeout(shutdown, 100)
4236
return result
4337
}
4438
)
@@ -52,7 +46,6 @@ async function main() {
5246
},
5347
async ({ message }) => {
5448
const result = { content: [{ type: 'text', text: `Tool echo: ${message}` }] }
55-
setTimeout(shutdown, 100)
5649
return result
5750
}
5851
)
@@ -74,7 +67,6 @@ async function main() {
7467
}
7568
}]
7669
}
77-
setTimeout(shutdown, 100)
7870
return result
7971
}
8072
)

test/versioned/mcp-sdk/streaming-server.js

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ class McpTestServer {
2424
this.transport = new StreamableHTTPServerTransport({
2525
sessionIdGenerator: undefined,
2626
enableDnsRebindingProtection: true,
27-
allowedHosts: ['127.0.0.1:3000', 'localhost:3000']
2827
})
2928

3029
this.app = express()
@@ -110,19 +109,21 @@ class McpTestServer {
110109
}
111110

112111
async start() {
112+
const self = this
113113
await this.server.connect(this.transport)
114-
const PORT = process.env.PORT || 3000
115114
return new Promise((resolve) => {
116-
this.expressServer = this.app.listen(PORT, () => {
117-
resolve()
115+
this.expressServer = this.app.listen(0, function onListen() {
116+
const port = this.address().port
117+
self.transport._allowedHosts = [`127.0.0.1:${port}`, `localhost:${port}`]
118+
resolve(port)
118119
})
119120
})
120121
}
121122

122123
async stop() {
123-
if (this.transport) {
124-
await this.transport.close()
125-
}
124+
await this.transport.close()
125+
this.server.close()
126+
126127
return new Promise((resolve, reject) => {
127128
if (this.expressServer) {
128129
this.expressServer.close((err) => {

0 commit comments

Comments
 (0)