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},
77 PrintErrorCode::kInvalidValue,
78 "field1"
79 },
80 DurationToJsonFailureTestParam{
81 DurationMessageData{kMinDurationSeconds - 1, 0},
82 PrintErrorCode::kInvalidValue,
83 "field1"
84 },
85 DurationToJsonFailureTestParam{
86 DurationMessageData{0, kMaxDurationNanos + 1},
87 PrintErrorCode::kInvalidValue,
88 "field1"
89 },
90 DurationToJsonFailureTestParam{
91 DurationMessageData{0, kMinDurationNanos - 1},
92 PrintErrorCode::kInvalidValue,
93 "field1"
94 },
95 DurationToJsonFailureTestParam{DurationMessageData{1, -1}, PrintErrorCode::kInvalidValue, "field1"}
96 )
97);
98
99TEST_P(DurationToJsonSuccessTest, Test) {
100 const auto& param = GetParam();
101
102 auto input = PrepareTestData(param.input);
103 formats::json::Value json;
104 formats::json::Value expected_json;
105 formats::json::Value sample_json;
106
107 UASSERT_NO_THROW((json = MessageToJson(input, param.options)));
108 UASSERT_NO_THROW((expected_json = PrepareJsonTestData(param.expected_json)));
109 UASSERT_NO_THROW((sample_json = CreateSampleJson(input, param.options)));
110
111 EXPECT_EQ(json, expected_json);
112 EXPECT_EQ(expected_json, sample_json);
113}
114
115TEST_P(DurationToJsonFailureTest, Test) {
116 const auto& param = GetParam();
117 auto input = PrepareTestData(param.input);
118
119 EXPECT_PRINT_ERROR((void)MessageToJson(input, param.options), param.expected_errc, param.expected_path);
120 UEXPECT_THROW((void)CreateSampleJson(input, param.options), SampleError);
121}
122
123TEST(DurationToJsonAdditionalTest, InlinedNonNull) {
124 DurationMessageData data{123, 321};
125 auto message = PrepareTestData(data);
126 formats::json::Value json;
127 formats::json::Value sample;
128
129 UASSERT_NO_THROW((json = MessageToJson(message.field1(), {})));
130 UASSERT_NO_THROW((sample = CreateSampleJson(message.field1())));
131 ASSERT_TRUE(json.IsString());
132 EXPECT_EQ(json, sample);
133 EXPECT_EQ(json.As<std::string>(), "123.000000321s");
134}
135
136TEST(DurationToJsonAdditionalTest, InlinedNull) {
137 proto_json::messages::DurationMessage message;
138 formats::json::Value json;
139 formats::json::Value sample;
140
141 UASSERT_NO_THROW((json = MessageToJson(message.field1(), {})));
142 UASSERT_NO_THROW((sample = CreateSampleJson(message.field1())));
143 ASSERT_TRUE(json.IsString());
144 EXPECT_EQ(json, sample);
145 EXPECT_EQ(json.As<std::string>(), "0s");
146}
147
148TEST(DurationToJsonAdditionalTest, DynamicMessage) {
149 using Message = ::google::protobuf::Duration;
150 ::google::protobuf::DynamicMessageFactory factory;
151
152 {
153 std::unique_ptr<::google::protobuf::Message> message(factory.GetPrototype(Message::descriptor())->New());
154 const auto reflection = message->GetReflection();
155 const auto seconds_desc = message->GetDescriptor()->FindFieldByName("seconds");
156 const auto nanos_desc = message->GetDescriptor()->FindFieldByName("nanos");
157
158 reflection->SetInt64(message.get(), seconds_desc, -123);
159 reflection->SetInt32(message.get(), nanos_desc, -987);
160
161 formats::json::Value json;
162
163 UASSERT_NO_THROW((json = MessageToJson(*message, {})));
164 ASSERT_TRUE(json.IsString());
165 EXPECT_EQ(json.As<std::string>(), "-123.000000987s");
166 }
167}
168
169} // namespace protobuf::json::tests
170
171USERVER_NAMESPACE_END