alkaid_release_platform/tests/test_defconfig_parser.py
ekko.bao 0a0f6a6054 初次创建仓库提交代码
1. 已经构建好了架子了。
2. 添加了示例的插件
2025-04-21 06:37:06 +00:00

209 lines
8.0 KiB
Python

import sys
import os
import tempfile
import shutil
from pathlib import Path
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
from utils.utils import DefconfigParser
def test_defconfig_parser_read():
"""测试 DefconfigParser 类的读取功能"""
defconfig_path = os.path.join(os.path.dirname(__file__), 'data', 'test_defconfig')
parser = DefconfigParser(defconfig_path)
temp_file1 = os.path.join(os.path.dirname(__file__), '.tmp', 'test_defconfig_parsed.json')
with open(temp_file1, 'w') as f:
f.write(f"{parser}")
# 测试获取简单键值对
assert parser.get('CONFIG_SIMPLE') == 'y'
assert parser['CONFIG_SIMPLE'] == 'y' # 使用索引方式访问
assert parser.get('CONFIG_WITH_SPACES') == 'y'
assert parser.get('CONFIG_NO_SPACES') == 'y'
# 测试获取数值配置
assert parser.get('CONFIG_INT_VALUE') == '100'
assert parser.get('CONFIG_HEX_VALUE') == '0x1000'
assert parser.get('CONFIG_OCTAL_VALUE') == '0755'
# 测试获取字符串配置
assert parser.get('CONFIG_STRING') == '"hello world"'
assert parser.get('CONFIG_STRING_NO_QUOTES') == 'hello world'
# 测试获取特殊字符配置
assert parser.get('CONFIG_PATH') == '/usr/local/bin:/usr/bin:/bin'
assert parser.get('CONFIG_SPECIAL_CHARS') == '$HOME/.config'
# 测试带有注释的配置
assert parser.get('CONFIG_WITH_COMMENT') == 'y'
# 测试混合格式
assert parser.get('CONFIG_MIXED') == '"value with spaces"'
# 测试空值配置
assert parser.get('CONFIG_EMPTY') == ''
# 测试布尔值配置
assert parser.get('CONFIG_BOOL_TRUE') == 'y'
assert parser.get('CONFIG_BOOL_FALSE') == 'n'
# 测试多行内容配置 (在实际解析中可能会有所不同,取决于实现)
multiline_value = parser.get('CONFIG_MULTILINE')
assert 'first line' in multiline_value
# 测试含有等号的值
assert parser.get('CONFIG_WITH_EQUAL') == 'key=value'
# 测试重复的键 (应该获取最后一个值)
assert parser.get('CONFIG_DUPLICATE') == 'second'
# 测试长路径配置
assert '/very/long/path' in parser.get('CONFIG_LONG_PATH')
# 测试不存在的键
assert parser.get('CONFIG_NOT_EXIST', 'default') == 'default'
def test_defconfig_parser_rw():
"""测试 DefconfigParser 类的读写功能,看是否能够正确写回文件"""
src_file = os.path.join(os.path.dirname(__file__), 'data', 'test_defconfig')
parser = DefconfigParser(src_file)
temp_dir = tempfile.mkdtemp()
if 1:
new_file = os.path.join(os.path.dirname(__file__), '.tmp', 'test_defconfig_copy')
else:
new_file = os.path.join(temp_dir, 'test_defconfig_copy')
# temp_file1 = os.path.join(os.path.dirname(__file__), 'test_defconfig_parsed.json')
# with open(temp_file1, 'w') as f:
# f.write(f"{parser}")
parser.flush(new_file)
try:
with open(new_file, 'r') as f:
with open(src_file, 'r') as f2:
# 由于一些格式控制符,导致读取的文件与原文件不一致,这里忽略空格进行比较
src = f2.read().replace(' ', '')
dst = f.read().replace(' ', '')
assert src == dst
finally:
# 清理临时文件
if os.path.exists(temp_dir):
shutil.rmtree(temp_dir)
def test_defconfig_parser_modify():
"""测试 DefconfigParser 类的修改功能"""
# 创建测试文件的副本
temp_dir = tempfile.mkdtemp()
temp_file = os.path.join(temp_dir, 'test_defconfig_copy')
original_file = os.path.join(os.path.dirname(__file__), 'data', 'test_defconfig')
shutil.copy(original_file, temp_file)
try:
parser = DefconfigParser(temp_file)
# 修改现有配置
parser['CONFIG_SIMPLE'] = 'n'
parser['CONFIG_INT_VALUE'] = '200'
parser['CONFIG_STRING'] = '"modified string"'
# 添加新配置
parser['CONFIG_NEW'] = 'new_value'
# 删除配置
del parser['CONFIG_EMPTY']
idx = parser.index('CONFIG_SIMPLE')
parser.insert(idx, 'CONFIG_SIMPLE_NEW', '=', 'new_value_new')
# 刷新到文件
parser.flush()
# temp_file1 = os.path.join(os.path.dirname(__file__), 'test_defconfig_parsed.json')
# with open(temp_file1, 'w') as f:
# f.write(f"{parser}")
# 重新加载验证修改
new_parser = DefconfigParser(temp_file)
assert new_parser.get('CONFIG_SIMPLE') == 'n'
assert new_parser.get('CONFIG_INT_VALUE') == '200'
assert new_parser.get('CONFIG_STRING') == '"modified string"'
assert new_parser.get('CONFIG_NEW') == 'new_value'
assert new_parser.get('CONFIG_EMPTY') is None # 删除的配置
assert new_parser.get('CONFIG_SIMPLE_NEW') == 'new_value_new' # 插入的配置
finally:
# 清理临时文件
if os.path.exists(temp_dir):
shutil.rmtree(temp_dir)
def test_defconfig_parser_content_preservation():
"""测试 DefconfigParser 类是否保留原始文件的注释和结构"""
# 创建测试文件的副本
temp_dir = tempfile.mkdtemp()
temp_file = os.path.join(temp_dir, 'test_defconfig_copy')
original_file = os.path.join(os.path.dirname(__file__), 'data', 'test_defconfig')
shutil.copy(original_file, temp_file)
try:
# 记录原始文件的行数和注释行数
with open(temp_file, 'r') as f:
original_lines = f.readlines()
original_line_count = len(original_lines)
original_comment_count = sum(1 for line in original_lines if line.strip().startswith('#'))
# 进行一些简单修改
parser = DefconfigParser(temp_file)
parser['CONFIG_SIMPLE'] = 'n'
parser.flush()
# 检查修改后的文件结构是否保留
with open(temp_file, 'r') as f:
modified_lines = f.readlines()
modified_line_count = len(modified_lines)
modified_comment_count = sum(1 for line in modified_lines if line.strip().startswith('#'))
# 行数应该大致相同
assert abs(original_line_count - modified_line_count) < 5
# 注释应该完全保留
assert original_comment_count == modified_comment_count
finally:
# 清理临时文件
if os.path.exists(temp_dir):
shutil.rmtree(temp_dir)
def test_edge_cases():
"""测试 DefconfigParser 类的边缘情况处理"""
# 创建一个临时的 defconfig 文件,包含一些边缘情况
temp_dir = tempfile.mkdtemp()
temp_file = os.path.join(temp_dir, 'edge_case_defconfig')
try:
# 创建一个包含边缘情况的 defconfig 文件
with open(temp_file, 'w') as f:
f.write("# 空文件开始\n\n")
f.write("# 只有注释的行\n")
f.write("CONFIG_NO_VALUE=\n") # 无值
f.write("CONFIG_SPACES_AROUND_EQUAL = value_with_spaces_around_equal\n") # 等号周围有多个空格
f.write("=invalid_line_no_key\n") # 无效行,没有键
f.write("invalid_line_no_equal\n") # 无效行,没有等号
# 解析文件并测试
parser = DefconfigParser(temp_file)
# 检查无值配置
assert parser.get('CONFIG_NO_VALUE') == ''
# 检查等号周围有多个空格的配置
assert parser.get('CONFIG_SPACES_AROUND_EQUAL') == 'value_with_spaces_around_equal'
# 检查无效行处理
assert parser.get('invalid_line_no_equal', 'not_found') == 'not_found'
# 修改并保存
parser['CONFIG_NO_VALUE'] = 'now_has_value'
parser.flush()
# 重新加载并验证
new_parser = DefconfigParser(temp_file)
assert new_parser.get('CONFIG_NO_VALUE') == 'now_has_value'
finally:
# 清理临时文件
if os.path.exists(temp_dir):
shutil.rmtree(temp_dir)