code: def test_resolve_dynamic_parameters(self):
      dynamic_parameters = pipeline_pb2.NodeParameters()
      text_format.Parse(
          """
          parameters {
            key: "input_str"
            value {
              placeholder {
                operator {
                  concat_op {
                    expressions {
                      operator {
                        artifact_value_op {
                          expression {
                            operator {
                              index_op {
                                expression {
                                  placeholder {
                                    key: "_test_placeholder"
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                    expressions {
                      value { string_value: "_foo_" }
                    }
                    expressions {
                      operator {
                        proto_op {
                          expression {
                            placeholder {
                              type: EXEC_INVOCATION
                            }
                          }
                          proto_field_path: ".pipeline_run_id"
                        }
                      }
                    }
                  }
                }
              }
            }
          }""",
          dynamic_parameters,
      )
      test_artifact = types.standard_artifacts.String()
      test_artifact.uri = self.create_tempfile().full_path
      test_artifact.value = "testvalue"
      input_dict = {"_test_placeholder": [test_artifact]}
      dynamic_parameters_res = inputs_utils.resolve_dynamic_parameters(
          dynamic_parameters,
          placeholder_utils.ResolutionContext(
              exec_info=data_types.ExecutionInfo(
                  input_dict=input_dict, pipeline_run_id="testrunid"
              )
          ),
      )
      self.assertLen(dynamic_parameters_res, 1)
      self.assertEqual(
          dynamic_parameters_res["input_str"], "testvalue_foo_testrunid"
      )
  
      with self.assertRaises(
          exceptions.InvalidArgument,
          msg=(
              "Failed to resolve dynamic exec property. "
              'Key: input_str. Value: input("_test_placeholder")[0].value'
          ),
      ):
          inputs_utils.resolve_dynamic_parameters(
              dynamic_parameters, placeholder_utils.ResolutionContext()
          )
  
imports: import collections
  import os
  import tensorflow
  from tfx import types
  from tfx.dsl.compiler import placeholder_utils
  from tfx.orchestration import metadata
  from tfx.orchestration.portable import data_types
  from tfx.orchestration.portable import execution_publish_utils
  from tfx.orchestration.portable import inputs_utils
  from tfx.orchestration.portable.input_resolution import exceptions
  from tfx.orchestration.portable.mlmd import context_lib
  from tfx.proto.orchestration import pipeline_pb2
  from tfx.utils import test_case_utils
  from google.protobuf import text_format
  from ml_metadata.proto import metadata_store_pb2
label_desc: Use image node_id 9 for calling the InputsUtilsTest obj's underlying member method code with example usage: obj.test_resolve_dynamic_parameters() without return types