Back to home page

EIC code displayed by LXR

 
 

    


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  # Auto-set to project root
0076         assert os.path.isabs(config.source_dir)  # Should be absolute path
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"