userver: /data/code/userver/libraries/protobuf/tests/json/duration_to_json_test.cpp Source File
Loading...
Searching...
No Matches
duration_to_json_test.cpp
1#include <gtest/gtest.h>
2
3#include <memory>
4#include <ostream>
5#include <string>
6
7#include <fmt/format.h>
8#include <google/protobuf/dynamic_message.h>
9
10#include <userver/protobuf/datetime.hpp>
11#include <userver/protobuf/json/convert.hpp>
12#include <userver/utest/assert_macros.hpp>
13
14#include "utils.hpp"
15
16USERVER_NAMESPACE_BEGIN
17
18namespace protobuf::json::tests {
19
20struct DurationToJsonSuccessTestParam {
21 DurationMessageData input = {};
22 std::string expected_json = {};
23 PrintOptions options = {};
24};
25
26struct DurationToJsonFailureTestParam {
27 DurationMessageData input = {};
28 PrintErrorCode expected_errc = {};
29 std::string expected_path = {};
30 PrintOptions options = {};
31};
32
33void PrintTo(const DurationToJsonSuccessTestParam& param, std::ostream* os) {
34 *os << fmt::format("{{ input = {{.seconds={}, .nanos={}}} }}", param.input.seconds, param.input.nanos);
35}
36
37void PrintTo(const DurationToJsonFailureTestParam& param, std::ostream* os) {
38 *os << fmt::format("{{ input = {{.seconds={}, .nanos={}}} }}", param.input.seconds, param.input.nanos);
39}
40
41class DurationToJsonSuccessTest : public ::testing::TestWithParam<DurationToJsonSuccessTestParam> {};
42class DurationToJsonFailureTest : public ::testing::TestWithParam<DurationToJsonFailureTestParam> {};
43
44INSTANTIATE_TEST_SUITE_P(
45 ,
46 DurationToJsonSuccessTest,
47 ::testing::Values(
48 DurationToJsonSuccessTestParam{DurationMessageData{0, 0, true}, R"({})"},
49 DurationToJsonSuccessTestParam{DurationMessageData{0, 0}, R"({"field1": "0s"})"},
50 DurationToJsonSuccessTestParam{DurationMessageData{123, 0}, R"({"field1": "123s"})"},
51 DurationToJsonSuccessTestParam{DurationMessageData{-123, 0}, R"({"field1": "-123s"})"},
52 DurationToJsonSuccessTestParam{DurationMessageData{0, 567}, R"({"field1": "0.000000567s"})"},
53 DurationToJsonSuccessTestParam{DurationMessageData{0, -567}, R"({"field1": "-0.000000567s"})"},
54 DurationToJsonSuccessTestParam{DurationMessageData{123, 987654321}, R"({"field1": "123.987654321s"})"},
55 DurationToJsonSuccessTestParam{DurationMessageData{-123, -987654320}, R"({"field1": "-123.987654320s"})"},
56 DurationToJsonSuccessTestParam{DurationMessageData{123, 987654000}, R"({"field1": "123.987654s"})"},
57 DurationToJsonSuccessTestParam{DurationMessageData{-123, -987600000}, R"({"field1": "-123.987600s"})"},
58 DurationToJsonSuccessTestParam{DurationMessageData{123, 987000000}, R"({"field1": "123.987s"})"},
59 DurationToJsonSuccessTestParam{DurationMessageData{-123, -980000000}, R"({"field1": "-123.980s"})"},
60 DurationToJsonSuccessTestParam{
61 DurationMessageData{kMaxDurationSeconds, kMaxDurationNanos},
62 R"({"field1": "315576000000.999999999s"})"
63 },
64 DurationToJsonSuccessTestParam{
65 DurationMessageData{kMinDurationSeconds, kMinDurationNanos},
66 R"({"field1": "-315576000000.999999999s"})"
67 }
68 )
69);
70
71INSTANTIATE_TEST_SUITE_P(
72 ,
73 DurationToJsonFailureTest,
74 ::testing::Values(
75 DurationToJsonFailureTestParam{
76 DurationMessageData{kMaxDurationSeconds + 1, 0},
78 "field1"
79 },
80 DurationToJsonFailureTestParam{
81 DurationMessageData{kMinDurationSeconds - 1, 0},
83 "field1"
84 },
85 DurationToJsonFailureTestParam{
86 DurationMessageData{0, kMaxDurationNanos + 1},
88 "field1"
89 },
90 DurationToJsonFailureTestParam{
91 DurationMessageData{0, kMinDurationNanos - 1},
93 "field1"
94 },
95 DurationToJsonFailureTestParam{
98 "field1",
99 }
100 )
101);
102
103TEST_P(DurationToJsonSuccessTest, Test) {
104 const auto& param = GetParam();
105
106 auto input = PrepareTestData(param.input);
107 formats::json::Value json;
108 formats::json::Value expected_json;
109 formats::json::Value sample_json;
110
111 UASSERT_NO_THROW((json = MessageToJson(input, param.options)));
112 UASSERT_NO_THROW((expected_json = PrepareJsonTestData(param.expected_json)));
113 UASSERT_NO_THROW((sample_json = CreateSampleJson(input, param.options)));
114
115 EXPECT_EQ(json, expected_json);
116 EXPECT_EQ(expected_json, sample_json);
117}
118
119TEST_P(DurationToJsonFailureTest, Test) {
120 const auto& param = GetParam();
121 auto input = PrepareTestData(param.input);
122
123 EXPECT_PRINT_ERROR((void)MessageToJson(input, param.options), param.expected_errc, param.expected_path);
124 UEXPECT_THROW((void)CreateSampleJson(input, param.options), SampleError);
125}
126
127TEST(DurationToJsonAdditionalTest, InlinedNonNull) {
128 DurationMessageData data{123, 321};
129 auto message = PrepareTestData(data);
130 formats::json::Value json;
131 formats::json::Value sample;
132
133 UASSERT_NO_THROW((json = MessageToJson(message.field1(), {})));
134 UASSERT_NO_THROW((sample = CreateSampleJson(message.field1())));
135 ASSERT_TRUE(json.IsString());
136 EXPECT_EQ(json, sample);
137 EXPECT_EQ(json.As<std::string>(), "123.000000321s");
138}
139
140TEST(DurationToJsonAdditionalTest, InlinedNull) {
141 proto_json::messages::DurationMessage message;
142 formats::json::Value json;
143 formats::json::Value sample;
144
145 UASSERT_NO_THROW((json = MessageToJson(message.field1(), {})));
146 UASSERT_NO_THROW((sample = CreateSampleJson(message.field1())));
147 ASSERT_TRUE(json.IsString());
148 EXPECT_EQ(json, sample);
149 EXPECT_EQ(json.As<std::string>(), "0s");
150}
151
152TEST(DurationToJsonAdditionalTest, DynamicMessage) {
153 using Message = ::google::protobuf::Duration;
154 ::google::protobuf::DynamicMessageFactory factory;
155
156 {
157 std::unique_ptr<::google::protobuf::Message> message(factory.GetPrototype(Message::descriptor())->New());
158 const auto reflection = message->GetReflection();
159 const auto seconds_desc = message->GetDescriptor()->FindFieldByName("seconds");
160 const auto nanos_desc = message->GetDescriptor()->FindFieldByName("nanos");
161
162 reflection->SetInt64(message.get(), seconds_desc, -123);
163 reflection->SetInt32(message.get(), nanos_desc, -987);
164
165 formats::json::Value json;
166
167 UASSERT_NO_THROW((json = MessageToJson(*message, {})));
168 ASSERT_TRUE(json.IsString());
169 EXPECT_EQ(json.As<std::string>(), "-123.000000987s");
170 }
171}
172
173} // namespace protobuf::json::tests
174
175USERVER_NAMESPACE_END