Jirat Jaturanpinyo
Upload voicevox_engine
edc06cb verified
raw
history blame
3.46 kB
import base64
from pathlib import Path
import pytest
from voicevox_engine.resource_manager import ResourceManager, ResourceManagerError
with_filemap_dir = Path(__file__).parent / "with_filemap"
without_filemap_dir = Path(__file__).parent / "without_filemap"
def b64encode_str(s: bytes) -> str:
return base64.b64encode(s).decode("utf-8")
def _assert_resource(manager: ResourceManager, input_path: Path) -> None:
"""
`input_path`で指定したファイルから正しくbase64が取得できるか確認する
また、ハッシュを取得し、対応するファイルから同じバイト列が取得できるか確認する
"""
true_bytes = input_path.read_bytes()
assert manager.resource_str(input_path, "base64") == b64encode_str(true_bytes)
result_filehash = manager.resource_str(input_path, "hash")
result_path = manager.resource_path(result_filehash)
assert result_path.read_bytes() == true_bytes
def test_with_filemap() -> None:
"""
"filemap.json"があるディレクトリでのテスト
(fimemapの生成コマンド)
`python tools/generate_filemap.py --target_dir test/unit/resource_manager/with_filemap`
"""
manager = ResourceManager(False)
manager.register_dir(with_filemap_dir)
png_path = with_filemap_dir / "dummy.png"
_assert_resource(manager, png_path)
wav_path = with_filemap_dir / "dummy.wav"
_assert_resource(manager, wav_path)
# 同じバイナリがある場合のテスト
same_wav_path = with_filemap_dir / "dummy_same_binary.wav"
assert wav_path.read_bytes() == same_wav_path.read_bytes()
_assert_resource(manager, same_wav_path)
# filemap.jsonに含まれないものはエラー
# NOTE: 通常、テキストはResourceManagerで管理しない
txt_path = with_filemap_dir / "dummy.txt"
with pytest.raises(ResourceManagerError):
manager.resource_str(txt_path, "base64")
with pytest.raises(ResourceManagerError):
manager.resource_str(txt_path, "hash")
# 登録されていないハッシュが渡された場合エラー
with pytest.raises(ResourceManagerError):
manager.resource_path("NOT_EXIST_HASH")
def test_without_filemap_when_production() -> None:
"""
"create_filemap_if_not_exist"がFalseで"filemap.json"が無い場合エラーにする
"""
manager = ResourceManager(False)
with pytest.raises(ResourceManagerError):
manager.register_dir(without_filemap_dir)
def test_without_filemap() -> None:
"""
"create_filemap_if_not_exist"がTrueで"filemap.json"が無い場合は登録時にfilemapを生成する
"""
manager = ResourceManager(True)
manager.register_dir(without_filemap_dir)
# 全てのファイルが管理される
png_path = without_filemap_dir / "dummy.png"
_assert_resource(manager, png_path)
wav_path = without_filemap_dir / "dummy.wav"
_assert_resource(manager, wav_path)
txt_path = without_filemap_dir / "dummy.txt"
_assert_resource(manager, txt_path)
# 同じバイナリがある場合のテスト
same_wav_path = without_filemap_dir / "dummy_same_binary.wav"
assert wav_path.read_bytes() == same_wav_path.read_bytes()
_assert_resource(manager, same_wav_path)
# 登録されていないハッシュが渡された場合エラー
with pytest.raises(ResourceManagerError):
manager.resource_path("NOT_EXIST_HASH")