code: def test_ping(self):
      program = lp.Program("test")
      server_address = lp.Address()
  
      def run_client():
          client = courier.Client(server_address.resolve())
          client.ping()
  
      has_ping = threading.Event()
  
      def run_server():
          server = courier.Server(
              port=lp.get_port_from_address(server_address.resolve())
          )
          server.Bind("ping", has_ping.set)
          server.Start()
          lp.wait_for_stop()
          server.Stop()
  
      client_node = lp.PyNode(run_client)
      server_node = lp.PyNode(run_server)
      server_node.allocate_address(server_address)
      program.add_node(
          lp.MultiThreadingColocation([client_node, server_node]),
          label="client_server",
      )
      lp.launch(
          program,
          launch_type="test_mt",
          test_case=self,
          serialize_py_nodes=False,
      )  # Disable serialization due to `Lock` objects
      has_ping.wait()
  
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 1 for calling the NodeTest obj's underlying member method code with example usage: obj.test_ping() without return types