userver: /data/code/userver/libraries/sqs/src/sqs/json_client_fixture_test.cpp Source File
Loading...
Searching...
No Matches
json_client_fixture_test.cpp
1#include <sqs/json_client_fixture_test.hpp>
2
3#include <userver/utest/http_client.hpp>
4#include <userver/utils/zstring_view.hpp>
5
6#include <fmt/format.h>
7
8#include <aws/sqs/model/CreateQueueRequest.h>
9#include <aws/sqs/model/DeleteQueueRequest.h>
10#include <aws/sqs/model/ListQueuesRequest.h>
11
12#include <chrono>
13#include <cstdlib>
14
15USERVER_NAMESPACE_BEGIN
16
17namespace {
18
19namespace sqs_model = Aws::SQS::Model;
20
21constexpr utils::zstring_view kSqsJsonPortEnv = "SQS_JSON_PORT";
22constexpr utils::zstring_view kSqsUser = "my_user";
23constexpr utils::zstring_view kSqsSecret = "unused";
24constexpr utils::zstring_view kSqsRegion = "yandex";
25constexpr std::chrono::milliseconds kClientTimeout{30000};
26
27} // namespace
28
29void SqsJsonClient::SetUp() {
30 // NOLINTNEXTLINE(concurrency-mt-unsafe)
31 const auto* port = std::getenv(kSqsJsonPortEnv.c_str());
32 ASSERT_NE(port, nullptr)
33 << "SQS_JSON_PORT env missing; check that sqs_recipe is started with "
34 "--enable-sqs-json-api";
35
36 endpoint_ = fmt::format("http://localhost:{}/Root", port);
37 http_client_ = utest::CreateHttpClient();
38 DeleteAllQueues();
39}
40
41void SqsJsonClient::TearDown() {
42 if (!http_client_) {
43 return;
44 }
45 DeleteAllQueues();
46}
47
48std::unique_ptr<sqs::JsonClient> SqsJsonClient::MakeClient() const {
49 sqs::ClientSettings settings;
50 settings.endpoint = endpoint_;
51 settings.region = std::string{kSqsRegion};
52 settings.timeout = kClientTimeout;
53 settings.verify_ssl = false;
54
55 return std::make_unique<sqs::JsonClient>(
56 *http_client_,
57 sqs::Credentials{
58 .access_key_id = std::string{kSqsUser},
59 .secret_key = std::string{kSqsSecret},
60 },
61 settings
62 );
63}
64
65Aws::String SqsJsonClient::CreateQueue(sqs::JsonClient& client, std::string_view queue_name) {
66 sqs_model::CreateQueueRequest request;
67 request.SetQueueName(std::string{queue_name}.c_str());
68
69 const auto outcome = client.CreateQueue(request);
70 if (!outcome.IsSuccess()) {
71 ADD_FAILURE() << "Failed to create queue: " << GetErrorMessage(outcome.GetError());
72 return {};
73 }
74
75 return outcome.GetResult().GetQueueUrl();
76}
77
78void SqsJsonClient::DeleteAllQueues() {
79 auto client = MakeClient();
80 Aws::String next_token;
81
82 do {
83 sqs_model::ListQueuesRequest list_request;
84 if (!next_token.empty()) {
85 list_request.SetNextToken(next_token);
86 }
87
88 const auto list_outcome = client->ListQueues(list_request);
89 if (!list_outcome.IsSuccess()) {
90 ADD_FAILURE() << "Failed to list queues: " << GetErrorMessage(list_outcome.GetError());
91 return;
92 }
93
94 const auto& result = list_outcome.GetResult();
95 for (const auto& queue_url : result.GetQueueUrls()) {
96 sqs_model::DeleteQueueRequest delete_request;
97 delete_request.SetQueueUrl(queue_url);
98
99 const auto delete_outcome = RunWhenQueueIsReady([&] { return client->DeleteQueue(delete_request); });
100 if (!delete_outcome.IsSuccess()) {
101 ADD_FAILURE()
102 << "Failed to delete queue " << queue_url << ": " << GetErrorMessage(delete_outcome.GetError());
103 }
104 }
105
106 next_token = result.GetNextToken();
107 } while (!next_token.empty());
108}
109
110std::string GetErrorMessage(const Aws::Client::AWSError<Aws::SQS::SQSErrors>& error) {
111 return fmt::format("{}: {}", error.GetExceptionName(), error.GetMessage());
112}
113
114bool IsQueueNotReady(const Aws::Client::AWSError<Aws::SQS::SQSErrors>& error) {
115 return std::string_view{error.GetMessage()}.find("nonexistent queue") != std::string_view::npos;
116}
117
118USERVER_NAMESPACE_END