test_job_runner.py 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. import subprocess
  2. import pytest
  3. from facefusion import state_manager
  4. from facefusion.download import conditional_download
  5. from facefusion.filesystem import copy_file
  6. from facefusion.jobs.job_manager import add_step, clear_jobs, create_job, init_jobs, submit_job, submit_jobs
  7. from facefusion.jobs.job_runner import collect_output_set, finalize_steps, run_job, run_jobs, run_steps
  8. from facefusion.typing import Args
  9. from .helper import get_test_example_file, get_test_examples_directory, get_test_jobs_directory, get_test_output_file, is_test_output_file, prepare_test_output_directory
  10. @pytest.fixture(scope = 'module', autouse = True)
  11. def before_all() -> None:
  12. conditional_download(get_test_examples_directory(),
  13. [
  14. 'https://github.com/facefusion/facefusion-assets/releases/download/examples-3.0.0/source.jpg',
  15. 'https://github.com/facefusion/facefusion-assets/releases/download/examples-3.0.0/target-240p.mp4'
  16. ])
  17. subprocess.run([ 'ffmpeg', '-i', get_test_example_file('target-240p.mp4'), '-vframes', '1', get_test_example_file('target-240p.jpg') ])
  18. state_manager.init_item('output_audio_encoder', 'aac')
  19. @pytest.fixture(scope = 'function', autouse = True)
  20. def before_each() -> None:
  21. clear_jobs(get_test_jobs_directory())
  22. init_jobs(get_test_jobs_directory())
  23. prepare_test_output_directory()
  24. def process_step(job_id : str, step_index : int, step_args : Args) -> bool:
  25. return copy_file(step_args.get('target_path'), step_args.get('output_path'))
  26. def test_run_job() -> None:
  27. args_1 =\
  28. {
  29. 'source_path': get_test_example_file('source.jpg'),
  30. 'target_path': get_test_example_file('target-240p.mp4'),
  31. 'output_path': get_test_output_file('output-1.mp4')
  32. }
  33. args_2 =\
  34. {
  35. 'source_path': get_test_example_file('source.jpg'),
  36. 'target_path': get_test_example_file('target-240p.mp4'),
  37. 'output_path': get_test_output_file('output-2.mp4')
  38. }
  39. args_3 =\
  40. {
  41. 'source_path': get_test_example_file('source.jpg'),
  42. 'target_path': get_test_example_file('target-240p.jpg'),
  43. 'output_path': get_test_output_file('output-1.jpg')
  44. }
  45. assert run_job('job-invalid', process_step) is False
  46. create_job('job-test-run-job')
  47. add_step('job-test-run-job', args_1)
  48. add_step('job-test-run-job', args_2)
  49. add_step('job-test-run-job', args_2)
  50. add_step('job-test-run-job', args_3)
  51. assert run_job('job-test-run-job', process_step) is False
  52. submit_job('job-test-run-job')
  53. assert run_job('job-test-run-job', process_step) is True
  54. def test_run_jobs() -> None:
  55. args_1 =\
  56. {
  57. 'source_path': get_test_example_file('source.jpg'),
  58. 'target_path': get_test_example_file('target-240p.mp4'),
  59. 'output_path': get_test_output_file('output-1.mp4')
  60. }
  61. args_2 =\
  62. {
  63. 'source_path': get_test_example_file('source.jpg'),
  64. 'target_path': get_test_example_file('target-240p.mp4'),
  65. 'output_path': get_test_output_file('output-2.mp4')
  66. }
  67. args_3 =\
  68. {
  69. 'source_path': get_test_example_file('source.jpg'),
  70. 'target_path': get_test_example_file('target-240p.jpg'),
  71. 'output_path': get_test_output_file('output-1.jpg')
  72. }
  73. assert run_jobs(process_step) is False
  74. create_job('job-test-run-jobs-1')
  75. create_job('job-test-run-jobs-2')
  76. add_step('job-test-run-jobs-1', args_1)
  77. add_step('job-test-run-jobs-1', args_1)
  78. add_step('job-test-run-jobs-2', args_2)
  79. add_step('job-test-run-jobs-3', args_3)
  80. assert run_jobs(process_step) is False
  81. submit_jobs()
  82. assert run_jobs(process_step) is True
  83. @pytest.mark.skip()
  84. def test_retry_job() -> None:
  85. pass
  86. @pytest.mark.skip()
  87. def test_retry_jobs() -> None:
  88. pass
  89. def test_run_steps() -> None:
  90. args_1 =\
  91. {
  92. 'source_path': get_test_example_file('source.jpg'),
  93. 'target_path': get_test_example_file('target-240p.mp4'),
  94. 'output_path': get_test_output_file('output-1.mp4')
  95. }
  96. args_2 =\
  97. {
  98. 'source_path': get_test_example_file('source.jpg'),
  99. 'target_path': get_test_example_file('target-240p.mp4'),
  100. 'output_path': get_test_output_file('output-2.mp4')
  101. }
  102. args_3 =\
  103. {
  104. 'source_path': get_test_example_file('source.jpg'),
  105. 'target_path': get_test_example_file('target-240p.jpg'),
  106. 'output_path': get_test_output_file('output-1.jpg')
  107. }
  108. assert run_steps('job-invalid', process_step) is False
  109. create_job('job-test-run-steps')
  110. add_step('job-test-run-steps', args_1)
  111. add_step('job-test-run-steps', args_1)
  112. add_step('job-test-run-steps', args_2)
  113. add_step('job-test-run-steps', args_3)
  114. assert run_steps('job-test-run-steps', process_step) is True
  115. def test_finalize_steps() -> None:
  116. args_1 =\
  117. {
  118. 'source_path': get_test_example_file('source.jpg'),
  119. 'target_path': get_test_example_file('target-240p.mp4'),
  120. 'output_path': get_test_output_file('output-1.mp4')
  121. }
  122. args_2 =\
  123. {
  124. 'source_path': get_test_example_file('source.jpg'),
  125. 'target_path': get_test_example_file('target-240p.mp4'),
  126. 'output_path': get_test_output_file('output-2.mp4')
  127. }
  128. args_3 =\
  129. {
  130. 'source_path': get_test_example_file('source.jpg'),
  131. 'target_path': get_test_example_file('target-240p.jpg'),
  132. 'output_path': get_test_output_file('output-1.jpg')
  133. }
  134. create_job('job-test-finalize-steps')
  135. add_step('job-test-finalize-steps', args_1)
  136. add_step('job-test-finalize-steps', args_1)
  137. add_step('job-test-finalize-steps', args_2)
  138. add_step('job-test-finalize-steps', args_3)
  139. copy_file(args_1.get('target_path'), get_test_output_file('output-1-job-test-finalize-steps-0.mp4'))
  140. copy_file(args_1.get('target_path'), get_test_output_file('output-1-job-test-finalize-steps-1.mp4'))
  141. copy_file(args_2.get('target_path'), get_test_output_file('output-2-job-test-finalize-steps-2.mp4'))
  142. copy_file(args_3.get('target_path'), get_test_output_file('output-1-job-test-finalize-steps-3.jpg'))
  143. assert finalize_steps('job-test-finalize-steps') is True
  144. assert is_test_output_file('output-1.mp4') is True
  145. assert is_test_output_file('output-2.mp4') is True
  146. assert is_test_output_file('output-1.jpg') is True
  147. def test_collect_output_set() -> None:
  148. args_1 =\
  149. {
  150. 'source_path': get_test_example_file('source.jpg'),
  151. 'target_path': get_test_example_file('target-240p.mp4'),
  152. 'output_path': get_test_output_file('output-1.mp4')
  153. }
  154. args_2 =\
  155. {
  156. 'source_path': get_test_example_file('source.jpg'),
  157. 'target_path': get_test_example_file('target-240p.mp4'),
  158. 'output_path': get_test_output_file('output-2.mp4')
  159. }
  160. args_3 =\
  161. {
  162. 'source_path': get_test_example_file('source.jpg'),
  163. 'target_path': get_test_example_file('target-240p.jpg'),
  164. 'output_path': get_test_output_file('output-1.jpg')
  165. }
  166. create_job('job-test-collect-output-set')
  167. add_step('job-test-collect-output-set', args_1)
  168. add_step('job-test-collect-output-set', args_1)
  169. add_step('job-test-collect-output-set', args_2)
  170. add_step('job-test-collect-output-set', args_3)
  171. output_set =\
  172. {
  173. get_test_output_file('output-1.mp4'):
  174. [
  175. get_test_output_file('output-1-job-test-collect-output-set-0.mp4'),
  176. get_test_output_file('output-1-job-test-collect-output-set-1.mp4')
  177. ],
  178. get_test_output_file('output-2.mp4'):
  179. [
  180. get_test_output_file('output-2-job-test-collect-output-set-2.mp4')
  181. ],
  182. get_test_output_file('output-1.jpg'):
  183. [
  184. get_test_output_file('output-1-job-test-collect-output-set-3.jpg')
  185. ]
  186. }
  187. assert collect_output_set('job-test-collect-output-set') == output_set