code: def test_perform_combiner_packing_optimization(
      self,
      feature_spec,
      preprocessing_fn,
      num_phases,
      expected_dot_graph_str_before_packing,
      expected_dot_graph_str_after_packing,
  ):
      (
          graph,
          structured_inputs,
          structured_outputs,
      ) = impl_helper.trace_preprocessing_function(
          preprocessing_fn, feature_spec, use_tf_compat_v1=True
      )
  
      def _side_effect_fn(
          saved_model_future, cache_value_nodes, unused_num_phases
      ):
          return (saved_model_future, cache_value_nodes)
  
      with mock.patch.object(
          combiner_packing_util,
          "perform_combiner_packing_optimization",
          side_effect=_side_effect_fn,
      ):
          (
              transform_fn_future_before,
              unused_cache,
              _,
          ) = analysis_graph_builder.build(
              graph, structured_inputs, structured_outputs
          )
      (
          transform_fn_future_after,
          unused_cache,
      ) = combiner_packing_util.perform_combiner_packing_optimization(
          transform_fn_future_before, unused_cache, num_phases
      )
      dot_string_before = nodes.get_dot_graph(
          [transform_fn_future_before]
      ).to_string()
      self.assertMultiLineEqual(
          msg="Prior to optimization dot graph is:\n{}".format(
              dot_string_before
          ),
          first=dot_string_before,
          second=expected_dot_graph_str_before_packing,
      )
      dot_string_after = nodes.get_dot_graph(
          [transform_fn_future_after]
      ).to_string()
      self.WriteRenderedDotFile(dot_string_after)
      self.assertMultiLineEqual(
          msg="After optimization dot graph is:\n{}".format(
              dot_string_after
          ),
          first=dot_string_after,
          second=expected_dot_graph_str_after_packing,
      )
  
file_path: transform/tensorflow_transform/beam/combiner_packing_util_test.py
imports: from unittest import mock
  import tensorflow
  import tensorflow_transform
  from tensorflow_transform import impl_helper
  from tensorflow_transform import nodes
  from tensorflow_transform.beam import analysis_graph_builder
  from tensorflow_transform.beam import combiner_packing_util
  from tensorflow_transform import test_case
label_desc: Use image node_id 1 for calling the CombinerPackingUtilTest obj's underlying member method code with example usage: obj.test_perform_combiner_packing_optimization(feature_spec, preprocessing_fn, num_phases, expected_dot_graph_str_before_packing, expected_dot_graph_str_after_packing) and returns: saved_model_future,  cache_value_nodes