Files
dstalk/tests/service_registry_test.cpp
XiuChengWu bb2e8c0220
Some checks failed
CI / Determine matrix (push) Has been cancelled
CI / ${{ matrix.os }} / ${{ matrix.build_type }} (push) Has been cancelled
Wave 8: tech-debt audits, core unit tests, CLI pipe input (W11.1-W11.7)
- W11.1 context_plugin audit (architect-huang): 3 findings on ABI exception
  safety, strdup null checks, dead g_max_tokens variable. Rating: B.
- W11.2 config audit (engineer-chen): identified 74-line TOML parser
  duplication between config_plugin and config_store, dual-store data
  isolation, dangling c_str() risk. Rating: C.
- W11.3 event_bus + service_registry unit tests (qa-liu): 12 cases total,
  ctest coverage 2 -> 4 targets, 100% pass.
- W11.4 CLI stdin pipe mode (engineer-zhao): isatty detection, single-shot
  inference path with exit codes 0/1/2/3.
- W11.6 scripts/refresh_status.py (engineer-li): 431-line generator that
  scans 16 profile.md + 5 group.md to regenerate STATUS.md.
- W11.7 destructive testing (qa-xu): 10 input scenarios PASS, found bin
  copy mismatch (BUG-1) plus 3 minor UX bugs for follow-up.

Verified: cmake build 0 error, ctest 4/4 pass.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-27 09:06:25 +08:00

115 lines
4.7 KiB
C++

// ============================================================================
// service_registry_test.cpp — ServiceRegistry 单元测试(补充覆盖,不与 host_api_test 重叠)
// ============================================================================
// host_api_test 已覆盖: 重复注册(同名同版/同名异版)、查询不存在服务、版本不满足、
// shutdown 后查询。本测试补充边界与生命周期路径。
// ============================================================================
#include <cstring>
#include <iostream>
#include "service_registry.hpp"
// ---- 轻量断言 ----
static int g_failures = 0;
#define TCHECK(cond, msg) do { \
if (cond) { \
std::cout << "[OK] " << (msg) << "\n"; \
} else { \
std::cerr << "[FAIL] " << (msg) << "\n"; \
g_failures++; \
} \
} while (0)
// ============================================================
int main()
{
std::cout << "=== dstalk service_registry unit tests (supplement) ===\n\n";
// ====================================================================
// Test 1: register_service(nullptr name) → -1
// ====================================================================
{
dstalk::ServiceRegistry reg;
void* vt = reinterpret_cast<void*>(0x10);
int r = reg.register_service(nullptr, 1, vt);
TCHECK(r == -1, "register_service(nullptr name) returns -1");
}
// ====================================================================
// Test 2: register_service(nullptr vtable) → -1
// ====================================================================
{
dstalk::ServiceRegistry reg;
int r = reg.register_service("valid_name", 1, nullptr);
TCHECK(r == -1, "register_service(nullptr vtable) returns -1");
}
// ====================================================================
// Test 3: 完整生命周期 — register → query → unregister → query(nullptr)
// ====================================================================
{
dstalk::ServiceRegistry reg;
void* vt = reinterpret_cast<void*>(0xDEAD);
int r = reg.register_service("life", 3, vt);
TCHECK(r == 0, "register_service(\"life\",3) returns 0");
void* q1 = reg.query_service("life", 2);
TCHECK(q1 == vt, "query_service(\"life\",2) returns vtable after register");
reg.unregister_service("life");
void* q2 = reg.query_service("life", 1);
TCHECK(q2 == nullptr, "query_service(\"life\",1) returns nullptr after unregister");
}
// ====================================================================
// Test 4: unregister_service(nullptr name) 不崩溃(安全空操作)
// ====================================================================
{
dstalk::ServiceRegistry reg;
reg.unregister_service(nullptr);
std::cout << "[OK] unregister_service(nullptr) did not crash\n";
}
// ====================================================================
// Test 5: 注册后重新注册同名 → 先 unregister 再 register 成功
// ====================================================================
{
dstalk::ServiceRegistry reg;
void* vt1 = reinterpret_cast<void*>(0xA);
void* vt2 = reinterpret_cast<void*>(0xB);
reg.register_service("reborn", 1, vt1);
reg.unregister_service("reborn");
int r = reg.register_service("reborn", 2, vt2);
TCHECK(r == 0, "register_service after unregister same name returns 0");
void* q = reg.query_service("reborn", 2);
TCHECK(q == vt2, "query_service after re-register returns new vtable");
}
// ====================================================================
// Test 6: query_service(nullptr name) → nullptr
// ====================================================================
{
dstalk::ServiceRegistry reg;
void* q = reg.query_service(nullptr, 1);
TCHECK(q == nullptr, "query_service(nullptr name) returns nullptr");
}
// ====================================================================
// 结果
// ====================================================================
std::cout << "\n";
if (g_failures == 0) {
std::cout << "=== All service_registry tests passed ===\n";
return 0;
} else {
std::cerr << "=== " << g_failures << " service_registry test(s) FAILED ===\n";
return 1;
}
}