code: def test_connector_pipeline(self):
      ctx = ConnectorContext()
      connectors = [ConvertToNumpyConnector(ctx)]
      pipeline = ActionConnectorPipeline(ctx, connectors)
      name, params = pipeline.to_state()
      restored = get_connector(name, ctx, params)
      self.assertTrue(isinstance(restored, ActionConnectorPipeline))
      self.assertTrue(
          isinstance(restored.connectors[0], ConvertToNumpyConnector)
      )
      # There should not be any timer yet
      self.assertFalse(bool(pipeline.timers.values()))
      pipeline(ActionConnectorDataType(0, 0, {}, ([1], [], None)))
      # After a first input, there should be one timer
      self.assertEquals(len(pipeline.timers.values()), 1)
  
file_path: ray/rllib/connectors/tests/test_action.py
imports: import unittest
  import gymnasium
  import numpy
  from ray.rllib.connectors.action.clip import ClipActionsConnector
  from ray.rllib.connectors.action.immutable import ImmutableActionsConnector
  from ray.rllib.connectors.action.lambdas import ConvertToNumpyConnector
  from ray.rllib.connectors.action.normalize import NormalizeActionsConnector
  from ray.rllib.connectors.action.pipeline import ActionConnectorPipeline
  from ray.rllib.connectors.connector import ConnectorContext
  from ray.rllib.connectors.registry import get_connector
  from ray.rllib.utils.framework import try_import_torch
  from ray.rllib.utils.typing import ActionConnectorDataType
label_desc: Use image node_id 1 for calling the TestActionConnector obj's underlying member method code with example usage: obj.test_connector_pipeline() without return types