userver
C++ Async Framework
Toggle main menu visibility
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
15
USERVER_NAMESPACE_BEGIN
16
17
namespace
{
18
19
namespace
sqs_model = Aws::SQS::Model;
20
21
constexpr
utils::
zstring_view
kSqsJsonPortEnv =
"SQS_JSON_PORT"
;
22
constexpr
utils::
zstring_view
kSqsUser =
"my_user"
;
23
constexpr
utils::
zstring_view
kSqsSecret =
"unused"
;
24
constexpr
utils::
zstring_view
kSqsRegion =
"yandex"
;
25
constexpr
std::chrono::milliseconds kClientTimeout{30000};
26
27
}
// namespace
28
29
void
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
41
void
SqsJsonClient::TearDown() {
42
if
(!http_client_) {
43
return
;
44
}
45
DeleteAllQueues();
46
}
47
48
std::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
65
Aws::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
78
void
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
110
std::string GetErrorMessage(
const
Aws::Client::AWSError<Aws::SQS::SQSErrors>& error) {
111
return
fmt::format(
"{}: {}"
, error.GetExceptionName(), error.GetMessage());
112
}
113
114
bool
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
118
USERVER_NAMESPACE_END
sqs
src
sqs
json_client_fixture_test.cpp
Generated on
for userver by
Doxygen
1.17.0