@@ -42,7 +42,6 @@ func TestAddHooks(t *testing.T) {
4242 serverHooks := & server.Hooks {}
4343 ddHooks .AddHooks (serverHooks )
4444
45- // Verify hooks were added
4645 assert .Len (t , serverHooks .OnBeforeCallTool , 1 )
4746 assert .Len (t , serverHooks .OnAfterCallTool , 1 )
4847 assert .Len (t , serverHooks .OnError , 1 )
@@ -54,31 +53,24 @@ func TestIntegrationSessionInitialize(t *testing.T) {
5453 tt := testTracer (t )
5554 defer tt .Stop ()
5655
57- // Create Datadog hooks
5856 ddHooks := NewHooks ()
5957 defer ddHooks .Stop ()
6058
61- // Create server hooks and add Datadog tracing
6259 hooks := & server.Hooks {}
6360 ddHooks .AddHooks (hooks )
6461
65- // Create MCP server with hooks
6662 srv := server .NewMCPServer ("test-server" , "1.0.0" ,
6763 server .WithHooks (hooks ))
6864
69- // Create initialize request
7065 ctx := context .Background ()
7166 initRequest := `{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test-client","version":"1.0.0"}}}`
7267
73- // Send initialize request
7468 response := srv .HandleMessage (ctx , []byte (initRequest ))
7569 assert .NotNil (t , response )
7670
77- // Marshal response to check it
7871 responseBytes , err := json .Marshal (response )
7972 require .NoError (t , err )
8073
81- // Verify response is valid JSON-RPC
8274 var resp map [string ]interface {}
8375 err = json .Unmarshal (responseBytes , & resp )
8476 require .NoError (t , err )
@@ -91,19 +83,15 @@ func TestIntegrationToolCallSuccess(t *testing.T) {
9183 tt := testTracer (t )
9284 defer tt .Stop ()
9385
94- // Create Datadog hooks
9586 ddHooks := NewHooks ()
9687 defer ddHooks .Stop ()
9788
98- // Create server hooks and add Datadog tracing
9989 hooks := & server.Hooks {}
10090 ddHooks .AddHooks (hooks )
10191
102- // Create MCP server with hooks
10392 srv := server .NewMCPServer ("test-server" , "1.0.0" ,
10493 server .WithHooks (hooks ))
10594
106- // Add a simple calculator tool
10795 calcTool := mcp .NewTool ("calculator" ,
10896 mcp .WithDescription ("A simple calculator" ))
10997
@@ -126,132 +114,108 @@ func TestIntegrationToolCallSuccess(t *testing.T) {
126114 return mcp .NewToolResultText (string (resultJSON )), nil
127115 })
128116
129- // Initialize session using default session manager
130117 ctx := context .Background ()
131118 sessionID := "test-session-123"
132119
133- // Create a mock session and add it to context
134120 session := & mockSession {id : sessionID }
135121 session .Initialize ()
136122 ctx = srv .WithContext (ctx , session )
137123
138- // Create the actual MCP tools/call request as JSON
139124 toolCallRequest := `{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"calculator","arguments":{"operation":"add","x":5,"y":3}}}`
140125
141- // Call the actual MCP server's HandleMessage method
142126 response := srv .HandleMessage (ctx , []byte (toolCallRequest ))
143127 assert .NotNil (t , response )
144128
145- // Marshal response to check it
146129 responseBytes , err := json .Marshal (response )
147130 require .NoError (t , err )
148131
149- // Verify response contains result
150132 var resp map [string ]interface {}
151133 err = json .Unmarshal (responseBytes , & resp )
152134 require .NoError (t , err )
153135 assert .Equal (t , "2.0" , resp ["jsonrpc" ])
154136 assert .NotNil (t , resp ["result" ])
155137
156- // Verify LLMObs tool span was created
157138 spans := tt .WaitForLLMObsSpans (t , 1 )
158139 require .Len (t , spans , 1 )
159140
160141 toolSpan := spans [0 ]
161142 assert .Equal (t , "calculator" , toolSpan .Name )
162143 assert .Equal (t , "tool" , toolSpan .Meta ["span.kind" ])
163144
164- // Verify input/output annotations exist
165145 assert .Contains (t , toolSpan .Meta , "input" )
166146 assert .Contains (t , toolSpan .Meta , "output" )
167147
168- // The Meta field contains map[string]any, so we need to handle it as such
169148 inputMeta := toolSpan .Meta ["input" ]
170149 assert .NotNil (t , inputMeta )
171150
172- // Input could be a map or string, marshal to JSON to check content
173151 inputJSON , err := json .Marshal (inputMeta )
174152 require .NoError (t , err )
175153 inputStr := string (inputJSON )
176154 assert .Contains (t , inputStr , "calculator" )
177155 assert .Contains (t , inputStr , "add" )
178156
179- // Same for output
180157 outputMeta := toolSpan .Meta ["output" ]
181158 assert .NotNil (t , outputMeta )
182159
183160 outputJSON , err := json .Marshal (outputMeta )
184161 require .NoError (t , err )
185162 outputStr := string (outputJSON )
186- assert .Contains (t , outputStr , "8" ) // result of 5 + 3
163+ assert .Contains (t , outputStr , "8" )
187164}
188165
189166func TestIntegrationToolCallError (t * testing.T ) {
190167 tt := testTracer (t )
191168 defer tt .Stop ()
192169
193- // Create Datadog hooks
194170 ddHooks := NewHooks ()
195171 defer ddHooks .Stop ()
196172
197- // Create server hooks and add Datadog tracing
198173 hooks := & server.Hooks {}
199174 ddHooks .AddHooks (hooks )
200175
201- // Create MCP server with hooks
202176 srv := server .NewMCPServer ("test-server" , "1.0.0" ,
203177 server .WithHooks (hooks ))
204178
205- // Add a tool that always errors
206179 errorTool := mcp .NewTool ("error_tool" ,
207180 mcp .WithDescription ("A tool that always errors" ))
208181
209182 srv .AddTool (errorTool , func (ctx context.Context , request mcp.CallToolRequest ) (* mcp.CallToolResult , error ) {
210183 return nil , errors .New ("intentional test error" )
211184 })
212185
213- // Initialize session
214186 ctx := context .Background ()
215187 sessionID := "test-session-456"
216188
217- // Create a mock session and add it to context
218189 session := & mockSession {id : sessionID }
219190 session .Initialize ()
220191 ctx = srv .WithContext (ctx , session )
221192
222- // Create the actual MCP tools/call request as JSON
223193 toolCallRequest := `{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"error_tool","arguments":{}}}`
224194
225- // Call the actual MCP server's HandleMessage method
226195 response := srv .HandleMessage (ctx , []byte (toolCallRequest ))
227196 assert .NotNil (t , response )
228197
229- // Marshal response to check it
230198 responseBytes , err := json .Marshal (response )
231199 require .NoError (t , err )
232200
233- // Verify response contains error
234201 var resp map [string ]interface {}
235202 err = json .Unmarshal (responseBytes , & resp )
236203 require .NoError (t , err )
237204 assert .Equal (t , "2.0" , resp ["jsonrpc" ])
238205 assert .NotNil (t , resp ["error" ])
239206
240- // Verify LLMObs tool span was created with error
241207 spans := tt .WaitForLLMObsSpans (t , 1 )
242208 require .Len (t , spans , 1 )
243209
244210 toolSpan := spans [0 ]
245211 assert .Equal (t , "error_tool" , toolSpan .Name )
246212 assert .Equal (t , "tool" , toolSpan .Meta ["span.kind" ])
247213
248- // Verify error was recorded
249214 assert .Contains (t , toolSpan .Meta , "error.message" )
250215 assert .Contains (t , toolSpan .Meta ["error.message" ], "intentional test error" )
251216 assert .Contains (t , toolSpan .Meta , "error.type" )
252217 assert .Contains (t , toolSpan .Meta , "error.stack" )
253218
254- // Verify input annotation was still added
255219 assert .Contains (t , toolSpan .Meta , "input" )
256220}
257221
0 commit comments