core/tests/components/stream/test_recorder.py

121 lines
3.6 KiB
Python
Raw Normal View History

"""The tests for hls streams."""
from datetime import timedelta
from io import BytesIO
import av
import pytest
from homeassistant.components.stream.core import Segment
from homeassistant.components.stream.recorder import recorder_save_worker
from homeassistant.setup import async_setup_component
import homeassistant.util.dt as dt_util
from tests.async_mock import patch
from tests.common import async_fire_time_changed
2019-07-31 19:25:30 +00:00
from tests.components.stream.common import generate_h264_video, preload_stream
@pytest.mark.skip("Flaky in CI")
async def test_record_stream(hass, hass_client):
"""
Test record stream.
Purposefully not mocking anything here to test full
integration with the stream component.
"""
2019-07-31 19:25:30 +00:00
await async_setup_component(hass, "stream", {"stream": {}})
2019-07-31 19:25:30 +00:00
with patch("homeassistant.components.stream.recorder.recorder_save_worker"):
# Setup demo track
source = generate_h264_video()
stream = preload_stream(hass, source)
2019-07-31 19:25:30 +00:00
recorder = stream.add_provider("recorder")
stream.start()
while True:
segment = await recorder.recv()
if not segment:
break
segments = segment.sequence
stream.stop()
2019-04-05 06:39:19 +00:00
assert segments > 1
@pytest.mark.skip("Flaky in CI")
async def test_recorder_timeout(hass, hass_client):
"""Test recorder timeout."""
2019-07-31 19:25:30 +00:00
await async_setup_component(hass, "stream", {"stream": {}})
with patch(
2019-07-31 19:25:30 +00:00
"homeassistant.components.stream.recorder.RecorderOutput.cleanup"
) as mock_cleanup:
# Setup demo track
source = generate_h264_video()
stream = preload_stream(hass, source)
2019-07-31 19:25:30 +00:00
recorder = stream.add_provider("recorder")
stream.start()
await recorder.recv()
# Wait a minute
future = dt_util.utcnow() + timedelta(minutes=1)
async_fire_time_changed(hass, future)
await hass.async_block_till_done()
assert mock_cleanup.called
@pytest.mark.skip("Flaky in CI")
async def test_recorder_save():
"""Test recorder save."""
# Setup
source = generate_h264_video()
output = BytesIO()
2019-07-31 19:25:30 +00:00
output.name = "test.mp4"
# Run
recorder_save_worker(output, [Segment(1, source, 4)], "mp4")
# Assert
assert output.getvalue()
@pytest.mark.skip("Flaky in CI")
async def test_record_stream_audio(hass, hass_client):
"""
Test treatment of different audio inputs.
Record stream output should have an audio channel when input has
a valid codec and audio packets and no audio channel otherwise.
"""
await async_setup_component(hass, "stream", {"stream": {}})
for a_codec, expected_audio_streams in (
("aac", 1), # aac is a valid mp4 codec
("pcm_mulaw", 0), # G.711 is not a valid mp4 codec
("empty", 0), # audio stream with no packets
(None, 0), # no audio stream
):
with patch("homeassistant.components.stream.recorder.recorder_save_worker"):
# Setup demo track
source = generate_h264_video(
container_format="mov", audio_codec=a_codec
) # mov can store PCM
stream = preload_stream(hass, source)
recorder = stream.add_provider("recorder")
stream.start()
while True:
segment = await recorder.recv()
if not segment:
break
last_segment = segment
result = av.open(last_segment.segment, "r", format="mp4")
assert len(result.streams.audio) == expected_audio_streams
result.close()
stream.stop()