diff --git a/antd-cpp/include/antd/models.hpp b/antd-cpp/include/antd/models.hpp index c3dd450..dff2ee6 100644 --- a/antd-cpp/include/antd/models.hpp +++ b/antd-cpp/include/antd/models.hpp @@ -6,10 +6,21 @@ namespace antd { -/// Result of a health check. +/// Health check result from the antd daemon. +/// +/// The diagnostic fields (version, evm_network, uptime_seconds, build_commit, +/// payment_token_address, payment_vault_address) were added in antd 0.4.0. +/// They default to empty / 0 so the struct stays usable when talking to an +/// older daemon that doesn't report them. struct HealthStatus { bool ok{false}; std::string network; + std::string version; ///< antd crate version, e.g. "0.4.0" + std::string evm_network; ///< "arbitrum-one", "arbitrum-sepolia", "local", "custom" + std::uint64_t uptime_seconds{0}; ///< seconds since the daemon process started + std::string build_commit; ///< short git SHA, "" if unknown + std::string payment_token_address; ///< "" if unconfigured + std::string payment_vault_address; ///< "" if unconfigured }; /// Result of a put/create operation. diff --git a/antd-cpp/src/client.cpp b/antd-cpp/src/client.cpp index d35c781..3350d02 100644 --- a/antd-cpp/src/client.cpp +++ b/antd-cpp/src/client.cpp @@ -100,6 +100,12 @@ HealthStatus Client::health() { return HealthStatus{ .ok = j.value("status", "") == "ok", .network = j.value("network", ""), + .version = j.value("version", ""), + .evm_network = j.value("evm_network", ""), + .uptime_seconds = j.value("uptime_seconds", 0), + .build_commit = j.value("build_commit", ""), + .payment_token_address = j.value("payment_token_address", ""), + .payment_vault_address = j.value("payment_vault_address", ""), }; } diff --git a/antd-cpp/src/grpc_client.cpp b/antd-cpp/src/grpc_client.cpp index fa8512e..388aa24 100644 --- a/antd-cpp/src/grpc_client.cpp +++ b/antd-cpp/src/grpc_client.cpp @@ -86,6 +86,12 @@ HealthStatus GrpcClient::health() { return HealthStatus{ .ok = resp.status() == "ok", .network = resp.network(), + .version = resp.version(), + .evm_network = resp.evm_network(), + .uptime_seconds = resp.uptime_seconds(), + .build_commit = resp.build_commit(), + .payment_token_address = resp.payment_token_address(), + .payment_vault_address = resp.payment_vault_address(), }; } diff --git a/antd-cpp/tests/test_client.cpp b/antd-cpp/tests/test_client.cpp index af23458..2f36953 100644 --- a/antd-cpp/tests/test_client.cpp +++ b/antd-cpp/tests/test_client.cpp @@ -82,13 +82,56 @@ TEST_CASE("AntdError subtypes are catchable as AntdError") { // --------------------------------------------------------------------------- TEST_CASE("HealthStatus from JSON") { - auto j = json::parse(R"({"status":"ok","network":"local"})"); - antd::HealthStatus h; - h.ok = j.value("status", "") == "ok"; - h.network = j.value("network", ""); + auto j = json::parse(R"({ + "status":"ok", + "network":"local", + "version":"0.4.0", + "evm_network":"local", + "uptime_seconds":42, + "build_commit":"abcdef123456", + "payment_token_address":"0xtoken", + "payment_vault_address":"0xvault" + })"); + antd::HealthStatus h{ + .ok = j.value("status", "") == "ok", + .network = j.value("network", ""), + .version = j.value("version", ""), + .evm_network = j.value("evm_network", ""), + .uptime_seconds = j.value("uptime_seconds", 0), + .build_commit = j.value("build_commit", ""), + .payment_token_address = j.value("payment_token_address", ""), + .payment_vault_address = j.value("payment_vault_address", ""), + }; CHECK(h.ok); CHECK(h.network == "local"); + CHECK(h.version == "0.4.0"); + CHECK(h.evm_network == "local"); + CHECK(h.uptime_seconds == 42); + CHECK(h.build_commit == "abcdef123456"); + CHECK(h.payment_token_address == "0xtoken"); + CHECK(h.payment_vault_address == "0xvault"); +} + +TEST_CASE("HealthStatus defaults populate when pre-0.4.0 daemon omits diagnostics") { + auto j = json::parse(R"({"status":"ok","network":"default"})"); + antd::HealthStatus h{ + .ok = j.value("status", "") == "ok", + .network = j.value("network", ""), + .version = j.value("version", ""), + .evm_network = j.value("evm_network", ""), + .uptime_seconds = j.value("uptime_seconds", 0), + .build_commit = j.value("build_commit", ""), + .payment_token_address = j.value("payment_token_address", ""), + .payment_vault_address = j.value("payment_vault_address", ""), + }; + + CHECK(h.ok); + CHECK(h.network == "default"); + CHECK(h.version.empty()); + CHECK(h.evm_network.empty()); + CHECK(h.uptime_seconds == 0); + CHECK(h.build_commit.empty()); } TEST_CASE("PutResult from JSON") {