Files
DDNS/tests/test_config_log_file_dir.py
CopilotandNewFuture 030c5cb32b docs(agents): exclude VitePress and ESA tooling files from structure tracking (#670)
* Initial plan

* docs(agents): ignore VitePress and ESA files in update-agents workflow

Co-authored-by: NewFuture <6290356+NewFuture@users.noreply.github.com>

* style: fix linting issues in update_agents_structure.py

Co-authored-by: NewFuture <6290356+NewFuture@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: NewFuture <6290356+NewFuture@users.noreply.github.com>
2026-01-30 10:47:11 +00:00

150 lines
5.3 KiB
Python

# coding=utf-8
# type: ignore[index,operator,assignment]
"""
Unit tests for log file directory creation issue
Reproduces the issue where log_file path has non-existent parent directories
@author: GitHub Copilot
"""
from __init__ import unittest
import tempfile
import json
import os
import sys
import shutil
from ddns.config import load_configs
class TestLogFileDirectory(unittest.TestCase):
"""测试日志文件目录创建问题"""
def setUp(self):
self.temp_dir = tempfile.mkdtemp()
self.original_argv = sys.argv[:]
def tearDown(self):
sys.argv = self.original_argv
# Clean up logging handlers
import logging
for handler in logging.root.handlers[:]:
logging.root.removeHandler(handler)
# Clean up temp directory
shutil.rmtree(self.temp_dir, ignore_errors=True)
def test_log_file_with_nonexistent_directory_single_config(self):
"""测试单个配置时,log文件所在目录不存在的情况"""
# 创建一个不存在的目录路径
log_dir = os.path.join(self.temp_dir, "nonexistent", "subdir")
log_file = os.path.join(log_dir, "ddns.log")
# 确保目录不存在
self.assertFalse(os.path.exists(log_dir))
config_data = {
"dns": "debug",
"id": "test@example.com",
"token": "secret123",
"ipv4": ["test.example.com"],
"log": {"file": log_file, "level": "INFO"},
}
config_path = os.path.join(self.temp_dir, "config.json")
with open(config_path, "w") as f:
json.dump(config_data, f)
sys.argv = ["ddns", "-c", config_path]
# 加载配置,应该自动创建目录
configs = load_configs("test", "1.0", "2023-01-01")
# 验证目录被创建
self.assertTrue(os.path.exists(log_dir), "Log directory should be created")
self.assertEqual(len(configs), 1)
self.assertEqual(configs[0].log_file, log_file)
def test_log_file_with_nonexistent_directory_multi_provider(self):
"""测试多个provider配置时,log文件所在目录不存在的情况(复现issue中的问题)"""
# 创建一个不存在的目录路径
log_dir = os.path.join(self.temp_dir, "ddns")
log_file = os.path.join(log_dir, "ddns.log")
# 确保目录不存在
self.assertFalse(os.path.exists(log_dir))
# 模拟issue中的配置:多个provider,共享同一个log文件
config_data = {
"$schema": "https://ddns.newfuture.cc/schema/v4.1.json",
"ssl": "auto",
"cache": os.path.join(self.temp_dir, "cache"),
"log": {"level": "INFO", "file": log_file},
"index4": "default",
"index6": "default",
"providers": [
{"provider": "debug", "token": "token1", "ipv6": ["test1.xyz"]},
{"provider": "debug", "token": "token2", "ipv6": ["test2.org"]},
],
}
config_path = os.path.join(self.temp_dir, "multi_config.json")
with open(config_path, "w") as f:
json.dump(config_data, f)
sys.argv = ["ddns", "-c", config_path]
# 加载配置,应该自动创建目录
configs = load_configs("test", "1.0", "2023-01-01")
# 验证目录被创建
self.assertTrue(os.path.exists(log_dir), "Log directory should be created")
self.assertEqual(len(configs), 2)
# 验证两个配置都使用同一个log文件
for config in configs:
self.assertEqual(config.log_file, log_file)
def test_log_file_with_nested_nonexistent_directory(self):
"""测试log文件路径有多级不存在的目录"""
# 创建多级不存在的目录路径
log_file = os.path.join(self.temp_dir, "a", "b", "c", "d", "ddns.log")
config_data = {"dns": "debug", "id": "test@example.com", "token": "secret123", "log": {"file": log_file}}
config_path = os.path.join(self.temp_dir, "config.json")
with open(config_path, "w") as f:
json.dump(config_data, f)
sys.argv = ["ddns", "-c", config_path]
# 加载配置,应该自动创建所有父目录
configs = load_configs("test", "1.0", "2023-01-01")
# 验证所有父目录被创建
self.assertTrue(os.path.exists(os.path.dirname(log_file)), "All parent directories should be created")
self.assertEqual(configs[0].log_file, log_file)
def test_log_file_with_existing_directory(self):
"""测试log文件所在目录已存在的情况(不应该出错)"""
# 创建目录
log_dir = os.path.join(self.temp_dir, "existing_dir")
os.makedirs(log_dir)
log_file = os.path.join(log_dir, "ddns.log")
config_data = {"dns": "debug", "id": "test@example.com", "token": "secret123", "log": {"file": log_file}}
config_path = os.path.join(self.temp_dir, "config.json")
with open(config_path, "w") as f:
json.dump(config_data, f)
sys.argv = ["ddns", "-c", config_path]
# 加载配置,应该正常工作
configs = load_configs("test", "1.0", "2023-01-01")
self.assertTrue(os.path.exists(log_dir))
self.assertEqual(configs[0].log_file, log_file)
if __name__ == "__main__":
unittest.main()