code: def assertPipelineExecution(
      self,
      has_tuner: bool = False,
      has_bulk_inferrer: bool = False,
      has_schema_gen: bool = True,
      has_pusher: bool = True,
  ) -> None:
      self.assertExecutedOnce("CsvExampleGen")
      self.assertExecutedOnce("Evaluator")
      self.assertExecutedOnce("StatisticsGen")
      self.assertExecutedOnce("Trainer")
      self.assertExecutedOnce("Transform")
      if has_schema_gen:
          self.assertExecutedOnce("SchemaGen")
      else:
          self.assertExecutedOnce("ImportSchemaGen")
          self.assertExecutedOnce("ExampleValidator")
      if has_tuner:
          self.assertExecutedOnce("Tuner")
      if has_bulk_inferrer:
          self.assertExecutedOnce("CsvExampleGen_Unlabelled")
          self.assertExecutedOnce("BulkInferrer")
      if has_pusher:
          self.assertExecutedOnce("Pusher")
  
imports: import importlib
  import os
  from typing import List
  from absl import logging
  from absl.testing import parameterized
  import tensorflow
  from tfx.examples.penguin import penguin_pipeline_local
  from tfx.v1 import proto
  from tfx.v1.dsl.io import fileio
  from tfx.v1.orchestration import LocalDagRunner
  from tfx.v1.orchestration import metadata
  import ml_metadata
  from ml_metadata.proto import metadata_store_pb2
label_desc: Use image node_id 4 for calling the PenguinPipelineLocalEndToEndTest obj's underlying member method code with example usage: obj.assertPipelineExecution(has_tuner, has_bulk_inferrer, has_schema_gen, has_pusher) without return types