From 6c145e48492bc913059f0f83aad16f11b393a314 Mon Sep 17 00:00:00 2001 From: xufei Date: Sat, 28 Feb 2026 16:35:29 +0800 Subject: [PATCH] add dovecot test case --- .../dovecot/tc_service_dovecot_fun001.yaml | 40 +++++++ .../dovecot/tc_service_dovecot_fun002.yaml | 40 +++++++ .../dovecot/tc_service_dovecot_fun003.yaml | 43 ++++++++ .../dovecot/tc_service_dovecot_fun004.yaml | 35 ++++++ .../dovecot/tc_service_dovecot_fun005.yaml | 30 ++++++ .../dovecot/tc_service_dovecot_fun006.yaml | 38 +++++++ .../dovecot/tc_service_dovecot_fun007.yaml | 38 +++++++ .../dovecot/tc_service_dovecot_fun001.py | 69 ++++++++++++ .../dovecot/tc_service_dovecot_fun002.py | 91 ++++++++++++++++ .../dovecot/tc_service_dovecot_fun003.py | 76 +++++++++++++ .../dovecot/tc_service_dovecot_fun004.py | 68 ++++++++++++ .../dovecot/tc_service_dovecot_fun005.py | 77 +++++++++++++ .../dovecot/tc_service_dovecot_fun006.py | 102 ++++++++++++++++++ .../dovecot/tc_service_dovecot_fun007.py | 93 ++++++++++++++++ 14 files changed, 840 insertions(+) create mode 100644 docs/system_base/dovecot/tc_service_dovecot_fun001.yaml create mode 100644 docs/system_base/dovecot/tc_service_dovecot_fun002.yaml create mode 100644 docs/system_base/dovecot/tc_service_dovecot_fun003.yaml create mode 100644 docs/system_base/dovecot/tc_service_dovecot_fun004.yaml create mode 100644 docs/system_base/dovecot/tc_service_dovecot_fun005.yaml create mode 100644 docs/system_base/dovecot/tc_service_dovecot_fun006.yaml create mode 100644 docs/system_base/dovecot/tc_service_dovecot_fun007.yaml create mode 100644 tests/system_base/dovecot/tc_service_dovecot_fun001.py create mode 100644 tests/system_base/dovecot/tc_service_dovecot_fun002.py create mode 100644 tests/system_base/dovecot/tc_service_dovecot_fun003.py create mode 100644 tests/system_base/dovecot/tc_service_dovecot_fun004.py create mode 100644 tests/system_base/dovecot/tc_service_dovecot_fun005.py create mode 100644 tests/system_base/dovecot/tc_service_dovecot_fun006.py create mode 100644 tests/system_base/dovecot/tc_service_dovecot_fun007.py diff --git a/docs/system_base/dovecot/tc_service_dovecot_fun001.yaml b/docs/system_base/dovecot/tc_service_dovecot_fun001.yaml new file mode 100644 index 00000000..2b9cd09f --- /dev/null +++ b/docs/system_base/dovecot/tc_service_dovecot_fun001.yaml @@ -0,0 +1,40 @@ +作者: xufei +优先级: P1 +支持架构: noarch +执行方式: 自动 +测试类型: 功能测试 +通用标签: local,dovecot +用例描述: dovecot基本命令功能测试 +修改人: xufei + +前置条件: +- 安装dovecot软件包 +- 重启dovecot服务 + +测试步骤: +- 执行`dovecot --version`,验证版本信息 +- 执行`dovecot --help`,验证帮助信息 +- 执行`dovecot -n`,验证非默认配置输出 +- 执行`doveconf -n`,验证非默认配置输出 +- 执行`dovecot -a`,验证全部配置输出 +- 执行`doveconf`,验证配置输出 +- 执行`dovecot --hostdomain`,验证主机域名输出 +- 验证dovecot用户是否创建 +- 执行`dovecot reload`,重新加载配置 +- 执行`dovecot stop`,停止服务 +- 执行`dovecot -c`指定配置文件启动 +- 执行`dovecot --build-options`,验证构建选项 + +期望结果: +- 版本命令执行成功 +- 帮助命令执行成功 +- `dovecot -n`输出包含当前内核版本 +- `doveconf -n`输出包含当前内核版本 +- `dovecot -a`输出包含"service"字符串 +- `doveconf`输出包含"service"字符串 +- `dovecot --hostdomain`输出包含主机名 +- /etc/passwd中包含dovecot用户 +- reload命令执行成功 +- stop命令执行成功 +- 指定配置文件启动成功 +- --build-options命令执行成功 diff --git a/docs/system_base/dovecot/tc_service_dovecot_fun002.yaml b/docs/system_base/dovecot/tc_service_dovecot_fun002.yaml new file mode 100644 index 00000000..2b9cd09f --- /dev/null +++ b/docs/system_base/dovecot/tc_service_dovecot_fun002.yaml @@ -0,0 +1,40 @@ +作者: xufei +优先级: P1 +支持架构: noarch +执行方式: 自动 +测试类型: 功能测试 +通用标签: local,dovecot +用例描述: dovecot基本命令功能测试 +修改人: xufei + +前置条件: +- 安装dovecot软件包 +- 重启dovecot服务 + +测试步骤: +- 执行`dovecot --version`,验证版本信息 +- 执行`dovecot --help`,验证帮助信息 +- 执行`dovecot -n`,验证非默认配置输出 +- 执行`doveconf -n`,验证非默认配置输出 +- 执行`dovecot -a`,验证全部配置输出 +- 执行`doveconf`,验证配置输出 +- 执行`dovecot --hostdomain`,验证主机域名输出 +- 验证dovecot用户是否创建 +- 执行`dovecot reload`,重新加载配置 +- 执行`dovecot stop`,停止服务 +- 执行`dovecot -c`指定配置文件启动 +- 执行`dovecot --build-options`,验证构建选项 + +期望结果: +- 版本命令执行成功 +- 帮助命令执行成功 +- `dovecot -n`输出包含当前内核版本 +- `doveconf -n`输出包含当前内核版本 +- `dovecot -a`输出包含"service"字符串 +- `doveconf`输出包含"service"字符串 +- `dovecot --hostdomain`输出包含主机名 +- /etc/passwd中包含dovecot用户 +- reload命令执行成功 +- stop命令执行成功 +- 指定配置文件启动成功 +- --build-options命令执行成功 diff --git a/docs/system_base/dovecot/tc_service_dovecot_fun003.yaml b/docs/system_base/dovecot/tc_service_dovecot_fun003.yaml new file mode 100644 index 00000000..a2090bf5 --- /dev/null +++ b/docs/system_base/dovecot/tc_service_dovecot_fun003.yaml @@ -0,0 +1,43 @@ +作者:xufei +优先级:P1 +支持架构:noarch +执行方式:自动 +测试类型:功能测试 +通用标签:local,dovecot +用例描述:doveadm 及 Dovecot 相关工具命令功能测试 +修改人:xufei + +前置条件: +- 安装 dovecot 软件包 +- 创建测试用户 testuser 并设置密码 +- dovecot 服务处于运行状态 + +测试步骤: +- 执行 `doveadm config` 查看配置 +- 执行 `doveadm instance list` 列出实例 +- 执行 `doveadm instance remove ` 移除实例 +- 执行 `doveadm penalty` 查看惩罚信息 +- 执行 `doveadm proxy list` 列出代理信息 +- 执行 `doveadm proxy kick ` 踢出代理连接 +- 执行 `doveadm auth cache flush` 刷新认证缓存 +- 执行 `doveadm auth login testuser testuser` 测试用户登录 +- 执行 `doveadm auth test testuser testuser` 测试用户认证 +- 执行 `dovecot-sysreport` 生成系统报告 +- 执行 `ls dovecot-sysreport*` 检查报告文件是否存在 +- 执行 `doveadm reload` 重新加载配置 +- 执行 `doveadm stop` 停止服务 + +期望结果: +- `doveadm config` 命令执行成功 +- `doveadm instance list` 命令执行成功 +- `doveadm instance remove` 命令执行成功 +- `doveadm penalty` 命令执行成功 +- `doveadm proxy list` 命令执行成功 +- `doveadm proxy kick` 命令执行成功 +- `doveadm auth cache flush` 命令执行成功 +- `doveadm auth login` 命令执行成功 +- `doveadm auth test` 命令执行成功 +- `dovecot-sysreport` 命令执行成功 +- 系统报告文件生成成功 +- `doveadm reload` 命令执行成功 +- `doveadm stop` 命令执行成功 diff --git a/docs/system_base/dovecot/tc_service_dovecot_fun004.yaml b/docs/system_base/dovecot/tc_service_dovecot_fun004.yaml new file mode 100644 index 00000000..6ecb32d2 --- /dev/null +++ b/docs/system_base/dovecot/tc_service_dovecot_fun004.yaml @@ -0,0 +1,35 @@ +作者:xufei +优先级:P1 +支持架构:noarch +执行方式:自动 +测试类型:功能测试 +通用标签:local,dovecot +用例描述:doveadm 进程、用户、统计及服务管理功能测试 +修改人:xufei + +前置条件: +- 安装 dovecot 软件包 +- 重启 dovecot 服务 +- 创建测试用户 testuser +- 创建临时文件 a.sh + +测试步骤: +- 执行 `doveadm process status` 查看进程状态 +- 执行 `doveadm user -u testuser` 查询测试用户信息 +- 执行 `doveadm stats dump` 导出统计数据 +- 获取本机 IPv4 地址,并使用 expect 脚本执行 `doveadm zlibconnect 110` 进行连接测试 +- 执行 `doveadm service status` 查看服务状态 +- 执行 `doveadm service stop doveadm` 停止 doveadm 服务 +- 执行 `doveadm oldstats reset` 重置旧统计数据 +- 执行 `doveadm penalty` 查看惩罚信息 + +期望结果: +- `doveadm process status` 命令执行成功 +- `doveadm user` 命令执行成功并返回 testuser 信息 +- `doveadm stats dump` 命令执行成功 +- `doveadm zlibconnect` 连接测试执行成功 +- `doveadm service status` 命令执行成功 +- `doveadm service stop` 命令执行成功 +- `doveadm oldstats reset` 命令执行成功 +- `doveadm penalty` 命令执行成功 + diff --git a/docs/system_base/dovecot/tc_service_dovecot_fun005.yaml b/docs/system_base/dovecot/tc_service_dovecot_fun005.yaml new file mode 100644 index 00000000..5ce3f6c7 --- /dev/null +++ b/docs/system_base/dovecot/tc_service_dovecot_fun005.yaml @@ -0,0 +1,30 @@ +作者:xufei +优先级:P1 +支持架构:noarch +执行方式:自动 +测试类型:功能测试 +通用标签:local,dovecot +用例描述:dovecot-init.service 服务状态、启用/禁用及日志检查 +修改人:xufei + +前置条件: +- 安装 dovecot 软件包 +- 启动 dovecot-init.service 服务 + +测试步骤: +- 获取当前时间戳,用于后续日志查询范围限定 +- 检查 `dovecot-init.service` 的 Active 状态,验证其未处于 "inactive (dead)" 状态(即应处于运行或激活状态) +- 检查 `dovecot-init.service` 的 enabled 状态: + - 若为 enabled:执行 disable 操作,验证软链接被移除;再执行 enable 操作,验证软链接重新创建 + - 若为 disabled:执行 enable 操作,验证软链接创建;再执行 disable 操作,验证软链接被移除 + - 若为 masked、static 或其他状态:记录日志并跳过启用/禁用测试 +- 查询从测试开始时间点至今的 `dovecot-init.service` 系统日志,过滤掉 DEBUG、INFO、WARNING 级别,检查是否存在 FAIL 或 ERROR 错误信息 + +期望结果: +- `dovecot-init.service` 服务状态正常,非 inactive (dead) +- 若服务可配置启用/禁用: + - disable 操作成功,对应的软链接文件不存在 + - enable 操作成功,对应的软链接文件存在 +- 若服务为 masked 或 static,逻辑判断正确并跳过相关测试 +- 服务日志中不包含严重的 FAIL 或 ERROR 错误信息 + diff --git a/docs/system_base/dovecot/tc_service_dovecot_fun006.yaml b/docs/system_base/dovecot/tc_service_dovecot_fun006.yaml new file mode 100644 index 00000000..778ba39c --- /dev/null +++ b/docs/system_base/dovecot/tc_service_dovecot_fun006.yaml @@ -0,0 +1,38 @@ +作者:xufei +优先级:P1 +支持架构:noarch +执行方式:自动 +测试类型:功能测试 +通用标签:local,dovecot +用例描述:dovecot.service 服务生命周期管理、启用/禁用配置及重载功能测试 +修改人:xufei + +前置条件: +- 安装 dovecot 软件包 +- systemd 环境正常 + +测试步骤: +- 记录当前时间戳,用于后续日志分析 +- 执行 `systemctl restart dovecot.service` 重启服务,等待 5 秒后验证状态为 active +- 执行 `systemctl stop dovecot.service` 停止服务,等待 5 秒后验证状态为 inactive +- 执行 `systemctl start dovecot.service` 启动服务,等待 5 秒后验证状态为 active +- 检查 `dovecot.service` 的 enabled 状态: + - 若为 enabled:执行 disable 验证软链接移除,再执行 enable 验证软链接恢复 + - 若为 disabled:执行 enable 验证软链接创建,再执行 disable 验证软链接移除 + - 若为 masked:先执行 unmask,再进行上述逻辑(代码中隐含 unmask 操作) + - 若为 static 或其他:记录日志并跳过 +- 查询从测试开始时间点至今的 `dovecot.service` 系统日志,过滤掉 DEBUG、INFO、WARNING,检查是否存在 FAIL 或 ERROR 错误 +- 修改 systemd 配置文件 `/usr/lib/systemd/system/dovecot.service`,在 ExecStart 中添加 `-a` 参数 +- 执行 `systemctl daemon-reload` 重新加载守护进程配置 +- 执行 `systemctl reload dovecot.service` 重载服务 +- 验证重载后服务状态仍为 active + +期望结果: +- `restart`、`stop`、`start` 命令均执行成功,且服务状态按预期变化(active/inactive) +- 若服务可配置启用/禁用: + - disable 操作成功,对应的软链接文件不存在 + - enable 操作成功,对应的软链接文件存在 +- 若服务被 masked,unmask 操作有效 +- 服务运行期间日志中不包含严重的 FAIL 或 ERROR 错误信息 +- 修改配置文件并执行 `daemon-reload` 和 `reload` 后,服务正常运行且状态保持 active + diff --git a/docs/system_base/dovecot/tc_service_dovecot_fun007.yaml b/docs/system_base/dovecot/tc_service_dovecot_fun007.yaml new file mode 100644 index 00000000..3d6d8877 --- /dev/null +++ b/docs/system_base/dovecot/tc_service_dovecot_fun007.yaml @@ -0,0 +1,38 @@ +作者:xufei +优先级:P1 +支持架构:noarch +执行方式:自动 +测试类型:功能测试 +通用标签:local,dovecot +用例描述:dovecot.socket 服务生命周期管理、启用/禁用配置及重载行为验证 +修改人:xufei + +前置条件: +- 安装 dovecot 软件包 +- systemd 环境正常 + +测试步骤: +- 记录当前时间戳,用于后续日志分析 +- 执行 `systemctl restart dovecot.socket` 重启服务,等待 5 秒后验证状态为 active +- 执行 `systemctl stop dovecot.socket` 停止服务,等待 5 秒后验证状态为 inactive +- 执行 `systemctl start dovecot.socket` 启动服务,等待 5 秒后验证状态为 active +- 检查 `dovecot.socket` 的 enabled 状态: + - 若为 enabled:执行 disable 验证软链接移除,再执行 enable 验证软链接恢复 + - 若为 disabled:执行 enable 验证软链接创建,再执行 disable 验证软链接移除 + - 若为 masked:先执行 unmask,再进行上述逻辑 + - 若为 static 或其他:记录日志并跳过 +- 查询从测试开始时间点至今的 `dovecot.socket` 系统日志,过滤掉 DEBUG、INFO、WARNING,检查是否存在 FAIL 或 ERROR 错误 +- 确保服务处于启动状态 +- 执行 `systemctl reload dovecot.socket`,验证该操作是否被正确拒绝(Socket 单元通常不支持 reload) +- 验证执行 reload 尝试后,服务状态仍保持 active + +期望结果: +- `restart`、`stop`、`start` 命令均执行成功,且服务状态按预期变化(active/inactive) +- 若服务可配置启用/禁用: + - disable 操作成功,对应的软链接文件不存在 + - enable 操作成功,对应的软链接文件存在 +- 若服务被 masked,unmask 操作有效 +- 服务运行期间日志中不包含严重的 FAIL 或 ERROR 错误信息 +- 执行 `reload` 命令时返回特定错误提示"Job type reload is not applicable for unit dovecot.socket",表明 Socket 单元不支持重载 +- 尝试 reload 后,服务状态未受影响,仍保持 active + diff --git a/tests/system_base/dovecot/tc_service_dovecot_fun001.py b/tests/system_base/dovecot/tc_service_dovecot_fun001.py new file mode 100644 index 00000000..f5dc13c0 --- /dev/null +++ b/tests/system_base/dovecot/tc_service_dovecot_fun001.py @@ -0,0 +1,69 @@ +""" +@File: tc_service_dovecot_fun001.py +@Time: 2026/2/28 15:30:20 +@Author: xufei +@Version: 1.0 +@Contact: xufei@inspur.com +@License: Mulan PSL v2 +@Modify: xufei +""" +import subprocess +import time + +from common.basetest import LocalTest + + +class Test(LocalTest): + """ + See tc_service_dovecot_fun001.yaml for details + + :avocado: tags=P1,noarch,local,dovecot + """ + PARAM_DIC = {"pkg_name": "dovecot"} + + def setUp(self): + super().setUp(self.PARAM_DIC) + self.cmd(' systemctl restart dovecot') + + def test(self): + code, result = self.cmd('dovecot --version') + self.assertFalse(code, "Check dovecot version failed.") + + code, result = self.cmd('dovecot --help') + self.assertFalse(code, "Check dovecot help failed.") + + code, result = self.cmd('dovecot -n | grep $(uname -r)') + self.assertFalse(code, "Check dovecot non default config failed.") + + code, result = self.cmd('doveconf -n | grep $(uname -r)') + self.assertFalse(code, "Check doveconf non default config failed.") + + code, result = self.cmd('dovecot -a | grep -q "service"') + self.assertFalse(code, "Check dovecot all config failed.") + + code, result = self.cmd('doveconf | grep -q "service"') + self.assertFalse(code, "Check doveconf failed.") + + code, result = self.cmd('dovecot --hostdomain | grep -q "$(hostname | awk -F\'.\' \'{print $1}\')"') + self.assertFalse(code, "Check dovecot hostdomain failed.") + + code, result = self.cmd('grep -q "dovecot" /etc/passwd') + self.assertFalse(code, "Check dovecot user created failed.") + + code, result = self.cmd('dovecot reload') + self.assertFalse(code, "Reload dovecot failed.") + + code, result = self.cmd('dovecot stop') + self.assertFalse(code, "Stop dovecot failed.") + + code, result = self.cmd('nohup dovecot -c /etc/dovecot/dovecot.conf >/dev/null 2>&1 &') + self.assertFalse(code, "Set dovecot config file failed.") + + code, result = self.cmd('dovecot --build-options /etc/dovecot/dovecot.conf') + self.assertFalse(code, "Build dovecot failed.") + + + def tearDown(self): + self.cmd('kill -9 $(ps -ef | grep dovecot | grep -v grep | grep -v ".sh\|.py" | awk \'{print $2}\')') + super().tearDown(self.PARAM_DIC) + diff --git a/tests/system_base/dovecot/tc_service_dovecot_fun002.py b/tests/system_base/dovecot/tc_service_dovecot_fun002.py new file mode 100644 index 00000000..a04a5aba --- /dev/null +++ b/tests/system_base/dovecot/tc_service_dovecot_fun002.py @@ -0,0 +1,91 @@ +""" +@File: tc_service_dovecot_fun002.py +@Time: 2026/2/28 15:30:20 +@Author: xufei +@Version: 1.0 +@Contact: xufei@inspur.com +@License: Mulan PSL v2 +@Modify: xufei +""" +import subprocess +import time + +from common.basetest import LocalTest + + +class Test(LocalTest): + """ + See tc_service_dovecot_fun002.yaml for details + + :avocado: tags=P1,noarch,local,dovecot + """ + PARAM_DIC = {"pkg_name": "dovecot"} + + def setUp(self): + super().setUp(self.PARAM_DIC) + self.cmd('cp /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.bak') + self.cmd("sed -i '/ssl_key = <\/etc\/pki\/dovecot\/private\/dovecot.pem/d' /etc/dovecot/conf.d/10-ssl.conf") + self.cmd(' systemctl restart dovecot') + + + def test(self): + code,result=self.cmd('systemctl status dovecot | grep "active (running)"') + self.assertFalse(code,'status failed') + code, result = self.cmd('doveadm -D who') + self.assertFalse(code, "Check doveadm who detail failed.") + + code, result = self.cmd('doveadm -v who') + self.assertFalse(code, "Check doveadm who verbose failed.") + + code, result = self.cmd('doveadm who -1') + self.assertFalse(code, "Check doveadm who -1 failed.") + code, ipv4 = self.cmd("hostname -I | awk '{print $1}'") + code, result = self.cmd(f'doveadm who {ipv4}') + self.assertFalse(code, f"Check doveadm who {ipv4} failed.") + + code, result = self.cmd('doveadm who 0022') + self.assertFalse(code, "Check doveadm who 0022 failed.") + + code, result = self.cmd('doveadm pw -l') + self.assertFalse(code, "Check doveadm pw -l failed.") + + code, result = self.cmd(r"printf 'password\npassword\n' | doveadm pw") + self.assertFalse(code, "Check doveadm pw failed.") + + code, result = self.cmd('doveadm pw -p password') + self.assertFalse(code, "Check doveadm pw -p failed.") + + code, result = self.cmd(r"nohup printf 'password\npassword\n' | doveadm pw -r 1002 >/dev/null 2>&1 &") + self.assertFalse(code, "Check doveadm pw -r start failed.") + + self.cmd('sleep 1') + code, result = self.cmd('ps -ef | grep "doveadm pw -r 1002" | grep -v "grep"') + self.assertFalse(code, "Check doveadm pw -r failed.") + + code, result = self.cmd(r"printf 'password\npassword\n' | doveadm pw -u testuser") + self.assertFalse(code, "Check doveadm pw -u failed.") + + code, result = self.cmd(r"printf 'password\npassword\n' | doveadm pw -V") + self.assertFalse(code, "Check doveadm pw -V failed.") + + code, result = self.cmd(r"printf 'password\npassword\n' | doveadm pw -s SHA512-CRYPT") + self.assertFalse(code, "Check doveadm pw -s failed.") + + code, result = self.cmd('doveadm log errors') + self.assertFalse(code, "Check doveadm log errors failed.") + + code, result = self.cmd('doveadm log find') + self.assertFalse(code, "Check doveadm log find failed.") + + code, result = self.cmd('doveadm log reopen') + self.assertFalse(code, "Check doveadm log reopen failed.") + + code, result = self.cmd('doveadm log test') + self.assertFalse(code, "Check doveadm log test failed.") + + def tearDown(self): + self.cmd('rm -f a.sh* /etc/dovecot/conf.d/10-ssl.conf') + self.cmd('mv /etc/dovecot/conf.d/10-ssl.conf.bak /etc/dovecot/conf.d/10-ssl.conf') + self.cmd('kill -9 $(ps -ef | grep "doveadm" | grep -Ev "grep|.sh" | awk \'{print $2}\')') + super().tearDown(self.PARAM_DIC) + diff --git a/tests/system_base/dovecot/tc_service_dovecot_fun003.py b/tests/system_base/dovecot/tc_service_dovecot_fun003.py new file mode 100644 index 00000000..ce4834f7 --- /dev/null +++ b/tests/system_base/dovecot/tc_service_dovecot_fun003.py @@ -0,0 +1,76 @@ +""" +@File: tc_service_dovecot_fun003.py +@Time: 2026/2/28 15:30:20 +@Author: xufei +@Version: 1.0 +@Contact: xufei@inspur.com +@License: Mulan PSL v2 +@Modify: xufei +""" +import subprocess +import time + +from common.basetest import LocalTest + + +class Test(LocalTest): + """ + See tc_service_dovecot_fun003.yaml for details + + :avocado: tags=P1,noarch,local,dovecot + """ + PARAM_DIC = {"pkg_name": "dovecot"} + + def setUp(self): + super().setUp(self.PARAM_DIC) + self.cmd('useradd testuser') + self.cmd(r"printf 'testuser\ntestuser\n' | passwd testuser") + self.cmd(' systemctl restart dovecot') + + + def test(self): + code, result = self.cmd('doveadm config >/dev/null') + self.assertFalse(code, "Check doveadm config failed.") + + code, result = self.cmd('doveadm instance list') + self.assertFalse(code, "Check doveadm instance list failed.") + code,path=self.cmd("doveadm instance list | awk 'NR==2 {print $1}'") + + code, result = self.cmd(f'doveadm instance remove {path}') + self.assertFalse(code, "Check doveadm instance remove failed.") + + code, result = self.cmd('doveadm penalty') + self.assertFalse(code, "Check doveadm penalty failed.") + + code, result = self.cmd('doveadm proxy list') + self.assertFalse(code, "Check doveadm proxy list failed.") + code, ipv4 = self.cmd("hostname -I | awk '{print $1}'") + code, result = self.cmd(f'doveadm proxy kick {ipv4}') + self.assertFalse(code, f"Check doveadm proxy kick {ipv4} failed.") + + code, result = self.cmd('doveadm auth cache flush') + self.assertFalse(code, "Check doveadm auth cache flush failed.") + + code, result = self.cmd('doveadm auth login testuser testuser') + self.assertFalse(code, "Check doveadm auth login failed.") + + code, result = self.cmd('doveadm auth test testuser testuser') + self.assertFalse(code, "Check doveadm auth test failed.") + + code, result = self.cmd('dovecot-sysreport') + self.assertFalse(code, "Check doveadm-sysreport failed.") + + code, result = self.cmd('ls dovecot-sysreport*') + self.assertFalse(code, "The report doesn't exist.") + + code, result = self.cmd('doveadm reload') + self.assertFalse(code, "Check doveadm reload failed.") + + code, result = self.cmd('doveadm stop') + self.assertFalse(code, "Check doveadm stop failed.") + + def tearDown(self): + self.cmd('userdel testuser') + self.cmd('rm -rf dovecot-sysreport* ') + super().tearDown(self.PARAM_DIC) + diff --git a/tests/system_base/dovecot/tc_service_dovecot_fun004.py b/tests/system_base/dovecot/tc_service_dovecot_fun004.py new file mode 100644 index 00000000..d15e2fc6 --- /dev/null +++ b/tests/system_base/dovecot/tc_service_dovecot_fun004.py @@ -0,0 +1,68 @@ +""" +@File: tc_service_dovecot_fun004.py +@Time: 2026/2/28 15:30:20 +@Author: xufei +@Version: 1.0 +@Contact: xufei@inspur.com +@License: Mulan PSL v2 +@Modify: xufei +""" +import subprocess +import time + +from common.basetest import LocalTest + + +class Test(LocalTest): + """ + See tc_service_dovecot_fun004.yaml for details + + :avocado: tags=P1,noarch,local,dovecot + """ + PARAM_DIC = {"pkg_name": "dovecot "} + + def setUp(self): + super().setUp(self.PARAM_DIC) + self.cmd('systemctl restart dovecot') + self.cmd('touch a.sh') + self.cmd('useradd testuser') + + + + def test(self): + code, result = self.cmd('doveadm process status') + self.assertFalse(code, "Check doveadm process status failed.") + + code, result = self.cmd('doveadm user -u testuser') + self.assertFalse(code, "Check doveadm user failed.") + + code, result = self.cmd('doveadm stats dump') + self.assertFalse(code, "Check doveadm stats dump failed.") + code, ipv4 = self.cmd("hostname -I | awk '{print $1}'") + command = f"""expect <&1 | grep "Removed" | awk \'{{print $2}}\' | awk \'{{print substr($0,1,length($0)-1)}}\' | tr -d \'\"\'') + command = f'find {symlink_file}' + result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + self.assertTrue(result.returncode, f"{service} disable failed") + self.cmd(f'systemctl enable {service}') + code, result = self.cmd(f'find {symlink_file}') + self.assertFalse(code, f"{service} enable failed") + elif status1 == "disabled": + code, symlink_file = self.cmd( + f'systemctl enable "{service}" 2>&1 | grep "Created symlink" | awk \'{{print $3}}\' | tr -d \'\"\'') + code, result = self.cmd(f'find {symlink_file}') + self.assertFalse(code, f"{service} enable failed") + self.cmd(f'systemctl disable {service}') + command = f'find {symlink_file}' + result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + self.assertTrue(result.returncode, f"{service} disable failed") + elif status1 == "masked": + self.log.info("Unit is masked, ignoring.") + elif status1 == "static": + self.log.info( + "The unit files have no installation config,This means they are not meant to be enabled using systemctl.") + else: + self.log.info("Unit is indirect, ignoring.") + # execution + command = f' journalctl --since {log_time} -u {service} | grep -i "fail\|error" | grep -v -i "DEBUG\|INFO\|WARNING"' + result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + self.assertTrue(result.returncode, f"There is an error message for the log of {service}") + + + + def tearDown(self): + + self.cmd(' rm -rf /etc/pki/dovecot/certs/dovecot.pem /etc/pki/dovecot/private/dovecot.pem') + super().tearDown(self.PARAM_DIC) + diff --git a/tests/system_base/dovecot/tc_service_dovecot_fun006.py b/tests/system_base/dovecot/tc_service_dovecot_fun006.py new file mode 100644 index 00000000..6b2380da --- /dev/null +++ b/tests/system_base/dovecot/tc_service_dovecot_fun006.py @@ -0,0 +1,102 @@ +""" +@File: tc_service_dovecot_fun006.py +@Time: 2026/2/28 15:30:20 +@Author: xufei +@Version: 1.0 +@Contact: xufei@inspur.com +@License: Mulan PSL v2 +@Modify: xufei +""" +import subprocess +import time + +from common.basetest import LocalTest + + +class Test(LocalTest): + """ + See tc_service_dovecot_fun006.yaml for details + + :avocado: tags=P1,noarch,local,dovecot + """ + PARAM_DIC = {"pkg_name": "dovecot "} + + def setUp(self): + super().setUp(self.PARAM_DIC) + + def test(self): + + service = 'dovecot.service' + # test_execution + code, log_time = self.cmd("date '+%Y-%m-%d %T'") + # test_restart + code, result = self.cmd(f"systemctl restart {service}") + self.assertFalse(code, f"{service} restart failed") + self.cmd('sleep 5') + code, result = self.cmd(f"systemctl status {service}| grep 'Active: active'") + self.assertFalse(code, f"{service} restart failed") + code, result = self.cmd(f"systemctl stop {service}") + self.assertFalse(code, f"{service} stop failed") + self.cmd('sleep 5') + code, result = self.cmd(f"systemctl status {service}| grep 'Active: inactive'") + self.assertFalse(code, f"{service} stop failed") + code, result = self.cmd(f"systemctl start {service}") + self.assertFalse(code, f"{service} start failed") + self.cmd('sleep 5') + code, result = self.cmd(f"systemctl status {service}| grep 'Active: active'") + self.assertFalse(code, f"{service} start failed") + # test_enabled + command = f'systemctl is-enabled {service}' + result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + status1 = result.stdout.decode('utf-8').strip() + self.cmd(f'systemctl unmask {service}') + if status1 == "enabled": + code, symlink_file = self.cmd( + f'systemctl disable {service} 2>&1 | grep "Removed" | awk \'{{print $2}}\' | awk \'{{print substr($0,1,length($0)-1)}}\' | tr -d \'\"\'') + command = f'find {symlink_file}' + result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + self.assertTrue(result.returncode, f"{service} disable failed") + self.cmd(f'systemctl enable {service}') + code, result = self.cmd(f'find {symlink_file}') + self.assertFalse(code, f"{service} enable failed") + elif status1 == "disabled": + code, symlink_file = self.cmd( + f'systemctl enable "{service}" 2>&1 | grep "Created symlink" | awk \'{{print $3}}\' | tr -d \'\"\'') + code, result = self.cmd(f'find {symlink_file}') + self.assertFalse(code, f"{service} enable failed") + self.cmd(f'systemctl disable {service}') + command = f'find {symlink_file}' + result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + self.assertTrue(result.returncode, f"{service} disable failed") + elif status1 == "masked": + self.log.info("Unit is masked, ignoring.") + elif status1 == "static": + self.log.info( + "The unit files have no installation config,This means they are not meant to be enabled using systemctl.") + else: + self.log.info("Unit is indirect, ignoring.") + # execution + command = f' journalctl --since {log_time} -u {service} | grep -i "fail\|error" | grep -v -i "DEBUG\|INFO\|WARNING"' + result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + self.assertTrue(result.returncode, f"There is an error message for the log of {service}") + # test_reload + self.cmd(f'systemctl start {service}') + self.cmd( + "sed -i 's\ExecStart=/usr/sbin/dovecot\ExecStart=/usr/sbin/dovecot -a\g' /usr/lib/systemd/system/dovecot.service") + + self.cmd('systemctl daemon-reload') + code, result = self.cmd('systemctl reload dovecot.service') + self.assertFalse(code, "dovecot.service reload failed") + + code, result = self.cmd('systemctl status dovecot.service | grep "Active: active"') + self.assertFalse(code, "dovecot.service reload causes the service status to change") + + def tearDown(self): + self.cmd( + "sed -i 's\ExecStart=/usr/sbin/dovecot -a\ExecStart=/usr/sbin/dovecot\g' /usr/lib/systemd/system/dovecot.service") + self.cmd('systemctl daemon-reload') + self.cmd('systemctl reload dovecot.service') + self.cmd('systemctl stop dovecot.service') + self.cmd('rm -rf /etc/pki/dovecot/certs/dovecot.pem /etc/pki/dovecot/private/dovecot.pem') + super().tearDown(self.PARAM_DIC) + diff --git a/tests/system_base/dovecot/tc_service_dovecot_fun007.py b/tests/system_base/dovecot/tc_service_dovecot_fun007.py new file mode 100644 index 00000000..35fea9a6 --- /dev/null +++ b/tests/system_base/dovecot/tc_service_dovecot_fun007.py @@ -0,0 +1,93 @@ +""" +@File: tc_service_dovecot_fun007.py +@Time: 2026/2/28 15:30:20 +@Author: xufei +@Version: 1.0 +@Contact: xufei@inspur.com +@License: Mulan PSL v2 +@Modify: xufei +""" +import subprocess +import time + +from common.basetest import LocalTest + + +class Test(LocalTest): + """ + See tc_service_dovecot_fun007.yaml for details + + :avocado: tags=P1,noarch,local,dovecot + """ + PARAM_DIC = {"pkg_name": "dovecot "} + + def setUp(self): + super().setUp(self.PARAM_DIC) + + def test(self): + + service = 'dovecot.socket' + # test_execution + code, log_time = self.cmd("date '+%Y-%m-%d %T'") + # test_restart + code, result = self.cmd(f"systemctl restart {service}") + self.assertFalse(code, f"{service} restart failed") + self.cmd('sleep 5') + code, result = self.cmd(f"systemctl status {service}| grep 'Active: active'") + self.assertFalse(code, f"{service} restart failed") + code, result = self.cmd(f"systemctl stop {service}") + self.assertFalse(code, f"{service} stop failed") + self.cmd('sleep 5') + code, result = self.cmd(f"systemctl status {service}| grep 'Active: inactive'") + self.assertFalse(code, f"{service} stop failed") + code, result = self.cmd(f"systemctl start {service}") + self.assertFalse(code, f"{service} start failed") + self.cmd('sleep 5') + code, result = self.cmd(f"systemctl status {service}| grep 'Active: active'") + self.assertFalse(code, f"{service} start failed") + # test_enabled + command = f'systemctl is-enabled {service}' + result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + status1 = result.stdout.decode('utf-8').strip() + self.cmd(f'systemctl unmask {service}') + if status1 == "enabled": + code, symlink_file = self.cmd( + f'systemctl disable {service} 2>&1 | grep "Removed" | awk \'{{print $2}}\' | awk \'{{print substr($0,1,length($0)-1)}}\' | tr -d \'\"\'') + command = f'find {symlink_file}' + result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + self.assertTrue(result.returncode, f"{service} disable failed") + self.cmd(f'systemctl enable {service}') + code, result = self.cmd(f'find {symlink_file}') + self.assertFalse(code, f"{service} enable failed") + elif status1 == "disabled": + code, symlink_file = self.cmd( + f'systemctl enable "{service}" 2>&1 | grep "Created symlink" | awk \'{{print $3}}\' | tr -d \'\"\'') + code, result = self.cmd(f'find {symlink_file}') + self.assertFalse(code, f"{service} enable failed") + self.cmd(f'systemctl disable {service}') + command = f'find {symlink_file}' + result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + self.assertTrue(result.returncode, f"{service} disable failed") + elif status1 == "masked": + self.log.info("Unit is masked, ignoring.") + elif status1 == "static": + self.log.info( + "The unit files have no installation config,This means they are not meant to be enabled using systemctl.") + else: + self.log.info("Unit is indirect, ignoring.") + # execution + command = f' journalctl --since {log_time} -u {service} | grep -i "fail\|error" | grep -v -i "DEBUG\|INFO\|WARNING"' + result = subprocess.run(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + self.assertTrue(result.returncode, f"There is an error message for the log of {service}") + # test_reload + self.cmd(f'systemctl start {service}') + code, result = self.cmd('systemctl reload dovecot.socket 2>&1 | grep "Job type reload is not applicable for unit dovecot.socket"') + self.assertFalse(code, "dovecot.socket reload failed") + + code, result = self.cmd('systemctl status dovecot.socket | grep "Active: active"') + self.assertFalse(code, "dovecot.socket reload causes the service status to change") + + def tearDown(self): + self.cmd('systemctl stop dovecot.socket') + super().tearDown(self.PARAM_DIC) + -- Gitee