code: def test_auto_restart_and_timeout(self):
      def fn():
          logging.info("Running")
          time.sleep(1)
          raise ValueError
  
      mpr = multi_process_runner.MultiProcessRunner(
          fn,
          multi_worker_test_base.create_cluster_spec(num_workers=1),
          auto_restart=True,
          return_output=True,
      )
      mpr.start()
      with self.assertRaises(ValueError) as cm:
          mpr.join(timeout=10)
      self.assertGreater(
          sum(
              [
                  "Running" in msg
                  for msg in cm.exception.mpr_result.stdout
              ]
          ),
          1,
      )
  
imports: import ctypes
  import json
  import os
  import sys
  import threading
  import time
  import unittest
  from absl import logging
  from absl.testing import parameterized
  from tensorflow.python.distribute import combinations
  from tensorflow.python.distribute import multi_process_runner
  from tensorflow.python.distribute import multi_worker_test_base
  from tensorflow.python.eager import context
  from tensorflow.python.eager import test
label_desc: Use image node_id 20 for calling the MultiProcessRunnerTest obj's underlying member method code with example usage: obj.test_auto_restart_and_timeout() without return types