File indexing completed on 2026-08-12 08:24:57
0001 """Tests for PanDAiDDS scheduler configuration."""
0002
0003 import os
0004 import pytest
0005 from unittest.mock import patch
0006
0007 from aid2e.schedulers.PanDAiDDS.config import PanDAiDDSRunnerConfig
0008
0009
0010 class TestPanDAiDDSRunnerConfig:
0011 """Test suite for PanDAiDDS configuration model."""
0012
0013 def test_name_auto_generation_from_system_username(self):
0014 """Test that name is auto-generated from system username."""
0015 with patch("getpass.getuser", return_value="testuser"):
0016 config = PanDAiDDSRunnerConfig()
0017 assert config.name == "user.testuser.aid2e_job"
0018
0019 def test_name_auto_generation_from_env_variable(self):
0020 """Test that PANDA_USERNAME env variable overrides system username."""
0021 with patch.dict(os.environ, {"PANDA_USERNAME": "envuser"}):
0022 config = PanDAiDDSRunnerConfig()
0023 assert config.name == "user.envuser.aid2e_job"
0024
0025 def test_job_name_prefix_used_for_auto_generation(self):
0026 """Test that job_name_prefix controls generated PanDA names."""
0027 with patch.dict(os.environ, {"PANDA_USERNAME": "envuser"}):
0028 config = PanDAiDDSRunnerConfig(job_name_prefix="custom_job")
0029 assert config.name == "user.envuser.custom_job"
0030
0031 def test_name_validation_valid_prefix(self):
0032 """Test that valid names starting with 'user.' are accepted."""
0033 config = PanDAiDDSRunnerConfig(name="user.myname.experiment")
0034 assert config.name == "user.myname.experiment"
0035
0036 def test_name_validation_invalid_prefix(self):
0037 """Test that names not starting with 'user.' are rejected."""
0038 with pytest.raises(ValueError, match="must start with 'user\\."):
0039 PanDAiDDSRunnerConfig(name="invalid.name")
0040
0041 def test_name_validation_empty_string(self):
0042 """Test that empty string triggers auto-generation."""
0043 config = PanDAiDDSRunnerConfig(name="")
0044 assert config.name.startswith("user.")
0045 assert ".aid2e_job" in config.name
0046
0047 def test_name_with_multiple_dots(self):
0048 """Test that names with multiple dots are accepted if prefix is valid."""
0049 config = PanDAiDDSRunnerConfig(name="user.john.doe.experiment.test")
0050 assert config.name == "user.john.doe.experiment.test"
0051
0052 def test_env_variable_takes_precedence_over_system(self):
0053 """Test that PANDA_USERNAME takes precedence over getpass.getuser()."""
0054 with patch("getpass.getuser", return_value="systemuser"):
0055 with patch.dict(os.environ, {"PANDA_USERNAME": "envuser"}):
0056 config = PanDAiDDSRunnerConfig()
0057 assert config.name == "user.envuser.aid2e_job"
0058
0059 def test_explicit_name_overrides_auto_generation(self):
0060 """Test that explicitly provided name overrides auto-generation."""
0061 with patch.dict(os.environ, {"PANDA_USERNAME": "envuser"}):
0062 config = PanDAiDDSRunnerConfig(name="user.explicit.name")
0063 assert config.name == "user.explicit.name"
0064
0065 def test_other_fields_defaults(self):
0066 """Test that other fields have expected defaults."""
0067 config = PanDAiDDSRunnerConfig()
0068 init_env_list = [
0069 "source setup_aid2e.sh;",
0070 "bash install_aid2e_dependencies.sh;",
0071 ]
0072 assert config.init_env == " ".join(init_env_list) + " "
0073 assert config.cloud is None
0074 assert config.queue is None
0075 assert config.source_dir is not None
0076 assert os.path.isabs(config.source_dir)
0077 assert config.source_dir_parent_level == 1
0078 assert config.max_walltime is None
0079 assert config.core_count == 1
0080 assert config.total_memory == 4000
0081 assert config.enable_separate_log is True
0082 assert config.job_dir is None
0083
0084 def test_source_dir_auto_set_to_project_root(self):
0085 """Test that source_dir defaults to the project root."""
0086 config = PanDAiDDSRunnerConfig()
0087 expected = os.path.abspath(
0088 os.path.join(os.path.dirname(__file__), "..", "..")
0089 )
0090 assert config.source_dir == expected
0091
0092 def test_source_dir_from_env_variable(self):
0093 """Test that PANDA_SOURCE_DIR env variable overrides auto-setting."""
0094 with patch.dict(os.environ, {"PANDA_SOURCE_DIR": "/custom/source/dir"}):
0095 config = PanDAiDDSRunnerConfig()
0096 assert config.source_dir == "/custom/source/dir"
0097
0098 def test_source_dir_explicit_override(self):
0099 """Test that explicit source_dir overrides auto-setting."""
0100 config = PanDAiDDSRunnerConfig(source_dir="/explicit/path")
0101 assert config.source_dir == "/explicit/path"
0102
0103 def test_full_config_with_custom_name(self):
0104 """Test creating a full configuration with custom name."""
0105 config = PanDAiDDSRunnerConfig(
0106 name="user.scientist.epic_tracking",
0107 job_name_prefix="custom_prefix",
0108 cloud="US",
0109 queue="BNL_PanDA_1",
0110 source_dir="/custom/source",
0111 max_walltime=7200,
0112 core_count=4,
0113 total_memory=8000,
0114 enable_separate_log=True,
0115 job_dir="/tmp/panda_jobs",
0116 )
0117 assert config.name == "user.scientist.epic_tracking"
0118 assert config.job_name_prefix == "custom_prefix"
0119 assert config.cloud == "US"
0120 assert config.queue == "BNL_PanDA_1"
0121 assert config.source_dir == "/custom/source"
0122 assert config.max_walltime == 7200
0123 assert config.core_count == 4
0124 assert config.total_memory == 8000
0125 assert config.job_dir == "/tmp/panda_jobs"