yams/tests/unit/cli/status_metrics_catch2_test.cpp
trvon 05202d49a3
feat(storage): expose typed disk pressure policy
Signed-off-by: trvon <git@trevon.dev>
2026-08-27 09:54:06 -06:00

112 lines
5 KiB
C++

// pi-lens-ignore: fatal error
#include <catch2/catch_test_macros.hpp>
#include <yams/cli/status_metrics.h>
using yams::cli::effectiveSearchMetrics;
using yams::daemon::StatusResponse;
using yams::daemon::metrics::kSearchActive;
using yams::daemon::metrics::kSearchAvgLatencyUs;
using yams::daemon::metrics::kSearchCacheHitRatePct;
using yams::daemon::metrics::kSearchConcurrencyLimit;
using yams::daemon::metrics::kSearchExecuted;
using yams::daemon::metrics::kSearchQueued;
TEST_CASE("effectiveSearchMetrics preserves populated typed metrics", "[cli][status][metrics]") {
StatusResponse status;
status.searchMetrics.active = 3;
status.searchMetrics.queued = 2;
status.searchMetrics.executed = 41;
status.searchMetrics.cacheHitRate = 0.73;
status.searchMetrics.avgLatencyUs = 8123;
status.searchMetrics.concurrencyLimit = 12;
status.requestCounts[std::string(kSearchActive)] = 99;
status.requestCounts[std::string(kSearchQueued)] = 98;
status.requestCounts[std::string(kSearchExecuted)] = 97;
status.requestCounts[std::string(kSearchCacheHitRatePct)] = 96;
status.requestCounts[std::string(kSearchAvgLatencyUs)] = 95;
status.requestCounts[std::string(kSearchConcurrencyLimit)] = 94;
const auto effective = effectiveSearchMetrics(status);
CHECK(effective.active == 3);
CHECK(effective.queued == 2);
CHECK(effective.executed == 41);
CHECK(effective.cacheHitRate == 0.73);
CHECK(effective.avgLatencyUs == 8123);
CHECK(effective.concurrencyLimit == 12);
}
TEST_CASE("effectiveSearchMetrics recovers zeroed typed metrics from requestCounts",
"[cli][status][metrics]") {
StatusResponse status;
status.requestCounts[std::string(kSearchActive)] = 4;
status.requestCounts[std::string(kSearchQueued)] = 1;
status.requestCounts[std::string(kSearchExecuted)] = 28;
status.requestCounts[std::string(kSearchCacheHitRatePct)] = 64;
status.requestCounts[std::string(kSearchAvgLatencyUs)] = 10230234;
status.requestCounts[std::string(kSearchConcurrencyLimit)] = 7;
const auto effective = effectiveSearchMetrics(status);
CHECK(effective.active == 4);
CHECK(effective.queued == 1);
CHECK(effective.executed == 28);
CHECK(effective.cacheHitRate == 0.64);
CHECK(effective.avgLatencyUs == 10230234);
CHECK(effective.concurrencyLimit == 7);
}
TEST_CASE("extractStoragePressure decodes detailed disk policy metrics",
"[cli][status][metrics][disk-pressure]") {
StatusResponse status;
status.requestCounts[std::string(yams::daemon::metrics::kStorageCapacityBytesLow)] =
0x80000000ULL;
status.requestCounts[std::string(yams::daemon::metrics::kStorageCapacityBytesHigh)] = 2;
status.requestCounts[std::string(yams::daemon::metrics::kStorageAvailableBytesLow)] =
512ULL * 1024ULL * 1024ULL;
status.requestCounts[std::string(yams::daemon::metrics::kStorageAvailableBytesHigh)] = 0;
status.requestCounts[std::string(yams::daemon::metrics::kStoragePressureLevel)] =
static_cast<std::size_t>(yams::storage::DiskPressureLevel::Warning);
status.requestCounts[std::string(yams::daemon::metrics::kStorageWarningFreePercentBp)] = 1250;
status.requestCounts[std::string(yams::daemon::metrics::kStorageWriteAdmissionBytesLow)] =
256ULL * 1024ULL * 1024ULL;
status.requestCounts[std::string(yams::daemon::metrics::kStorageWriteAdmissionBytesHigh)] = 0;
status.requestCounts[std::string(yams::daemon::metrics::kStorageEmergencyReserveBytesLow)] =
100ULL * 1024ULL * 1024ULL;
status.requestCounts[std::string(yams::daemon::metrics::kStorageEmergencyReserveBytesHigh)] = 0;
const auto disk = yams::cli::extractStoragePressure(status);
REQUIRE(disk.capacityBytes.has_value());
REQUIRE(disk.availableBytes.has_value());
CHECK(*disk.capacityBytes == 10ULL * 1024ULL * 1024ULL * 1024ULL);
CHECK(*disk.availableBytes == 512ULL * 1024ULL * 1024ULL);
CHECK(disk.level == yams::storage::DiskPressureLevel::Warning);
CHECK(disk.warningFreePercent == 12.5);
CHECK(disk.minimumWriteAdmissionBytes == 256ULL * 1024ULL * 1024ULL);
CHECK(disk.emergencyReserveBytes == 100ULL * 1024ULL * 1024ULL);
}
TEST_CASE("effectiveSearchMetrics fills only missing typed fields", "[cli][status][metrics]") {
StatusResponse status;
status.searchMetrics.executed = 11;
status.searchMetrics.avgLatencyUs = 4200;
status.requestCounts[std::string(kSearchActive)] = 2;
status.requestCounts[std::string(kSearchQueued)] = 5;
status.requestCounts[std::string(kSearchExecuted)] = 99;
status.requestCounts[std::string(kSearchCacheHitRatePct)] = 25;
status.requestCounts[std::string(kSearchAvgLatencyUs)] = 123456;
status.requestCounts[std::string(kSearchConcurrencyLimit)] = 8;
const auto effective = effectiveSearchMetrics(status);
CHECK(effective.active == 2);
CHECK(effective.queued == 5);
CHECK(effective.executed == 11);
CHECK(effective.cacheHitRate == 0.25);
CHECK(effective.avgLatencyUs == 4200);
CHECK(effective.concurrencyLimit == 8);
}