@@ -4112,3 +4112,49 @@ def test_find_active_nodes(partitions_name_map, expected_nodelist):
41124112 """Unit test for the `ClusterManager._find_active_nodes()` method."""
41134113 result_nodelist = ClusterManager ._find_active_nodes (partitions_name_map )
41144114 assert_that (result_nodelist ).is_equal_to (expected_nodelist )
4115+
4116+
4117+ @pytest .mark .parametrize (
4118+ "write_heartbeat_file_succeeds, expect_heartbeat_event_published" ,
4119+ [
4120+ pytest .param (True , True , id = "When heartbeat file is written, heartbeat event is written" ),
4121+ pytest .param (False , False , id = "When heartbeat file is not written, heartbeat event is not written" ),
4122+ ],
4123+ )
4124+ @pytest .mark .usefixtures (
4125+ "initialize_instance_manager_mock" , "initialize_executor_mock" , "initialize_console_logger_mock"
4126+ )
4127+ def test_heartbeat_reporting (write_heartbeat_file_succeeds , expect_heartbeat_event_published , mocker , tmp_path ):
4128+ """Test that heartbeat event is published only when file write succeeds."""
4129+ from slurm_plugin .common import TIMESTAMP_FORMAT
4130+
4131+ heartbeat_file_path = str (tmp_path / "heartbeat" )
4132+ mock_sync_config = SimpleNamespace (
4133+ heartbeat_file_path = heartbeat_file_path ,
4134+ insufficient_capacity_timeout = 600 ,
4135+ cluster_name = "test-cluster" ,
4136+ head_node_instance_id = "i-instance-id" ,
4137+ region = "us-east-2" ,
4138+ boto3_config = None ,
4139+ fleet_config = {},
4140+ )
4141+
4142+ cluster_manager = ClusterManager (mock_sync_config )
4143+ mock_event_publisher = mocker .patch .object (cluster_manager , "_event_publisher" )
4144+
4145+ if write_heartbeat_file_succeeds :
4146+ cluster_manager ._write_timestamp_to_file ()
4147+ heartbeat_file = tmp_path / "heartbeat"
4148+ assert_that (heartbeat_file .exists ()).is_true ()
4149+ else :
4150+ mocker .patch ("os.open" , side_effect = OSError ("Mocked write failure" ))
4151+ with pytest .raises (OSError ):
4152+ cluster_manager ._write_timestamp_to_file ()
4153+
4154+ if expect_heartbeat_event_published :
4155+ mock_event_publisher .publish_heartbeat_event .assert_called_once ()
4156+ event_timestamp = mock_event_publisher .publish_heartbeat_event .call_args [0 ][0 ]
4157+ assert_that (event_timestamp ).is_instance_of (datetime )
4158+ assert_that (event_timestamp .strftime (TIMESTAMP_FORMAT )).is_equal_to (heartbeat_file .read_text ())
4159+ else :
4160+ mock_event_publisher .publish_heartbeat_event .assert_not_called ()
0 commit comments