code: def test_reference_table():
      expected_unused_uris = []
      expected_unused_runtime_env = str()
  
      def uris_parser(runtime_env) -> Tuple[str, UriType]:
          result = list()
          result.append((runtime_env.working_dir(), "working_dir"))
          py_module_uris = runtime_env.py_modules()
          for uri in py_module_uris:
              result.append((uri, "py_modules"))
          return result
  
      def unused_uris_processor(
          unused_uris: List[Tuple[str, UriType]]
      ) -> None:
          nonlocal expected_unused_uris
          assert expected_unused_uris
          for unused in unused_uris:
              assert unused in expected_unused_uris
              expected_unused_uris.remove(unused)
          assert not expected_unused_uris
  
      def unused_runtime_env_processor(unused_runtime_env: str) -> None:
          nonlocal expected_unused_runtime_env
          assert expected_unused_runtime_env
          assert expected_unused_runtime_env == unused_runtime_env
          expected_unused_runtime_env = None
  
      reference_table = ReferenceTable(
          uris_parser,
          unused_uris_processor,
          unused_runtime_env_processor,
      )
      runtime_env_1 = RuntimeEnv(
          working_dir="s3://working_dir_1.zip",
          py_modules=["s3://py_module_A.zip", "s3://py_module_B.zip"],
      )
      runtime_env_2 = RuntimeEnv(
          working_dir="s3://working_dir_2.zip",
          py_modules=["s3://py_module_A.zip", "s3://py_module_C.zip"],
      )
      # Add runtime env 1
      reference_table.increase_reference(
          runtime_env_1, runtime_env_1.serialize(), "raylet"
      )
      # Add runtime env 2
      reference_table.increase_reference(
          runtime_env_2, runtime_env_2.serialize(), "raylet"
      )
      # Add runtime env 1 by `client_server`, this will be skipped by reference table.
      reference_table.increase_reference(
          runtime_env_1, runtime_env_1.serialize(), "client_server"
      )
  
      # Remove runtime env 1
      expected_unused_uris.append(
          ("s3://working_dir_1.zip", "working_dir")
      )
      expected_unused_uris.append(
          ("s3://py_module_B.zip", "py_modules")
      )
      expected_unused_runtime_env = runtime_env_1.serialize()
      reference_table.decrease_reference(
          runtime_env_1, runtime_env_1.serialize(), "raylet"
      )
      assert not expected_unused_uris
      assert not expected_unused_runtime_env
  
      # Remove runtime env 2
      expected_unused_uris.append(
          ("s3://working_dir_2.zip", "working_dir")
      )
      expected_unused_uris.append(
          ("s3://py_module_A.zip", "py_modules")
      )
      expected_unused_uris.append(
          ("s3://py_module_C.zip", "py_modules")
      )
      expected_unused_runtime_env = runtime_env_2.serialize()
      reference_table.decrease_reference(
          runtime_env_2, runtime_env_2.serialize(), "raylet"
      )
      assert not expected_unused_uris
      assert not expected_unused_runtime_env
  
file_path: ray/python/ray/tests/test_runtime_env_agent.py
imports: import sys
  import pytest
  import logging
  import os
  import time
  from typing import List, Tuple
  import ray
  from ray._private.runtime_env.agent.runtime_env_agent import UriType, ReferenceTable
  from ray._private import ray_constants
  from ray._private.test_utils import get_error_message, init_error_pubsub, wait_for_condition
  from ray.runtime_env import RuntimeEnv
  import psutil
label_desc: Use image node_id 1 for calling a global function with example usage: test_reference_table() and returns: result