code: def test_resource_utils(ray_start_10_cpus_shared):
      r1 = ExecutionResources()
      r2 = ExecutionResources(cpu=1)
      r3 = ExecutionResources(gpu=1)
      r4 = ExecutionResources(
          cpu=1, gpu=1, object_store_memory=100 * 1024 * 1024
      )
      r5 = ExecutionResources(
          cpu=1, gpu=1, object_store_memory=1024 * 1024 * 1024
      )
  
      # Test str.
      assert r3.object_store_memory_str() == "None"
      assert r4.object_store_memory_str() == "100.0 MiB"
      assert r5.object_store_memory_str() == "1.0 GiB"
  
      # Test add.
      assert r1.add(r1) == r1
      assert r1.add(r2) == r2
      assert r2.add(r2) == ExecutionResources(cpu=2)
      assert r2.add(r3) == ExecutionResources(cpu=1, gpu=1)
      assert r4.add(r4) == ExecutionResources(
          cpu=2, gpu=2, object_store_memory=200 * 1024 * 1024
      )
  
      # Test limit.
      for r in [r1, r2, r3, r4, r5]:
          assert r.satisfies_limit(r)
          assert r.satisfies_limit(ExecutionResources())
      assert r2.satisfies_limit(r3)
      assert r3.satisfies_limit(r2)
      assert r4.satisfies_limit(r5)
      assert not r5.satisfies_limit(r4)
  
file_path: ray/python/ray/data/tests/test_executor_resource_management.py
imports: import pytest
  import ray
  from ray.data._internal.compute import ActorPoolStrategy, TaskPoolStrategy
  from ray.data._internal.execution.interfaces import ExecutionOptions, ExecutionResources
  from ray.data._internal.execution.operators.input_data_buffer import InputDataBuffer
  from ray.data._internal.execution.operators.map_operator import MapOperator
  from ray.data._internal.execution.util import make_ref_bundles
  from ray.data.tests.conftest import *
  from ray.data.tests.test_operators import _mul2_map_data_prcessor
  from ray.data.tests.util import run_op_tasks_sync
label_desc: Use image node_id 1 for calling a global function with example usage: test_resource_utils(ray_start_10_cpus_shared) without return types