diff options
author | andrew-rykov <arykov@ydb.tech> | 2022-10-07 00:13:31 +0300 |
---|---|---|
committer | andrew-rykov <arykov@ydb.tech> | 2022-10-07 00:13:31 +0300 |
commit | 53354011eff56242aedc542ce6884d5b7ca3beb8 (patch) | |
tree | f0516a5377c6afde5e2d8ef24e73ac7293c46c94 | |
parent | 7be9429fa6e226df17f1e04841dc2962e1d8c755 (diff) | |
download | ydb-53354011eff56242aedc542ce6884d5b7ca3beb8.tar.gz |
health checker tests
-rw-r--r-- | library/cpp/json/writer/json_ut.cpp | 39 | ||||
-rw-r--r-- | ydb/core/health_check/health_check_ut.cpp | 179 |
2 files changed, 176 insertions, 42 deletions
diff --git a/library/cpp/json/writer/json_ut.cpp b/library/cpp/json/writer/json_ut.cpp index 9980555683..1768e91224 100644 --- a/library/cpp/json/writer/json_ut.cpp +++ b/library/cpp/json/writer/json_ut.cpp @@ -265,43 +265,4 @@ Y_UNIT_TEST_SUITE(JsonWriter) { UNIT_ASSERT_STRINGS_EQUAL(buf.Str(), R"({"\u003C\u003E&":"Ololo","<>&":"Ololo2"})"); } } - - Y_UNIT_TEST(WriteUninitializedBoolDoesntCrashProgram) { - // makes sense only in release build w/ address sanitizer - // - // passing uninitialized boolean into WriteBool can make cleverly optimized code which is emitted by compiler crash program - // https://stackoverflow.com/questions/54120862/does-the-c-standard-allow-for-an-uninitialized-bool-to-crash-a-program - - // looks like compiler can detect UB at compile time in simple cases, but not in this one - class TSensorConf { - public: - class TAggrRuleItem { - public: - TVector<TString> Cond; - TVector<TString> Target; - }; - - TString ToString() const { - NJson::TJsonValue jsonValue; - NJsonWriter::TBuf jsonOutput; - jsonOutput.BeginObject() - .WriteKey("rawDataMemOnly").WriteBool(RawDataMemOnly) - .WriteKey("aggrRules").BeginList(); - - jsonOutput.EndList() - .EndObject(); - - return jsonOutput.Str(); - } - - TVector<TAggrRuleItem> AggrRules; - bool RawDataMemOnly; - }; - - TSensorConf s; - NSan::Unpoison(&s.RawDataMemOnly, sizeof(s.RawDataMemOnly)); - auto p = s.ToString(); - // doesn't really matter - UNIT_ASSERT(!p.empty()); - } } diff --git a/ydb/core/health_check/health_check_ut.cpp b/ydb/core/health_check/health_check_ut.cpp index 0972b3b707..befb205e02 100644 --- a/ydb/core/health_check/health_check_ut.cpp +++ b/ydb/core/health_check/health_check_ut.cpp @@ -3,13 +3,20 @@ #include <ydb/core/testlib/test_client.h> #include <ydb/public/lib/deprecated/kicli/kicli.h> +#include <ydb/core/node_whiteboard/node_whiteboard.h> +#include <ydb/core/blobstorage/base/blobstorage_events.h> +#include <ydb/core/tx/schemeshard/schemeshard.h> #include "health_check.h" -using namespace NKikimr; +#include <unordered_map> + +namespace NKikimr { + +using namespace NSchemeShard; using namespace Tests; Y_UNIT_TEST_SUITE(THealthCheckTest) { - Y_UNIT_TEST(Basic) { + void BasicTest(IEventBase* ev) { TPortManager tp; ui16 port = tp.GetPort(2134); ui16 grpcPort = tp.GetPort(2135); @@ -27,9 +34,175 @@ Y_UNIT_TEST_SUITE(THealthCheckTest) { TActorId sender = runtime->AllocateEdgeActor(); TAutoPtr<IEventHandle> handle; - runtime->Send(new IEventHandle(NHealthCheck::MakeHealthCheckID(), sender, new NHealthCheck::TEvSelfCheckRequest(), 0)); + runtime->Send(new IEventHandle(NHealthCheck::MakeHealthCheckID(), sender, ev, 0)); NHealthCheck::TEvSelfCheckResult* result = runtime->GrabEdgeEvent<NHealthCheck::TEvSelfCheckResult>(handle); UNIT_ASSERT(result != nullptr); } + + Y_UNIT_TEST(Basic) { + BasicTest(new NHealthCheck::TEvSelfCheckRequest()); + } + + Y_UNIT_TEST(BasicNodeCheckRequest) { + BasicTest(new NHealthCheck::TEvNodeCheckRequest()); + } + + int const GROUP_START_ID = 1200; + int const VCARD_START_ID = 5500; + + void ChangeDescribeSchemeResult(TEvSchemeShard::TEvDescribeSchemeResult::TPtr* ev) { + auto pool = (*ev)->Get()->MutableRecord()->mutable_pathdescription()->mutable_domaindescription()->add_storagepools(); + pool->set_name("/Root:test"); + pool->set_kind("kind"); + }; + + void AddGroupsInControllerSelectGroupsResult(TEvBlobStorage::TEvControllerSelectGroupsResult::TPtr* ev, int groupCount) { + auto &pbRecord = (*ev)->Get()->Record; + auto pbMatchGroups = pbRecord.mutable_matchinggroups(0); + + auto sample = pbMatchGroups->GetGroups(0); + pbMatchGroups->ClearGroups(); + + auto groupId = GROUP_START_ID; + for (int i = 0; i < groupCount; i++) { + auto group = pbMatchGroups->add_groups(); + group->CopyFrom(sample); + group->SetGroupID(groupId++); + } + }; + + void AddGroupVSlotInControllerConfigResponse(TEvBlobStorage::TEvControllerConfigResponse::TPtr* ev, int groupCount, int vslotCount) { + auto &pbRecord = (*ev)->Get()->Record; + auto pbConfig = pbRecord.mutable_response()->mutable_status(0)->mutable_baseconfig(); + + auto groupSample = pbConfig->GetGroup(0); + auto vslotSample = pbConfig->GetVSlot(0); + auto vslotIdSample = pbConfig->GetGroup(0).GetVSlotId(0); + pbConfig->clear_group(); + pbConfig->clear_vslot(); + + auto groupId = GROUP_START_ID; + auto vslotId = VCARD_START_ID; + for (int i = 0; i < groupCount; i++) { + + auto group = pbConfig->add_group(); + group->CopyFrom(groupSample); + group->set_groupid(groupId); + + group->clear_vslotid(); + for (int j = 0; j < vslotCount; j++) { + auto vslot = pbConfig->add_vslot(); + vslot->CopyFrom(vslotSample); + vslot->SetVDiskIdx(vslotId); + vslot->set_groupid(groupId); + vslot->mutable_vslotid()->set_vslotid(vslotId); + + auto slotId = group->add_vslotid(); + slotId->CopyFrom(vslotIdSample); + slotId->set_vslotid(vslotId); + + vslotId++; + } + groupId++; + } + }; + + void AddVSlotInVDiskStateResponse(NNodeWhiteboard::TEvWhiteboard::TEvVDiskStateResponse::TPtr* ev, int groupCount, int vslotCount) { + auto &pbRecord = (*ev)->Get()->Record; + + auto sample = pbRecord.GetVDiskStateInfo(0); + pbRecord.clear_vdiskstateinfo(); + + auto groupId = GROUP_START_ID; + auto slotId = VCARD_START_ID; + for (int i = 0; i < groupCount; i++) { + for (int j = 0; j < vslotCount; j++) { + auto state = pbRecord.add_vdiskstateinfo(); + state->CopyFrom(sample); + state->mutable_vdiskid()->set_vdisk(slotId++); + state->mutable_vdiskid()->set_groupid(groupId); + } + groupId++; + } + } + + void ListingTest(int const groupNumber, int const groupVdiscNumber) { + TPortManager tp; + ui16 port = tp.GetPort(2134); + ui16 grpcPort = tp.GetPort(2135); + auto settings = TServerSettings(port) + .SetNodeCount(2) + .SetUseRealThreads(false) + .SetDomainName("Root"); + TServer server(settings); + server.EnableGRpc(grpcPort); + TClient client(settings); + TTestActorRuntime &runtime = *server.GetRuntime(); + + TActorId sender = runtime.AllocateEdgeActor(); + TAutoPtr<IEventHandle> handle; + + auto observerFunc = [&](TTestActorRuntimeBase&, TAutoPtr<IEventHandle>& ev) { + switch (ev->GetTypeRewrite()) { + case TEvSchemeShard::EvDescribeSchemeResult: { + auto *x = reinterpret_cast<NSchemeShard::TEvSchemeShard::TEvDescribeSchemeResult::TPtr*>(&ev); + ChangeDescribeSchemeResult(x); + break; + } + case TEvBlobStorage::EvControllerSelectGroupsResult: { + auto *x = reinterpret_cast<TEvBlobStorage::TEvControllerSelectGroupsResult::TPtr*>(&ev); + AddGroupsInControllerSelectGroupsResult(x, groupNumber); + break; + } + case TEvBlobStorage::EvControllerConfigResponse: { + auto *x = reinterpret_cast<TEvBlobStorage::TEvControllerConfigResponse::TPtr*>(&ev); + AddGroupVSlotInControllerConfigResponse(x, groupNumber, groupVdiscNumber); + break; + } + case NNodeWhiteboard::TEvWhiteboard::EvVDiskStateResponse: { + auto *x = reinterpret_cast<NNodeWhiteboard::TEvWhiteboard::TEvVDiskStateResponse::TPtr*>(&ev); + AddVSlotInVDiskStateResponse(x, groupNumber, groupVdiscNumber); + break; + } + } + + return TTestActorRuntime::EEventAction::PROCESS; + }; + runtime.SetObserverFunc(observerFunc); + + auto *request = new NHealthCheck::TEvSelfCheckRequest; + runtime.Send(new IEventHandle(NHealthCheck::MakeHealthCheckID(), sender, request, 0)); + NHealthCheck::TEvSelfCheckResult* result = runtime.GrabEdgeEvent<NHealthCheck::TEvSelfCheckResult>(handle); + + int groupCount = 0; + for (const auto& issue_log : result->Result.Getissue_log()) { + if (issue_log.Gettype() == "STORAGE_GROUP" && issue_log.Getlocation().Getstorage().Getpool().Getname() == "/Root:test") { + groupCount++; + } + } + UNIT_ASSERT_VALUES_EQUAL(groupCount, groupNumber); + + int vdiscCount = 0; + for (const auto& issue_log : result->Result.Getissue_log()) { + if (issue_log.Gettype() == "VDISK" && issue_log.Getlocation().Getstorage().Getpool().Getname() == "/Root:test") { + vdiscCount++; + } + } + UNIT_ASSERT_VALUES_EQUAL(vdiscCount, groupNumber * groupVdiscNumber); + } + + Y_UNIT_TEST(GroupsListing) { + ListingTest(15, 1); + } + + Y_UNIT_TEST(VCardListing) { + ListingTest(1, 20); + } + + Y_UNIT_TEST(GroupsVCardListing) { + ListingTest(15, 20); + } +} + } |