@@ -87,11 +87,21 @@ def mock_run_sut_cmd(cmd: str) -> MagicMock:
8787 )
8888
8989 if "partition --json" in cmd :
90- return make_cmd_result (
90+ json_output = (
9191 make_json_response (
9292 [{"gpu" : 0 , "memory_partition" : "NPS1" , "compute_partition" : "CPX_DISABLED" }]
9393 )
94+ + "\n "
95+ + make_json_response (
96+ [{"gpu" : 1 , "memory_partition" : "NPS1" , "compute_partition" : "CPX_DISABLED" }]
97+ )
98+ + "\n "
99+ + make_json_response (
100+ [{"gpu_id" : "N/A" , "profile_index" : "N/A" , "partition_id" : "0" }]
101+ )
102+ + "\n \n Legend:\n * = Current mode"
94103 )
104+ return make_cmd_result (json_output )
95105
96106 if "firmware --json" in cmd :
97107 return make_cmd_result (
@@ -241,9 +251,8 @@ def test_collect_data(collector):
241251 assert data .process is not None and len (data .process ) == 1
242252 assert len (data .process [0 ].process_list ) == 2
243253
244- # partition
245254 assert data .partition is not None
246- assert len (data .partition .memory_partition ) = = 1
255+ assert len (data .partition .memory_partition ) > = 1
247256 assert data .partition .memory_partition [0 ].partition_type == "NPS1"
248257
249258 # firmware
@@ -286,12 +295,12 @@ def test_get_process(collector):
286295
287296
288297def test_get_partition (collector ):
289- """Test partition parsing"""
298+ """Test partition parsing with multi-JSON output """
290299 p = collector .get_partition ()
291300 assert p is not None
292- assert len (p .memory_partition ) == 1 and len (p .compute_partition ) == 1
301+ # The mock now returns realistic multi-JSON output
302+ assert len (p .memory_partition ) >= 1
293303 assert p .memory_partition [0 ].partition_type == "NPS1"
294- assert p .compute_partition [0 ].partition_type == "CPX_DISABLED"
295304
296305
297306def test_get_firmware (collector ):
@@ -369,7 +378,7 @@ def mock_bad_json(cmd: str) -> MagicMock:
369378 result , data = c .collect_data ()
370379 assert data is not None
371380 assert data .version is None
372- assert len (result .events ) > 0 # Should have error events
381+ assert len (result .events ) > 0
373382
374383
375384def test_command_error (conn_mock , system_info , monkeypatch ):
@@ -392,3 +401,61 @@ def mock_cmd_error(cmd: str) -> MagicMock:
392401 assert data .version is None
393402 assert data .gpu_list == []
394403 assert len (result .events ) > 0 # Should have error events
404+
405+
406+ def test_multi_json_parsing (conn_mock , system_info , monkeypatch ):
407+ """Test parsing of multiple JSON objects with trailing text"""
408+
409+ def mock_multi_json (cmd : str ) -> MagicMock :
410+ if "which amd-smi" in cmd :
411+ return make_cmd_result ("/usr/bin/amd-smi" )
412+ if "test --json" in cmd :
413+ multi_json = (
414+ '[{"data": 1}]\n '
415+ '[{"data": 2}]\n '
416+ '[{"data": 3}]\n '
417+ "\n \n Legend:\n * = Current mode\n "
418+ )
419+ return make_cmd_result (multi_json )
420+ return make_cmd_result ("" )
421+
422+ c = AmdSmiCollector (
423+ system_info = system_info ,
424+ system_interaction_level = SystemInteractionLevel .PASSIVE ,
425+ connection = conn_mock ,
426+ )
427+ monkeypatch .setattr (c , "_run_sut_cmd" , mock_multi_json )
428+
429+ result = c ._run_amd_smi_dict ("test" )
430+
431+ assert result is not None
432+ assert isinstance (result , list )
433+ assert len (result ) == 3
434+ assert result [0 ] == [{"data" : 1 }]
435+ assert result [1 ] == [{"data" : 2 }]
436+ assert result [2 ] == [{"data" : 3 }]
437+
438+
439+ def test_single_json_parsing (conn_mock , system_info , monkeypatch ):
440+ """Test that single JSON parsing still works"""
441+
442+ def mock_single_json (cmd : str ) -> MagicMock :
443+ if "which amd-smi" in cmd :
444+ return make_cmd_result ("/usr/bin/amd-smi" )
445+ if "version --json" in cmd :
446+ return make_cmd_result (make_json_response ([{"tool" : "amdsmi" , "version" : "1.0" }]))
447+ return make_cmd_result ("" )
448+
449+ c = AmdSmiCollector (
450+ system_info = system_info ,
451+ system_interaction_level = SystemInteractionLevel .PASSIVE ,
452+ connection = conn_mock ,
453+ )
454+ monkeypatch .setattr (c , "_run_sut_cmd" , mock_single_json )
455+
456+ result = c ._run_amd_smi_dict ("version" )
457+
458+ assert result is not None
459+ assert isinstance (result , list )
460+ assert len (result ) == 1
461+ assert result [0 ]["tool" ] == "amdsmi"
0 commit comments