diff options
author | cerevra <cerevra@yandex-team.ru> | 2022-02-10 16:45:58 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:45:58 +0300 |
commit | bf41dd01f6c920583e9faae7cd55ed25e547e052 (patch) | |
tree | ec7c8c285ffa648a5c5efeff453787a15ab811ac /library/cpp/tvmauth/client/misc/api/dynamic_dst | |
parent | e2c3e3004f7cd68441cefcfa4aaccd3d8051c846 (diff) | |
download | ydb-bf41dd01f6c920583e9faae7cd55ed25e547e052.tar.gz |
Restoring authorship annotation for <cerevra@yandex-team.ru>. Commit 1 of 2.
Diffstat (limited to 'library/cpp/tvmauth/client/misc/api/dynamic_dst')
5 files changed, 771 insertions, 771 deletions
diff --git a/library/cpp/tvmauth/client/misc/api/dynamic_dst/tvm_client.cpp b/library/cpp/tvmauth/client/misc/api/dynamic_dst/tvm_client.cpp index 6ec15c0e88..dee9b05d1f 100644 --- a/library/cpp/tvmauth/client/misc/api/dynamic_dst/tvm_client.cpp +++ b/library/cpp/tvmauth/client/misc/api/dynamic_dst/tvm_client.cpp @@ -1,126 +1,126 @@ -#include "tvm_client.h" - -#include <util/string/builder.h> - -namespace NTvmAuth::NDynamicClient { - TAsyncUpdaterPtr TTvmClient::Create(const NTvmApi::TClientSettings& settings, TLoggerPtr logger) { - Y_ENSURE_EX(logger, TNonRetriableException() << "Logger is required"); - THolder<TTvmClient> p(new TTvmClient(settings, std::move(logger))); - p->Init(); - p->StartWorker(); - return p.Release(); - } - - NThreading::TFuture<TAddResponse> TTvmClient::Add(TDsts&& dsts) { - if (dsts.empty()) { - LogDebug("Adding dst: got empty task"); - return NThreading::MakeFuture<TAddResponse>(TAddResponse{}); - } - - const size_t size = dsts.size(); - const ui64 id = ++TaskIds_; - NThreading::TPromise<TAddResponse> promise = NThreading::NewPromise<TAddResponse>(); - - TaskQueue_.Enqueue(TTask{id, promise, std::move(dsts)}); - - LogDebug(TStringBuilder() << "Adding dst: got task #" << id << " with " << size << " dsts"); - return promise.GetFuture(); - } - - std::optional<TString> TTvmClient::GetOptionalServiceTicketFor(const TTvmId dst) { - TServiceTicketsPtr tickets = GetCachedServiceTickets(); - Y_ENSURE_EX(tickets, - TBrokenTvmClientSettings() - << "Need to enable fetching of service tickets in settings"); - - auto it = tickets->TicketsById.find(dst); - if (it != tickets->TicketsById.end()) { - return it->second; - } - - it = tickets->ErrorsById.find(dst); - if (it != tickets->ErrorsById.end()) { - ythrow TMissingServiceTicket() - << "Failed to get ticket for '" << dst << "': " - << it->second; - } - - return {}; - } - - TTvmClient::TTvmClient(const NTvmApi::TClientSettings& settings, TLoggerPtr logger) - : TBase(settings, logger) - { - } - +#include "tvm_client.h" + +#include <util/string/builder.h> + +namespace NTvmAuth::NDynamicClient { + TAsyncUpdaterPtr TTvmClient::Create(const NTvmApi::TClientSettings& settings, TLoggerPtr logger) { + Y_ENSURE_EX(logger, TNonRetriableException() << "Logger is required"); + THolder<TTvmClient> p(new TTvmClient(settings, std::move(logger))); + p->Init(); + p->StartWorker(); + return p.Release(); + } + + NThreading::TFuture<TAddResponse> TTvmClient::Add(TDsts&& dsts) { + if (dsts.empty()) { + LogDebug("Adding dst: got empty task"); + return NThreading::MakeFuture<TAddResponse>(TAddResponse{}); + } + + const size_t size = dsts.size(); + const ui64 id = ++TaskIds_; + NThreading::TPromise<TAddResponse> promise = NThreading::NewPromise<TAddResponse>(); + + TaskQueue_.Enqueue(TTask{id, promise, std::move(dsts)}); + + LogDebug(TStringBuilder() << "Adding dst: got task #" << id << " with " << size << " dsts"); + return promise.GetFuture(); + } + + std::optional<TString> TTvmClient::GetOptionalServiceTicketFor(const TTvmId dst) { + TServiceTicketsPtr tickets = GetCachedServiceTickets(); + Y_ENSURE_EX(tickets, + TBrokenTvmClientSettings() + << "Need to enable fetching of service tickets in settings"); + + auto it = tickets->TicketsById.find(dst); + if (it != tickets->TicketsById.end()) { + return it->second; + } + + it = tickets->ErrorsById.find(dst); + if (it != tickets->ErrorsById.end()) { + ythrow TMissingServiceTicket() + << "Failed to get ticket for '" << dst << "': " + << it->second; + } + + return {}; + } + + TTvmClient::TTvmClient(const NTvmApi::TClientSettings& settings, TLoggerPtr logger) + : TBase(settings, logger) + { + } + TTvmClient::~TTvmClient() { TBase::StopWorker(); } - void TTvmClient::Worker() { - TBase::Worker(); - ProcessTasks(); - } - - void TTvmClient::ProcessTasks() { - TaskQueue_.DequeueAll(&Tasks_); - if (Tasks_.empty()) { - return; - } - - TDsts required; - for (const TTask& task : Tasks_) { - for (const auto& dst : task.Dsts) { - required.insert(dst); - } - } - - TServiceTicketsPtr cache = UpdateMissingServiceTickets(required); - - for (TTask& task : Tasks_) { - try { - SetResponseForTask(task, *cache); - } catch (const std::exception& e) { - LogError(TStringBuilder() - << "Adding dst: task #" << task.Id << ": exception: " << e.what()); - } catch (...) { - LogError(TStringBuilder() - << "Adding dst: task #" << task.Id << ": exception: " << CurrentExceptionMessage()); - } - } - - Tasks_.clear(); - } - - static const TString UNKNOWN = "Unknown reason"; - void TTvmClient::SetResponseForTask(TTvmClient::TTask& task, const TServiceTickets& cache) { - if (task.Promise.HasValue()) { - LogWarning(TStringBuilder() << "Adding dst: task #" << task.Id << " already has value"); - return; - } - - TAddResponse response; - - for (const auto& dst : task.Dsts) { - if (cache.TicketsById.contains(dst.Id)) { - AddDstToSettings(dst); - response.emplace(dst, TDstResponse{EDstStatus::Success, TString()}); - - LogDebug(TStringBuilder() << "Adding dst: task #" << task.Id - << ": dst=" << dst.Id << " got ticket"); - continue; - } - - auto it = cache.ErrorsById.find(dst.Id); - const TString& error = it == cache.ErrorsById.end() ? UNKNOWN : it->second; - response.emplace(dst, TDstResponse{EDstStatus::Fail, error}); - - LogWarning(TStringBuilder() << "Adding dst: task #" << task.Id - << ": dst=" << dst.Id - << " failed to get ticket: " << error); - } - - LogDebug(TStringBuilder() << "Adding dst: task #" << task.Id << ": set value"); - task.Promise.SetValue(std::move(response)); - } -} + void TTvmClient::Worker() { + TBase::Worker(); + ProcessTasks(); + } + + void TTvmClient::ProcessTasks() { + TaskQueue_.DequeueAll(&Tasks_); + if (Tasks_.empty()) { + return; + } + + TDsts required; + for (const TTask& task : Tasks_) { + for (const auto& dst : task.Dsts) { + required.insert(dst); + } + } + + TServiceTicketsPtr cache = UpdateMissingServiceTickets(required); + + for (TTask& task : Tasks_) { + try { + SetResponseForTask(task, *cache); + } catch (const std::exception& e) { + LogError(TStringBuilder() + << "Adding dst: task #" << task.Id << ": exception: " << e.what()); + } catch (...) { + LogError(TStringBuilder() + << "Adding dst: task #" << task.Id << ": exception: " << CurrentExceptionMessage()); + } + } + + Tasks_.clear(); + } + + static const TString UNKNOWN = "Unknown reason"; + void TTvmClient::SetResponseForTask(TTvmClient::TTask& task, const TServiceTickets& cache) { + if (task.Promise.HasValue()) { + LogWarning(TStringBuilder() << "Adding dst: task #" << task.Id << " already has value"); + return; + } + + TAddResponse response; + + for (const auto& dst : task.Dsts) { + if (cache.TicketsById.contains(dst.Id)) { + AddDstToSettings(dst); + response.emplace(dst, TDstResponse{EDstStatus::Success, TString()}); + + LogDebug(TStringBuilder() << "Adding dst: task #" << task.Id + << ": dst=" << dst.Id << " got ticket"); + continue; + } + + auto it = cache.ErrorsById.find(dst.Id); + const TString& error = it == cache.ErrorsById.end() ? UNKNOWN : it->second; + response.emplace(dst, TDstResponse{EDstStatus::Fail, error}); + + LogWarning(TStringBuilder() << "Adding dst: task #" << task.Id + << ": dst=" << dst.Id + << " failed to get ticket: " << error); + } + + LogDebug(TStringBuilder() << "Adding dst: task #" << task.Id << ": set value"); + task.Promise.SetValue(std::move(response)); + } +} diff --git a/library/cpp/tvmauth/client/misc/api/dynamic_dst/tvm_client.h b/library/cpp/tvmauth/client/misc/api/dynamic_dst/tvm_client.h index 58ed953b63..a3aed7210a 100644 --- a/library/cpp/tvmauth/client/misc/api/dynamic_dst/tvm_client.h +++ b/library/cpp/tvmauth/client/misc/api/dynamic_dst/tvm_client.h @@ -1,60 +1,60 @@ -#pragma once - -#include <library/cpp/tvmauth/client/misc/api/threaded_updater.h> - +#pragma once + +#include <library/cpp/tvmauth/client/misc/api/threaded_updater.h> + #include <library/cpp/threading/future/future.h> - -#include <util/generic/map.h> -#include <util/thread/lfqueue.h> - -#include <optional> - -namespace NTvmAuth::NDynamicClient { - enum class EDstStatus { - Success, - Fail, - }; - - struct TDstResponse { - EDstStatus Status = EDstStatus::Fail; - TString Error; - - bool operator==(const TDstResponse& o) const { - return Status == o.Status && Error == o.Error; - } - }; - - using TDsts = NTvmApi::TDstSet; - using TAddResponse = TMap<NTvmApi::TClientSettings::TDst, TDstResponse>; - - class TTvmClient: public NTvmApi::TThreadedUpdater { - public: - static TAsyncUpdaterPtr Create(const NTvmApi::TClientSettings& settings, TLoggerPtr logger); + +#include <util/generic/map.h> +#include <util/thread/lfqueue.h> + +#include <optional> + +namespace NTvmAuth::NDynamicClient { + enum class EDstStatus { + Success, + Fail, + }; + + struct TDstResponse { + EDstStatus Status = EDstStatus::Fail; + TString Error; + + bool operator==(const TDstResponse& o) const { + return Status == o.Status && Error == o.Error; + } + }; + + using TDsts = NTvmApi::TDstSet; + using TAddResponse = TMap<NTvmApi::TClientSettings::TDst, TDstResponse>; + + class TTvmClient: public NTvmApi::TThreadedUpdater { + public: + static TAsyncUpdaterPtr Create(const NTvmApi::TClientSettings& settings, TLoggerPtr logger); virtual ~TTvmClient(); - - NThreading::TFuture<TAddResponse> Add(TDsts&& dsts); - std::optional<TString> GetOptionalServiceTicketFor(const TTvmId dst); - - protected: // for tests - struct TTask { - ui64 Id = 0; - NThreading::TPromise<TAddResponse> Promise; - TDsts Dsts; - }; - - using TBase = NTvmApi::TThreadedUpdater; - - protected: // for tests - TTvmClient(const NTvmApi::TClientSettings& settings, TLoggerPtr logger); - - void Worker() override; - void ProcessTasks(); - - void SetResponseForTask(TTask& task, const TServiceTickets& cache); - - private: - std::atomic<ui64> TaskIds_ = {0}; - TLockFreeQueue<TTask> TaskQueue_; - TVector<TTask> Tasks_; - }; -} + + NThreading::TFuture<TAddResponse> Add(TDsts&& dsts); + std::optional<TString> GetOptionalServiceTicketFor(const TTvmId dst); + + protected: // for tests + struct TTask { + ui64 Id = 0; + NThreading::TPromise<TAddResponse> Promise; + TDsts Dsts; + }; + + using TBase = NTvmApi::TThreadedUpdater; + + protected: // for tests + TTvmClient(const NTvmApi::TClientSettings& settings, TLoggerPtr logger); + + void Worker() override; + void ProcessTasks(); + + void SetResponseForTask(TTask& task, const TServiceTickets& cache); + + private: + std::atomic<ui64> TaskIds_ = {0}; + TLockFreeQueue<TTask> TaskQueue_; + TVector<TTask> Tasks_; + }; +} diff --git a/library/cpp/tvmauth/client/misc/api/dynamic_dst/ut/tvm_client_ut.cpp b/library/cpp/tvmauth/client/misc/api/dynamic_dst/ut/tvm_client_ut.cpp index 89403c15e4..e0b4562a31 100644 --- a/library/cpp/tvmauth/client/misc/api/dynamic_dst/ut/tvm_client_ut.cpp +++ b/library/cpp/tvmauth/client/misc/api/dynamic_dst/ut/tvm_client_ut.cpp @@ -1,119 +1,119 @@ -#include <library/cpp/tvmauth/client/misc/api/dynamic_dst/tvm_client.h> - -#include <library/cpp/tvmauth/client/misc/disk_cache.h> - -#include <library/cpp/tvmauth/unittest.h> - +#include <library/cpp/tvmauth/client/misc/api/dynamic_dst/tvm_client.h> + +#include <library/cpp/tvmauth/client/misc/disk_cache.h> + +#include <library/cpp/tvmauth/unittest.h> + #include <library/cpp/testing/unittest/registar.h> - -#include <util/stream/file.h> -#include <util/system/fs.h> - -#include <regex> - -using namespace NTvmAuth; -using namespace NTvmAuth::NDynamicClient; - -Y_UNIT_TEST_SUITE(DynamicClient) { - static const std::regex TIME_REGEX(R"(\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d.\d{6}Z)"); - static const TString CACHE_DIR = "./tmp/"; - - static void WriteFile(TString name, TStringBuf body, TInstant time) { - NFs::Remove(CACHE_DIR + name); - TFileOutput f(CACHE_DIR + name); - f << TDiskWriter::PrepareData(time, body); - } - - static void CleanCache() { - NFs::RemoveRecursive(CACHE_DIR); - NFs::MakeDirectoryRecursive(CACHE_DIR); - } - - class TLogger: public NTvmAuth::ILogger { - public: - void Log(int lvl, const TString& msg) override { - Cout << TInstant::Now() << " lvl=" << lvl << " msg: " << msg << "\n"; - Stream << lvl << ": " << msg << Endl; - } - - TStringStream Stream; - }; - - class TOfflineUpdater: public NDynamicClient::TTvmClient { - public: - TOfflineUpdater(const NTvmApi::TClientSettings& settings, - TIntrusivePtr<TLogger> l, - bool fail = true, - std::vector<TString> tickets = {}) - : TTvmClient(settings, l) - , Fail(fail) - , Tickets(std::move(tickets)) - { - Init(); - ExpBackoff_.SetEnabled(false); - } - - NUtils::TFetchResult FetchServiceTicketsFromHttp(const TString& req) const override { - if (Fail) { - throw yexception() << "tickets: alarm"; - } - - TString response; - if (!Tickets.empty()) { - response = Tickets.front(); - Tickets.erase(Tickets.begin()); - } - - Cout << "*** FetchServiceTicketsFromHttp. request: " << req << ". response: " << response << Endl; - return {200, {}, "/2/ticket", response, ""}; - } - - NUtils::TFetchResult FetchPublicKeysFromHttp() const override { - if (Fail) { - throw yexception() << "keysalarm"; - } - Cout << "*** FetchPublicKeysFromHttp" << Endl; - return {200, {}, "/2/keys", PublicKeys, ""}; - } - - using TTvmClient::GetDsts; - using TTvmClient::ProcessTasks; - using TTvmClient::SetResponseForTask; - using TTvmClient::Worker; - - bool Fail = true; - TString PublicKeys = NUnittest::TVMKNIFE_PUBLIC_KEYS; - mutable std::vector<TString> Tickets; - }; - + +#include <util/stream/file.h> +#include <util/system/fs.h> + +#include <regex> + +using namespace NTvmAuth; +using namespace NTvmAuth::NDynamicClient; + +Y_UNIT_TEST_SUITE(DynamicClient) { + static const std::regex TIME_REGEX(R"(\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d.\d{6}Z)"); + static const TString CACHE_DIR = "./tmp/"; + + static void WriteFile(TString name, TStringBuf body, TInstant time) { + NFs::Remove(CACHE_DIR + name); + TFileOutput f(CACHE_DIR + name); + f << TDiskWriter::PrepareData(time, body); + } + + static void CleanCache() { + NFs::RemoveRecursive(CACHE_DIR); + NFs::MakeDirectoryRecursive(CACHE_DIR); + } + + class TLogger: public NTvmAuth::ILogger { + public: + void Log(int lvl, const TString& msg) override { + Cout << TInstant::Now() << " lvl=" << lvl << " msg: " << msg << "\n"; + Stream << lvl << ": " << msg << Endl; + } + + TStringStream Stream; + }; + + class TOfflineUpdater: public NDynamicClient::TTvmClient { + public: + TOfflineUpdater(const NTvmApi::TClientSettings& settings, + TIntrusivePtr<TLogger> l, + bool fail = true, + std::vector<TString> tickets = {}) + : TTvmClient(settings, l) + , Fail(fail) + , Tickets(std::move(tickets)) + { + Init(); + ExpBackoff_.SetEnabled(false); + } + + NUtils::TFetchResult FetchServiceTicketsFromHttp(const TString& req) const override { + if (Fail) { + throw yexception() << "tickets: alarm"; + } + + TString response; + if (!Tickets.empty()) { + response = Tickets.front(); + Tickets.erase(Tickets.begin()); + } + + Cout << "*** FetchServiceTicketsFromHttp. request: " << req << ". response: " << response << Endl; + return {200, {}, "/2/ticket", response, ""}; + } + + NUtils::TFetchResult FetchPublicKeysFromHttp() const override { + if (Fail) { + throw yexception() << "keysalarm"; + } + Cout << "*** FetchPublicKeysFromHttp" << Endl; + return {200, {}, "/2/keys", PublicKeys, ""}; + } + + using TTvmClient::GetDsts; + using TTvmClient::ProcessTasks; + using TTvmClient::SetResponseForTask; + using TTvmClient::Worker; + + bool Fail = true; + TString PublicKeys = NUnittest::TVMKNIFE_PUBLIC_KEYS; + mutable std::vector<TString> Tickets; + }; + Y_UNIT_TEST(StartWithIncompleteTicketsSet) { - TInstant now = TInstant::Now(); - CleanCache(); - WriteFile("./service_tickets", - R"({"19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}})" - "\t100500", - now); - - NTvmApi::TClientSettings s; - s.SetSelfTvmId(100500); + TInstant now = TInstant::Now(); + CleanCache(); + WriteFile("./service_tickets", + R"({"19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}})" + "\t100500", + now); + + NTvmApi::TClientSettings s; + s.SetSelfTvmId(100500); s.EnableServiceTicketsFetchOptions("qwerty", {{"blackbox", 19}, {"kolmo", 213}}, false); s.SetDiskCacheDir(CACHE_DIR); auto l = MakeIntrusive<TLogger>(); { - TOfflineUpdater client(s, - l, - false, - { - R"({"213" : { "error" : "some error"}})", - R"({"123" : { "ticket" : "service_ticket_3"}})", - }); + TOfflineUpdater client(s, + l, + false, + { + R"({"213" : { "error" : "some error"}})", + R"({"123" : { "ticket" : "service_ticket_3"}})", + }); UNIT_ASSERT_VALUES_EQUAL(TClientStatus::IncompleteTicketsSet, client.GetStatus()); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->TicketsById.contains(213)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - UNIT_ASSERT(client.GetCachedServiceTickets()->ErrorsById.contains(213)); + UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->TicketsById.contains(213)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); + UNIT_ASSERT(client.GetCachedServiceTickets()->ErrorsById.contains(213)); NThreading::TFuture<TAddResponse> fut = client.Add({123}); UNIT_ASSERT_VALUES_EQUAL(TClientStatus::IncompleteTicketsSet, client.GetStatus()); @@ -121,12 +121,12 @@ Y_UNIT_TEST_SUITE(DynamicClient) { client.Worker(); UNIT_ASSERT_VALUES_EQUAL(TClientStatus::IncompleteTicketsSet, client.GetStatus()); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->TicketsById.contains(213)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(123)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - UNIT_ASSERT(client.GetCachedServiceTickets()->ErrorsById.contains(213)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(123)); + UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->TicketsById.contains(213)); + UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(123)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); + UNIT_ASSERT(client.GetCachedServiceTickets()->ErrorsById.contains(213)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(123)); UNIT_ASSERT(fut.HasValue()); TAddResponse resp{ @@ -134,7 +134,7 @@ Y_UNIT_TEST_SUITE(DynamicClient) { }; UNIT_ASSERT_VALUES_EQUAL(resp, fut.GetValue()); - UNIT_ASSERT(client.Tickets.empty()); + UNIT_ASSERT(client.Tickets.empty()); TDsts dsts{19, 123, 213}; UNIT_ASSERT_VALUES_EQUAL(dsts, client.GetDsts()); @@ -144,7 +144,7 @@ Y_UNIT_TEST_SUITE(DynamicClient) { } Y_UNIT_TEST(StartWithEmptyTicketsSet) { - CleanCache(); + CleanCache(); NTvmApi::TClientSettings s; s.SetSelfTvmId(100500); @@ -154,16 +154,16 @@ Y_UNIT_TEST_SUITE(DynamicClient) { auto l = MakeIntrusive<TLogger>(); { - TOfflineUpdater client(s, - l, - false, - { - R"({"213" : { "error" : "some error"}})", - R"({"123" : { "ticket" : "3:serv:CBAQ__________9_IgYIlJEGEHs:CcafYQH-FF5XaXMuJrgLZj98bIC54cs1ZkcFS9VV_9YM9iOM_0PXCtMkdg85rFjxE_BMpg7bE8ZuoqNfdw0FPt0BAKNeISwlydj4o0IjY82--LZBpP8CRn-EpAnkRaDShdlfrcF2pk1SSmEX8xdyZVQEnkUPY0cHGlFnu231vnE"}})", - }); + TOfflineUpdater client(s, + l, + false, + { + R"({"213" : { "error" : "some error"}})", + R"({"123" : { "ticket" : "3:serv:CBAQ__________9_IgYIlJEGEHs:CcafYQH-FF5XaXMuJrgLZj98bIC54cs1ZkcFS9VV_9YM9iOM_0PXCtMkdg85rFjxE_BMpg7bE8ZuoqNfdw0FPt0BAKNeISwlydj4o0IjY82--LZBpP8CRn-EpAnkRaDShdlfrcF2pk1SSmEX8xdyZVQEnkUPY0cHGlFnu231vnE"}})", + }); UNIT_ASSERT_VALUES_EQUAL(TClientStatus::IncompleteTicketsSet, client.GetStatus()); - UNIT_ASSERT(!client.GetCachedServiceTickets()->TicketsById.contains(213)); - UNIT_ASSERT(client.GetCachedServiceTickets()->ErrorsById.contains(213)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->TicketsById.contains(213)); + UNIT_ASSERT(client.GetCachedServiceTickets()->ErrorsById.contains(213)); UNIT_ASSERT_EXCEPTION_CONTAINS(client.GetOptionalServiceTicketFor(213), TMissingServiceTicket, "some error"); NThreading::TFuture<TAddResponse> fut = client.Add({123}); @@ -172,10 +172,10 @@ Y_UNIT_TEST_SUITE(DynamicClient) { client.Worker(); UNIT_ASSERT_VALUES_EQUAL(TClientStatus::IncompleteTicketsSet, client.GetStatus()); - UNIT_ASSERT(!client.GetCachedServiceTickets()->TicketsById.contains(213)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(123)); - UNIT_ASSERT(client.GetCachedServiceTickets()->ErrorsById.contains(213)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(123)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->TicketsById.contains(213)); + UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(123)); + UNIT_ASSERT(client.GetCachedServiceTickets()->ErrorsById.contains(213)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(123)); UNIT_ASSERT(fut.HasValue()); TAddResponse resp{ @@ -183,7 +183,7 @@ Y_UNIT_TEST_SUITE(DynamicClient) { }; UNIT_ASSERT_VALUES_EQUAL(resp, fut.GetValue()); - UNIT_ASSERT(client.Tickets.empty()); + UNIT_ASSERT(client.Tickets.empty()); TDsts dsts{123, 213}; UNIT_ASSERT_VALUES_EQUAL(dsts, client.GetDsts()); @@ -193,443 +193,443 @@ Y_UNIT_TEST_SUITE(DynamicClient) { }; Y_UNIT_TEST(StartWithIncompleteCacheAndAdd) { TInstant now = TInstant::Now(); - CleanCache(); - WriteFile("./service_tickets", + CleanCache(); + WriteFile("./service_tickets", R"({"19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}})" "\t100500", now); NTvmApi::TClientSettings s; s.SetSelfTvmId(100500); - s.EnableServiceTicketsFetchOptions("qwerty", {{"blackbox", 19}, {"kolmo", 213}}); - s.SetDiskCacheDir(CACHE_DIR); - - auto l = MakeIntrusive<TLogger>(); - - UNIT_ASSERT_EXCEPTION_CONTAINS(TOfflineUpdater(s, l), - TRetriableException, - "Failed to start TvmClient. You can retry: ServiceTickets: tickets: alarm"); - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: File './tmp/service_tickets' was successfully read\n" - << "6: Got 1 service ticket(s) from disk\n" - << "6: Cache was updated with 1 service ticket(s): XXXXXXXXXXX\n" - << "7: File './tmp/retry_settings' does not exist\n" - << "4: Failed to get ServiceTickets: tickets: alarm\n" - << "4: Failed to get ServiceTickets: tickets: alarm\n" - << "4: Failed to get ServiceTickets: tickets: alarm\n" - << "4: Failed to update service tickets: tickets: alarm\n", - std::regex_replace(std::string(l->Stream.Str()), TIME_REGEX, "XXXXXXXXXXX")); - l->Stream.Str().clear(); - - { - TOfflineUpdater client(s, - l, - false, - { - R"({"213" : { "ticket" : "service_ticket_2"}})", - R"({"123" : { "ticket" : "service_ticket_3"}})", - }); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(213)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(213)); - - NThreading::TFuture<TAddResponse> fut = client.Add({123}); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - - client.Worker(); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(213)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(123)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(213)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(123)); - - UNIT_ASSERT(fut.HasValue()); - TAddResponse resp{ - {123, {EDstStatus::Success, ""}}, - }; - UNIT_ASSERT_VALUES_EQUAL(resp, fut.GetValue()); - - UNIT_ASSERT(client.Tickets.empty()); - - TDsts dsts{19, 123, 213}; - UNIT_ASSERT_VALUES_EQUAL(dsts, client.GetDsts()); - } - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: File './tmp/service_tickets' was successfully read\n" - << "6: Got 1 service ticket(s) from disk\n" - << "6: Cache was updated with 1 service ticket(s): " << TInstant::Seconds(now.Seconds()) << "\n" - << "7: File './tmp/retry_settings' does not exist\n" - << "7: Response with service tickets for 1 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" - << "7: Got responses with service tickets with 1 pages for 1 destination(s)\n" - << "6: Cache was partly updated with 1 service ticket(s). total: 2\n" - << "6: File './tmp/service_tickets' was successfully written\n" - << "7: Adding dst: got task #1 with 1 dsts\n" - << "7: Response with service tickets for 1 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" - << "7: Got responses with service tickets with 1 pages for 1 destination(s)\n" - << "6: Cache was partly updated with 1 service ticket(s). total: 3\n" - << "6: File './tmp/service_tickets' was successfully written\n" - << "7: Adding dst: task #1: dst=123 got ticket\n" - << "7: Adding dst: task #1: set value\n", - l->Stream.Str()); - } - - Y_UNIT_TEST(StartWithCacheAndAdd) { - TInstant now = TInstant::Now(); - CleanCache(); - WriteFile("./service_tickets", - R"({"19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}})" - "\t100500", - now); - - NTvmApi::TClientSettings s; - s.SetSelfTvmId(100500); - s.EnableServiceTicketsFetchOptions("qwerty", {{"blackbox", 19}}); - s.SetDiskCacheDir(CACHE_DIR); - - auto l = MakeIntrusive<TLogger>(); - { - TOfflineUpdater client(s, l); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - - client.Fail = false; - client.Tickets = { - R"({"123" : { "ticket" : "service_ticket_3"}, "213" : { "ticket" : "service_ticket_2"}})", - }; - NThreading::TFuture<TAddResponse> fut = client.Add({123, 213}); - - client.Worker(); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(213)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(123)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(213)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(123)); - - UNIT_ASSERT(fut.HasValue()); - TAddResponse resp{ - {123, {EDstStatus::Success, ""}}, - {213, {EDstStatus::Success, ""}}, - }; - UNIT_ASSERT_VALUES_EQUAL(resp, fut.GetValue()); - - UNIT_ASSERT(client.Tickets.empty()); - - TDsts dsts{19, 123, 213}; - UNIT_ASSERT_VALUES_EQUAL(dsts, client.GetDsts()); - } - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: File './tmp/service_tickets' was successfully read\n" - << "6: Got 1 service ticket(s) from disk\n" - << "6: Cache was updated with 1 service ticket(s): " << TInstant::Seconds(now.Seconds()) << "\n" - << "7: File './tmp/retry_settings' does not exist\n" - << "7: Adding dst: got task #1 with 2 dsts\n" - << "7: Response with service tickets for 2 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" - << "7: Got responses with service tickets with 1 pages for 2 destination(s)\n" - << "6: Cache was partly updated with 2 service ticket(s). total: 3\n" - << "6: File './tmp/service_tickets' was successfully written\n" - << "7: Adding dst: task #1: dst=123 got ticket\n" - << "7: Adding dst: task #1: dst=213 got ticket\n" - << "7: Adding dst: task #1: set value\n", - l->Stream.Str()); - } - - Y_UNIT_TEST(StartWithCacheAndAddSeveral) { - TInstant now = TInstant::Now(); - CleanCache(); - WriteFile("./service_tickets", - R"({"19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}})" - "\t100500", - now); - - NTvmApi::TClientSettings s; - s.SetSelfTvmId(100500); - s.EnableServiceTicketsFetchOptions("qwerty", {{"blackbox", 19}}); - s.SetDiskCacheDir(CACHE_DIR); - - auto l = MakeIntrusive<TLogger>(); - { - TOfflineUpdater client(s, l); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - - client.Fail = false; - client.Tickets = { - R"({"123" : { "ticket" : "service_ticket_3"}, "213" : { "ticket" : "service_ticket_2"}})", - }; - NThreading::TFuture<TAddResponse> fut1 = client.Add({123}); - NThreading::TFuture<TAddResponse> fut2 = client.Add({213}); - - client.Worker(); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(213)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(123)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(213)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(123)); - - UNIT_ASSERT(fut1.HasValue()); - TAddResponse resp1{ - {123, {EDstStatus::Success, ""}}, - }; - UNIT_ASSERT_VALUES_EQUAL(resp1, fut1.GetValue()); - - UNIT_ASSERT(fut2.HasValue()); - TAddResponse resp2{ - {213, {EDstStatus::Success, ""}}, - }; - UNIT_ASSERT_VALUES_EQUAL(resp2, fut2.GetValue()); - - UNIT_ASSERT(client.Tickets.empty()); - - TDsts dsts{19, 123, 213}; - UNIT_ASSERT_VALUES_EQUAL(dsts, client.GetDsts()); - } - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: File './tmp/service_tickets' was successfully read\n" - << "6: Got 1 service ticket(s) from disk\n" - << "6: Cache was updated with 1 service ticket(s): " << TInstant::Seconds(now.Seconds()) << "\n" - << "7: File './tmp/retry_settings' does not exist\n" - << "7: Adding dst: got task #1 with 1 dsts\n" - << "7: Adding dst: got task #2 with 1 dsts\n" - << "7: Response with service tickets for 2 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" - << "7: Got responses with service tickets with 1 pages for 2 destination(s)\n" - << "6: Cache was partly updated with 2 service ticket(s). total: 3\n" - << "6: File './tmp/service_tickets' was successfully written\n" - << "7: Adding dst: task #1: dst=123 got ticket\n" - << "7: Adding dst: task #1: set value\n" - << "7: Adding dst: task #2: dst=213 got ticket\n" - << "7: Adding dst: task #2: set value\n", - l->Stream.Str()); - } - - Y_UNIT_TEST(StartWithCacheAndAddSeveralWithErrors) { - TInstant now = TInstant::Now(); - CleanCache(); - WriteFile("./service_tickets", - R"({"19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}})" - "\t100500", - now); - - NTvmApi::TClientSettings s; - s.SetSelfTvmId(100500); - s.EnableServiceTicketsFetchOptions("qwerty", {{"blackbox", 19}}); - s.SetDiskCacheDir(CACHE_DIR); - - auto l = MakeIntrusive<TLogger>(); - { - TOfflineUpdater client(s, l); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - - UNIT_ASSERT(client.GetOptionalServiceTicketFor(19)); - UNIT_ASSERT_VALUES_EQUAL("3:serv:CBAQ__________9_IgYIKhCUkQY:CX", - *client.GetOptionalServiceTicketFor(19)); - UNIT_ASSERT(!client.GetOptionalServiceTicketFor(456)); - - client.Fail = false; - client.Tickets = { - R"({ - "123" : { "ticket" : "service_ticket_3"}, - "213" : { "ticket" : "service_ticket_2"}, - "456" : { "error" : "error_3"} - })", - }; - NThreading::TFuture<TAddResponse> fut1 = client.Add({123, 213}); - NThreading::TFuture<TAddResponse> fut2 = client.Add({213, 456}); - - client.Worker(); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(213)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(123)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->TicketsById.contains(456)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(213)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(123)); - UNIT_ASSERT(client.GetCachedServiceTickets()->ErrorsById.contains(456)); - - UNIT_ASSERT(client.GetOptionalServiceTicketFor(19)); - UNIT_ASSERT_VALUES_EQUAL("3:serv:CBAQ__________9_IgYIKhCUkQY:CX", - *client.GetOptionalServiceTicketFor(19)); - UNIT_ASSERT_EXCEPTION_CONTAINS(client.GetOptionalServiceTicketFor(456), - TMissingServiceTicket, - "Failed to get ticket for '456': error_3"); - - UNIT_ASSERT(fut1.HasValue()); - TAddResponse resp1{ - {123, {EDstStatus::Success, ""}}, - {213, {EDstStatus::Success, ""}}, - }; - UNIT_ASSERT_VALUES_EQUAL(resp1, fut1.GetValue()); - - UNIT_ASSERT(fut2.HasValue()); - TAddResponse resp2{ - {213, {EDstStatus::Success, ""}}, - {456, {EDstStatus::Fail, "error_3"}}, - }; - UNIT_ASSERT_VALUES_EQUAL(resp2, fut2.GetValue()); - - UNIT_ASSERT(client.Tickets.empty()); - - TDsts dsts{19, 123, 213}; - UNIT_ASSERT_VALUES_EQUAL(dsts, client.GetDsts()); - } - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: File './tmp/service_tickets' was successfully read\n" - << "6: Got 1 service ticket(s) from disk\n" - << "6: Cache was updated with 1 service ticket(s): " << TInstant::Seconds(now.Seconds()) << "\n" - << "7: File './tmp/retry_settings' does not exist\n" - << "7: Adding dst: got task #1 with 2 dsts\n" - << "7: Adding dst: got task #2 with 2 dsts\n" - << "7: Response with service tickets for 3 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" - << "7: Got responses with service tickets with 1 pages for 3 destination(s)\n" - << "3: Failed to get service ticket for dst=456: error_3\n" - << "6: Cache was partly updated with 2 service ticket(s). total: 3\n" - << "6: File './tmp/service_tickets' was successfully written\n" - << "7: Adding dst: task #1: dst=123 got ticket\n" - << "7: Adding dst: task #1: dst=213 got ticket\n" - << "7: Adding dst: task #1: set value\n" - << "7: Adding dst: task #2: dst=213 got ticket\n" - << "4: Adding dst: task #2: dst=456 failed to get ticket: error_3\n" - << "7: Adding dst: task #2: set value\n", - l->Stream.Str()); - } - - Y_UNIT_TEST(WithException) { - TInstant now = TInstant::Now(); - CleanCache(); - WriteFile("./service_tickets", - R"({"19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}})" - "\t100500", - now); - - NTvmApi::TClientSettings s; - s.SetSelfTvmId(100500); - s.EnableServiceTicketsFetchOptions("qwerty", {{"blackbox", 19}}); - s.SetDiskCacheDir(CACHE_DIR); - - auto l = MakeIntrusive<TLogger>(); - { - TOfflineUpdater client(s, l); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - - client.Fail = false; - client.Tickets = { - R"({ - "123" : { "ticket" : "service_ticket_3"}, - "213" : { "ticket" : "service_ticket_2"}, - "456" : { "error" : "error_3"}, - "789" : { "ticket" : "service_ticket_4"} - })", - }; - NThreading::TFuture<TAddResponse> fut1 = client.Add({123, 213}); - NThreading::TFuture<TAddResponse> fut2 = client.Add({213, 456}); - NThreading::TFuture<TAddResponse> fut3 = client.Add({789}); - - fut2.Subscribe([](const auto&) { - throw yexception() << "planed exc"; - }); - fut3.Subscribe([](const auto&) { - throw 5; - }); - - UNIT_ASSERT_NO_EXCEPTION(client.Worker()); - UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); - - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(213)); - UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(123)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->TicketsById.contains(456)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(213)); - UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(123)); - UNIT_ASSERT(client.GetCachedServiceTickets()->ErrorsById.contains(456)); - - UNIT_ASSERT(fut1.HasValue()); - TAddResponse resp1{ - {123, {EDstStatus::Success, ""}}, - {213, {EDstStatus::Success, ""}}, - }; - UNIT_ASSERT_VALUES_EQUAL(resp1, fut1.GetValue()); - - UNIT_ASSERT(fut2.HasValue()); - TAddResponse resp2{ - {213, {EDstStatus::Success, ""}}, - {456, {EDstStatus::Fail, "error_3"}}, - }; - UNIT_ASSERT_VALUES_EQUAL(resp2, fut2.GetValue()); - - UNIT_ASSERT(fut3.HasValue()); - TAddResponse resp3{ - {789, {EDstStatus::Success, ""}}, - }; - UNIT_ASSERT_VALUES_EQUAL(resp3, fut3.GetValue()); - - UNIT_ASSERT(client.Tickets.empty()); - - TDsts dsts{19, 123, 213, 789}; - UNIT_ASSERT_VALUES_EQUAL(dsts, client.GetDsts()); - } - - UNIT_ASSERT_VALUES_EQUAL( - TStringBuilder() - << "6: File './tmp/service_tickets' was successfully read\n" - << "6: Got 1 service ticket(s) from disk\n" - << "6: Cache was updated with 1 service ticket(s): " << TInstant::Seconds(now.Seconds()) << "\n" - << "7: File './tmp/retry_settings' does not exist\n" - << "7: Adding dst: got task #1 with 2 dsts\n" - << "7: Adding dst: got task #2 with 2 dsts\n" - << "7: Adding dst: got task #3 with 1 dsts\n" - << "7: Response with service tickets for 4 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" - << "7: Got responses with service tickets with 1 pages for 4 destination(s)\n" - << "3: Failed to get service ticket for dst=456: error_3\n" - << "6: Cache was partly updated with 3 service ticket(s). total: 4\n" - << "6: File './tmp/service_tickets' was successfully written\n" - << "7: Adding dst: task #1: dst=123 got ticket\n" - << "7: Adding dst: task #1: dst=213 got ticket\n" - << "7: Adding dst: task #1: set value\n" - << "7: Adding dst: task #2: dst=213 got ticket\n" - << "4: Adding dst: task #2: dst=456 failed to get ticket: error_3\n" - << "7: Adding dst: task #2: set value\n" - << "3: Adding dst: task #2: exception: planed exc\n" - << "7: Adding dst: task #3: dst=789 got ticket\n" - << "7: Adding dst: task #3: set value\n" - << "3: Adding dst: task #3: exception: unknown error\n", - l->Stream.Str()); - } -} - -template <> -void Out<NTvmAuth::NDynamicClient::TDstResponse>(IOutputStream& out, const NTvmAuth::NDynamicClient::TDstResponse& m) { - out << m.Status << " (" << m.Error << ")"; -} - -template <> -void Out<NTvmAuth::NTvmApi::TClientSettings::TDst>(IOutputStream& out, const NTvmAuth::NTvmApi::TClientSettings::TDst& m) { - out << m.Id; -} + s.EnableServiceTicketsFetchOptions("qwerty", {{"blackbox", 19}, {"kolmo", 213}}); + s.SetDiskCacheDir(CACHE_DIR); + + auto l = MakeIntrusive<TLogger>(); + + UNIT_ASSERT_EXCEPTION_CONTAINS(TOfflineUpdater(s, l), + TRetriableException, + "Failed to start TvmClient. You can retry: ServiceTickets: tickets: alarm"); + UNIT_ASSERT_VALUES_EQUAL( + TStringBuilder() + << "6: File './tmp/service_tickets' was successfully read\n" + << "6: Got 1 service ticket(s) from disk\n" + << "6: Cache was updated with 1 service ticket(s): XXXXXXXXXXX\n" + << "7: File './tmp/retry_settings' does not exist\n" + << "4: Failed to get ServiceTickets: tickets: alarm\n" + << "4: Failed to get ServiceTickets: tickets: alarm\n" + << "4: Failed to get ServiceTickets: tickets: alarm\n" + << "4: Failed to update service tickets: tickets: alarm\n", + std::regex_replace(std::string(l->Stream.Str()), TIME_REGEX, "XXXXXXXXXXX")); + l->Stream.Str().clear(); + + { + TOfflineUpdater client(s, + l, + false, + { + R"({"213" : { "ticket" : "service_ticket_2"}})", + R"({"123" : { "ticket" : "service_ticket_3"}})", + }); + UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); + UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); + UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(213)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(213)); + + NThreading::TFuture<TAddResponse> fut = client.Add({123}); + UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); + + client.Worker(); + UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); + + UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); + UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(213)); + UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(123)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(213)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(123)); + + UNIT_ASSERT(fut.HasValue()); + TAddResponse resp{ + {123, {EDstStatus::Success, ""}}, + }; + UNIT_ASSERT_VALUES_EQUAL(resp, fut.GetValue()); + + UNIT_ASSERT(client.Tickets.empty()); + + TDsts dsts{19, 123, 213}; + UNIT_ASSERT_VALUES_EQUAL(dsts, client.GetDsts()); + } + + UNIT_ASSERT_VALUES_EQUAL( + TStringBuilder() + << "6: File './tmp/service_tickets' was successfully read\n" + << "6: Got 1 service ticket(s) from disk\n" + << "6: Cache was updated with 1 service ticket(s): " << TInstant::Seconds(now.Seconds()) << "\n" + << "7: File './tmp/retry_settings' does not exist\n" + << "7: Response with service tickets for 1 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" + << "7: Got responses with service tickets with 1 pages for 1 destination(s)\n" + << "6: Cache was partly updated with 1 service ticket(s). total: 2\n" + << "6: File './tmp/service_tickets' was successfully written\n" + << "7: Adding dst: got task #1 with 1 dsts\n" + << "7: Response with service tickets for 1 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" + << "7: Got responses with service tickets with 1 pages for 1 destination(s)\n" + << "6: Cache was partly updated with 1 service ticket(s). total: 3\n" + << "6: File './tmp/service_tickets' was successfully written\n" + << "7: Adding dst: task #1: dst=123 got ticket\n" + << "7: Adding dst: task #1: set value\n", + l->Stream.Str()); + } + + Y_UNIT_TEST(StartWithCacheAndAdd) { + TInstant now = TInstant::Now(); + CleanCache(); + WriteFile("./service_tickets", + R"({"19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}})" + "\t100500", + now); + + NTvmApi::TClientSettings s; + s.SetSelfTvmId(100500); + s.EnableServiceTicketsFetchOptions("qwerty", {{"blackbox", 19}}); + s.SetDiskCacheDir(CACHE_DIR); + + auto l = MakeIntrusive<TLogger>(); + { + TOfflineUpdater client(s, l); + UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); + UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); + + client.Fail = false; + client.Tickets = { + R"({"123" : { "ticket" : "service_ticket_3"}, "213" : { "ticket" : "service_ticket_2"}})", + }; + NThreading::TFuture<TAddResponse> fut = client.Add({123, 213}); + + client.Worker(); + UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); + + UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); + UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(213)); + UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(123)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(213)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(123)); + + UNIT_ASSERT(fut.HasValue()); + TAddResponse resp{ + {123, {EDstStatus::Success, ""}}, + {213, {EDstStatus::Success, ""}}, + }; + UNIT_ASSERT_VALUES_EQUAL(resp, fut.GetValue()); + + UNIT_ASSERT(client.Tickets.empty()); + + TDsts dsts{19, 123, 213}; + UNIT_ASSERT_VALUES_EQUAL(dsts, client.GetDsts()); + } + + UNIT_ASSERT_VALUES_EQUAL( + TStringBuilder() + << "6: File './tmp/service_tickets' was successfully read\n" + << "6: Got 1 service ticket(s) from disk\n" + << "6: Cache was updated with 1 service ticket(s): " << TInstant::Seconds(now.Seconds()) << "\n" + << "7: File './tmp/retry_settings' does not exist\n" + << "7: Adding dst: got task #1 with 2 dsts\n" + << "7: Response with service tickets for 2 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" + << "7: Got responses with service tickets with 1 pages for 2 destination(s)\n" + << "6: Cache was partly updated with 2 service ticket(s). total: 3\n" + << "6: File './tmp/service_tickets' was successfully written\n" + << "7: Adding dst: task #1: dst=123 got ticket\n" + << "7: Adding dst: task #1: dst=213 got ticket\n" + << "7: Adding dst: task #1: set value\n", + l->Stream.Str()); + } + + Y_UNIT_TEST(StartWithCacheAndAddSeveral) { + TInstant now = TInstant::Now(); + CleanCache(); + WriteFile("./service_tickets", + R"({"19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}})" + "\t100500", + now); + + NTvmApi::TClientSettings s; + s.SetSelfTvmId(100500); + s.EnableServiceTicketsFetchOptions("qwerty", {{"blackbox", 19}}); + s.SetDiskCacheDir(CACHE_DIR); + + auto l = MakeIntrusive<TLogger>(); + { + TOfflineUpdater client(s, l); + UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); + UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); + + client.Fail = false; + client.Tickets = { + R"({"123" : { "ticket" : "service_ticket_3"}, "213" : { "ticket" : "service_ticket_2"}})", + }; + NThreading::TFuture<TAddResponse> fut1 = client.Add({123}); + NThreading::TFuture<TAddResponse> fut2 = client.Add({213}); + + client.Worker(); + UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); + + UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); + UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(213)); + UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(123)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(213)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(123)); + + UNIT_ASSERT(fut1.HasValue()); + TAddResponse resp1{ + {123, {EDstStatus::Success, ""}}, + }; + UNIT_ASSERT_VALUES_EQUAL(resp1, fut1.GetValue()); + + UNIT_ASSERT(fut2.HasValue()); + TAddResponse resp2{ + {213, {EDstStatus::Success, ""}}, + }; + UNIT_ASSERT_VALUES_EQUAL(resp2, fut2.GetValue()); + + UNIT_ASSERT(client.Tickets.empty()); + + TDsts dsts{19, 123, 213}; + UNIT_ASSERT_VALUES_EQUAL(dsts, client.GetDsts()); + } + + UNIT_ASSERT_VALUES_EQUAL( + TStringBuilder() + << "6: File './tmp/service_tickets' was successfully read\n" + << "6: Got 1 service ticket(s) from disk\n" + << "6: Cache was updated with 1 service ticket(s): " << TInstant::Seconds(now.Seconds()) << "\n" + << "7: File './tmp/retry_settings' does not exist\n" + << "7: Adding dst: got task #1 with 1 dsts\n" + << "7: Adding dst: got task #2 with 1 dsts\n" + << "7: Response with service tickets for 2 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" + << "7: Got responses with service tickets with 1 pages for 2 destination(s)\n" + << "6: Cache was partly updated with 2 service ticket(s). total: 3\n" + << "6: File './tmp/service_tickets' was successfully written\n" + << "7: Adding dst: task #1: dst=123 got ticket\n" + << "7: Adding dst: task #1: set value\n" + << "7: Adding dst: task #2: dst=213 got ticket\n" + << "7: Adding dst: task #2: set value\n", + l->Stream.Str()); + } + + Y_UNIT_TEST(StartWithCacheAndAddSeveralWithErrors) { + TInstant now = TInstant::Now(); + CleanCache(); + WriteFile("./service_tickets", + R"({"19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}})" + "\t100500", + now); + + NTvmApi::TClientSettings s; + s.SetSelfTvmId(100500); + s.EnableServiceTicketsFetchOptions("qwerty", {{"blackbox", 19}}); + s.SetDiskCacheDir(CACHE_DIR); + + auto l = MakeIntrusive<TLogger>(); + { + TOfflineUpdater client(s, l); + UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); + UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); + + UNIT_ASSERT(client.GetOptionalServiceTicketFor(19)); + UNIT_ASSERT_VALUES_EQUAL("3:serv:CBAQ__________9_IgYIKhCUkQY:CX", + *client.GetOptionalServiceTicketFor(19)); + UNIT_ASSERT(!client.GetOptionalServiceTicketFor(456)); + + client.Fail = false; + client.Tickets = { + R"({ + "123" : { "ticket" : "service_ticket_3"}, + "213" : { "ticket" : "service_ticket_2"}, + "456" : { "error" : "error_3"} + })", + }; + NThreading::TFuture<TAddResponse> fut1 = client.Add({123, 213}); + NThreading::TFuture<TAddResponse> fut2 = client.Add({213, 456}); + + client.Worker(); + UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); + + UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); + UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(213)); + UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(123)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->TicketsById.contains(456)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(213)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(123)); + UNIT_ASSERT(client.GetCachedServiceTickets()->ErrorsById.contains(456)); + + UNIT_ASSERT(client.GetOptionalServiceTicketFor(19)); + UNIT_ASSERT_VALUES_EQUAL("3:serv:CBAQ__________9_IgYIKhCUkQY:CX", + *client.GetOptionalServiceTicketFor(19)); + UNIT_ASSERT_EXCEPTION_CONTAINS(client.GetOptionalServiceTicketFor(456), + TMissingServiceTicket, + "Failed to get ticket for '456': error_3"); + + UNIT_ASSERT(fut1.HasValue()); + TAddResponse resp1{ + {123, {EDstStatus::Success, ""}}, + {213, {EDstStatus::Success, ""}}, + }; + UNIT_ASSERT_VALUES_EQUAL(resp1, fut1.GetValue()); + + UNIT_ASSERT(fut2.HasValue()); + TAddResponse resp2{ + {213, {EDstStatus::Success, ""}}, + {456, {EDstStatus::Fail, "error_3"}}, + }; + UNIT_ASSERT_VALUES_EQUAL(resp2, fut2.GetValue()); + + UNIT_ASSERT(client.Tickets.empty()); + + TDsts dsts{19, 123, 213}; + UNIT_ASSERT_VALUES_EQUAL(dsts, client.GetDsts()); + } + + UNIT_ASSERT_VALUES_EQUAL( + TStringBuilder() + << "6: File './tmp/service_tickets' was successfully read\n" + << "6: Got 1 service ticket(s) from disk\n" + << "6: Cache was updated with 1 service ticket(s): " << TInstant::Seconds(now.Seconds()) << "\n" + << "7: File './tmp/retry_settings' does not exist\n" + << "7: Adding dst: got task #1 with 2 dsts\n" + << "7: Adding dst: got task #2 with 2 dsts\n" + << "7: Response with service tickets for 3 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" + << "7: Got responses with service tickets with 1 pages for 3 destination(s)\n" + << "3: Failed to get service ticket for dst=456: error_3\n" + << "6: Cache was partly updated with 2 service ticket(s). total: 3\n" + << "6: File './tmp/service_tickets' was successfully written\n" + << "7: Adding dst: task #1: dst=123 got ticket\n" + << "7: Adding dst: task #1: dst=213 got ticket\n" + << "7: Adding dst: task #1: set value\n" + << "7: Adding dst: task #2: dst=213 got ticket\n" + << "4: Adding dst: task #2: dst=456 failed to get ticket: error_3\n" + << "7: Adding dst: task #2: set value\n", + l->Stream.Str()); + } + + Y_UNIT_TEST(WithException) { + TInstant now = TInstant::Now(); + CleanCache(); + WriteFile("./service_tickets", + R"({"19" : { "ticket" : "3:serv:CBAQ__________9_IgYIKhCUkQY:CX"}})" + "\t100500", + now); + + NTvmApi::TClientSettings s; + s.SetSelfTvmId(100500); + s.EnableServiceTicketsFetchOptions("qwerty", {{"blackbox", 19}}); + s.SetDiskCacheDir(CACHE_DIR); + + auto l = MakeIntrusive<TLogger>(); + { + TOfflineUpdater client(s, l); + UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); + UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); + + client.Fail = false; + client.Tickets = { + R"({ + "123" : { "ticket" : "service_ticket_3"}, + "213" : { "ticket" : "service_ticket_2"}, + "456" : { "error" : "error_3"}, + "789" : { "ticket" : "service_ticket_4"} + })", + }; + NThreading::TFuture<TAddResponse> fut1 = client.Add({123, 213}); + NThreading::TFuture<TAddResponse> fut2 = client.Add({213, 456}); + NThreading::TFuture<TAddResponse> fut3 = client.Add({789}); + + fut2.Subscribe([](const auto&) { + throw yexception() << "planed exc"; + }); + fut3.Subscribe([](const auto&) { + throw 5; + }); + + UNIT_ASSERT_NO_EXCEPTION(client.Worker()); + UNIT_ASSERT_VALUES_EQUAL(TClientStatus::Ok, client.GetStatus()); + + UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(19)); + UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(213)); + UNIT_ASSERT(client.GetCachedServiceTickets()->TicketsById.contains(123)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->TicketsById.contains(456)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(19)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(213)); + UNIT_ASSERT(!client.GetCachedServiceTickets()->ErrorsById.contains(123)); + UNIT_ASSERT(client.GetCachedServiceTickets()->ErrorsById.contains(456)); + + UNIT_ASSERT(fut1.HasValue()); + TAddResponse resp1{ + {123, {EDstStatus::Success, ""}}, + {213, {EDstStatus::Success, ""}}, + }; + UNIT_ASSERT_VALUES_EQUAL(resp1, fut1.GetValue()); + + UNIT_ASSERT(fut2.HasValue()); + TAddResponse resp2{ + {213, {EDstStatus::Success, ""}}, + {456, {EDstStatus::Fail, "error_3"}}, + }; + UNIT_ASSERT_VALUES_EQUAL(resp2, fut2.GetValue()); + + UNIT_ASSERT(fut3.HasValue()); + TAddResponse resp3{ + {789, {EDstStatus::Success, ""}}, + }; + UNIT_ASSERT_VALUES_EQUAL(resp3, fut3.GetValue()); + + UNIT_ASSERT(client.Tickets.empty()); + + TDsts dsts{19, 123, 213, 789}; + UNIT_ASSERT_VALUES_EQUAL(dsts, client.GetDsts()); + } + + UNIT_ASSERT_VALUES_EQUAL( + TStringBuilder() + << "6: File './tmp/service_tickets' was successfully read\n" + << "6: Got 1 service ticket(s) from disk\n" + << "6: Cache was updated with 1 service ticket(s): " << TInstant::Seconds(now.Seconds()) << "\n" + << "7: File './tmp/retry_settings' does not exist\n" + << "7: Adding dst: got task #1 with 2 dsts\n" + << "7: Adding dst: got task #2 with 2 dsts\n" + << "7: Adding dst: got task #3 with 1 dsts\n" + << "7: Response with service tickets for 4 destination(s) was successfully fetched from https://tvm-api.yandex.net\n" + << "7: Got responses with service tickets with 1 pages for 4 destination(s)\n" + << "3: Failed to get service ticket for dst=456: error_3\n" + << "6: Cache was partly updated with 3 service ticket(s). total: 4\n" + << "6: File './tmp/service_tickets' was successfully written\n" + << "7: Adding dst: task #1: dst=123 got ticket\n" + << "7: Adding dst: task #1: dst=213 got ticket\n" + << "7: Adding dst: task #1: set value\n" + << "7: Adding dst: task #2: dst=213 got ticket\n" + << "4: Adding dst: task #2: dst=456 failed to get ticket: error_3\n" + << "7: Adding dst: task #2: set value\n" + << "3: Adding dst: task #2: exception: planed exc\n" + << "7: Adding dst: task #3: dst=789 got ticket\n" + << "7: Adding dst: task #3: set value\n" + << "3: Adding dst: task #3: exception: unknown error\n", + l->Stream.Str()); + } +} + +template <> +void Out<NTvmAuth::NDynamicClient::TDstResponse>(IOutputStream& out, const NTvmAuth::NDynamicClient::TDstResponse& m) { + out << m.Status << " (" << m.Error << ")"; +} + +template <> +void Out<NTvmAuth::NTvmApi::TClientSettings::TDst>(IOutputStream& out, const NTvmAuth::NTvmApi::TClientSettings::TDst& m) { + out << m.Id; +} diff --git a/library/cpp/tvmauth/client/misc/api/dynamic_dst/ut/ya.make b/library/cpp/tvmauth/client/misc/api/dynamic_dst/ut/ya.make index 5d01ffaad8..12290a32bd 100644 --- a/library/cpp/tvmauth/client/misc/api/dynamic_dst/ut/ya.make +++ b/library/cpp/tvmauth/client/misc/api/dynamic_dst/ut/ya.make @@ -1,11 +1,11 @@ -UNITTEST_FOR(library/cpp/tvmauth/client/misc/api/dynamic_dst) - -OWNER(g:passport_infra) - -SRCS( - tvm_client_ut.cpp -) - +UNITTEST_FOR(library/cpp/tvmauth/client/misc/api/dynamic_dst) + +OWNER(g:passport_infra) + +SRCS( + tvm_client_ut.cpp +) + ENV(YA_TEST_SHORTEN_WINE_PATH=1) -END() +END() diff --git a/library/cpp/tvmauth/client/misc/api/dynamic_dst/ya.make b/library/cpp/tvmauth/client/misc/api/dynamic_dst/ya.make index f3858e602f..2caadae017 100644 --- a/library/cpp/tvmauth/client/misc/api/dynamic_dst/ya.make +++ b/library/cpp/tvmauth/client/misc/api/dynamic_dst/ya.make @@ -1,20 +1,20 @@ -LIBRARY() - -OWNER(g:passport_infra) - -PEERDIR( +LIBRARY() + +OWNER(g:passport_infra) + +PEERDIR( library/cpp/threading/future - library/cpp/tvmauth/client -) - -SRCS( - tvm_client.cpp -) - -GENERATE_ENUM_SERIALIZATION(tvm_client.h) - -END() - -RECURSE_FOR_TESTS( - ut -) + library/cpp/tvmauth/client +) + +SRCS( + tvm_client.cpp +) + +GENERATE_ENUM_SERIALIZATION(tvm_client.h) + +END() + +RECURSE_FOR_TESTS( + ut +) |