#!/usr/bin/env python3
"""
ESP-IDF安装脚本测试套件
"""
import unittest
import subprocess
import os
import sys
# 测试脚本路径
INSTALL_SCRIPT = os.path.join(os.path.dirname(__file__), '..', 'install_esp_idf.py')
TEST_DIR = os.path.dirname(__file__)
class TestInstallScript(unittest.TestCase):
"""测试ESP-IDF安装脚本的功能"""
def run_script(self, args=[], cwd=None):
"""运行安装脚本并返回结果"""
cmd = ['python3', INSTALL_SCRIPT] + args
try:
result = subprocess.run(
cmd,
cwd=cwd or TEST_DIR,
capture_output=True,
text=True,
timeout=30
)
return result.returncode, result.stdout, result.stderr
except subprocess.TimeoutExpired:
self.fail(f"脚本执行超时: {' '.join(cmd)}")
except Exception as e:
self.fail(f"执行脚本时发生错误: {e}")
def test_help_option(self):
"""测试帮助选项"""
exit_code, stdout, stderr = self.run_script(['--help'])
# 检查退出码
self.assertEqual(exit_code, 0, f"帮助选项应返回0,但返回了{exit_code}")
# 检查输出是否包含帮助信息
self.assertIn("ESP-IDF自动安装脚本", stdout, "帮助输出应包含脚本名称")
self.assertIn("--version", stdout, "帮助输出应包含--version选项")
self.assertIn("--list-versions", stdout, "帮助输出应包含--list-versions选项")
self.assertIn("--version-count", stdout, "帮助输出应包含--version-count选项")
def test_list_versions_option(self):
"""测试版本列表选项"""
exit_code, stdout, stderr = self.run_script(['--list-versions'])
# 检查退出码
self.assertEqual(exit_code, 0, f"版本列表选项应返回0,但返回了{exit_code}")
# 检查输出是否包含版本列表信息
# 注意:Python版本的脚本不会显示"正在获取ESP-IDF版本列表"这条信息
# 检查输出是否包含至少一个版本号(格式如vX.Y.Z)
self.assertRegex(stdout, r'v\d+\.\d+', "输出应包含至少一个版本号")
def test_version_count_option(self):
"""测试版本数量参数"""
# 测试默认数量(10个版本)
exit_code, stdout, stderr = self.run_script(['--list-versions'])
self.assertEqual(exit_code, 0, "版本列表选项应返回0")
# 计算版本号数量(通过换行符分割并过滤空行)
versions = [line for line in stdout.split('\n') if line.startswith('v')]
self.assertGreaterEqual(len(versions), 1, "应至少显示一个版本")
# 测试指定数量(5个版本)
exit_code, stdout, stderr = self.run_script(['--list-versions', '--version-count', '5'])
self.assertEqual(exit_code, 0, "指定版本数量选项应返回0")
# 计算版本号数量
versions = [line for line in stdout.split('\n') if line.startswith('v')]
self.assertLessEqual(len(versions), 5, "应显示不超过5个版本")
if __name__ == '__main__':
unittest.main()