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