Wazuh DBSync 单元测试编译与运行指南:从零构建并验证 Linux 目标测试
【免费下载链接】wazuhWazuh - The Open Source Security Platform. Unified XDR and SIEM protection for endpoints and cloud workloads.项目地址: https://gitcode.com/GitHub_Trending/wa/wazuh
导读
DBSync 是 Wazuh 开源安全平台中负责本地数据库同步的核心共享模块(位于src/shared_modules/dbsync),它为 syscollector、FIM 等模块提供基于 SQLite 的高性能数据同步能力。本文围绕仓库内 DBSync 单元测试文档 展开,系统讲解如何在 Linux 环境下完成 Wazuh 工程级编译、独立构建 DBSync 单元测试、运行指定测试目标与单条测试用例的全过程。读完本文,你将掌握make TEST=1的工程编译开关、CMake 独立构建命令、四个测试二进制的作用、gtest/gmock 测试组织方式,以及如何借助 ctest 与覆盖率参数对 DBSync 进行质量验证。
一、DBSync 单元测试体系概览
1.1 被测对象:DBSync 是什么
DBSync 以共享库形式提供了一套面向 SQLite 的数据同步引擎。从 公开 C 接口 可以看到其核心能力:通过dbsync_create/dbsync_create_persistent创建数据库句柄(前者默认DbManagement::VOLATILE,后者默认PERSISTENT并支持表结构升级语句),通过dbsync_create_txn创建多线程事务,再以行同步、快照更新、删除行回调等方式把 JSON 数据批量写入本地库。入口实现 中dbsync_create_会先校验path与sql_statement非空,再委托给 C++ 实现层完成初始化。
单元测试正是围绕这套接口及其底层 SQLite 封装(src/sqlite/sqlite_wrapper.cpp、src/sqlite/sqlite_dbengine.cpp)展开的。
1.2 测试目录结构
仓库中 tests 目录 的组织方式如下:
src/shared_modules/dbsync/tests/ ├── Readme.md # 本文对应的官方说明文档 ├── CMakeLists.txt # 汇总四个测试子目录的顶层构建脚本 ├── dbengine/ # 数据库引擎层测试(sqlite_dbengine) ├── interface/ # DBSync 公开接口层测试(dbsync 句柄/事务) ├── mocks/ # gmock 桩:sqlite_wrapper、sqlite factory、dbsync ├── pipelineFactory/ # 同步管线工厂测试(多线程批量处理) └── sqlite/ # SQLite 封装层测试(连接/事务)顶层 tests/CMakeLists.txt 依次add_subdirectory(sqlite)、add_subdirectory(interface)、add_subdirectory(pipelineFactory)、add_subdirectory(dbengine),并引入external/googletest与external/googlemock头文件,说明整套单测基于 GoogleTest / GoogleMock 框架编写。
二、前置条件:以 TEST 模式编译 Wazuh
原文档明确指出:要对某个 Wazuh 目标运行单元测试,必须先以TEST选项构建整个工程。命令如下:
make deps RESOURCES_URL=file:///path/to/deps/ make TARGET=server|agent TEST=1make deps RESOURCES_URL=file:///path/to/deps/:拉取/解压第三方依赖资源。RESOURCES_URL指向存放预编译依赖的本地目录(也可为 HTTP(S) 源),是离线构建的常用方式。make TARGET=server|agent TEST=1:TARGET决定编译服务端还是 Agent,TEST=1是关键开关——它会让各模块的 CMake 构建脚本进入测试模式。
以 DBSync 模块自身的 CMakeLists.txt 为例,UNIT_TEST打开后会发生三件事:
enable_testing()启用 ctest 测试注册;add_coverage_libraries(dbsync)并给所有测试可执行文件追加--coverage/-fprofile-arcs编译与链接参数(GCC 与 Clang 均支持),实现代码覆盖率收集;- 追加
add_subdirectory(tests)与add_subdirectory(integrationTests),把单元测试与集成测试一并纳入构建。
反之,当UNIT_TEST未定义时,构建系统会编译 example 示例程序 以演示库的用法(if(NOT DEFINED COVERITY AND NOT DEFINED UNIT_TEST)分支),说明测试模式与示例模式是互斥的。
三、独立编译 DBSync 单元测试(Linux)
3.1 构建前置要求
运行 DBSync 单元测试必须使用CMake 3.12 或更高版本(cmake_minimum_required(VERSION 3.12.4)),并确保已按上文方式准备好wazuh/src/external/下的依赖(包括 sqlite3、cJSON、OpenSSL、nlohmann/json、googletest 等,模块 CMakeLists 中通过include_directories引用了external/sqlite、external/nlohmann、external/cJSON、external/openssl/include)。
3.2 构建命令
原文档给出的步骤为(注意:原文档写于早期目录布局,指向wazuh/src/dbsync/;在当前仓库中,模块实际位于src/shared_modules/dbsync/,下文命令已按现状调整):
mkdir build cd build cmake -DEXTERNAL_LIB=~/path/to/wazuh/src/external/ -DCMAKE_BUILD_TYPE=Debug -DUNIT_TEST=ON .. cmake --build .参数逐一说明:
| 参数 | 含义 |
|---|---|
-DEXTERNAL_LIB=<path> | 指向 Wazuh 外部依赖目录,即wazuh/src/external/的绝对路径,构建时会用它定位 sqlite3、cJSON、gtest/gmock 等库 |
-DCMAKE_BUILD_TYPE=Debug | 以 Debug 模式编译,保留调试符号,便于定位断言失败与覆盖率分析 |
-DUNIT_TEST=ON | 开启 DBSync 测试构建分支,等价于上一节工程级TEST=1在该模块内的具体落地 |
构建成功后,产物统一输出到build/bin(库输出到build/lib),如 模块 CMakeLists 中CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin所定义。
3.3 构建脚本层面的测试接线
在 tests/CMakeLists.txt 及各子目录 CMakeLists 中,每个测试目标都遵循同一模式:
- 使用
file(GLOB ..._TEST_SRC "*.cpp")收集测试源码,再显式引入被测实现源码(如 sqlite 测试引入src/sqlite/sqlite_wrapper.cpp,dbengine 测试引入sqlite_dbengine.cpp与sqlite_wrapper.cpp); - 链接
gtest、gmock、gtest_main、gmock_main,以及sqlite3、cjson、pthread、dl等运行库; - 通过
add_test(NAME <target> COMMAND <target>)注册到 ctest,并set_tests_properties(... PROPERTIES LABELS "dbsync")打上标签,便于批量筛选执行。
四、四个测试目标:被测层次与职责
下表汇总了当前仓库实际生成的测试二进制及其对应源码位置:
| 测试二进制 | 对应目录 | 被测对象 | 说明 |
|---|---|---|---|
sqlite_unit_test | tests/sqlite | src/sqlite/sqlite_wrapper.cpp | 覆盖 SQLite 连接、事务、语句执行等底层封装 |
dbsync_unit_test | tests/interface | src/*.cpp、src/sqlite/*.cpp | 覆盖公开句柄、事务、行同步等接口行为 |
dbsyncPipelineFactory_unit_test | tests/pipelineFactory | src/dbsyncPipelineFactory.*及全部实现 | 覆盖多线程同步管线工厂的批量调度 |
dbengine_unit_test | tests/dbengine | src/sqlite/sqlite_dbengine.cpp | 覆盖数据库引擎层的表管理、快照与删除逻辑 |
原文档示例中提到的
string_helper_unit_test对应的是通用工具类测试的命名惯例;在本模块中,直接对应上述四个二进制即可。
测试中大量使用 GoogleMock 桩:mocks/sqlitewrapper_mock.h与mocks/sqlitefactory_mock.h用于隔离 SQLite 真实调用,mocks/mock_dbsync.hpp用于在接口层测试中模拟 DBSync 句柄,从而让测试聚焦业务逻辑而非数据库实现细节。
五、运行单元测试
5.1 运行全部测试
在build目录下,可用 ctest 一次性执行本模块全部已注册测试:
ctest -L dbsync --output-on-failure-L dbsync依据前面打上的 LABELS 精确筛选 DBSync 相关用例,--output-on-failure在失败时打印详细日志。
5.2 运行指定测试目标
原文档强调:若只需运行某个特定测试,直接进入其所在子目录对应的bin目录,像运行普通 Linux 程序一样执行即可,测试结果直接输出到控制台:
cd bin ./sqlite_unit_test ./dbsync_unit_test ./dbsyncPipelineFactory_unit_test ./dbengine_unit_test每个二进制内部也可用 gtest 的过滤参数运行更细粒度的用例,例如只执行 SQLite 连接相关测试:
./sqlite_unit_test --gtest_filter=SQLiteTest.Connection*5.3 测试输出示例
以 sqlite_test.cpp 为例,其测试场景包括:
ConnectionCtor:默认构造与带路径构造的连接对象均能获得有效数据库句柄;ConnectionClose:关闭后db()返回空指针,且再次执行语句会抛出sqlite_error;ConnectionExecute:合法的BEGIN TRANSACTION/ROLLBACK TRANSACTION不抛异常,非法 SQL 抛出sqlite_error;TransactionCtorDtorSuccess/TransactionCommitSuccess:通过MOCK_METHOD桩连接验证事务在构造时发出BEGIN TRANSACTION、提交时发出COMMIT、析构未提交时回滚ROLLBACK TRANSACTION。
这些用例同时验证了sqlite_wrapper的异常语义(db_exception.h中的sqlite_error)与事务生命周期,是典型的“行为驱动 + 状态断言”gtest 写法。
六、测试数据与纵深验证手段
六、接口层测试的真实数据
tests/interface/test_inputs.h 内嵌了大量真实进程数据的 JSON 数组(如systemd、kthreadd、rcu_gp等 Linux 进程字段:pid、ppid、name、state、resident、vm_size……),用于模拟 syscollector 上报的进程清单。接口层测试正是把这些 JSON 输入灌入dbsync_create_txn等接口,验证插入、修改、删除、快照等同步语义,与实际业务场景保持一致。
六、2 更广的测试生态
除单元测试外,同一模块还提供两层验证:
- 集成测试:integrationTests/fim 下的
fimIntegrationTest.cpp面向 FIM(文件完整性监控)场景做端到端数据库验证,同样受UNIT_TEST开关控制; - 冒烟测试:smokeTests 通过 DBSync 测试工具(testtool)驱动整个库的公开 API,按
InsertionUpdateDeleteSelect、snapshotsUpdate、triggerActions、txnOperation等场景组织 JSON 输入与预期结果,用于验证核心链路未回归。
下图展示了测试工具的总体架构(图片来源 dbsyncTestToolArchDiagram.png):
测试工具本身位于 testtool,由main.cpp、action.h、cmdArgsHelper.h、factoryAction.h、testContext.h及input/下的一系列 JSON 场景文件组成,为冒烟测试提供了统一的命令行入口。
七、常见问题与排查要点
- 目录路径不一致:原文档写的是
wazuh/src/dbsync/,在当前仓库中应按src/shared_modules/dbsync/执行构建,其余步骤不变。 make deps资源缺失:若RESOURCES_URL指定的本地目录缺少预编译依赖,构建会在链接阶段报cannot find -lsqlite3、-lgtest之类的错误,请确认external/下依赖完整。- CMake 版本过低:
cmake_minimum_required(VERSION 3.12.4)会直接拒绝低于 3.12 的 CMake,请先升级。 - 找不到测试二进制:确认
-DUNIT_TEST=ON已传入;只有该选项打开时add_subdirectory(tests)才会生效,bin目录下才会出现四个测试程序。 - 覆盖率数据:Debug + 测试模式下已自动附加
--coverage,可用 gcov/lcov 分析各测试目标对src/sqlite/与src/源码的覆盖情况,辅助补充用例。
结语
DBSync 的单元测试体系以 GoogleTest/GoogleMock 为底座,通过工程级TEST=1与模块级-DUNIT_TEST=ON两级开关接入构建,形成 sqlite 封装层、接口层、管线工厂、引擎层四个层次的测试目标。掌握本文的编译命令(make deps、make TARGET=server|agent TEST=1、cmake -DEXTERNAL_LIB=... -DUNIT_TEST=ON、cmake --build .)与运行方式(ctest -L dbsync、直接执行bin下二进制、--gtest_filter),即可对 Wazuh 数据同步核心链路进行系统性的本地验证,并可与 FIM 集成测试、冒烟测试配合形成完整的质量保障闭环。
【免费下载链接】wazuhWazuh - The Open Source Security Platform. Unified XDR and SIEM protection for endpoints and cloud workloads.项目地址: https://gitcode.com/GitHub_Trending/wa/wazuh
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考