code: def testExecutionWatcher_Local(self):
      req = execution_watcher_pb2.UpdateExecutionInfoRequest()
      value = metadata_store_pb2.Value()
      value.string_value = "string_value"
      req.execution_id = self._execution.id
      req.updates["test_key"].CopyFrom(value)
      res = self.stub.UpdateExecutionInfo(req)
      self.assertEqual(
          execution_watcher_pb2.UpdateExecutionInfoResponse(), res
      )
      with self._mlmd_connection as m:
          executions = m.store.get_executions_by_id(
              [self._execution.id]
          )
      self.assertEqual(len(executions), 1)
      self.assertProtoPartiallyEquals(
          """
        id: 1
        last_known_state: RUNNING
        custom_properties {
          key: "test_key"
          value {
            string_value: "string_value"
          }
        }
        """,
          executions[0],
          ignored_fields=[
              "type_id",
              "type",
              "create_time_since_epoch",
              "last_update_time_since_epoch",
              "name",
          ],
      )
  
file_path: tfx/tfx/orchestration/portable/execution_watcher_test.py
imports: import os
  import grpc
  import portpicker
  import tensorflow
  from tfx.orchestration import metadata
  from tfx.orchestration.portable import execution_publish_utils
  from tfx.orchestration.portable import execution_watcher
  from tfx.proto.orchestration import execution_watcher_pb2
  from tfx.utils import test_case_utils
  from ml_metadata.proto import metadata_store_pb2
label_desc: Use image node_id 4 for calling the ExecutionWatcherTest obj's underlying member method code with example usage: obj.testExecutionWatcher_Local() without return types