userver: /data/code/userver/libraries/protobuf/tests/json/unknown_field_test.cpp Source File
Loading...
Searching...
No Matches
unknown_field_test.cpp
1#include <gtest/gtest.h>
2
3#include <ostream>
4#include <string>
5
6#include <fmt/format.h>
7
8#include <userver/protobuf/json/convert.hpp>
9#include <userver/utest/assert_macros.hpp>
10
11#include "utils.hpp"
12
13USERVER_NAMESPACE_BEGIN
14
15namespace protobuf::json::tests {
16
17struct UnknownJsonFieldAcceptedTestParam {
18 std::string input = {};
19 UnknownFieldMessageData expected_message = {};
20};
21
22struct UnknownJsonFieldRejectedTestParam {
23 std::string input = {};
24 std::string expected_path = {};
25};
26
27void PrintTo(const UnknownJsonFieldAcceptedTestParam& param, std::ostream* os) {
28 *os << fmt::format("{{ input = '{}' }}", param.input);
29}
30
31void PrintTo(const UnknownJsonFieldRejectedTestParam& param, std::ostream* os) {
32 *os << fmt::format("{{ input = '{}' }}", param.input);
33}
34
35class UnknownJsonFieldAcceptedTest : public ::testing::TestWithParam<UnknownJsonFieldAcceptedTestParam> {};
36class UnknownJsonFieldRejectedTest : public ::testing::TestWithParam<UnknownJsonFieldRejectedTestParam> {};
37
38INSTANTIATE_TEST_SUITE_P(
39 ,
40 UnknownJsonFieldAcceptedTest,
41 ::testing::Values(
42 UnknownJsonFieldAcceptedTestParam{
43 R"({
44 "field1":{"field1":"aaa"},
45 "field2":[{"field1":"item1"}],
46 "field3":{"1":{"field1":"value1"}}
47 })",
48 UnknownFieldMessageData{{"aaa"}, {{"item1"}}, {{1, {"value1"}}}}
49 },
50 UnknownJsonFieldAcceptedTestParam{
51 R"({
52 "unknown_field": true,
53 "field1":{"field1":"aaa"},
54 "field2":[{"field1":"item1"}],
55 "field3":{"1":{"field1":"value1"}}
56 })",
57 UnknownFieldMessageData{{"aaa"}, {{"item1"}}, {{1, {"value1"}}}}
58 },
59 UnknownJsonFieldAcceptedTestParam{
60 R"({
61 "field1":{"field1":"aaa","unknown_field":true},
62 "field2":[{"field1":"item1"}],
63 "field3":{"1":{"field1":"value1"}}
64 })",
65 UnknownFieldMessageData{{"aaa"}, {{"item1"}}, {{1, {"value1"}}}}
66 },
67 UnknownJsonFieldAcceptedTestParam{
68 R"({
69 "field1":{"field1":"aaa"},
70 "field2":[{"field1":"item1","unknown_field":true}],
71 "field3":{"1":{"field1":"value1"}}
72 })",
73 UnknownFieldMessageData{{"aaa"}, {{"item1"}}, {{1, {"value1"}}}}
74 },
75 UnknownJsonFieldAcceptedTestParam{
76 R"({
77 "field1":{"field1":"aaa"},
78 "field2":[{"field1":"item1"}],
79 "field3":{"1":{"field1":"value1","unknown_field":true}}
80 })",
81 UnknownFieldMessageData{{"aaa"}, {{"item1"}}, {{1, {"value1"}}}}
82 }
83 )
84);
85
86INSTANTIATE_TEST_SUITE_P(
87 ,
88 UnknownJsonFieldRejectedTest,
89 ::testing::Values(
90 UnknownJsonFieldRejectedTestParam{
91 R"({
92 "unknown.field": true,
93 "field1":{"field1":"aaa"},
94 "field2":[{"field1":"item1"}],
95 "field3":{"1":{"field1":"value1"}}
96 })",
97 "'unknown.field'"
98 },
99 UnknownJsonFieldRejectedTestParam{
100 R"({
101 "field1":{"field1":"aaa","unknown.field":true},
102 "field2":[{"field1":"item1"}],
103 "field3":{"1":{"field1":"value1"}}
104 })",
105 "field1.'unknown.field'"
106 },
107 UnknownJsonFieldRejectedTestParam{
108 R"({
109 "field1":{"field1":"aaa"},
110 "field2":[{"field1":"item1","unknown.field":true}],
111 "field3":{"1":{"field1":"value1"}}
112 })",
113 "field2[0].'unknown.field'",
114 },
115 UnknownJsonFieldRejectedTestParam{
116 R"({
117 "field1":{"field1":"aaa"},
118 "field2":[{"field1":"item1"}],
119 "field3":{"1":{"field1":"value1","unknown.field":true}}
120 })",
121 "field3.1.'unknown.field'"
122 }
123 )
124);
125
126TEST_P(UnknownJsonFieldAcceptedTest, Test) {
127 using Message = proto_json::messages::UnknownFieldMessage;
128 const auto& param = GetParam();
129
130 Message message;
131 Message expected_message;
132 Message sample_message;
133 formats::json::Value input = PrepareJsonTestData(param.input);
134 expected_message = PrepareTestData(param.expected_message);
135
136 UASSERT_NO_THROW((message = JsonToMessage<Message>(input, {.ignore_unknown_fields = true})));
137 UASSERT_NO_THROW(InitSampleMessage(param.input, sample_message, {.ignore_unknown_fields = true}));
138
139 CheckMessageEqual(message, sample_message);
140 CheckMessageEqual(message, expected_message);
141}
142
143TEST_P(UnknownJsonFieldRejectedTest, Test) {
144 using Message = proto_json::messages::UnknownFieldMessage;
145 const auto& param = GetParam();
146
147 Message sample;
148 formats::json::Value input = PrepareJsonTestData(param.input);
149
151 (void)JsonToMessage<proto_json::messages::UnknownFieldMessage>(input, {.ignore_unknown_fields = false}),
152 ParseErrorCode::kUnknownField,
153 param.expected_path
154 );
155 UEXPECT_THROW(InitSampleMessage(param.input, sample, {.ignore_unknown_fields = false}), SampleError);
156}
157
158} // namespace protobuf::json::tests
159
160USERVER_NAMESPACE_END