This repository has been archived on 2024-12-22. You can view files and clone it, but cannot push or open issues or pull requests.
PyBitmessage-2024-12-22/tests-kivy.py
Peter Šurda e5e9955cd9
Record telenium/kivy video
- add a ffmpeg process to kivy tests if it detects running inside docker
- this approach can be reused for other tests that may benefit from a
  video
- it may be possible to do this in bash, outside of python, but that
  would exacerbate the process synchronisation issues, as outlined here:
  - X server must be running before ffmpeg starts, otherwise ffmpeg
    can't record and quits
  - ffmpeg must end before the X server ends, as otherwise it segfaults
    and video will be incomplete
  - ffmpeg must start before the actual tests start and stop after the
    tests stop, otherwise a part of the tests will be missing from the
    recording
- this approach I chose here avoids most synchronisation issues.
  If ffmpeg takes more than 2 seconds to start recording (unlikely), a
  part of the video will be missing. Also if for some reason ffmpeg is
  too slow, then also we may end up with a truncated video, at the end.
- I chose lossless vp9 codec with webm format, this appears to work on
  firefox and chrome. Safari refuses to show the video even though it
  should be supported.
2022-08-09 22:35:55 +08:00

44 lines
1.4 KiB
Python

#!/usr/bin/env python
"""Custom tests runner script for tox and python3"""
import random # noseq
import sys
import unittest
from os import environ, mkdir
from subprocess import Popen, TimeoutExpired
from time import sleep
def unittest_discover():
"""Explicit test suite creation"""
loader = unittest.defaultTestLoader
loader.sortTestMethodsUsing = lambda a, b: random.randint(-1, 1)
return loader.discover('src.bitmessagekivy.tests')
if __name__ == "__main__":
with open("/proc/self/cgroup", "rt", encoding='ascii', errors='replace') as f:
in_docker = "docker" in f.read()
if in_docker:
try:
mkdir("../out")
except FileExistsError: # flake8: noqa:F821
pass
ffmpeg = Popen([ # pylint: disable=consider-using-with
"ffmpeg", "-y", "-nostdin", "-f", "x11grab", "-video_size", "vga",
"-draw_mouse", "0", "-i", environ['DISPLAY'],
"-codec:v", "libvpx-vp9", "-lossless", "1", "-r", "30",
"../out/test.webm"
])
sleep(2) # let ffmpeg start
result = unittest.TextTestRunner(verbosity=2).run(unittest_discover())
if in_docker:
ffmpeg.terminate()
try:
ffmpeg.wait(10)
except TimeoutExpired:
ffmpeg.kill()
sys.exit(not result.wasSuccessful())