remove dead code, add pidfile tests

This commit is contained in:
evilchili 2024-03-10 12:08:45 -07:00
parent 205177dca3
commit a5cf97870b
4 changed files with 34 additions and 35 deletions

View File

@ -10,20 +10,19 @@ import typer
from dotenv import load_dotenv from dotenv import load_dotenv
from typing_extensions import Annotated from typing_extensions import Annotated
import croaker.path from croaker import path
from croaker.exceptions import ConfigurationError
from croaker.playlist import Playlist from croaker.playlist import Playlist
from croaker.server import server from croaker.server import server
SETUP_HELP = """ SETUP_HELP = f"""
# Root directory for croaker configuration and logs. See also croaker --root. # Root directory for croaker configuration and logs. See also croaker --root.
CROAKER_ROOT=~/.dnd/croaker CROAKER_ROOT={path.root()}
# where to store playlist sources # where to store playlist sources
#PLAYLIST_ROOT=$CROAKER_ROOT/playlists #PLAYLIST_ROOT={path.root()}/playlists
# Where the record the daemon's PID # Where the record the daemon's PID
#PIDFILE=$CROAKER_ROOT/croaker.pid #PIDFILE={path.root()}/croaker.pid
# Command and Control TCP Server bind address # Command and Control TCP Server bind address
HOST=0.0.0.0 HOST=0.0.0.0
@ -68,20 +67,17 @@ def main(
level=logging.DEBUG if debug else logging.INFO, level=logging.DEBUG if debug else logging.INFO,
) )
try:
croaker.path.root()
croaker.path.playlist_root()
except ConfigurationError as e:
sys.stderr.write(f"{e}\n\n{SETUP_HELP}")
sys.exit(1)
@app.command() @app.command()
def setup(context: typer.Context): def setup(context: typer.Context):
""" """
(Re)Initialize Croaker. (Re)Initialize Croaker.
""" """
sys.stderr.write("Interactive setup is not yet available. Sorry!\n")
sys.stderr.write(
"Interactive setup is not available, but you can redirect "
"this command's output to a defaults file of your choice.\n"
)
print(dedent(SETUP_HELP)) print(dedent(SETUP_HELP))

View File

@ -1,16 +0,0 @@
class APIHandlingException(Exception):
"""
An API reqeust could not be encoded or decoded.
"""
class ConfigurationError(Exception):
"""
An error was discovered with the Groove on Demand configuration.
"""
class InvalidPathError(Exception):
"""
The specified path was invalid -- either it was not the expected type or wasn't accessible.
"""

View File

@ -9,11 +9,6 @@ def root():
return Path(os.environ.get("CROAKER_ROOT", "~/.dnd/croaker")).expanduser() return Path(os.environ.get("CROAKER_ROOT", "~/.dnd/croaker")).expanduser()
def cache_root():
path = Path(os.environ.get("CACHE_ROOT", root() / "cache")).expanduser()
return path
def playlist_root(): def playlist_root():
path = Path(os.environ.get("PLAYLIST_ROOT", root() / "playlists")).expanduser() path = Path(os.environ.get("PLAYLIST_ROOT", root() / "playlists")).expanduser()
return path return path

24
test/test_pidfile.py Normal file
View File

@ -0,0 +1,24 @@
from pathlib import Path
from unittest.mock import MagicMock
import pytest
from croaker import pidfile
@pytest.mark.parametrize('pid,terminate,kill_result,broken', [
('pid', False, None, False), # running proc, no terminate
('pid', True, True, False), # running proc, terminate
('pid', True, ProcessLookupError, True), # stale pid
(None, None, None, False), # no running proc
])
def test_pidfile(monkeypatch, pid, terminate, kill_result, broken):
monkeypatch.setattr(pidfile._pidfile, 'TimeoutPIDLockFile', MagicMock(**{
'return_value.read_pid.return_value': pid,
}))
monkeypatch.setattr(pidfile.os, 'kill', MagicMock(**{
'side_effect': kill_result if type(kill_result) is Exception else [kill_result]
}))
ret = pidfile.pidfile(pidfile_path=Path('/dev/null'), terminate_if_running=terminate)
assert ret.break_lock.called == broken