code: def test_invoke_run(
      self,
      shutdown_mock,
      record_events_mock,
      record_metrics_mock,
      invoke_run_mock,
  ):
      spec = self._get_worker_spec(max_restarts=1)
      agent = TestAgent(spec)
      agent.run()
      invoke_run_mock.assert_called_once()
      record_metrics_mock.assert_called_once()
      record_events_mock.assert_called_once()
      shutdown_mock.assert_called_once()
  
imports: import signal
  import unittest
  import uuid
  from typing import Any, Dict
  from unittest.mock import call, patch, MagicMock
  import torch.distributed.elastic.rendezvous.registry
  from torch.distributed.elastic.agent.server.api import RunResult, SimpleElasticAgent, WorkerGroup, WorkerSpec, WorkerState, _get_fq_hostname, _RoleInstanceInfo
  from torch.distributed.elastic.multiprocessing import SignalException
  from torch.distributed.elastic.multiprocessing.errors import ProcessFailure
  from torch.distributed.elastic.rendezvous import RendezvousHandler, RendezvousParameters
  from torch.distributed.elastic.utils.distributed import get_free_port
  from torch.testing._internal.common_utils import run_tests
label_desc: Use image node_id 6 for calling the SimpleElasticAgentTest obj's underlying member method code with example usage: obj.test_invoke_run(shutdown_mock, record_events_mock, record_metrics_mock, invoke_run_mock) without return types