-
Sybren A. Stüvel authoredSybren A. Stüvel authored
test_runner_blender_render.py 3.50 KiB
from unittest.mock import patch, call
from test_runner import AbstractCommandTest
class BlenderRenderTest(AbstractCommandTest):
def setUp(self):
super().setUp()
from flamenco_worker.commands import BlenderRenderCommand
self.cmd = BlenderRenderCommand(
worker=self.fworker,
task_id='12345',
command_idx=0,
)
def test_re_time(self):
line = '| Time:00:04.17 |'
m = self.cmd.re_time.search(line)
self.assertEqual(m.groupdict(), {
'hours': None,
'minutes': '00',
'seconds': '04',
'hunds': '17',
})
def test_parse_render_line(self):
line = 'Fra:10 Mem:17.52M (0.00M, Peak 33.47M) | Time:00:04.17 | Remaining:00:00.87 | ' \
'Mem:1.42M, Peak:1.42M | Scene, RenderLayer | Path Tracing Tile 110/135'
self.assertEqual(
self.cmd.parse_render_line(line),
{'fra': 10,
'mem': '17.52M',
'peakmem': '33.47M',
'time_sec': 4.17,
'remaining_sec': 0.87,
'status': 'Path Tracing Tile 110/135',
}
)
line = 'Fra:003 Mem:17.52G (0.00M, Peak 33G) | Time:03:00:04.17 | Remaining:44:00:00.87 | ' \
'Mem:1.42M, Peak:1.42M | Séance, RenderLëør | Computing cosmic flöw 110/13005'
self.assertEqual(
self.cmd.parse_render_line(line),
{'fra': 3,
'mem': '17.52G',
'peakmem': '33G',
'time_sec': 3 * 3600 + 4.17,
'remaining_sec': 44 * 3600 + 0.87,
'status': 'Computing cosmic flöw 110/13005',
}
)
def test_missing_files(self):
"""Missing files should not abort the render."""
line = 'Warning: Unable to open je moeder'
self.loop.run_until_complete(self.cmd.process_line(line))
self.fworker.register_task_update.assert_called_once_with(activity=line)
self.fworker.register_task_update.reset_mock()
line = "Warning: Path 'je moeder' not found"
self.loop.run_until_complete(self.cmd.process_line(line))
self.fworker.register_task_update.assert_called_once_with(activity=line)
def test_cli_args(self):
"""Test that CLI arguments in the blender_cmd setting are handled properly."""
from pathlib import Path
import subprocess
from mock_responses import CoroMock
filepath = str(Path(__file__).parent)
settings = {
# Point blender_cmd to this file so that we're sure it exists.
'blender_cmd': '%s --with --cli="args for CLI"' % __file__,
'chunk_size': 100,
'frames': '1..2',
'format': 'JPEG',
'filepath': filepath,
}
cse = CoroMock(...)
cse.coro.return_value.wait = CoroMock(return_value=0)
with patch('asyncio.create_subprocess_exec', new=cse) as mock_cse:
self.loop.run_until_complete(self.cmd.run(settings))
mock_cse.assert_called_once_with(
__file__,
'--with',
'--cli=args for CLI',
'--factory-startup',
'--enable-autoexec',
'-noaudio',
'--background',
filepath,
'--render-format', 'JPEG',
'--render-frame', '1..2',
stdin=subprocess.DEVNULL,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)