userver: /data/code/userver/libraries/proto-structs/tests/binary_to_struct_test.cpp Source File
Loading...
Searching...
No Matches
binary_to_struct_test.cpp
1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
3
4#include <userver/proto-structs/convert.hpp>
5#include <userver/utest/assert_macros.hpp>
6
7#include "messages.pb.h"
8#include "structs.hpp"
9
10USERVER_NAMESPACE_BEGIN
11
12namespace proto_structs::tests {
13
14TEST(BinaryToStruct, Scalar) {
15 {
16 messages::Scalar msg;
17 msg.set_f1(true);
18 msg.set_f2(std::numeric_limits<int32_t>::min());
19 msg.set_f3(std::numeric_limits<uint32_t>::max());
20 msg.set_f4(std::numeric_limits<int64_t>::min());
21 msg.set_f5(std::numeric_limits<uint64_t>::max());
22 msg.set_f6(static_cast<float>(1.5));
23 msg.set_f7(-2.5);
24 msg.set_f8("test1");
25 msg.set_f9("test2");
26 msg.set_f10(messages::TestEnum::TEST_ENUM_VALUE1);
27 msg.set_f11(987);
28
29 protobuf::ProtoStringType serialized_from_msg_tstring;
30 ASSERT_TRUE(msg.SerializeToString(&serialized_from_msg_tstring));
31 std::string_view serialized_from_msg = serialized_from_msg_tstring;
32
33 {
34 structs::Scalar obj;
35 UASSERT_NO_THROW(BinaryToStruct(serialized_from_msg, obj));
36 CheckScalarEqual(obj, msg);
37 }
38
39 {
40 auto obj = BinaryToStruct<structs::Scalar>(serialized_from_msg);
41 CheckScalarEqual(obj, msg);
42 }
43 }
44}
45
46TEST(BinaryToStruct, ThrowsOnInvalidBinary) {
47 structs::Scalar obj;
48
49 // Неверная длина строк
50 std::string binary_data;
51 // Поле f8 (string, field number 8) → tag = 0x42 (8 << 3 | 2)
52 binary_data += '\x42';
53 // Указываем длину 100, но даём только 5 байт
54 binary_data += '\x64'; // 100 в varint
55 binary_data += "hello"; // только 5 байт
56
57 UEXPECT_THROW(BinaryToStruct<structs::Scalar>(binary_data, obj), ReadError);
58 UEXPECT_THROW((void)BinaryToStruct<structs::Scalar>(binary_data), ReadError);
59}
60} // namespace proto_structs::tests
61
62USERVER_NAMESPACE_END