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 UnkownJsonFieldAcceptedTestParam {
18 std::string input = {};
19 UnknownFieldMessageData expected_message = {};
20};
21
22struct UnkownJsonFieldRejectedTestParam {
23 std::string input = {};
24 std::string expected_path = {};
25};
26
27void PrintTo(const UnkownJsonFieldAcceptedTestParam& param, std::ostream* os) {
28 *os << fmt::format("{{ input = '{}' }}", param.input);
29}
30
31void PrintTo(const UnkownJsonFieldRejectedTestParam& param, std::ostream* os) {
32 *os << fmt::format("{{ input = '{}' }}", param.input);
33}
34
35class UnkownJsonFieldAcceptedTest : public ::testing::TestWithParam<UnkownJsonFieldAcceptedTestParam> {};
36class UnkownJsonFieldRejectedTest : public ::testing::TestWithParam<UnkownJsonFieldRejectedTestParam> {};
37
38INSTANTIATE_TEST_SUITE_P(
39 ,
40 UnkownJsonFieldAcceptedTest,
41 ::testing::Values(
42 UnkownJsonFieldAcceptedTestParam{
43 R"({
44 "field1":{"field1":"aaa"},
45 "field2":[{"field1":"item1"}],
46 "field3":{"1":{"field1":"value1"}}
47 })",
48 UnknownFieldMessageData{{"aaa"}, {{"item1"}}, {{1, {"value1"}}}}
49 },
50 UnkownJsonFieldAcceptedTestParam{
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 UnkownJsonFieldAcceptedTestParam{
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 UnkownJsonFieldAcceptedTestParam{
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 UnkownJsonFieldAcceptedTestParam{
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 UnkownJsonFieldRejectedTest,
89 ::testing::Values(
90 UnkownJsonFieldRejectedTestParam{
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 UnkownJsonFieldRejectedTestParam{
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 UnkownJsonFieldRejectedTestParam{
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 UnkownJsonFieldRejectedTestParam{
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(UnkownJsonFieldAcceptedTest, Test) {
127 using Message = proto_json::messages::UnknownFieldMessage;
128 const auto& param = GetParam();
129
130 Message message, expected_message, sample_message;
131 formats::json::Value input = PrepareJsonTestData(param.input);
132 expected_message = PrepareTestData(param.expected_message);
133
134 UASSERT_NO_THROW((message = JsonToMessage<Message>(input, {.ignore_unknown_fields = true})));
135 UASSERT_NO_THROW(InitSampleMessage(param.input, {.ignore_unknown_fields = true}, sample_message));
136
137 CheckMessageEqual(message, sample_message);
138 CheckMessageEqual(message, expected_message);
139}
140
141TEST_P(UnkownJsonFieldRejectedTest, Test) {
142 using Message = proto_json::messages::UnknownFieldMessage;
143 const auto& param = GetParam();
144
145 Message sample;
146 formats::json::Value input = PrepareJsonTestData(param.input);
147
148 EXPECT_READ_ERROR(
149 (void)JsonToMessage<proto_json::messages::UnknownFieldMessage>(input, {.ignore_unknown_fields = false}),
150 ReadErrorCode::kUnknownField,
151 param.expected_path
152 );
153 UEXPECT_THROW(InitSampleMessage(param.input, {.ignore_unknown_fields = false}, sample), SampleError);
154}
155
156} // namespace protobuf::json::tests
157
158USERVER_NAMESPACE_END