code: def test_controller(self, spec, my_id, trials, expected_output):
      controller_ = controller.InProcessController(
          phoenix_spec=spec,
          metadata=ml_metadata_db.MLMetaData(
              phoenix_spec=spec, study_name="", study_owner=""
          ),
      )
      generators = controller_.get_generators(my_id, trials)
      logging.info(generators)
      self.assertEqual(
          len(expected_output.keys()), len(generators.keys())
      )
      for k, v in generators.items():
          self.assertEqual(k, v.instance.generator_name())
          self.assertIn(k, expected_output.keys())
          self.assertEqual(v.relevant_trials, expected_output[k])
  
file_path: model_search/model_search/controller_test.py
imports: from absl import logging
  from absl.testing import absltest
  from absl.testing import parameterized
  from model_search import controller
  from model_search.metadata import ml_metadata_db
  from model_search.metadata import trial
  from model_search.proto import ensembling_spec_pb2
  from model_search.proto import phoenix_spec_pb2
label_desc: Use image node_id 1 for calling the ControllerTest obj's underlying member method code with example usage: obj.test_controller(spec, my_id, trials, expected_output) without return types