Files

71 lines
2.0 KiB
Python

"""Unit tests for dl.drm_lock, the per-key-set lock that makes tracks sharing KIDs
take turns so the second one reads the content keys out of the cache."""
from __future__ import annotations
from threading import Lock
from typing import Any, Optional
from uuid import UUID
import pytest
from unshackle.commands.dl import dl
pytestmark = pytest.mark.unit
KID_A = UUID("11111111111111111111111111111111")
KID_B = UUID("22222222222222222222222222222222")
class FakeDRM:
def __init__(self, kids: Optional[list[Any]] = None, content_id: Optional[str] = None) -> None:
self.kids = kids or []
self.content_id = content_id
class NamelessDRM:
"""No kids and no content_id, so the class name is the only key left."""
pass
@pytest.fixture(autouse=True)
def clean_locks() -> Any:
dl.DRM_LOCKS.clear()
yield
dl.DRM_LOCKS.clear()
def test_same_kid_set_shares_one_lock() -> None:
lock = dl.drm_lock(FakeDRM(kids=[KID_A, KID_B]))
assert isinstance(lock, type(Lock()))
assert dl.drm_lock(FakeDRM(kids=[KID_A, KID_B])) is lock
def test_kid_order_does_not_matter() -> None:
first = dl.drm_lock(FakeDRM(kids=[KID_A, KID_B]))
assert dl.drm_lock(FakeDRM(kids=[KID_B, KID_A])) is first
def test_different_kids_get_different_locks() -> None:
assert dl.drm_lock(FakeDRM(kids=[KID_A])) is not dl.drm_lock(FakeDRM(kids=[KID_B]))
assert len(dl.DRM_LOCKS) == 2
def test_no_kids_falls_back_to_content_id() -> None:
lock = dl.drm_lock(FakeDRM(content_id="abc"))
assert dl.drm_lock(FakeDRM(content_id="abc")) is lock
assert dl.drm_lock(FakeDRM(content_id="def")) is not lock
assert set(dl.DRM_LOCKS) == {"abc", "def"}
def test_no_kids_and_no_content_id_falls_back_to_class_name() -> None:
lock = dl.drm_lock(NamelessDRM())
assert dl.drm_lock(NamelessDRM()) is lock
assert set(dl.DRM_LOCKS) == {"NamelessDRM"}
def test_empty_content_id_still_falls_back_to_class_name() -> None:
dl.drm_lock(FakeDRM(content_id=""))
assert set(dl.DRM_LOCKS) == {"FakeDRM"}