code: def test_command_runner_interface_abstraction_violation():
      """Enforces the CommandRunnerInterface functions on the subclasses.
  
      This is important to make sure the subclasses do not violate the
      function abstractions. If you need to add a new function to one of
      the CommandRunnerInterface subclasses, you have to add it to
      CommandRunnerInterface and all of its subclasses.
      """
  
      cmd_runner_interface_public_functions = dir(
          CommandRunnerInterface
      )
      allowed_public_interface_functions = {
          func
          for func in cmd_runner_interface_public_functions
          if not func.startswith("_")
      }
      for subcls in [SSHCommandRunner, DockerCommandRunner]:
          subclass_available_functions = dir(subcls)
          subclass_public_functions = {
              func
              for func in subclass_available_functions
              if not func.startswith("_")
          }
          assert (
              allowed_public_interface_functions
              == subclass_public_functions
          )
  
file_path: ray/python/ray/tests/test_command_runner.py
imports: import pytest
  from ray.tests.test_autoscaler import MockProvider, MockProcessRunner
  from ray.autoscaler.command_runner import CommandRunnerInterface
  from ray.autoscaler._private.command_runner import SSHCommandRunner, DockerCommandRunner, _with_environment_variables
  from ray.autoscaler.sdk import get_docker_host_mount_location
  from getpass import getuser
  import hashlib
label_desc: Use image node_id 3 for calling a global function with example usage: test_command_runner_interface_abstraction_violation() without return types