userver: /data/code/userver/libraries/protobuf/tests/json/bytes_from_json_test.cpp Source File
Loading...
Searching...
No Matches
bytes_from_json_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#include <userver/utils/encoding/hex.hpp>
11
12#include "utils.hpp"
13
14USERVER_NAMESPACE_BEGIN
15
16namespace protobuf::json::tests {
17
18struct BytesFromJsonSuccessTestParam {
19 std::string input = {};
20 BytesMessageData expected_message = {};
21 ReadOptions options = {};
22};
23
24struct BytesFromJsonFailureTestParam {
25 std::string input = {};
26 ReadErrorCode expected_errc = {};
27 std::string expected_path = {};
28 ReadOptions options = {};
29};
30
31void PrintTo(const BytesFromJsonSuccessTestParam& param, std::ostream* os) {
32 *os << fmt::format("{{ input = '{}' }}", param.input);
33}
34
35void PrintTo(const BytesFromJsonFailureTestParam& param, std::ostream* os) {
36 *os << fmt::format("{{ input = '{}' }}", param.input);
37}
38
39class BytesFromJsonSuccessTest : public ::testing::TestWithParam<BytesFromJsonSuccessTestParam> {};
40class BytesFromJsonFailureTest : public ::testing::TestWithParam<BytesFromJsonFailureTestParam> {};
41
42INSTANTIATE_TEST_SUITE_P(
43 ,
44 BytesFromJsonSuccessTest,
45 ::testing::Values(
46 BytesFromJsonSuccessTestParam{R"({})", BytesMessageData{""}},
47 BytesFromJsonSuccessTestParam{R"({"field1":null})", BytesMessageData{""}},
48 BytesFromJsonSuccessTestParam{R"({"field1":""})", BytesMessageData{""}},
49 BytesFromJsonSuccessTestParam{R"({"field1":"+/s="})", BytesMessageData{std::string("\xfb\xfb", 2)}},
50 BytesFromJsonSuccessTestParam{R"({"field1":"-_s="})", BytesMessageData{std::string("\xfb\xfb", 2)}},
51 BytesFromJsonSuccessTestParam{R"({"field1":"+/s"})", BytesMessageData{std::string("\xfb\xfb", 2)}},
52 BytesFromJsonSuccessTestParam{R"({"field1":"-_s"})", BytesMessageData{std::string("\xfb\xfb", 2)}}
53 )
54);
55
56INSTANTIATE_TEST_SUITE_P(
57 ,
58 BytesFromJsonFailureTest,
59 ::testing::Values(
60 BytesFromJsonFailureTestParam{R"({"field1":[]})", ReadErrorCode::kInvalidType, "field1"},
61 BytesFromJsonFailureTestParam{R"({"field1":{}})", ReadErrorCode::kInvalidType, "field1"},
62 BytesFromJsonFailureTestParam{R"({"field1":1})", ReadErrorCode::kInvalidType, "field1"},
63 BytesFromJsonFailureTestParam{R"({"field1":true})", ReadErrorCode::kInvalidType, "field1"},
64 BytesFromJsonFailureTestParam{R"({"field1":"TW=E"})", ReadErrorCode::kInvalidValue, "field1"},
65 BytesFromJsonFailureTestParam{R"({"field1":"TQ==="})", ReadErrorCode::kInvalidValue, "field1"},
66 BytesFromJsonFailureTestParam{R"({"field1":"TWE#"})", ReadErrorCode::kInvalidValue, "field1"}
67 )
68);
69
70TEST_P(BytesFromJsonSuccessTest, Test) {
71 const auto& param = GetParam();
72
73 proto_json::messages::BytesMessage message, expected_message, sample_message;
74 formats::json::Value input = PrepareJsonTestData(param.input);
75 expected_message = PrepareTestData(param.expected_message);
76
77 message.set_field1("dump");
78
79 UASSERT_NO_THROW((message = JsonToMessage<proto_json::messages::BytesMessage>(input, param.options)));
80 UASSERT_NO_THROW(InitSampleMessage(param.input, param.options, sample_message));
81
82 CheckMessageEqual(message, sample_message);
83 CheckMessageEqual(message, expected_message);
84}
85
86TEST_P(BytesFromJsonFailureTest, Test) {
87 const auto& param = GetParam();
88
89 proto_json::messages::BytesMessage sample_message;
90 formats::json::Value input = PrepareJsonTestData(param.input);
91
92 EXPECT_READ_ERROR(
93 (void)JsonToMessage<proto_json::messages::BytesMessage>(input, param.options),
94 param.expected_errc,
95 param.expected_path
96 );
97 UEXPECT_THROW(InitSampleMessage(param.input, param.options, sample_message), SampleError);
98}
99
100} // namespace protobuf::json::tests
101
102USERVER_NAMESPACE_END