@@ -31,11 +31,11 @@ def __init__(self, trace_id, span_id): # pylint: disable=no-self-use
31
31
class SimpleTracerProvider :
32
32
"""Simple mock tracer provider without using MagicMock"""
33
33
34
- def __init__ (self ): # pylint: disable=no-self-use
34
+ def __init__ (self ): # pylint: disable=no-self-use
35
35
self .get_tracer_called = False
36
36
self .tracer_name = None
37
37
38
- def get_tracer (self , name ): # pylint: disable=no-self-use
38
+ def get_tracer (self , name ): # pylint: disable=no-self-use
39
39
self .get_tracer_called = True
40
40
self .tracer_name = name
41
41
return "mock_tracer_from_provider"
@@ -44,10 +44,10 @@ def get_tracer(self, name): # pylint: disable=no-self-use
44
44
class TestInjectTraceContext (unittest .TestCase ):
45
45
"""Test the _inject_trace_context method"""
46
46
47
- def setUp (self ): # pylint: disable=no-self-use
47
+ def setUp (self ): # pylint: disable=no-self-use
48
48
self .instrumentor = MCPInstrumentor ()
49
49
50
- def test_inject_trace_context_empty_dict (self ): # pylint: disable=no-self-use
50
+ def test_inject_trace_context_empty_dict (self ): # pylint: disable=no-self-use
51
51
"""Test injecting trace context into empty dictionary"""
52
52
# Setup
53
53
request_data = {}
@@ -70,7 +70,7 @@ def test_inject_trace_context_empty_dict(self): # pylint: disable=no-self-use
70
70
self .assertEqual (int (parts [1 ], 16 ), 12345 ) # trace_id
71
71
self .assertEqual (int (parts [2 ], 16 ), 67890 ) # span_id
72
72
73
- def test_inject_trace_context_existing_params (self ): # pylint: disable=no-self-use
73
+ def test_inject_trace_context_existing_params (self ): # pylint: disable=no-self-use
74
74
"""Test injecting trace context when params already exist"""
75
75
# Setup
76
76
request_data = {"params" : {"existing_field" : "test_value" }}
@@ -94,13 +94,13 @@ def test_inject_trace_context_existing_params(self): # pylint: disable=no-sel
94
94
class TestTracerProvider (unittest .TestCase ):
95
95
"""Test the tracer provider kwargs logic in _instrument method"""
96
96
97
- def setUp (self ): # pylint: disable=no-self-use
97
+ def setUp (self ): # pylint: disable=no-self-use
98
98
self .instrumentor = MCPInstrumentor ()
99
99
# Reset tracer to ensure test isolation
100
100
if hasattr (self .instrumentor , "tracer" ):
101
101
delattr (self .instrumentor , "tracer" )
102
102
103
- def test_instrument_without_tracer_provider_kwargs (self ): # pylint: disable=no-self-use
103
+ def test_instrument_without_tracer_provider_kwargs (self ): # pylint: disable=no-self-use
104
104
"""Test _instrument method when no tracer_provider in kwargs - should use default tracer"""
105
105
# Execute - Actually test the mcpinstrumentor method
106
106
with unittest .mock .patch ("opentelemetry.trace.get_tracer" ) as mock_get_tracer :
@@ -130,10 +130,10 @@ def test_instrument_with_tracer_provider_kwargs(self): # pylint: disable=no-sel
130
130
class TestInstrumentationDependencies (unittest .TestCase ):
131
131
"""Test the instrumentation_dependencies method"""
132
132
133
- def setUp (self ): # pylint: disable=no-self-use
133
+ def setUp (self ): # pylint: disable=no-self-use
134
134
self .instrumentor = MCPInstrumentor ()
135
135
136
- def test_instrumentation_dependencies (self ): # pylint: disable=no-self-use
136
+ def test_instrumentation_dependencies (self ): # pylint: disable=no-self-use
137
137
"""Test that instrumentation_dependencies method returns the expected dependencies"""
138
138
# Execute - Actually test the mcpinstrumentor method
139
139
dependencies = self .instrumentor .instrumentation_dependencies ()
@@ -147,7 +147,7 @@ def test_instrumentation_dependencies(self): # pylint: disable=no-self-use
147
147
class TestTraceContextInjection (unittest .TestCase ):
148
148
"""Test trace context injection using actual mcpinstrumentor methods"""
149
149
150
- def setUp (self ): # pylint: disable=no-self-use
150
+ def setUp (self ): # pylint: disable=no-self-use
151
151
self .instrumentor = MCPInstrumentor ()
152
152
153
153
def test_trace_context_injection_with_realistic_request (self ): # pylint: disable=no-self-use
@@ -159,7 +159,7 @@ def __init__(self, tool_name, arguments=None): # pylint: disable=no-self-use
159
159
self .root = self
160
160
self .params = CallToolParams (tool_name , arguments )
161
161
162
- def model_dump (self , by_alias = True , mode = "json" , exclude_none = True ): # pylint: disable=no-self-use
162
+ def model_dump (self , by_alias = True , mode = "json" , exclude_none = True ): # pylint: disable=no-self-use
163
163
result = {"method" : "call_tool" , "params" : {"name" : self .params .name }}
164
164
if self .params .arguments :
165
165
result ["params" ]["arguments" ] = self .params .arguments
@@ -177,7 +177,7 @@ def model_validate(cls, data): # pylint: disable=no-self-use
177
177
return instance
178
178
179
179
class CallToolParams :
180
- def __init__ (self , name , arguments = None ): # pylint: disable=no-self-use
180
+ def __init__ (self , name , arguments = None ): # pylint: disable=no-self-use
181
181
self .name = name
182
182
self .arguments = arguments
183
183
self ._meta = None # Will hold trace context
@@ -214,7 +214,7 @@ def __init__(self, name, arguments=None): # pylint: disable=no-self-use
214
214
class TestInstrumentedMCPServer (unittest .TestCase ):
215
215
"""Test mcpinstrumentor with a mock MCP server to verify end-to-end functionality"""
216
216
217
- def setUp (self ): # pylint: disable=no-self-use
217
+ def setUp (self ): # pylint: disable=no-self-use
218
218
self .instrumentor = MCPInstrumentor ()
219
219
# Initialize tracer so the instrumentor can work
220
220
mock_tracer = MagicMock ()
@@ -224,15 +224,15 @@ def test_no_trace_context_fallback(self): # pylint: disable=no-self-use
224
224
"""Test graceful handling when no trace context is present on server side"""
225
225
226
226
class MockServerNoTrace :
227
- async def _handle_request (self , session , request ): # pylint: disable=no-self-use
227
+ async def _handle_request (self , session , request ): # pylint: disable=no-self-use
228
228
return {"success" : True , "handled_without_trace" : True }
229
229
230
230
class MockServerRequestNoTrace :
231
- def __init__ (self , tool_name ): # pylint: disable=no-self-use
231
+ def __init__ (self , tool_name ): # pylint: disable=no-self-use
232
232
self .params = MockServerRequestParamsNoTrace (tool_name )
233
233
234
234
class MockServerRequestParamsNoTrace :
235
- def __init__ (self , name ): # pylint: disable=no-self-use
235
+ def __init__ (self , name ): # pylint: disable=no-self-use
236
236
self .name = name
237
237
self .meta = None # No trace context
238
238
@@ -274,7 +274,7 @@ def __init__(self, tool_name, arguments=None, method="call_tool"): # pylint: di
274
274
self .params = MCPRequestParams (tool_name , arguments )
275
275
self .method = method
276
276
277
- def model_dump (self , by_alias = True , mode = "json" , exclude_none = True ): # pylint: disable=no-self-use
277
+ def model_dump (self , by_alias = True , mode = "json" , exclude_none = True ): # pylint: disable=no-self-use
278
278
result = {"method" : self .method , "params" : {"name" : self .params .name }}
279
279
if self .params .arguments :
280
280
result ["params" ]["arguments" ] = self .params .arguments
@@ -293,19 +293,19 @@ def model_validate(cls, data): # pylint: disable=no-self-use
293
293
return instance
294
294
295
295
class MCPRequestParams :
296
- def __init__ (self , name , arguments = None ): # pylint: disable=no-self-use
296
+ def __init__ (self , name , arguments = None ): # pylint: disable=no-self-use
297
297
self .name = name
298
298
self .arguments = arguments
299
299
self ._meta = None
300
300
301
301
class MCPServerRequest :
302
- def __init__ (self , client_request_data ): # pylint: disable=no-self-use
302
+ def __init__ (self , client_request_data ): # pylint: disable=no-self-use
303
303
"""Server request created from client's serialized data"""
304
304
self .method = client_request_data .get ("method" , "call_tool" )
305
305
self .params = MCPServerRequestParams (client_request_data ["params" ])
306
306
307
307
class MCPServerRequestParams :
308
- def __init__ (self , params_data ): # pylint: disable=no-self-use
308
+ def __init__ (self , params_data ): # pylint: disable=no-self-use
309
309
self .name = params_data ["name" ]
310
310
self .arguments = params_data .get ("arguments" )
311
311
# Extract traceparent from _meta if present
@@ -315,16 +315,16 @@ def __init__(self, params_data): # pylint: disable=no-self-use
315
315
self .meta = None
316
316
317
317
class MCPServerRequestMeta :
318
- def __init__ (self , traceparent ): # pylint: disable=no-self-use
318
+ def __init__ (self , traceparent ): # pylint: disable=no-self-use
319
319
self .traceparent = traceparent
320
320
321
321
# Mock client and server that actually communicate
322
322
class EndToEndMCPSystem :
323
- def __init__ (self ): # pylint: disable=no-self-use
323
+ def __init__ (self ): # pylint: disable=no-self-use
324
324
self .communication_log = []
325
325
self .last_sent_request = None
326
326
327
- async def client_send_request (self , request ): # pylint: disable=no-self-use
327
+ async def client_send_request (self , request ): # pylint: disable=no-self-use
328
328
"""Client sends request - captures what gets sent"""
329
329
self .communication_log .append ("CLIENT: Preparing to send request" )
330
330
self .last_sent_request = request # Capture the modified request
@@ -336,7 +336,7 @@ async def client_send_request(self, request): # pylint: disable=no-self-use
336
336
# Return client response
337
337
return {"success" : True , "client_response" : "Request sent successfully" }
338
338
339
- async def server_handle_request (self , session , server_request ): # pylint: disable=no-self-use
339
+ async def server_handle_request (self , session , server_request ): # pylint: disable=no-self-use
340
340
"""Server handles the request it received"""
341
341
self .communication_log .append (f"SERVER: Received request for { server_request .params .name } " )
342
342
0 commit comments