@@ -9,6 +9,7 @@ class ServerNotificationTest < ActiveSupport::TestCase
99
1010 class MockTransport < Transport
1111 attr_reader :notifications
12+ attr_accessor :logging_sessions
1213
1314 def initialize ( server )
1415 super
@@ -302,22 +303,93 @@ def send_notification(method, params = nil)
302303 assert_equal Methods ::NOTIFICATIONS_MESSAGE , notifications [ 3 ] [ :method ]
303304 end
304305
306+ test "logging/setLevel does not enable logs in other existing or future sessions" do
307+ session = ServerSession . new ( server : @server , transport : @mock_transport )
308+ other_session = ServerSession . new ( server : @server , transport : @mock_transport )
309+ @server . define_tool ( name : "log_debug" ) do |server_context :|
310+ server_context . notify_log_message ( data : "debug detail" , level : "debug" )
311+ Tool ::Response . new ( [ { type : "text" , text : "ok" } ] )
312+ end
313+
314+ response = session . handle (
315+ { jsonrpc : "2.0" , id : 1 , method : "logging/setLevel" , params : { level : "debug" } } ,
316+ )
317+ assert_equal ( { } , response [ :result ] )
318+ future_session = ServerSession . new ( server : @server , transport : @mock_transport )
319+
320+ [ other_session , future_session ] . each do |unconfigured_session |
321+ response = unconfigured_session . handle (
322+ { jsonrpc : "2.0" , id : 2 , method : "tools/call" , params : { name : "log_debug" , arguments : { } } } ,
323+ )
324+ assert_equal "ok" , response [ :result ] [ :content ] . first [ :text ]
325+ end
326+
327+ assert_empty @mock_transport . notifications
328+ assert_nil @server . logging_message_notification
329+
330+ response = session . handle (
331+ { jsonrpc : "2.0" , id : 3 , method : "tools/call" , params : { name : "log_debug" , arguments : { } } } ,
332+ )
333+ assert_equal "ok" , response [ :result ] [ :content ] . first [ :text ]
334+ assert_equal 1 , @mock_transport . notifications . size
335+ assert_equal "debug detail" , @mock_transport . notifications . first [ :params ] [ "data" ]
336+ end
337+
338+ test "logging/setLevel does not change an application-configured server-wide default" do
339+ default_logging = LoggingMessageNotification . new ( level : "error" )
340+ @server . logging_message_notification = default_logging
341+ session = ServerSession . new ( server : @server , transport : @mock_transport )
342+ other_session = ServerSession . new ( server : @server , transport : @mock_transport )
343+
344+ response = session . handle (
345+ { jsonrpc : "2.0" , id : 1 , method : "logging/setLevel" , params : { level : "debug" } } ,
346+ )
347+ assert_equal ( { } , response [ :result ] )
348+ future_session = ServerSession . new ( server : @server , transport : @mock_transport )
349+
350+ [ other_session , future_session ] . each do |unconfigured_session |
351+ unconfigured_session . notify_log_message ( data : "info detail" , level : "info" )
352+ unconfigured_session . notify_log_message ( data : "error detail" , level : "error" )
353+ end
354+ @server . notify_log_message ( data : "broadcast info" , level : "info" )
355+ @server . notify_log_message ( data : "broadcast error" , level : "error" )
356+ session . notify_log_message ( data : "session debug" , level : "debug" )
357+
358+ assert_equal [ "error detail" , "error detail" , "broadcast error" , "session debug" ] ,
359+ @mock_transport . notifications . map { |notification | notification [ :params ] [ "data" ] }
360+ assert_same default_logging , @server . logging_message_notification
361+ end
362+
305363 test "server.notify_log_message works after logging/setLevel via session" do
306364 session = ServerSession . new ( server : @server , transport : @mock_transport )
365+ @mock_transport . logging_sessions = [ session ]
307366
308367 # Client sends logging/setLevel through session.
309- @server . handle (
368+ response = @server . handle (
310369 { jsonrpc : "2.0" , id : 1 , method : "logging/setLevel" , params : { level : "info" } } ,
311370 session : session ,
312371 )
372+ assert_equal ( { } , response [ :result ] )
313373
314- # Server-level broadcast should still work because logging level
315- # is stored on both the session and the server.
316374 @server . notify_log_message ( data : "broadcast log" , level : "info" )
317375
318376 log_notifications = @mock_transport . notifications . select { |n | n [ :method ] == Methods ::NOTIFICATIONS_MESSAGE }
319377 assert_equal 1 , log_notifications . size
320378 assert_equal "broadcast log" , log_notifications . first [ :params ] [ "data" ]
321379 end
380+
381+ test "logging/setLevel without a session configures server-wide broadcasts" do
382+ response = @server . handle (
383+ { jsonrpc : "2.0" , id : 1 , method : "logging/setLevel" , params : { level : "info" } } ,
384+ )
385+ assert_equal ( { } , response [ :result ] )
386+
387+ @server . notify_log_message ( data : "debug log" , level : "debug" )
388+ @server . notify_log_message ( data : "broadcast log" , level : "info" )
389+
390+ assert_equal 1 , @mock_transport . notifications . size
391+ assert_equal Methods ::NOTIFICATIONS_MESSAGE , @mock_transport . notifications . first [ :method ]
392+ assert_equal "broadcast log" , @mock_transport . notifications . first [ :params ] [ "data" ]
393+ end
322394 end
323395end
0 commit comments