code: def test_all_completed(self):
      manager = worker_manager.WorkerManager(register_in_thread=True)
      self.addCleanup(manager.cleanup_after_test, self)
      f1_done = threading.Event()
      f2_done = threading.Event()
  
      colo_node = lp.MultiThreadingColocation(
          [lp.PyNode(f1_done.set), lp.PyNode(f2_done.set)],
          return_on_first_completed=False,
      )
      colo_node.run()  # Returns after both f1 and f2 finish.
      self.assertTrue(f1_done.is_set())
      self.assertTrue(f2_done.is_set())
  
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 5 for calling the NodeTest obj's underlying member method code with example usage: obj.test_all_completed() without return types