code: def test_plan_all_job_creation_and_termination(
      processing_graph: ProcessingGraph, to_backfill: list[set[str]]
  ) -> None:
      previous_artifacts: set[str] = set()
      for artifacts_to_backfill in to_backfill:
          is_empty = sorted(artifacts_to_backfill - previous_artifacts)
          is_outdated_by_parent = sorted(
              artifacts_to_backfill.intersection(previous_artifacts)
          )
          in_process = sorted(is_empty + is_outdated_by_parent)
          up_to_date = sorted(
              previous_artifacts - artifacts_to_backfill
          )
          previous_artifacts = artifacts_to_backfill.union(
              previous_artifacts
          )
  
          dataset_backfill_plan = get_dataset_backfill_plan(
              processing_graph=processing_graph
          )
          assert_dataset_backfill_plan(
              dataset_backfill_plan=dataset_backfill_plan,
              cache_status={
                  "cache_has_different_git_revision": [],
                  "cache_is_outdated_by_parent": is_outdated_by_parent,
                  "cache_is_empty": is_empty,
                  "cache_is_error_to_retry": [],
                  "cache_is_job_runner_obsolete": [],
                  "up_to_date": up_to_date,
              },
              queue_status={"in_process": []},
              tasks=[f"CreateJobs,{len(in_process)}"]
              if in_process
              else [],
          )
  
          dataset_backfill_plan.run()
  
          dataset_backfill_plan = get_dataset_backfill_plan(
              processing_graph=processing_graph
          )
          assert_dataset_backfill_plan(
              dataset_backfill_plan=dataset_backfill_plan,
              cache_status={
                  "cache_has_different_git_revision": [],
                  "cache_is_outdated_by_parent": is_outdated_by_parent,
                  "cache_is_empty": is_empty,
                  "cache_is_error_to_retry": [],
                  "cache_is_job_runner_obsolete": [],
                  "up_to_date": up_to_date,
              },
              queue_status={"in_process": in_process},
              tasks=[],
          )
  
          process_all_jobs()
  
imports: from datetime import datetime
  from typing import Optional
  from unittest.mock import patch
  import pytest
  from libcommon.constants import ERROR_CODES_TO_RETRY
  from libcommon.processing_graph import ProcessingGraph
  from libcommon.queue import Queue
  from libcommon.resources import CacheMongoResource, QueueMongoResource
  from libcommon.utils import Priority, Status
  from .utils import ARTIFACT_CA_1, ARTIFACT_CA_2, ARTIFACT_CB_1, ARTIFACT_CB_2, ARTIFACT_DA, ARTIFACT_DA_OTHER_REVISION, ARTIFACT_DB, ARTIFACT_DC, ARTIFACT_DD, ARTIFACT_DE, ARTIFACT_DF, ARTIFACT_DG, ARTIFACT_DH, ARTIFACT_DI, ARTIFACT_SA_1_1, ARTIFACT_SA_1_2, ARTIFACT_SA_2_1, ARTIFACT_SA_2_2, CONFIG_NAME_1, CONFIG_NAMES, DATASET_NAME, DIFFICULTY, OTHER_REVISION_NAME, PROCESSING_GRAPH_FAN_IN_OUT, PROCESSING_GRAPH_GENEALOGY, PROCESSING_GRAPH_ONE_STEP, PROCESSING_GRAPH_PARALLEL, REVISION_NAME, SPLIT_NAME_1, SPLIT_NAMES, STEP_CA, STEP_DA, STEP_DD, STEP_DI, STEP_SA, assert_dataset_backfill_plan, compute_all, get_dataset_backfill_plan, process_all_jobs, process_next_job, put_cache
label_desc: Use image node_id 7 for calling a global function with example usage: test_plan_all_job_creation_and_termination(processing_graph, to_backfill) without return types