Files
Gymnasium/tests/wrappers/test_video_recorder.py

104 lines
2.3 KiB
Python
Raw Normal View History

import gc
2016-04-27 08:00:58 -07:00
import os
import time
2016-04-27 08:00:58 -07:00
import gym
from gym.wrappers.monitoring.video_recorder import VideoRecorder
2016-04-27 08:00:58 -07:00
2021-07-29 02:26:34 +02:00
2022-01-11 18:12:05 +01:00
class BrokenRecordableEnv:
metadata = {"render_modes": [None, "rgb_array"]}
2016-04-27 08:00:58 -07:00
def render(self, mode=None):
pass
2021-07-29 02:26:34 +02:00
2022-01-11 18:12:05 +01:00
class UnrecordableEnv:
metadata = {"render_modes": [None]}
2016-04-27 08:00:58 -07:00
def render(self, mode=None):
pass
2021-07-29 02:26:34 +02:00
def test_record_simple():
env = gym.make("CartPole-v1")
rec = VideoRecorder(env)
env.reset()
rec.capture_frame()
proc = rec.encoder.proc
assert proc.poll() is None # subprocess is running
rec.close()
assert proc.poll() is not None # subprocess is terminated
assert not rec.empty
assert not rec.broken
assert os.path.exists(rec.path)
f = open(rec.path)
assert os.fstat(f.fileno()).st_size > 100
2016-04-27 08:00:58 -07:00
2021-07-29 02:26:34 +02:00
def test_autoclose():
def record():
env = gym.make("CartPole-v1")
rec = VideoRecorder(env)
env.reset()
rec.capture_frame()
rec_path = rec.path
proc = rec.encoder.proc
assert proc.poll() is None # subprocess is running
# The function ends without an explicit `rec.close()` call
# The Python interpreter will implicitly do `del rec` on garbage cleaning
return rec_path, proc
rec_path, proc = record()
gc.collect() # do explicit garbage collection for test
time.sleep(5) # wait for subprocess exiting
assert proc.poll() is not None # subprocess is terminated
assert os.path.exists(rec_path)
f = open(rec_path)
assert os.fstat(f.fileno()).st_size > 100
2016-04-27 08:00:58 -07:00
def test_no_frames():
env = BrokenRecordableEnv()
rec = VideoRecorder(env)
rec.close()
assert rec.empty
assert rec.functional
assert not os.path.exists(rec.path)
2021-07-29 02:26:34 +02:00
2016-04-27 08:00:58 -07:00
def test_record_unrecordable_method():
env = UnrecordableEnv()
rec = VideoRecorder(env)
assert not rec.enabled
rec.close()
2021-07-29 02:26:34 +02:00
2016-04-27 08:00:58 -07:00
def test_record_breaking_render_method():
env = BrokenRecordableEnv()
rec = VideoRecorder(env)
rec.capture_frame()
rec.close()
assert rec.empty
assert rec.broken
assert not os.path.exists(rec.path)
2021-07-29 02:26:34 +02:00
2016-04-27 08:00:58 -07:00
def test_text_envs():
env = gym.make("FrozenLake-v1")
2016-04-27 08:00:58 -07:00
video = VideoRecorder(env)
try:
env.reset()
video.capture_frame()
video.close()
finally:
os.remove(video.path)