Changeset View
Changeset View
Standalone View
Standalone View
swh/scheduler/tests/test_server.py
# Copyright (C) 2019-2020 The Software Heritage developers | # Copyright (C) 2019-2020 The Software Heritage developers | ||||
# See the AUTHORS file at the top-level directory of this distribution | # See the AUTHORS file at the top-level directory of this distribution | ||||
# License: GNU General Public License version 3, or any later version | # License: GNU General Public License version 3, or any later version | ||||
# See top-level LICENSE file for more information | # See top-level LICENSE file for more information | ||||
import copy | |||||
import pytest | import pytest | ||||
import yaml | import yaml | ||||
from swh.scheduler.api.server import load_and_check_config | from swh.scheduler.api.server import load_and_check_config | ||||
def prepare_config_file(tmpdir, content, name="config.yml"): | def prepare_config_file(tmpdir, content, name="config.yml"): | ||||
"""Prepare configuration file in `$tmpdir/name` with content `content`. | """Prepare configuration file in `$tmpdir/name` with content `content`. | ||||
Show All 36 Lines | def test_load_and_check_config_wrong_configuration(tmpdir): | ||||
"""Wrong configuration raises""" | """Wrong configuration raises""" | ||||
config_path = prepare_config_file(tmpdir, "something: useless") | config_path = prepare_config_file(tmpdir, "something: useless") | ||||
with pytest.raises(KeyError, match="Missing '%scheduler' configuration"): | with pytest.raises(KeyError, match="Missing '%scheduler' configuration"): | ||||
load_and_check_config(config_path) | load_and_check_config(config_path) | ||||
def test_load_and_check_config_remote_config_local_type_raise(tmpdir): | def test_load_and_check_config_remote_config_local_type_raise(tmpdir): | ||||
"""Configuration without 'local' storage is rejected""" | """Configuration without 'local' storage is rejected""" | ||||
config = {"scheduler": {"cls": "remote", "args": {}}} | config = {"scheduler": {"cls": "remote"}} | ||||
config_path = prepare_config_file(tmpdir, config) | config_path = prepare_config_file(tmpdir, config) | ||||
expected_error = ( | expected_error = ( | ||||
"The scheduler backend can only be started with a 'local'" " configuration" | "The scheduler backend can only be started with a 'local'" " configuration" | ||||
) | ) | ||||
with pytest.raises(ValueError, match=expected_error): | with pytest.raises(ValueError, match=expected_error): | ||||
load_and_check_config(config_path, type="local") | load_and_check_config(config_path, type="local") | ||||
def test_load_and_check_config_local_incomplete_configuration(tmpdir): | def test_load_and_check_config_local_incomplete_configuration(tmpdir): | ||||
"""Incomplete 'local' configuration should raise""" | """Incomplete 'local' configuration should raise""" | ||||
config = { | config = {"scheduler": {"cls": "local", "something": "needed-for-test",}} | ||||
"scheduler": { | |||||
"cls": "local", | config_path = prepare_config_file(tmpdir, config) | ||||
"args": {"db": "database", "something": "needed-for-test",}, | expected_error = "Invalid configuration; missing 'db' config entry" | ||||
} | |||||
} | |||||
for key in ["db", "args"]: | |||||
c = copy.deepcopy(config) | |||||
if key == "db": | |||||
source = c["scheduler"]["args"] | |||||
else: | |||||
source = c["scheduler"] | |||||
source.pop(key) | |||||
config_path = prepare_config_file(tmpdir, c) | |||||
expected_error = f"Invalid configuration; missing '{key}' config entry" | |||||
with pytest.raises(KeyError, match=expected_error): | with pytest.raises(KeyError, match=expected_error): | ||||
load_and_check_config(config_path) | load_and_check_config(config_path) | ||||
def test_load_and_check_config_local_config_fine(tmpdir): | def test_load_and_check_config_local_config_fine(tmpdir): | ||||
"""Local configuration is fine""" | """Local configuration is fine""" | ||||
config = {"scheduler": {"cls": "local", "args": {"db": "db",}}} | config = {"scheduler": {"cls": "local", "db": "db",}} | ||||
config_path = prepare_config_file(tmpdir, config) | config_path = prepare_config_file(tmpdir, config) | ||||
cfg = load_and_check_config(config_path, type="local") | cfg = load_and_check_config(config_path, type="local") | ||||
assert cfg == config | assert cfg == config | ||||
def test_load_and_check_config_remote_config_fine(tmpdir): | def test_load_and_check_config_remote_config_fine(tmpdir): | ||||
"""Remote configuration is fine""" | """Remote configuration is fine""" | ||||
config = {"scheduler": {"cls": "remote", "args": {}}} | config = {"scheduler": {"cls": "remote"}} | ||||
config_path = prepare_config_file(tmpdir, config) | config_path = prepare_config_file(tmpdir, config) | ||||
cfg = load_and_check_config(config_path, type="any") | cfg = load_and_check_config(config_path, type="any") | ||||
assert cfg == config | assert cfg == config |