code: def test_exception_propagation(self):
      def raise_error():
          raise RuntimeError("Foo")
  
      def wait_test_end():
          lp.wait_for_stop()
  
      error_node = lp.PyNode(raise_error)
      waiter_node = lp.PyNode(wait_test_end)
      colo_node = lp.MultiThreadingColocation([error_node, waiter_node])
      parent_manager = worker_manager.WorkerManager(
          register_in_thread=True
      )
      with self.assertRaisesRegex(RuntimeError, "Foo"):
          manager = colo_node.run()
          self.addCleanup(
              manager.cleanup_after_test, self
          )  # pytype: disable=attribute-error
      del parent_manager
  
file_path: launchpad/launchpad/nodes/multi_threading_colocation/node_test.py
imports: import threading
  from absl.testing import absltest
  import courier
  import launchpad
  from launchpad.launch import worker_manager
label_desc: Use image node_id 3 for calling the NodeTest obj's underlying member method code with example usage: obj.test_exception_propagation() without return types