1*61c4878aSAndroid Build Coastguard Worker // Copyright 2022 The Pigweed Authors
2*61c4878aSAndroid Build Coastguard Worker //
3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not
4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of
5*61c4878aSAndroid Build Coastguard Worker // the License at
6*61c4878aSAndroid Build Coastguard Worker //
7*61c4878aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*61c4878aSAndroid Build Coastguard Worker //
9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under
13*61c4878aSAndroid Build Coastguard Worker // the License.
14*61c4878aSAndroid Build Coastguard Worker #include <array>
15*61c4878aSAndroid Build Coastguard Worker #include <string_view>
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Worker #include "pw_bytes/span.h"
18*61c4878aSAndroid Build Coastguard Worker #include "pw_containers/vector.h"
19*61c4878aSAndroid Build Coastguard Worker #include "pw_protobuf/find.h"
20*61c4878aSAndroid Build Coastguard Worker #include "pw_span/span.h"
21*61c4878aSAndroid Build Coastguard Worker #include "pw_status/status.h"
22*61c4878aSAndroid Build Coastguard Worker #include "pw_status/status_with_size.h"
23*61c4878aSAndroid Build Coastguard Worker #include "pw_stream/memory_stream.h"
24*61c4878aSAndroid Build Coastguard Worker #include "pw_unit_test/framework.h"
25*61c4878aSAndroid Build Coastguard Worker
26*61c4878aSAndroid Build Coastguard Worker // These header files contain the code generated by the pw_protobuf plugin.
27*61c4878aSAndroid Build Coastguard Worker // They are re-generated every time the tests are built and are used by the
28*61c4878aSAndroid Build Coastguard Worker // tests to ensure that the interface remains consistent.
29*61c4878aSAndroid Build Coastguard Worker //
30*61c4878aSAndroid Build Coastguard Worker // The purpose of the tests in this file is primarily to verify that the
31*61c4878aSAndroid Build Coastguard Worker // generated C++ interface is valid rather than the correctness of the
32*61c4878aSAndroid Build Coastguard Worker // low-level encoder.
33*61c4878aSAndroid Build Coastguard Worker #include "pw_protobuf_test_protos/full_test.pwpb.h"
34*61c4878aSAndroid Build Coastguard Worker #include "pw_protobuf_test_protos/importer.pwpb.h"
35*61c4878aSAndroid Build Coastguard Worker #include "pw_protobuf_test_protos/non_pw_package.pwpb.h"
36*61c4878aSAndroid Build Coastguard Worker #include "pw_protobuf_test_protos/proto2.pwpb.h"
37*61c4878aSAndroid Build Coastguard Worker #include "pw_protobuf_test_protos/repeated.pwpb.h"
38*61c4878aSAndroid Build Coastguard Worker
39*61c4878aSAndroid Build Coastguard Worker namespace pw::protobuf {
40*61c4878aSAndroid Build Coastguard Worker namespace {
41*61c4878aSAndroid Build Coastguard Worker
42*61c4878aSAndroid Build Coastguard Worker using test::pwpb::Bool;
43*61c4878aSAndroid Build Coastguard Worker using test::pwpb::Enum;
44*61c4878aSAndroid Build Coastguard Worker
45*61c4878aSAndroid Build Coastguard Worker namespace DeviceInfo = test::pwpb::DeviceInfo;
46*61c4878aSAndroid Build Coastguard Worker namespace KeyValuePair = test::pwpb::KeyValuePair;
47*61c4878aSAndroid Build Coastguard Worker namespace Pigweed = test::pwpb::Pigweed;
48*61c4878aSAndroid Build Coastguard Worker namespace Proto = test::pwpb::Proto;
49*61c4878aSAndroid Build Coastguard Worker namespace RepeatedTest = test::pwpb::RepeatedTest;
50*61c4878aSAndroid Build Coastguard Worker namespace TestResult = test::pwpb::TestResult;
51*61c4878aSAndroid Build Coastguard Worker
52*61c4878aSAndroid Build Coastguard Worker namespace imported {
53*61c4878aSAndroid Build Coastguard Worker using ::pw::protobuf::test::imported::pwpb::IsValidStatus;
54*61c4878aSAndroid Build Coastguard Worker using ::pw::protobuf::test::imported::pwpb::Status;
55*61c4878aSAndroid Build Coastguard Worker } // namespace imported
56*61c4878aSAndroid Build Coastguard Worker
TEST(Codegen,StreamDecoder)57*61c4878aSAndroid Build Coastguard Worker TEST(Codegen, StreamDecoder) {
58*61c4878aSAndroid Build Coastguard Worker // clang-format off
59*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t proto_data[] = {
60*61c4878aSAndroid Build Coastguard Worker // pigweed.magic_number
61*61c4878aSAndroid Build Coastguard Worker 0x08, 0x49,
62*61c4878aSAndroid Build Coastguard Worker // pigweed.ziggy
63*61c4878aSAndroid Build Coastguard Worker 0x10, 0xdd, 0x01,
64*61c4878aSAndroid Build Coastguard Worker // pigweed.error_message
65*61c4878aSAndroid Build Coastguard Worker 0x2a, 0x10, 'n', 'o', 't', ' ', 'a', ' ',
66*61c4878aSAndroid Build Coastguard Worker 't', 'y', 'p', 'e', 'w', 'r', 'i', 't', 'e', 'r',
67*61c4878aSAndroid Build Coastguard Worker // pigweed.bin
68*61c4878aSAndroid Build Coastguard Worker 0x40, 0x01,
69*61c4878aSAndroid Build Coastguard Worker // pigweed.pigweed
70*61c4878aSAndroid Build Coastguard Worker 0x3a, 0x02,
71*61c4878aSAndroid Build Coastguard Worker // pigweed.pigweed.status
72*61c4878aSAndroid Build Coastguard Worker 0x08, 0x02,
73*61c4878aSAndroid Build Coastguard Worker // pigweed.proto
74*61c4878aSAndroid Build Coastguard Worker 0x4a, 0x56,
75*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.bin
76*61c4878aSAndroid Build Coastguard Worker 0x10, 0x00,
77*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.pigweed_pigweed_bin
78*61c4878aSAndroid Build Coastguard Worker 0x18, 0x00,
79*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.pigweed_protobuf_bin
80*61c4878aSAndroid Build Coastguard Worker 0x20, 0x01,
81*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.meta
82*61c4878aSAndroid Build Coastguard Worker 0x2a, 0x0f,
83*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.meta.file_name
84*61c4878aSAndroid Build Coastguard Worker 0x0a, 0x0b, '/', 'e', 't', 'c', '/', 'p', 'a', 's', 's', 'w', 'd',
85*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.meta.status
86*61c4878aSAndroid Build Coastguard Worker 0x10, 0x02,
87*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed
88*61c4878aSAndroid Build Coastguard Worker 0x0a, 0x3d,
89*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.error_message
90*61c4878aSAndroid Build Coastguard Worker 0x2a, 0x10, 'h', 'e', 'r', 'e', ' ', 'w', 'e', ' ',
91*61c4878aSAndroid Build Coastguard Worker 'g', 'o', ' ', 'a', 'g', 'a', 'i', 'n',
92*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.magic_number
93*61c4878aSAndroid Build Coastguard Worker 0x08, 0xe8, 0x04,
94*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.device_info
95*61c4878aSAndroid Build Coastguard Worker 0x32, 0x26,
96*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.device_info.attributes[0]
97*61c4878aSAndroid Build Coastguard Worker 0x22, 0x10,
98*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.device_info.attributes[0].key
99*61c4878aSAndroid Build Coastguard Worker 0x0a, 0x07, 'v', 'e', 'r', 's', 'i', 'o', 'n',
100*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.device_info.attributes[0].value
101*61c4878aSAndroid Build Coastguard Worker 0x12, 0x05, '5', '.', '3', '.', '1',
102*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.device_info.attributes[1]
103*61c4878aSAndroid Build Coastguard Worker 0x22, 0x10,
104*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.device_info.attributes[1].key
105*61c4878aSAndroid Build Coastguard Worker 0x0a, 0x04, 'c', 'h', 'i', 'p',
106*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.device_info.attributes[1].value
107*61c4878aSAndroid Build Coastguard Worker 0x12, 0x08, 'l', 'e', 'f', 't', '-', 's', 'o', 'c',
108*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.device_info.status
109*61c4878aSAndroid Build Coastguard Worker 0x18, 0x03,
110*61c4878aSAndroid Build Coastguard Worker // pigweed.id[0]
111*61c4878aSAndroid Build Coastguard Worker 0x52, 0x02,
112*61c4878aSAndroid Build Coastguard Worker // pigweed.id[0].id
113*61c4878aSAndroid Build Coastguard Worker 0x08, 0x31,
114*61c4878aSAndroid Build Coastguard Worker // pigweed.id[1]
115*61c4878aSAndroid Build Coastguard Worker 0x52, 0x02,
116*61c4878aSAndroid Build Coastguard Worker // pigweed.id[1].id
117*61c4878aSAndroid Build Coastguard Worker 0x08, 0x39,
118*61c4878aSAndroid Build Coastguard Worker // pigweed.id[2]
119*61c4878aSAndroid Build Coastguard Worker 0x52, 0x02,
120*61c4878aSAndroid Build Coastguard Worker // pigweed.id[2].id
121*61c4878aSAndroid Build Coastguard Worker 0x08, 0x4b,
122*61c4878aSAndroid Build Coastguard Worker // pigweed.id[3]
123*61c4878aSAndroid Build Coastguard Worker 0x52, 0x02,
124*61c4878aSAndroid Build Coastguard Worker // pigweed.id[3].id
125*61c4878aSAndroid Build Coastguard Worker 0x08, 0x67,
126*61c4878aSAndroid Build Coastguard Worker // pigweed.id[4]
127*61c4878aSAndroid Build Coastguard Worker 0x52, 0x03,
128*61c4878aSAndroid Build Coastguard Worker // pigweed.id[4].id
129*61c4878aSAndroid Build Coastguard Worker 0x08, 0x8d, 0x01
130*61c4878aSAndroid Build Coastguard Worker
131*61c4878aSAndroid Build Coastguard Worker };
132*61c4878aSAndroid Build Coastguard Worker // clang-format on
133*61c4878aSAndroid Build Coastguard Worker
134*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(as_bytes(span(proto_data)));
135*61c4878aSAndroid Build Coastguard Worker Pigweed::StreamDecoder pigweed(reader);
136*61c4878aSAndroid Build Coastguard Worker
137*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Next(), OkStatus());
138*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Field().value(), Pigweed::Fields::kMagicNumber);
139*61c4878aSAndroid Build Coastguard Worker Result<uint32_t> magic_number = pigweed.ReadMagicNumber();
140*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(magic_number.status(), OkStatus());
141*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(magic_number.value(), 0x49u);
142*61c4878aSAndroid Build Coastguard Worker
143*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Next(), OkStatus());
144*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Field().value(), Pigweed::Fields::kZiggy);
145*61c4878aSAndroid Build Coastguard Worker Result<int32_t> ziggy = pigweed.ReadZiggy();
146*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ziggy.status(), OkStatus());
147*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(ziggy.value(), -111);
148*61c4878aSAndroid Build Coastguard Worker
149*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedErrorMessage{"not a typewriter"};
150*61c4878aSAndroid Build Coastguard Worker
151*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Next(), OkStatus());
152*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Field().value(), Pigweed::Fields::kErrorMessage);
153*61c4878aSAndroid Build Coastguard Worker std::array<char, 32> error_message{};
154*61c4878aSAndroid Build Coastguard Worker StatusWithSize error_message_status = pigweed.ReadErrorMessage(error_message);
155*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(error_message_status.status(), OkStatus());
156*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(error_message_status.size(), kExpectedErrorMessage.size());
157*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp(error_message.data(),
158*61c4878aSAndroid Build Coastguard Worker kExpectedErrorMessage.data(),
159*61c4878aSAndroid Build Coastguard Worker kExpectedErrorMessage.size()),
160*61c4878aSAndroid Build Coastguard Worker 0);
161*61c4878aSAndroid Build Coastguard Worker
162*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Next(), OkStatus());
163*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Field().value(), Pigweed::Fields::kBin);
164*61c4878aSAndroid Build Coastguard Worker Result<Pigweed::Protobuf::Binary> bin = pigweed.ReadBin();
165*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(bin.status(), OkStatus());
166*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(bin.value(), Pigweed::Protobuf::Binary::ZERO);
167*61c4878aSAndroid Build Coastguard Worker
168*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Next(), OkStatus());
169*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Field().value(), Pigweed::Fields::kPigweed);
170*61c4878aSAndroid Build Coastguard Worker {
171*61c4878aSAndroid Build Coastguard Worker Pigweed::Pigweed::StreamDecoder pigweed_pigweed =
172*61c4878aSAndroid Build Coastguard Worker pigweed.GetPigweedDecoder();
173*61c4878aSAndroid Build Coastguard Worker
174*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed_pigweed.Next(), OkStatus());
175*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed_pigweed.Field().value(),
176*61c4878aSAndroid Build Coastguard Worker Pigweed::Pigweed::Fields::kStatus);
177*61c4878aSAndroid Build Coastguard Worker Result<Bool> pigweed_status = pigweed_pigweed.ReadStatus();
178*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed_status.status(), OkStatus());
179*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed_status.value(), Bool::FILE_NOT_FOUND);
180*61c4878aSAndroid Build Coastguard Worker
181*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed_pigweed.Next(), Status::OutOfRange());
182*61c4878aSAndroid Build Coastguard Worker }
183*61c4878aSAndroid Build Coastguard Worker
184*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Next(), OkStatus());
185*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Field().value(), Pigweed::Fields::kProto);
186*61c4878aSAndroid Build Coastguard Worker {
187*61c4878aSAndroid Build Coastguard Worker Proto::StreamDecoder proto = pigweed.GetProtoDecoder();
188*61c4878aSAndroid Build Coastguard Worker
189*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto.Next(), OkStatus());
190*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto.Field().value(), Proto::Fields::kBin);
191*61c4878aSAndroid Build Coastguard Worker Result<Proto::Binary> proto_bin = proto.ReadBin();
192*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto_bin.status(), OkStatus());
193*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto_bin.value(), Proto::Binary::OFF);
194*61c4878aSAndroid Build Coastguard Worker
195*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto.Next(), OkStatus());
196*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto.Field().value(), Proto::Fields::kPigweedPigweedBin);
197*61c4878aSAndroid Build Coastguard Worker Result<Pigweed::Pigweed::Binary> proto_pigweed_bin =
198*61c4878aSAndroid Build Coastguard Worker proto.ReadPigweedPigweedBin();
199*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto_pigweed_bin.status(), OkStatus());
200*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto_pigweed_bin.value(), Pigweed::Pigweed::Binary::ZERO);
201*61c4878aSAndroid Build Coastguard Worker
202*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto.Next(), OkStatus());
203*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto.Field().value(), Proto::Fields::kPigweedProtobufBin);
204*61c4878aSAndroid Build Coastguard Worker Result<Pigweed::Protobuf::Binary> proto_protobuf_bin =
205*61c4878aSAndroid Build Coastguard Worker proto.ReadPigweedProtobufBin();
206*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto_protobuf_bin.status(), OkStatus());
207*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto_protobuf_bin.value(), Pigweed::Protobuf::Binary::ZERO);
208*61c4878aSAndroid Build Coastguard Worker
209*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto.Next(), OkStatus());
210*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto.Field().value(), Proto::Fields::kMeta);
211*61c4878aSAndroid Build Coastguard Worker {
212*61c4878aSAndroid Build Coastguard Worker Pigweed::Protobuf::Compiler::StreamDecoder meta = proto.GetMetaDecoder();
213*61c4878aSAndroid Build Coastguard Worker
214*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedFileName{"/etc/passwd"};
215*61c4878aSAndroid Build Coastguard Worker
216*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(meta.Next(), OkStatus());
217*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(meta.Field().value(),
218*61c4878aSAndroid Build Coastguard Worker Pigweed::Protobuf::Compiler::Fields::kFileName);
219*61c4878aSAndroid Build Coastguard Worker std::array<char, 32> meta_file_name{};
220*61c4878aSAndroid Build Coastguard Worker StatusWithSize meta_file_name_status = meta.ReadFileName(meta_file_name);
221*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(meta_file_name_status.status(), OkStatus());
222*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(meta_file_name_status.size(), kExpectedFileName.size());
223*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp(meta_file_name.data(),
224*61c4878aSAndroid Build Coastguard Worker kExpectedFileName.data(),
225*61c4878aSAndroid Build Coastguard Worker kExpectedFileName.size()),
226*61c4878aSAndroid Build Coastguard Worker 0);
227*61c4878aSAndroid Build Coastguard Worker
228*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(meta.Next(), OkStatus());
229*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(meta.Field().value(),
230*61c4878aSAndroid Build Coastguard Worker Pigweed::Protobuf::Compiler::Fields::kStatus);
231*61c4878aSAndroid Build Coastguard Worker Result<Pigweed::Protobuf::Compiler::Status> meta_status =
232*61c4878aSAndroid Build Coastguard Worker meta.ReadStatus();
233*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(meta_status.status(), OkStatus());
234*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(meta_status.value(),
235*61c4878aSAndroid Build Coastguard Worker Pigweed::Protobuf::Compiler::Status::FUBAR);
236*61c4878aSAndroid Build Coastguard Worker
237*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(meta.Next(), Status::OutOfRange());
238*61c4878aSAndroid Build Coastguard Worker }
239*61c4878aSAndroid Build Coastguard Worker
240*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto.Next(), OkStatus());
241*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto.Field().value(), Proto::Fields::kPigweed);
242*61c4878aSAndroid Build Coastguard Worker {
243*61c4878aSAndroid Build Coastguard Worker Pigweed::StreamDecoder proto_pigweed = proto.GetPigweedDecoder();
244*61c4878aSAndroid Build Coastguard Worker
245*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedProtoErrorMessage{"here we go again"};
246*61c4878aSAndroid Build Coastguard Worker
247*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto_pigweed.Next(), OkStatus());
248*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto_pigweed.Field().value(), Pigweed::Fields::kErrorMessage);
249*61c4878aSAndroid Build Coastguard Worker std::array<char, 32> proto_pigweed_error_message{};
250*61c4878aSAndroid Build Coastguard Worker StatusWithSize proto_pigweed_error_message_status =
251*61c4878aSAndroid Build Coastguard Worker proto_pigweed.ReadErrorMessage(proto_pigweed_error_message);
252*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto_pigweed_error_message_status.status(), OkStatus());
253*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto_pigweed_error_message_status.size(),
254*61c4878aSAndroid Build Coastguard Worker kExpectedProtoErrorMessage.size());
255*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp(proto_pigweed_error_message.data(),
256*61c4878aSAndroid Build Coastguard Worker kExpectedProtoErrorMessage.data(),
257*61c4878aSAndroid Build Coastguard Worker kExpectedProtoErrorMessage.size()),
258*61c4878aSAndroid Build Coastguard Worker 0);
259*61c4878aSAndroid Build Coastguard Worker
260*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto_pigweed.Next(), OkStatus());
261*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto_pigweed.Field().value(), Pigweed::Fields::kMagicNumber);
262*61c4878aSAndroid Build Coastguard Worker Result<uint32_t> proto_pigweed_magic_number =
263*61c4878aSAndroid Build Coastguard Worker proto_pigweed.ReadMagicNumber();
264*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto_pigweed_magic_number.status(), OkStatus());
265*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto_pigweed_magic_number.value(), 616u);
266*61c4878aSAndroid Build Coastguard Worker
267*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto_pigweed.Next(), OkStatus());
268*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto_pigweed.Field().value(), Pigweed::Fields::kDeviceInfo);
269*61c4878aSAndroid Build Coastguard Worker {
270*61c4878aSAndroid Build Coastguard Worker DeviceInfo::StreamDecoder device_info =
271*61c4878aSAndroid Build Coastguard Worker proto_pigweed.GetDeviceInfoDecoder();
272*61c4878aSAndroid Build Coastguard Worker
273*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(device_info.Next(), OkStatus());
274*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(device_info.Field().value(), DeviceInfo::Fields::kAttributes);
275*61c4878aSAndroid Build Coastguard Worker {
276*61c4878aSAndroid Build Coastguard Worker KeyValuePair::StreamDecoder key_value_pair =
277*61c4878aSAndroid Build Coastguard Worker device_info.GetAttributesDecoder();
278*61c4878aSAndroid Build Coastguard Worker
279*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedKey{"version"};
280*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedValue{"5.3.1"};
281*61c4878aSAndroid Build Coastguard Worker
282*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(key_value_pair.Next(), OkStatus());
283*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(key_value_pair.Field().value(), KeyValuePair::Fields::kKey);
284*61c4878aSAndroid Build Coastguard Worker std::array<char, 32> key{};
285*61c4878aSAndroid Build Coastguard Worker StatusWithSize key_status = key_value_pair.ReadKey(key);
286*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(key_status.status(), OkStatus());
287*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(key_status.size(), kExpectedKey.size());
288*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
289*61c4878aSAndroid Build Coastguard Worker std::memcmp(key.data(), kExpectedKey.data(), kExpectedKey.size()),
290*61c4878aSAndroid Build Coastguard Worker 0);
291*61c4878aSAndroid Build Coastguard Worker
292*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(key_value_pair.Next(), OkStatus());
293*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(key_value_pair.Field().value(),
294*61c4878aSAndroid Build Coastguard Worker KeyValuePair::Fields::kValue);
295*61c4878aSAndroid Build Coastguard Worker std::array<char, 32> value{};
296*61c4878aSAndroid Build Coastguard Worker StatusWithSize value_status = key_value_pair.ReadValue(value);
297*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value_status.status(), OkStatus());
298*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value_status.size(), kExpectedValue.size());
299*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
300*61c4878aSAndroid Build Coastguard Worker std::memcmp(
301*61c4878aSAndroid Build Coastguard Worker value.data(), kExpectedValue.data(), kExpectedValue.size()),
302*61c4878aSAndroid Build Coastguard Worker 0);
303*61c4878aSAndroid Build Coastguard Worker
304*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(key_value_pair.Next(), Status::OutOfRange());
305*61c4878aSAndroid Build Coastguard Worker }
306*61c4878aSAndroid Build Coastguard Worker
307*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(device_info.Next(), OkStatus());
308*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(device_info.Field().value(), DeviceInfo::Fields::kAttributes);
309*61c4878aSAndroid Build Coastguard Worker {
310*61c4878aSAndroid Build Coastguard Worker KeyValuePair::StreamDecoder key_value_pair =
311*61c4878aSAndroid Build Coastguard Worker device_info.GetAttributesDecoder();
312*61c4878aSAndroid Build Coastguard Worker
313*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedKey{"chip"};
314*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedValue{"left-soc"};
315*61c4878aSAndroid Build Coastguard Worker
316*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(key_value_pair.Next(), OkStatus());
317*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(key_value_pair.Field().value(), KeyValuePair::Fields::kKey);
318*61c4878aSAndroid Build Coastguard Worker std::array<char, 32> key{};
319*61c4878aSAndroid Build Coastguard Worker StatusWithSize key_status = key_value_pair.ReadKey(key);
320*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(key_status.status(), OkStatus());
321*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(key_status.size(), kExpectedKey.size());
322*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
323*61c4878aSAndroid Build Coastguard Worker std::memcmp(key.data(), kExpectedKey.data(), kExpectedKey.size()),
324*61c4878aSAndroid Build Coastguard Worker 0);
325*61c4878aSAndroid Build Coastguard Worker
326*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(key_value_pair.Next(), OkStatus());
327*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(key_value_pair.Field().value(),
328*61c4878aSAndroid Build Coastguard Worker KeyValuePair::Fields::kValue);
329*61c4878aSAndroid Build Coastguard Worker std::array<char, 32> value{};
330*61c4878aSAndroid Build Coastguard Worker StatusWithSize value_status = key_value_pair.ReadValue(value);
331*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value_status.status(), OkStatus());
332*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value_status.size(), kExpectedValue.size());
333*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(
334*61c4878aSAndroid Build Coastguard Worker std::memcmp(
335*61c4878aSAndroid Build Coastguard Worker value.data(), kExpectedValue.data(), kExpectedValue.size()),
336*61c4878aSAndroid Build Coastguard Worker 0);
337*61c4878aSAndroid Build Coastguard Worker
338*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(key_value_pair.Next(), Status::OutOfRange());
339*61c4878aSAndroid Build Coastguard Worker }
340*61c4878aSAndroid Build Coastguard Worker
341*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(device_info.Next(), OkStatus());
342*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(device_info.Field().value(), DeviceInfo::Fields::kStatus);
343*61c4878aSAndroid Build Coastguard Worker Result<DeviceInfo::DeviceStatus> device_info_status =
344*61c4878aSAndroid Build Coastguard Worker device_info.ReadStatus();
345*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(device_info_status.status(), OkStatus());
346*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(device_info_status.value(), DeviceInfo::DeviceStatus::PANIC);
347*61c4878aSAndroid Build Coastguard Worker
348*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(device_info.Next(), Status::OutOfRange());
349*61c4878aSAndroid Build Coastguard Worker }
350*61c4878aSAndroid Build Coastguard Worker
351*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto_pigweed.Next(), Status::OutOfRange());
352*61c4878aSAndroid Build Coastguard Worker }
353*61c4878aSAndroid Build Coastguard Worker
354*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(proto.Next(), Status::OutOfRange());
355*61c4878aSAndroid Build Coastguard Worker }
356*61c4878aSAndroid Build Coastguard Worker
357*61c4878aSAndroid Build Coastguard Worker for (unsigned i = 0; i < 5; ++i) {
358*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Next(), OkStatus());
359*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Field().value(), Pigweed::Fields::kId);
360*61c4878aSAndroid Build Coastguard Worker
361*61c4878aSAndroid Build Coastguard Worker Proto::ID::StreamDecoder id = pigweed.GetIdDecoder();
362*61c4878aSAndroid Build Coastguard Worker
363*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(id.Next(), OkStatus());
364*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(id.Field().value(), Proto::ID::Fields::kId);
365*61c4878aSAndroid Build Coastguard Worker Result<uint32_t> id_id = id.ReadId();
366*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(id_id.status(), OkStatus());
367*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(id_id.value(), 5u * i * i + 3 * i + 49);
368*61c4878aSAndroid Build Coastguard Worker
369*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(id.Next(), Status::OutOfRange());
370*61c4878aSAndroid Build Coastguard Worker }
371*61c4878aSAndroid Build Coastguard Worker
372*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Next(), Status::OutOfRange());
373*61c4878aSAndroid Build Coastguard Worker }
374*61c4878aSAndroid Build Coastguard Worker
TEST(Codegen,ResourceExhausted)375*61c4878aSAndroid Build Coastguard Worker TEST(Codegen, ResourceExhausted) {
376*61c4878aSAndroid Build Coastguard Worker // clang-format off
377*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t proto_data[] = {
378*61c4878aSAndroid Build Coastguard Worker // pigweed.error_message
379*61c4878aSAndroid Build Coastguard Worker 0x2a, 0x10, 'n', 'o', 't', ' ', 'a', ' ',
380*61c4878aSAndroid Build Coastguard Worker 't', 'y', 'p', 'e', 'w', 'r', 'i', 't', 'e', 'r',
381*61c4878aSAndroid Build Coastguard Worker };
382*61c4878aSAndroid Build Coastguard Worker // clang-format on
383*61c4878aSAndroid Build Coastguard Worker
384*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(as_bytes(span(proto_data)));
385*61c4878aSAndroid Build Coastguard Worker Pigweed::StreamDecoder pigweed(reader);
386*61c4878aSAndroid Build Coastguard Worker
387*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Next(), OkStatus());
388*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Field().value(), Pigweed::Fields::kErrorMessage);
389*61c4878aSAndroid Build Coastguard Worker std::array<char, 8> error_message{};
390*61c4878aSAndroid Build Coastguard Worker StatusWithSize error_message_status = pigweed.ReadErrorMessage(error_message);
391*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(error_message_status.status(), Status::ResourceExhausted());
392*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(error_message_status.size(), 0u);
393*61c4878aSAndroid Build Coastguard Worker
394*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Next(), Status::OutOfRange());
395*61c4878aSAndroid Build Coastguard Worker }
396*61c4878aSAndroid Build Coastguard Worker
TEST(Codegen,BytesReader)397*61c4878aSAndroid Build Coastguard Worker TEST(Codegen, BytesReader) {
398*61c4878aSAndroid Build Coastguard Worker // clang-format off
399*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t proto_data[] = {
400*61c4878aSAndroid Build Coastguard Worker // pigweed.error_message
401*61c4878aSAndroid Build Coastguard Worker 0x2a, 0x10, 'n', 'o', 't', ' ', 'a', ' ',
402*61c4878aSAndroid Build Coastguard Worker 't', 'y', 'p', 'e', 'w', 'r', 'i', 't', 'e', 'r',
403*61c4878aSAndroid Build Coastguard Worker };
404*61c4878aSAndroid Build Coastguard Worker // clang-format on
405*61c4878aSAndroid Build Coastguard Worker
406*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(as_bytes(span(proto_data)));
407*61c4878aSAndroid Build Coastguard Worker Pigweed::StreamDecoder pigweed(reader);
408*61c4878aSAndroid Build Coastguard Worker
409*61c4878aSAndroid Build Coastguard Worker constexpr std::string_view kExpectedErrorMessage{"not a typewriter"};
410*61c4878aSAndroid Build Coastguard Worker
411*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Next(), OkStatus());
412*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Field().value(), Pigweed::Fields::kErrorMessage);
413*61c4878aSAndroid Build Coastguard Worker {
414*61c4878aSAndroid Build Coastguard Worker StreamDecoder::BytesReader bytes_reader = pigweed.GetErrorMessageReader();
415*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(bytes_reader.field_size(), kExpectedErrorMessage.size());
416*61c4878aSAndroid Build Coastguard Worker
417*61c4878aSAndroid Build Coastguard Worker std::array<std::byte, 32> error_message{};
418*61c4878aSAndroid Build Coastguard Worker Result<ByteSpan> result = bytes_reader.Read(error_message);
419*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.status(), OkStatus());
420*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.value().size(), kExpectedErrorMessage.size());
421*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp(result.value().data(),
422*61c4878aSAndroid Build Coastguard Worker kExpectedErrorMessage.data(),
423*61c4878aSAndroid Build Coastguard Worker kExpectedErrorMessage.size()),
424*61c4878aSAndroid Build Coastguard Worker 0);
425*61c4878aSAndroid Build Coastguard Worker
426*61c4878aSAndroid Build Coastguard Worker result = bytes_reader.Read(error_message);
427*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.status(), Status::OutOfRange());
428*61c4878aSAndroid Build Coastguard Worker }
429*61c4878aSAndroid Build Coastguard Worker
430*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Next(), Status::OutOfRange());
431*61c4878aSAndroid Build Coastguard Worker }
432*61c4878aSAndroid Build Coastguard Worker
TEST(Codegen,Enum)433*61c4878aSAndroid Build Coastguard Worker TEST(Codegen, Enum) {
434*61c4878aSAndroid Build Coastguard Worker // clang-format off
435*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t proto_data[] = {
436*61c4878aSAndroid Build Coastguard Worker // pigweed.bin (valid value)
437*61c4878aSAndroid Build Coastguard Worker 0x40, 0x01,
438*61c4878aSAndroid Build Coastguard Worker // pigweed.bin (unknown value)
439*61c4878aSAndroid Build Coastguard Worker 0x40, 0x7f,
440*61c4878aSAndroid Build Coastguard Worker // pigweed.bin (invalid value)
441*61c4878aSAndroid Build Coastguard Worker 0x40, 0xff,
442*61c4878aSAndroid Build Coastguard Worker };
443*61c4878aSAndroid Build Coastguard Worker // clang-format on
444*61c4878aSAndroid Build Coastguard Worker
445*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(as_bytes(span(proto_data)));
446*61c4878aSAndroid Build Coastguard Worker Pigweed::StreamDecoder pigweed(reader);
447*61c4878aSAndroid Build Coastguard Worker
448*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Next(), OkStatus());
449*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Field().value(), Pigweed::Fields::kBin);
450*61c4878aSAndroid Build Coastguard Worker Result<Pigweed::Protobuf::Binary> bin = pigweed.ReadBin();
451*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(bin.status(), OkStatus());
452*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(Pigweed::Protobuf::IsValidBinary(bin.value()));
453*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(bin.value(), Pigweed::Protobuf::Binary::ZERO);
454*61c4878aSAndroid Build Coastguard Worker
455*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Next(), OkStatus());
456*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Field().value(), Pigweed::Fields::kBin);
457*61c4878aSAndroid Build Coastguard Worker bin = pigweed.ReadBin();
458*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(bin.status(), OkStatus());
459*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(Pigweed::Protobuf::IsValidBinary(bin.value()));
460*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(static_cast<uint32_t>(bin.value()), 0x7fu);
461*61c4878aSAndroid Build Coastguard Worker
462*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Next(), OkStatus());
463*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed.Field().value(), Pigweed::Fields::kBin);
464*61c4878aSAndroid Build Coastguard Worker bin = pigweed.ReadBin();
465*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(bin.status(), Status::DataLoss());
466*61c4878aSAndroid Build Coastguard Worker }
467*61c4878aSAndroid Build Coastguard Worker
TEST(Codegen,ImportedEnum)468*61c4878aSAndroid Build Coastguard Worker TEST(Codegen, ImportedEnum) {
469*61c4878aSAndroid Build Coastguard Worker // clang-format off
470*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t proto_data[] = {
471*61c4878aSAndroid Build Coastguard Worker // result.status (valid value)
472*61c4878aSAndroid Build Coastguard Worker 0x08, 0x01,
473*61c4878aSAndroid Build Coastguard Worker // result.status (unknown value)
474*61c4878aSAndroid Build Coastguard Worker 0x08, 0x7f,
475*61c4878aSAndroid Build Coastguard Worker // result.status (invalid value)
476*61c4878aSAndroid Build Coastguard Worker 0x08, 0xff,
477*61c4878aSAndroid Build Coastguard Worker };
478*61c4878aSAndroid Build Coastguard Worker // clang-format on
479*61c4878aSAndroid Build Coastguard Worker
480*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(as_bytes(span(proto_data)));
481*61c4878aSAndroid Build Coastguard Worker TestResult::StreamDecoder test_result(reader);
482*61c4878aSAndroid Build Coastguard Worker
483*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(test_result.Next(), OkStatus());
484*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(test_result.Field().value(), TestResult::Fields::kStatus);
485*61c4878aSAndroid Build Coastguard Worker Result<imported::Status> status = test_result.ReadStatus();
486*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(status.status(), OkStatus());
487*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(imported::IsValidStatus(status.value()));
488*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(status.value(), imported::Status::NOT_OK);
489*61c4878aSAndroid Build Coastguard Worker
490*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(test_result.Next(), OkStatus());
491*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(test_result.Field().value(), TestResult::Fields::kStatus);
492*61c4878aSAndroid Build Coastguard Worker status = test_result.ReadStatus();
493*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(status.status(), OkStatus());
494*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(imported::IsValidStatus(status.value()));
495*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(static_cast<uint32_t>(status.value()), 0x7fu);
496*61c4878aSAndroid Build Coastguard Worker
497*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(test_result.Next(), OkStatus());
498*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(test_result.Field().value(), TestResult::Fields::kStatus);
499*61c4878aSAndroid Build Coastguard Worker status = test_result.ReadStatus();
500*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(status.status(), Status::DataLoss());
501*61c4878aSAndroid Build Coastguard Worker }
502*61c4878aSAndroid Build Coastguard Worker
TEST(CodegenRepeated,NonPackedScalar)503*61c4878aSAndroid Build Coastguard Worker TEST(CodegenRepeated, NonPackedScalar) {
504*61c4878aSAndroid Build Coastguard Worker // clang-format off
505*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t proto_data[] = {
506*61c4878aSAndroid Build Coastguard Worker // uint32s[], v={0, 16, 32, 48}
507*61c4878aSAndroid Build Coastguard Worker 0x08, 0x00,
508*61c4878aSAndroid Build Coastguard Worker 0x08, 0x10,
509*61c4878aSAndroid Build Coastguard Worker 0x08, 0x20,
510*61c4878aSAndroid Build Coastguard Worker 0x08, 0x30,
511*61c4878aSAndroid Build Coastguard Worker // fixed32s[]. v={0, 16, 32, 48}
512*61c4878aSAndroid Build Coastguard Worker 0x35, 0x00, 0x00, 0x00, 0x00,
513*61c4878aSAndroid Build Coastguard Worker 0x35, 0x10, 0x00, 0x00, 0x00,
514*61c4878aSAndroid Build Coastguard Worker 0x35, 0x20, 0x00, 0x00, 0x00,
515*61c4878aSAndroid Build Coastguard Worker 0x35, 0x30, 0x00, 0x00, 0x00,
516*61c4878aSAndroid Build Coastguard Worker };
517*61c4878aSAndroid Build Coastguard Worker // clang-format on
518*61c4878aSAndroid Build Coastguard Worker
519*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(as_bytes(span(proto_data)));
520*61c4878aSAndroid Build Coastguard Worker RepeatedTest::StreamDecoder repeated_test(reader);
521*61c4878aSAndroid Build Coastguard Worker
522*61c4878aSAndroid Build Coastguard Worker for (uint32_t i = 0; i < 4; ++i) {
523*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), OkStatus());
524*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Field().value(), RepeatedTest::Fields::kUint32s);
525*61c4878aSAndroid Build Coastguard Worker
526*61c4878aSAndroid Build Coastguard Worker Result<uint32_t> result = repeated_test.ReadUint32s();
527*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.status(), OkStatus());
528*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.value(), i * 16u);
529*61c4878aSAndroid Build Coastguard Worker }
530*61c4878aSAndroid Build Coastguard Worker
531*61c4878aSAndroid Build Coastguard Worker for (unsigned i = 0; i < 4; ++i) {
532*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), OkStatus());
533*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Field().value(), RepeatedTest::Fields::kFixed32s);
534*61c4878aSAndroid Build Coastguard Worker
535*61c4878aSAndroid Build Coastguard Worker Result<uint32_t> result = repeated_test.ReadFixed32s();
536*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.status(), OkStatus());
537*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.value(), i * 16u);
538*61c4878aSAndroid Build Coastguard Worker }
539*61c4878aSAndroid Build Coastguard Worker
540*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), Status::OutOfRange());
541*61c4878aSAndroid Build Coastguard Worker }
542*61c4878aSAndroid Build Coastguard Worker
TEST(CodegenRepeated,NonPackedScalarVector)543*61c4878aSAndroid Build Coastguard Worker TEST(CodegenRepeated, NonPackedScalarVector) {
544*61c4878aSAndroid Build Coastguard Worker // clang-format off
545*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t proto_data[] = {
546*61c4878aSAndroid Build Coastguard Worker // uint32s[], v={0, 16, 32, 48}
547*61c4878aSAndroid Build Coastguard Worker 0x08, 0x00,
548*61c4878aSAndroid Build Coastguard Worker 0x08, 0x10,
549*61c4878aSAndroid Build Coastguard Worker 0x08, 0x20,
550*61c4878aSAndroid Build Coastguard Worker 0x08, 0x30,
551*61c4878aSAndroid Build Coastguard Worker // fixed32s[]. v={0, 16, 32, 48}
552*61c4878aSAndroid Build Coastguard Worker 0x35, 0x00, 0x00, 0x00, 0x00,
553*61c4878aSAndroid Build Coastguard Worker 0x35, 0x10, 0x00, 0x00, 0x00,
554*61c4878aSAndroid Build Coastguard Worker 0x35, 0x20, 0x00, 0x00, 0x00,
555*61c4878aSAndroid Build Coastguard Worker 0x35, 0x30, 0x00, 0x00, 0x00,
556*61c4878aSAndroid Build Coastguard Worker };
557*61c4878aSAndroid Build Coastguard Worker // clang-format on
558*61c4878aSAndroid Build Coastguard Worker
559*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(as_bytes(span(proto_data)));
560*61c4878aSAndroid Build Coastguard Worker RepeatedTest::StreamDecoder repeated_test(reader);
561*61c4878aSAndroid Build Coastguard Worker
562*61c4878aSAndroid Build Coastguard Worker pw::Vector<uint32_t, 8> uint32s{};
563*61c4878aSAndroid Build Coastguard Worker
564*61c4878aSAndroid Build Coastguard Worker for (unsigned i = 0; i < 4; ++i) {
565*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), OkStatus());
566*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Field().value(), RepeatedTest::Fields::kUint32s);
567*61c4878aSAndroid Build Coastguard Worker
568*61c4878aSAndroid Build Coastguard Worker Status status = repeated_test.ReadUint32s(uint32s);
569*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(status, OkStatus());
570*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(uint32s.size(), i + 1u);
571*61c4878aSAndroid Build Coastguard Worker }
572*61c4878aSAndroid Build Coastguard Worker
573*61c4878aSAndroid Build Coastguard Worker for (unsigned short i = 0; i < 4; ++i) {
574*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(uint32s[i], i * 16u);
575*61c4878aSAndroid Build Coastguard Worker }
576*61c4878aSAndroid Build Coastguard Worker
577*61c4878aSAndroid Build Coastguard Worker pw::Vector<uint32_t, 8> fixed32s{};
578*61c4878aSAndroid Build Coastguard Worker
579*61c4878aSAndroid Build Coastguard Worker for (unsigned i = 0; i < 4; ++i) {
580*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), OkStatus());
581*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Field().value(), RepeatedTest::Fields::kFixed32s);
582*61c4878aSAndroid Build Coastguard Worker
583*61c4878aSAndroid Build Coastguard Worker Status status = repeated_test.ReadFixed32s(fixed32s);
584*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(status, OkStatus());
585*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(fixed32s.size(), i + 1u);
586*61c4878aSAndroid Build Coastguard Worker }
587*61c4878aSAndroid Build Coastguard Worker
588*61c4878aSAndroid Build Coastguard Worker for (unsigned short i = 0; i < 4; ++i) {
589*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(fixed32s[i], i * 16u);
590*61c4878aSAndroid Build Coastguard Worker }
591*61c4878aSAndroid Build Coastguard Worker
592*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), Status::OutOfRange());
593*61c4878aSAndroid Build Coastguard Worker }
594*61c4878aSAndroid Build Coastguard Worker
TEST(CodegenRepeated,NonPackedVarintScalarVectorFull)595*61c4878aSAndroid Build Coastguard Worker TEST(CodegenRepeated, NonPackedVarintScalarVectorFull) {
596*61c4878aSAndroid Build Coastguard Worker // clang-format off
597*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t proto_data[] = {
598*61c4878aSAndroid Build Coastguard Worker // uint32s[], v={0, 16, 32, 48}
599*61c4878aSAndroid Build Coastguard Worker 0x08, 0x00,
600*61c4878aSAndroid Build Coastguard Worker 0x08, 0x10,
601*61c4878aSAndroid Build Coastguard Worker 0x08, 0x20,
602*61c4878aSAndroid Build Coastguard Worker 0x08, 0x30,
603*61c4878aSAndroid Build Coastguard Worker };
604*61c4878aSAndroid Build Coastguard Worker // clang-format on
605*61c4878aSAndroid Build Coastguard Worker
606*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(as_bytes(span(proto_data)));
607*61c4878aSAndroid Build Coastguard Worker RepeatedTest::StreamDecoder repeated_test(reader);
608*61c4878aSAndroid Build Coastguard Worker
609*61c4878aSAndroid Build Coastguard Worker pw::Vector<uint32_t, 2> uint32s{};
610*61c4878aSAndroid Build Coastguard Worker
611*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), OkStatus());
612*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Field().value(), RepeatedTest::Fields::kUint32s);
613*61c4878aSAndroid Build Coastguard Worker Status status = repeated_test.ReadUint32s(uint32s);
614*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(status, OkStatus());
615*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(uint32s.size(), 1u);
616*61c4878aSAndroid Build Coastguard Worker
617*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), OkStatus());
618*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Field().value(), RepeatedTest::Fields::kUint32s);
619*61c4878aSAndroid Build Coastguard Worker status = repeated_test.ReadUint32s(uint32s);
620*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(status, OkStatus());
621*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(uint32s.size(), 2u);
622*61c4878aSAndroid Build Coastguard Worker
623*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), OkStatus());
624*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Field().value(), RepeatedTest::Fields::kUint32s);
625*61c4878aSAndroid Build Coastguard Worker status = repeated_test.ReadUint32s(uint32s);
626*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(status, Status::ResourceExhausted());
627*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(uint32s.size(), 2u);
628*61c4878aSAndroid Build Coastguard Worker
629*61c4878aSAndroid Build Coastguard Worker for (unsigned short i = 0; i < 2; ++i) {
630*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(uint32s[i], i * 16u);
631*61c4878aSAndroid Build Coastguard Worker }
632*61c4878aSAndroid Build Coastguard Worker }
633*61c4878aSAndroid Build Coastguard Worker
TEST(CodegenRepeated,NonPackedFixedScalarVectorFull)634*61c4878aSAndroid Build Coastguard Worker TEST(CodegenRepeated, NonPackedFixedScalarVectorFull) {
635*61c4878aSAndroid Build Coastguard Worker // clang-format off
636*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t proto_data[] = {
637*61c4878aSAndroid Build Coastguard Worker // fixed32s[]. v={0, 16, 32, 48}
638*61c4878aSAndroid Build Coastguard Worker 0x35, 0x00, 0x00, 0x00, 0x00,
639*61c4878aSAndroid Build Coastguard Worker 0x35, 0x10, 0x00, 0x00, 0x00,
640*61c4878aSAndroid Build Coastguard Worker 0x35, 0x20, 0x00, 0x00, 0x00,
641*61c4878aSAndroid Build Coastguard Worker 0x35, 0x30, 0x00, 0x00, 0x00,
642*61c4878aSAndroid Build Coastguard Worker };
643*61c4878aSAndroid Build Coastguard Worker // clang-format on
644*61c4878aSAndroid Build Coastguard Worker
645*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(as_bytes(span(proto_data)));
646*61c4878aSAndroid Build Coastguard Worker RepeatedTest::StreamDecoder repeated_test(reader);
647*61c4878aSAndroid Build Coastguard Worker
648*61c4878aSAndroid Build Coastguard Worker pw::Vector<uint32_t, 2> fixed32s{};
649*61c4878aSAndroid Build Coastguard Worker
650*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), OkStatus());
651*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Field().value(), RepeatedTest::Fields::kFixed32s);
652*61c4878aSAndroid Build Coastguard Worker Status status = repeated_test.ReadFixed32s(fixed32s);
653*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(status, OkStatus());
654*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(fixed32s.size(), 1u);
655*61c4878aSAndroid Build Coastguard Worker
656*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), OkStatus());
657*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Field().value(), RepeatedTest::Fields::kFixed32s);
658*61c4878aSAndroid Build Coastguard Worker status = repeated_test.ReadFixed32s(fixed32s);
659*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(status, OkStatus());
660*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(fixed32s.size(), 2u);
661*61c4878aSAndroid Build Coastguard Worker
662*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), OkStatus());
663*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Field().value(), RepeatedTest::Fields::kFixed32s);
664*61c4878aSAndroid Build Coastguard Worker status = repeated_test.ReadFixed32s(fixed32s);
665*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(status, Status::ResourceExhausted());
666*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(fixed32s.size(), 2u);
667*61c4878aSAndroid Build Coastguard Worker
668*61c4878aSAndroid Build Coastguard Worker for (unsigned short i = 0; i < 2; ++i) {
669*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(fixed32s[i], i * 16u);
670*61c4878aSAndroid Build Coastguard Worker }
671*61c4878aSAndroid Build Coastguard Worker }
672*61c4878aSAndroid Build Coastguard Worker
TEST(CodegenRepeated,PackedScalar)673*61c4878aSAndroid Build Coastguard Worker TEST(CodegenRepeated, PackedScalar) {
674*61c4878aSAndroid Build Coastguard Worker // clang-format off
675*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t proto_data[] = {
676*61c4878aSAndroid Build Coastguard Worker // uint32s[], v={0, 16, 32, 48}
677*61c4878aSAndroid Build Coastguard Worker 0x0a, 0x04,
678*61c4878aSAndroid Build Coastguard Worker 0x00,
679*61c4878aSAndroid Build Coastguard Worker 0x10,
680*61c4878aSAndroid Build Coastguard Worker 0x20,
681*61c4878aSAndroid Build Coastguard Worker 0x30,
682*61c4878aSAndroid Build Coastguard Worker // fixed32s[]. v={0, 16, 32, 48}
683*61c4878aSAndroid Build Coastguard Worker 0x32, 0x10,
684*61c4878aSAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00,
685*61c4878aSAndroid Build Coastguard Worker 0x10, 0x00, 0x00, 0x00,
686*61c4878aSAndroid Build Coastguard Worker 0x20, 0x00, 0x00, 0x00,
687*61c4878aSAndroid Build Coastguard Worker 0x30, 0x00, 0x00, 0x00,
688*61c4878aSAndroid Build Coastguard Worker };
689*61c4878aSAndroid Build Coastguard Worker // clang-format on
690*61c4878aSAndroid Build Coastguard Worker
691*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(as_bytes(span(proto_data)));
692*61c4878aSAndroid Build Coastguard Worker RepeatedTest::StreamDecoder repeated_test(reader);
693*61c4878aSAndroid Build Coastguard Worker
694*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), OkStatus());
695*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Field().value(), RepeatedTest::Fields::kUint32s);
696*61c4878aSAndroid Build Coastguard Worker std::array<uint32_t, 8> uint32s{};
697*61c4878aSAndroid Build Coastguard Worker StatusWithSize sws = repeated_test.ReadUint32s(uint32s);
698*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.status(), OkStatus());
699*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 4u);
700*61c4878aSAndroid Build Coastguard Worker
701*61c4878aSAndroid Build Coastguard Worker for (unsigned short i = 0; i < 4; ++i) {
702*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(uint32s[i], i * 16u);
703*61c4878aSAndroid Build Coastguard Worker }
704*61c4878aSAndroid Build Coastguard Worker
705*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), OkStatus());
706*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Field().value(), RepeatedTest::Fields::kFixed32s);
707*61c4878aSAndroid Build Coastguard Worker std::array<uint32_t, 8> fixed32s{};
708*61c4878aSAndroid Build Coastguard Worker sws = repeated_test.ReadFixed32s(fixed32s);
709*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.status(), OkStatus());
710*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 4u);
711*61c4878aSAndroid Build Coastguard Worker
712*61c4878aSAndroid Build Coastguard Worker for (unsigned short i = 0; i < 4; ++i) {
713*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(fixed32s[i], i * 16u);
714*61c4878aSAndroid Build Coastguard Worker }
715*61c4878aSAndroid Build Coastguard Worker
716*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), Status::OutOfRange());
717*61c4878aSAndroid Build Coastguard Worker }
718*61c4878aSAndroid Build Coastguard Worker
TEST(CodegenRepeated,PackedVarintScalarExhausted)719*61c4878aSAndroid Build Coastguard Worker TEST(CodegenRepeated, PackedVarintScalarExhausted) {
720*61c4878aSAndroid Build Coastguard Worker // clang-format off
721*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t proto_data[] = {
722*61c4878aSAndroid Build Coastguard Worker // uint32s[], v={0, 16, 32, 48}
723*61c4878aSAndroid Build Coastguard Worker 0x0a, 0x04,
724*61c4878aSAndroid Build Coastguard Worker 0x00,
725*61c4878aSAndroid Build Coastguard Worker 0x10,
726*61c4878aSAndroid Build Coastguard Worker 0x20,
727*61c4878aSAndroid Build Coastguard Worker 0x30,
728*61c4878aSAndroid Build Coastguard Worker };
729*61c4878aSAndroid Build Coastguard Worker // clang-format on
730*61c4878aSAndroid Build Coastguard Worker
731*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(as_bytes(span(proto_data)));
732*61c4878aSAndroid Build Coastguard Worker RepeatedTest::StreamDecoder repeated_test(reader);
733*61c4878aSAndroid Build Coastguard Worker
734*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), OkStatus());
735*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Field().value(), RepeatedTest::Fields::kUint32s);
736*61c4878aSAndroid Build Coastguard Worker std::array<uint32_t, 2> uint32s{};
737*61c4878aSAndroid Build Coastguard Worker StatusWithSize sws = repeated_test.ReadUint32s(uint32s);
738*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.status(), Status::ResourceExhausted());
739*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 2u);
740*61c4878aSAndroid Build Coastguard Worker
741*61c4878aSAndroid Build Coastguard Worker for (unsigned short i = 0; i < 2; ++i) {
742*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(uint32s[i], i * 16u);
743*61c4878aSAndroid Build Coastguard Worker }
744*61c4878aSAndroid Build Coastguard Worker }
745*61c4878aSAndroid Build Coastguard Worker
TEST(CodegenRepeated,PackedFixedScalarExhausted)746*61c4878aSAndroid Build Coastguard Worker TEST(CodegenRepeated, PackedFixedScalarExhausted) {
747*61c4878aSAndroid Build Coastguard Worker // clang-format off
748*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t proto_data[] = {
749*61c4878aSAndroid Build Coastguard Worker // fixed32s[]. v={0, 16, 32, 48}
750*61c4878aSAndroid Build Coastguard Worker 0x32, 0x10,
751*61c4878aSAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00,
752*61c4878aSAndroid Build Coastguard Worker 0x10, 0x00, 0x00, 0x00,
753*61c4878aSAndroid Build Coastguard Worker 0x20, 0x00, 0x00, 0x00,
754*61c4878aSAndroid Build Coastguard Worker 0x30, 0x00, 0x00, 0x00,
755*61c4878aSAndroid Build Coastguard Worker };
756*61c4878aSAndroid Build Coastguard Worker // clang-format on
757*61c4878aSAndroid Build Coastguard Worker
758*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(as_bytes(span(proto_data)));
759*61c4878aSAndroid Build Coastguard Worker RepeatedTest::StreamDecoder repeated_test(reader);
760*61c4878aSAndroid Build Coastguard Worker
761*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), OkStatus());
762*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Field().value(), RepeatedTest::Fields::kFixed32s);
763*61c4878aSAndroid Build Coastguard Worker std::array<uint32_t, 2> fixed32s{};
764*61c4878aSAndroid Build Coastguard Worker StatusWithSize sws = repeated_test.ReadFixed32s(fixed32s);
765*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.status(), Status::ResourceExhausted());
766*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 0u);
767*61c4878aSAndroid Build Coastguard Worker }
768*61c4878aSAndroid Build Coastguard Worker
TEST(CodegenRepeated,PackedScalarVector)769*61c4878aSAndroid Build Coastguard Worker TEST(CodegenRepeated, PackedScalarVector) {
770*61c4878aSAndroid Build Coastguard Worker // clang-format off
771*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t proto_data[] = {
772*61c4878aSAndroid Build Coastguard Worker // uint32s[], v={0, 16, 32, 48}
773*61c4878aSAndroid Build Coastguard Worker 0x0a, 0x04,
774*61c4878aSAndroid Build Coastguard Worker 0x00,
775*61c4878aSAndroid Build Coastguard Worker 0x10,
776*61c4878aSAndroid Build Coastguard Worker 0x20,
777*61c4878aSAndroid Build Coastguard Worker 0x30,
778*61c4878aSAndroid Build Coastguard Worker // fixed32s[]. v={0, 16, 32, 48}
779*61c4878aSAndroid Build Coastguard Worker 0x32, 0x10,
780*61c4878aSAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00,
781*61c4878aSAndroid Build Coastguard Worker 0x10, 0x00, 0x00, 0x00,
782*61c4878aSAndroid Build Coastguard Worker 0x20, 0x00, 0x00, 0x00,
783*61c4878aSAndroid Build Coastguard Worker 0x30, 0x00, 0x00, 0x00,
784*61c4878aSAndroid Build Coastguard Worker };
785*61c4878aSAndroid Build Coastguard Worker // clang-format on
786*61c4878aSAndroid Build Coastguard Worker
787*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(as_bytes(span(proto_data)));
788*61c4878aSAndroid Build Coastguard Worker RepeatedTest::StreamDecoder repeated_test(reader);
789*61c4878aSAndroid Build Coastguard Worker
790*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), OkStatus());
791*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Field().value(), RepeatedTest::Fields::kUint32s);
792*61c4878aSAndroid Build Coastguard Worker pw::Vector<uint32_t, 8> uint32s{};
793*61c4878aSAndroid Build Coastguard Worker Status status = repeated_test.ReadUint32s(uint32s);
794*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(status, OkStatus());
795*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(uint32s.size(), 4u);
796*61c4878aSAndroid Build Coastguard Worker
797*61c4878aSAndroid Build Coastguard Worker for (unsigned short i = 0; i < 4; ++i) {
798*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(uint32s[i], i * 16u);
799*61c4878aSAndroid Build Coastguard Worker }
800*61c4878aSAndroid Build Coastguard Worker
801*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), OkStatus());
802*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Field().value(), RepeatedTest::Fields::kFixed32s);
803*61c4878aSAndroid Build Coastguard Worker pw::Vector<uint32_t, 8> fixed32s{};
804*61c4878aSAndroid Build Coastguard Worker status = repeated_test.ReadFixed32s(fixed32s);
805*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(status, OkStatus());
806*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(fixed32s.size(), 4u);
807*61c4878aSAndroid Build Coastguard Worker
808*61c4878aSAndroid Build Coastguard Worker for (unsigned short i = 0; i < 4; ++i) {
809*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(fixed32s[i], i * 16u);
810*61c4878aSAndroid Build Coastguard Worker }
811*61c4878aSAndroid Build Coastguard Worker
812*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), Status::OutOfRange());
813*61c4878aSAndroid Build Coastguard Worker }
814*61c4878aSAndroid Build Coastguard Worker
TEST(CodegenRepeated,PackedVarintScalarVectorFull)815*61c4878aSAndroid Build Coastguard Worker TEST(CodegenRepeated, PackedVarintScalarVectorFull) {
816*61c4878aSAndroid Build Coastguard Worker // clang-format off
817*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t proto_data[] = {
818*61c4878aSAndroid Build Coastguard Worker // uint32s[], v={0, 16, 32, 48}
819*61c4878aSAndroid Build Coastguard Worker 0x0a, 0x04,
820*61c4878aSAndroid Build Coastguard Worker 0x00,
821*61c4878aSAndroid Build Coastguard Worker 0x10,
822*61c4878aSAndroid Build Coastguard Worker 0x20,
823*61c4878aSAndroid Build Coastguard Worker 0x30,
824*61c4878aSAndroid Build Coastguard Worker };
825*61c4878aSAndroid Build Coastguard Worker // clang-format on
826*61c4878aSAndroid Build Coastguard Worker
827*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(as_bytes(span(proto_data)));
828*61c4878aSAndroid Build Coastguard Worker RepeatedTest::StreamDecoder repeated_test(reader);
829*61c4878aSAndroid Build Coastguard Worker
830*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), OkStatus());
831*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Field().value(), RepeatedTest::Fields::kUint32s);
832*61c4878aSAndroid Build Coastguard Worker pw::Vector<uint32_t, 2> uint32s{};
833*61c4878aSAndroid Build Coastguard Worker Status status = repeated_test.ReadUint32s(uint32s);
834*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(status, Status::ResourceExhausted());
835*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(uint32s.size(), 2u);
836*61c4878aSAndroid Build Coastguard Worker
837*61c4878aSAndroid Build Coastguard Worker for (unsigned short i = 0; i < 2; ++i) {
838*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(uint32s[i], i * 16u);
839*61c4878aSAndroid Build Coastguard Worker }
840*61c4878aSAndroid Build Coastguard Worker }
841*61c4878aSAndroid Build Coastguard Worker
TEST(CodegenRepeated,PackedFixedScalarVectorFull)842*61c4878aSAndroid Build Coastguard Worker TEST(CodegenRepeated, PackedFixedScalarVectorFull) {
843*61c4878aSAndroid Build Coastguard Worker // clang-format off
844*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t proto_data[] = {
845*61c4878aSAndroid Build Coastguard Worker // fixed32s[]. v={0, 16, 32, 48}
846*61c4878aSAndroid Build Coastguard Worker 0x32, 0x10,
847*61c4878aSAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00,
848*61c4878aSAndroid Build Coastguard Worker 0x10, 0x00, 0x00, 0x00,
849*61c4878aSAndroid Build Coastguard Worker 0x20, 0x00, 0x00, 0x00,
850*61c4878aSAndroid Build Coastguard Worker 0x30, 0x00, 0x00, 0x00,
851*61c4878aSAndroid Build Coastguard Worker };
852*61c4878aSAndroid Build Coastguard Worker // clang-format on
853*61c4878aSAndroid Build Coastguard Worker
854*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(as_bytes(span(proto_data)));
855*61c4878aSAndroid Build Coastguard Worker RepeatedTest::StreamDecoder repeated_test(reader);
856*61c4878aSAndroid Build Coastguard Worker
857*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), OkStatus());
858*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Field().value(), RepeatedTest::Fields::kFixed32s);
859*61c4878aSAndroid Build Coastguard Worker pw::Vector<uint32_t, 2> fixed32s{};
860*61c4878aSAndroid Build Coastguard Worker Status status = repeated_test.ReadFixed32s(fixed32s);
861*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(status, Status::ResourceExhausted());
862*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(fixed32s.size(), 0u);
863*61c4878aSAndroid Build Coastguard Worker }
864*61c4878aSAndroid Build Coastguard Worker
TEST(CodegenRepeated,PackedScalarVectorRepeated)865*61c4878aSAndroid Build Coastguard Worker TEST(CodegenRepeated, PackedScalarVectorRepeated) {
866*61c4878aSAndroid Build Coastguard Worker // clang-format off
867*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t proto_data[] = {
868*61c4878aSAndroid Build Coastguard Worker // uint32s[], v={0, 16, 32, 48}
869*61c4878aSAndroid Build Coastguard Worker 0x0a, 0x04,
870*61c4878aSAndroid Build Coastguard Worker 0x00,
871*61c4878aSAndroid Build Coastguard Worker 0x10,
872*61c4878aSAndroid Build Coastguard Worker 0x20,
873*61c4878aSAndroid Build Coastguard Worker 0x30,
874*61c4878aSAndroid Build Coastguard Worker // uint32s[], v={64, 80, 96, 112}
875*61c4878aSAndroid Build Coastguard Worker 0x0a, 0x04,
876*61c4878aSAndroid Build Coastguard Worker 0x40,
877*61c4878aSAndroid Build Coastguard Worker 0x50,
878*61c4878aSAndroid Build Coastguard Worker 0x60,
879*61c4878aSAndroid Build Coastguard Worker 0x70,
880*61c4878aSAndroid Build Coastguard Worker // fixed32s[]. v={0, 16, 32, 48}
881*61c4878aSAndroid Build Coastguard Worker 0x32, 0x10,
882*61c4878aSAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00,
883*61c4878aSAndroid Build Coastguard Worker 0x10, 0x00, 0x00, 0x00,
884*61c4878aSAndroid Build Coastguard Worker 0x20, 0x00, 0x00, 0x00,
885*61c4878aSAndroid Build Coastguard Worker 0x30, 0x00, 0x00, 0x00,
886*61c4878aSAndroid Build Coastguard Worker // fixed32s[]. v={64, 80, 96, 112}
887*61c4878aSAndroid Build Coastguard Worker 0x32, 0x10,
888*61c4878aSAndroid Build Coastguard Worker 0x40, 0x00, 0x00, 0x00,
889*61c4878aSAndroid Build Coastguard Worker 0x50, 0x00, 0x00, 0x00,
890*61c4878aSAndroid Build Coastguard Worker 0x60, 0x00, 0x00, 0x00,
891*61c4878aSAndroid Build Coastguard Worker 0x70, 0x00, 0x00, 0x00,
892*61c4878aSAndroid Build Coastguard Worker };
893*61c4878aSAndroid Build Coastguard Worker // clang-format on
894*61c4878aSAndroid Build Coastguard Worker
895*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(as_bytes(span(proto_data)));
896*61c4878aSAndroid Build Coastguard Worker RepeatedTest::StreamDecoder repeated_test(reader);
897*61c4878aSAndroid Build Coastguard Worker
898*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), OkStatus());
899*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Field().value(), RepeatedTest::Fields::kUint32s);
900*61c4878aSAndroid Build Coastguard Worker pw::Vector<uint32_t, 8> uint32s{};
901*61c4878aSAndroid Build Coastguard Worker Status status = repeated_test.ReadUint32s(uint32s);
902*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(status, OkStatus());
903*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(uint32s.size(), 4u);
904*61c4878aSAndroid Build Coastguard Worker
905*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), OkStatus());
906*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Field().value(), RepeatedTest::Fields::kUint32s);
907*61c4878aSAndroid Build Coastguard Worker status = repeated_test.ReadUint32s(uint32s);
908*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(status, OkStatus());
909*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(uint32s.size(), 8u);
910*61c4878aSAndroid Build Coastguard Worker
911*61c4878aSAndroid Build Coastguard Worker for (unsigned short i = 0; i < 8; ++i) {
912*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(uint32s[i], i * 16u);
913*61c4878aSAndroid Build Coastguard Worker }
914*61c4878aSAndroid Build Coastguard Worker
915*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), OkStatus());
916*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Field().value(), RepeatedTest::Fields::kFixed32s);
917*61c4878aSAndroid Build Coastguard Worker pw::Vector<uint32_t, 8> fixed32s{};
918*61c4878aSAndroid Build Coastguard Worker status = repeated_test.ReadFixed32s(fixed32s);
919*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(status, OkStatus());
920*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(fixed32s.size(), 4u);
921*61c4878aSAndroid Build Coastguard Worker
922*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), OkStatus());
923*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Field().value(), RepeatedTest::Fields::kFixed32s);
924*61c4878aSAndroid Build Coastguard Worker status = repeated_test.ReadFixed32s(fixed32s);
925*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(status, OkStatus());
926*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(fixed32s.size(), 8u);
927*61c4878aSAndroid Build Coastguard Worker
928*61c4878aSAndroid Build Coastguard Worker for (unsigned short i = 0; i < 8; ++i) {
929*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(fixed32s[i], i * 16u);
930*61c4878aSAndroid Build Coastguard Worker }
931*61c4878aSAndroid Build Coastguard Worker
932*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), Status::OutOfRange());
933*61c4878aSAndroid Build Coastguard Worker }
934*61c4878aSAndroid Build Coastguard Worker
TEST(CodegenRepeated,NonScalar)935*61c4878aSAndroid Build Coastguard Worker TEST(CodegenRepeated, NonScalar) {
936*61c4878aSAndroid Build Coastguard Worker // clang-format off
937*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t proto_data[] = {
938*61c4878aSAndroid Build Coastguard Worker // strings[], v={"the", "quick", "brown", "fox"}
939*61c4878aSAndroid Build Coastguard Worker 0x1a, 0x03, 't', 'h', 'e',
940*61c4878aSAndroid Build Coastguard Worker 0x1a, 0x5, 'q', 'u', 'i', 'c', 'k',
941*61c4878aSAndroid Build Coastguard Worker 0x1a, 0x5, 'b', 'r', 'o', 'w', 'n',
942*61c4878aSAndroid Build Coastguard Worker 0x1a, 0x3, 'f', 'o', 'x'
943*61c4878aSAndroid Build Coastguard Worker };
944*61c4878aSAndroid Build Coastguard Worker // clang-format on
945*61c4878aSAndroid Build Coastguard Worker
946*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(as_bytes(span(proto_data)));
947*61c4878aSAndroid Build Coastguard Worker RepeatedTest::StreamDecoder repeated_test(reader);
948*61c4878aSAndroid Build Coastguard Worker
949*61c4878aSAndroid Build Coastguard Worker constexpr std::array<std::string_view, 4> kExpectedString{
950*61c4878aSAndroid Build Coastguard Worker {{"the"}, {"quick"}, {"brown"}, {"fox"}}};
951*61c4878aSAndroid Build Coastguard Worker
952*61c4878aSAndroid Build Coastguard Worker for (unsigned short i = 0; i < 4; ++i) {
953*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), OkStatus());
954*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Field().value(), RepeatedTest::Fields::kStrings);
955*61c4878aSAndroid Build Coastguard Worker std::array<char, 32> string{};
956*61c4878aSAndroid Build Coastguard Worker StatusWithSize sws = repeated_test.ReadStrings(string);
957*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.status(), OkStatus());
958*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), kExpectedString[i].size());
959*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(std::memcmp(string.data(),
960*61c4878aSAndroid Build Coastguard Worker kExpectedString[i].data(),
961*61c4878aSAndroid Build Coastguard Worker kExpectedString[i].size()),
962*61c4878aSAndroid Build Coastguard Worker 0);
963*61c4878aSAndroid Build Coastguard Worker }
964*61c4878aSAndroid Build Coastguard Worker
965*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), Status::OutOfRange());
966*61c4878aSAndroid Build Coastguard Worker }
967*61c4878aSAndroid Build Coastguard Worker
TEST(CodegenRepeated,PackedEnum)968*61c4878aSAndroid Build Coastguard Worker TEST(CodegenRepeated, PackedEnum) {
969*61c4878aSAndroid Build Coastguard Worker // clang-format off
970*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t proto_data[] = {
971*61c4878aSAndroid Build Coastguard Worker // enums[], v={RED, GREEN, AMBER, RED}
972*61c4878aSAndroid Build Coastguard Worker 0x4a, 0x04, 0x00, 0x02, 0x01, 0x00,
973*61c4878aSAndroid Build Coastguard Worker };
974*61c4878aSAndroid Build Coastguard Worker // clang-format on
975*61c4878aSAndroid Build Coastguard Worker
976*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(as_bytes(span(proto_data)));
977*61c4878aSAndroid Build Coastguard Worker RepeatedTest::StreamDecoder repeated_test(reader);
978*61c4878aSAndroid Build Coastguard Worker
979*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), OkStatus());
980*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Field().value(), RepeatedTest::Fields::kEnums);
981*61c4878aSAndroid Build Coastguard Worker std::array<Enum, 4> enums{};
982*61c4878aSAndroid Build Coastguard Worker StatusWithSize sws = repeated_test.ReadEnums(enums);
983*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.status(), OkStatus());
984*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(sws.size(), 4u);
985*61c4878aSAndroid Build Coastguard Worker
986*61c4878aSAndroid Build Coastguard Worker for (unsigned short i = 0; i < 4; ++i) {
987*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(IsValidEnum(enums[i]));
988*61c4878aSAndroid Build Coastguard Worker }
989*61c4878aSAndroid Build Coastguard Worker
990*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(enums[0], Enum::RED);
991*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(enums[1], Enum::GREEN);
992*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(enums[2], Enum::AMBER);
993*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(enums[3], Enum::RED);
994*61c4878aSAndroid Build Coastguard Worker
995*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), Status::OutOfRange());
996*61c4878aSAndroid Build Coastguard Worker }
997*61c4878aSAndroid Build Coastguard Worker
TEST(CodegenRepeated,PackedEnumVector)998*61c4878aSAndroid Build Coastguard Worker TEST(CodegenRepeated, PackedEnumVector) {
999*61c4878aSAndroid Build Coastguard Worker // clang-format off
1000*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t proto_data[] = {
1001*61c4878aSAndroid Build Coastguard Worker // enums[], v={RED, GREEN, AMBER, RED}
1002*61c4878aSAndroid Build Coastguard Worker 0x4a, 0x04, 0x00, 0x02, 0x01, 0x00,
1003*61c4878aSAndroid Build Coastguard Worker };
1004*61c4878aSAndroid Build Coastguard Worker // clang-format on
1005*61c4878aSAndroid Build Coastguard Worker
1006*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(as_bytes(span(proto_data)));
1007*61c4878aSAndroid Build Coastguard Worker RepeatedTest::StreamDecoder repeated_test(reader);
1008*61c4878aSAndroid Build Coastguard Worker
1009*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), OkStatus());
1010*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Field().value(), RepeatedTest::Fields::kEnums);
1011*61c4878aSAndroid Build Coastguard Worker pw::Vector<Enum, 4> enums{};
1012*61c4878aSAndroid Build Coastguard Worker Status status = repeated_test.ReadEnums(enums);
1013*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(status, OkStatus());
1014*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(enums.size(), 4u);
1015*61c4878aSAndroid Build Coastguard Worker
1016*61c4878aSAndroid Build Coastguard Worker for (unsigned short i = 0; i < 4; ++i) {
1017*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(IsValidEnum(enums[i]));
1018*61c4878aSAndroid Build Coastguard Worker }
1019*61c4878aSAndroid Build Coastguard Worker
1020*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(enums[0], Enum::RED);
1021*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(enums[1], Enum::GREEN);
1022*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(enums[2], Enum::AMBER);
1023*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(enums[3], Enum::RED);
1024*61c4878aSAndroid Build Coastguard Worker
1025*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(repeated_test.Next(), Status::OutOfRange());
1026*61c4878aSAndroid Build Coastguard Worker }
1027*61c4878aSAndroid Build Coastguard Worker
TEST(Codegen,FindBuffer)1028*61c4878aSAndroid Build Coastguard Worker TEST(Codegen, FindBuffer) {
1029*61c4878aSAndroid Build Coastguard Worker // clang-format off
1030*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t proto_data[] = {
1031*61c4878aSAndroid Build Coastguard Worker // pigweed.magic_number
1032*61c4878aSAndroid Build Coastguard Worker 0x08, 0x49,
1033*61c4878aSAndroid Build Coastguard Worker // pigweed.ziggy
1034*61c4878aSAndroid Build Coastguard Worker 0x10, 0xdd, 0x01,
1035*61c4878aSAndroid Build Coastguard Worker // pigweed.cycles
1036*61c4878aSAndroid Build Coastguard Worker 0x19, 0xde, 0xad, 0xca, 0xfe, 0x10, 0x20, 0x30, 0x40,
1037*61c4878aSAndroid Build Coastguard Worker // pigweed.ratio
1038*61c4878aSAndroid Build Coastguard Worker 0x25, 0x8f, 0xc2, 0xb5, 0xbf,
1039*61c4878aSAndroid Build Coastguard Worker // pigweed.error_message
1040*61c4878aSAndroid Build Coastguard Worker 0x2a, 0x10, 'n', 'o', 't', ' ', 'a', ' ',
1041*61c4878aSAndroid Build Coastguard Worker 't', 'y', 'p', 'e', 'w', 'r', 'i', 't', 'e', 'r',
1042*61c4878aSAndroid Build Coastguard Worker // pigweed.bin
1043*61c4878aSAndroid Build Coastguard Worker 0x40, 0x01,
1044*61c4878aSAndroid Build Coastguard Worker // pigweed.pigweed
1045*61c4878aSAndroid Build Coastguard Worker 0x3a, 0x02,
1046*61c4878aSAndroid Build Coastguard Worker // pigweed.pigweed.status
1047*61c4878aSAndroid Build Coastguard Worker 0x08, 0x02,
1048*61c4878aSAndroid Build Coastguard Worker // pigweed.proto
1049*61c4878aSAndroid Build Coastguard Worker 0x4a, 0x56,
1050*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.bin
1051*61c4878aSAndroid Build Coastguard Worker 0x10, 0x00,
1052*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.pigweed_pigweed_bin
1053*61c4878aSAndroid Build Coastguard Worker 0x18, 0x00,
1054*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.pigweed_protobuf_bin
1055*61c4878aSAndroid Build Coastguard Worker 0x20, 0x01,
1056*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.meta
1057*61c4878aSAndroid Build Coastguard Worker 0x2a, 0x0f,
1058*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.meta.file_name
1059*61c4878aSAndroid Build Coastguard Worker 0x0a, 0x0b, '/', 'e', 't', 'c', '/', 'p', 'a', 's', 's', 'w', 'd',
1060*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.meta.status
1061*61c4878aSAndroid Build Coastguard Worker 0x10, 0x02,
1062*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed
1063*61c4878aSAndroid Build Coastguard Worker 0x0a, 0x3d,
1064*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.error_message
1065*61c4878aSAndroid Build Coastguard Worker 0x2a, 0x10, 'h', 'e', 'r', 'e', ' ', 'w', 'e', ' ',
1066*61c4878aSAndroid Build Coastguard Worker 'g', 'o', ' ', 'a', 'g', 'a', 'i', 'n',
1067*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.magic_number
1068*61c4878aSAndroid Build Coastguard Worker 0x08, 0xe8, 0x04,
1069*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.device_info
1070*61c4878aSAndroid Build Coastguard Worker 0x32, 0x26,
1071*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.device_info.attributes[0]
1072*61c4878aSAndroid Build Coastguard Worker 0x22, 0x10,
1073*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.device_info.attributes[0].key
1074*61c4878aSAndroid Build Coastguard Worker 0x0a, 0x07, 'v', 'e', 'r', 's', 'i', 'o', 'n',
1075*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.device_info.attributes[0].value
1076*61c4878aSAndroid Build Coastguard Worker 0x12, 0x05, '5', '.', '3', '.', '1',
1077*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.device_info.attributes[1]
1078*61c4878aSAndroid Build Coastguard Worker 0x22, 0x10,
1079*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.device_info.attributes[1].key
1080*61c4878aSAndroid Build Coastguard Worker 0x0a, 0x04, 'c', 'h', 'i', 'p',
1081*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.device_info.attributes[1].value
1082*61c4878aSAndroid Build Coastguard Worker 0x12, 0x08, 'l', 'e', 'f', 't', '-', 's', 'o', 'c',
1083*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.device_info.status
1084*61c4878aSAndroid Build Coastguard Worker 0x18, 0x03,
1085*61c4878aSAndroid Build Coastguard Worker // pigweed.id[0]
1086*61c4878aSAndroid Build Coastguard Worker 0x52, 0x02,
1087*61c4878aSAndroid Build Coastguard Worker // pigweed.id[0].id
1088*61c4878aSAndroid Build Coastguard Worker 0x08, 0x31,
1089*61c4878aSAndroid Build Coastguard Worker // pigweed.id[1]
1090*61c4878aSAndroid Build Coastguard Worker 0x52, 0x02,
1091*61c4878aSAndroid Build Coastguard Worker // pigweed.id[1].id
1092*61c4878aSAndroid Build Coastguard Worker 0x08, 0x39,
1093*61c4878aSAndroid Build Coastguard Worker // pigweed.id[2]
1094*61c4878aSAndroid Build Coastguard Worker 0x52, 0x02,
1095*61c4878aSAndroid Build Coastguard Worker // pigweed.id[2].id
1096*61c4878aSAndroid Build Coastguard Worker 0x08, 0x4b,
1097*61c4878aSAndroid Build Coastguard Worker // pigweed.id[3]
1098*61c4878aSAndroid Build Coastguard Worker 0x52, 0x02,
1099*61c4878aSAndroid Build Coastguard Worker // pigweed.id[3].id
1100*61c4878aSAndroid Build Coastguard Worker 0x08, 0x67,
1101*61c4878aSAndroid Build Coastguard Worker // pigweed.id[4]
1102*61c4878aSAndroid Build Coastguard Worker 0x52, 0x03,
1103*61c4878aSAndroid Build Coastguard Worker // pigweed.id[4].id
1104*61c4878aSAndroid Build Coastguard Worker 0x08, 0x8d, 0x01
1105*61c4878aSAndroid Build Coastguard Worker
1106*61c4878aSAndroid Build Coastguard Worker };
1107*61c4878aSAndroid Build Coastguard Worker // clang-format on
1108*61c4878aSAndroid Build Coastguard Worker
1109*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Pigweed::FindMagicNumber(as_bytes(span(proto_data))).value(),
1110*61c4878aSAndroid Build Coastguard Worker 0x49u);
1111*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Pigweed::FindZiggy(as_bytes(span(proto_data))).value(), -111);
1112*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Pigweed::FindCycles(as_bytes(span(proto_data))).value(),
1113*61c4878aSAndroid Build Coastguard Worker 0x40302010fecaaddeu);
1114*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Pigweed::FindRatio(as_bytes(span(proto_data))).value(), -1.42f);
1115*61c4878aSAndroid Build Coastguard Worker
1116*61c4878aSAndroid Build Coastguard Worker auto result = Pigweed::FindErrorMessage(as_bytes(span(proto_data)));
1117*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.status(), OkStatus());
1118*61c4878aSAndroid Build Coastguard Worker InlineString<32> str(*result);
1119*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ(str.c_str(), "not a typewriter");
1120*61c4878aSAndroid Build Coastguard Worker
1121*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Pigweed::FindBin(as_bytes(span(proto_data))).value(),
1122*61c4878aSAndroid Build Coastguard Worker Pigweed::Protobuf::Binary::ZERO);
1123*61c4878aSAndroid Build Coastguard Worker
1124*61c4878aSAndroid Build Coastguard Worker Result<ConstByteSpan> pigweed =
1125*61c4878aSAndroid Build Coastguard Worker Pigweed::FindPigweed(as_bytes(span(proto_data)));
1126*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.status(), OkStatus());
1127*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(pigweed->size(), 2u);
1128*61c4878aSAndroid Build Coastguard Worker
1129*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Pigweed::Pigweed::FindStatus(*pigweed).value(),
1130*61c4878aSAndroid Build Coastguard Worker Bool::FILE_NOT_FOUND);
1131*61c4878aSAndroid Build Coastguard Worker
1132*61c4878aSAndroid Build Coastguard Worker // Nonexisting fields.
1133*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Pigweed::FindData(as_bytes(span(proto_data))).status(),
1134*61c4878aSAndroid Build Coastguard Worker Status::NotFound());
1135*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Pigweed::FindDescription(as_bytes(span(proto_data))).status(),
1136*61c4878aSAndroid Build Coastguard Worker Status::NotFound());
1137*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Pigweed::FindSpecialProperty(as_bytes(span(proto_data))).status(),
1138*61c4878aSAndroid Build Coastguard Worker Status::NotFound());
1139*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Pigweed::FindBungle(as_bytes(span(proto_data))).status(),
1140*61c4878aSAndroid Build Coastguard Worker Status::NotFound());
1141*61c4878aSAndroid Build Coastguard Worker }
1142*61c4878aSAndroid Build Coastguard Worker
TEST(Codegen,FindStream)1143*61c4878aSAndroid Build Coastguard Worker TEST(Codegen, FindStream) {
1144*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader({});
1145*61c4878aSAndroid Build Coastguard Worker // clang-format off
1146*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t proto_data[] = {
1147*61c4878aSAndroid Build Coastguard Worker // pigweed.magic_number
1148*61c4878aSAndroid Build Coastguard Worker 0x08, 0x49,
1149*61c4878aSAndroid Build Coastguard Worker // pigweed.ziggy
1150*61c4878aSAndroid Build Coastguard Worker 0x10, 0xdd, 0x01,
1151*61c4878aSAndroid Build Coastguard Worker // pigweed.cycles
1152*61c4878aSAndroid Build Coastguard Worker 0x19, 0xde, 0xad, 0xca, 0xfe, 0x10, 0x20, 0x30, 0x40,
1153*61c4878aSAndroid Build Coastguard Worker // pigweed.ratio
1154*61c4878aSAndroid Build Coastguard Worker 0x25, 0x8f, 0xc2, 0xb5, 0xbf,
1155*61c4878aSAndroid Build Coastguard Worker // pigweed.error_message
1156*61c4878aSAndroid Build Coastguard Worker 0x2a, 0x10, 'n', 'o', 't', ' ', 'a', ' ',
1157*61c4878aSAndroid Build Coastguard Worker 't', 'y', 'p', 'e', 'w', 'r', 'i', 't', 'e', 'r',
1158*61c4878aSAndroid Build Coastguard Worker // pigweed.bin
1159*61c4878aSAndroid Build Coastguard Worker 0x40, 0x01,
1160*61c4878aSAndroid Build Coastguard Worker // pigweed.pigweed
1161*61c4878aSAndroid Build Coastguard Worker 0x3a, 0x02,
1162*61c4878aSAndroid Build Coastguard Worker // pigweed.pigweed.status
1163*61c4878aSAndroid Build Coastguard Worker 0x08, 0x02,
1164*61c4878aSAndroid Build Coastguard Worker // pigweed.proto
1165*61c4878aSAndroid Build Coastguard Worker 0x4a, 0x56,
1166*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.bin
1167*61c4878aSAndroid Build Coastguard Worker 0x10, 0x00,
1168*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.pigweed_pigweed_bin
1169*61c4878aSAndroid Build Coastguard Worker 0x18, 0x00,
1170*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.pigweed_protobuf_bin
1171*61c4878aSAndroid Build Coastguard Worker 0x20, 0x01,
1172*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.meta
1173*61c4878aSAndroid Build Coastguard Worker 0x2a, 0x0f,
1174*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.meta.file_name
1175*61c4878aSAndroid Build Coastguard Worker 0x0a, 0x0b, '/', 'e', 't', 'c', '/', 'p', 'a', 's', 's', 'w', 'd',
1176*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.meta.status
1177*61c4878aSAndroid Build Coastguard Worker 0x10, 0x02,
1178*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed
1179*61c4878aSAndroid Build Coastguard Worker 0x0a, 0x3d,
1180*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.error_message
1181*61c4878aSAndroid Build Coastguard Worker 0x2a, 0x10, 'h', 'e', 'r', 'e', ' ', 'w', 'e', ' ',
1182*61c4878aSAndroid Build Coastguard Worker 'g', 'o', ' ', 'a', 'g', 'a', 'i', 'n',
1183*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.magic_number
1184*61c4878aSAndroid Build Coastguard Worker 0x08, 0xe8, 0x04,
1185*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.device_info
1186*61c4878aSAndroid Build Coastguard Worker 0x32, 0x26,
1187*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.device_info.attributes[0]
1188*61c4878aSAndroid Build Coastguard Worker 0x22, 0x10,
1189*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.device_info.attributes[0].key
1190*61c4878aSAndroid Build Coastguard Worker 0x0a, 0x07, 'v', 'e', 'r', 's', 'i', 'o', 'n',
1191*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.device_info.attributes[0].value
1192*61c4878aSAndroid Build Coastguard Worker 0x12, 0x05, '5', '.', '3', '.', '1',
1193*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.device_info.attributes[1]
1194*61c4878aSAndroid Build Coastguard Worker 0x22, 0x10,
1195*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.device_info.attributes[1].key
1196*61c4878aSAndroid Build Coastguard Worker 0x0a, 0x04, 'c', 'h', 'i', 'p',
1197*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.device_info.attributes[1].value
1198*61c4878aSAndroid Build Coastguard Worker 0x12, 0x08, 'l', 'e', 'f', 't', '-', 's', 'o', 'c',
1199*61c4878aSAndroid Build Coastguard Worker // pigweed.proto.nested_pigweed.device_info.status
1200*61c4878aSAndroid Build Coastguard Worker 0x18, 0x03,
1201*61c4878aSAndroid Build Coastguard Worker // pigweed.id[0]
1202*61c4878aSAndroid Build Coastguard Worker 0x52, 0x02,
1203*61c4878aSAndroid Build Coastguard Worker // pigweed.id[0].id
1204*61c4878aSAndroid Build Coastguard Worker 0x08, 0x31,
1205*61c4878aSAndroid Build Coastguard Worker // pigweed.id[1]
1206*61c4878aSAndroid Build Coastguard Worker 0x52, 0x02,
1207*61c4878aSAndroid Build Coastguard Worker // pigweed.id[1].id
1208*61c4878aSAndroid Build Coastguard Worker 0x08, 0x39,
1209*61c4878aSAndroid Build Coastguard Worker // pigweed.id[2]
1210*61c4878aSAndroid Build Coastguard Worker 0x52, 0x02,
1211*61c4878aSAndroid Build Coastguard Worker // pigweed.id[2].id
1212*61c4878aSAndroid Build Coastguard Worker 0x08, 0x4b,
1213*61c4878aSAndroid Build Coastguard Worker // pigweed.id[3]
1214*61c4878aSAndroid Build Coastguard Worker 0x52, 0x02,
1215*61c4878aSAndroid Build Coastguard Worker // pigweed.id[3].id
1216*61c4878aSAndroid Build Coastguard Worker 0x08, 0x67,
1217*61c4878aSAndroid Build Coastguard Worker // pigweed.id[4]
1218*61c4878aSAndroid Build Coastguard Worker 0x52, 0x03,
1219*61c4878aSAndroid Build Coastguard Worker // pigweed.id[4].id
1220*61c4878aSAndroid Build Coastguard Worker 0x08, 0x8d, 0x01
1221*61c4878aSAndroid Build Coastguard Worker
1222*61c4878aSAndroid Build Coastguard Worker };
1223*61c4878aSAndroid Build Coastguard Worker // clang-format on
1224*61c4878aSAndroid Build Coastguard Worker
1225*61c4878aSAndroid Build Coastguard Worker reader = stream::MemoryReader(as_bytes(span(proto_data)));
1226*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Pigweed::FindMagicNumber(reader).value(), 0x49u);
1227*61c4878aSAndroid Build Coastguard Worker
1228*61c4878aSAndroid Build Coastguard Worker reader = stream::MemoryReader(as_bytes(span(proto_data)));
1229*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Pigweed::FindZiggy(reader).value(), -111);
1230*61c4878aSAndroid Build Coastguard Worker
1231*61c4878aSAndroid Build Coastguard Worker reader = stream::MemoryReader(as_bytes(span(proto_data)));
1232*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Pigweed::FindCycles(reader).value(), 0x40302010fecaaddeu);
1233*61c4878aSAndroid Build Coastguard Worker
1234*61c4878aSAndroid Build Coastguard Worker reader = stream::MemoryReader(as_bytes(span(proto_data)));
1235*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Pigweed::FindRatio(reader).value(), -1.42f);
1236*61c4878aSAndroid Build Coastguard Worker
1237*61c4878aSAndroid Build Coastguard Worker reader = stream::MemoryReader(as_bytes(span(proto_data)));
1238*61c4878aSAndroid Build Coastguard Worker char str[32] = {'\0'};
1239*61c4878aSAndroid Build Coastguard Worker auto result = Pigweed::FindErrorMessage(reader, str);
1240*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.status(), OkStatus());
1241*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.size(), 16u);
1242*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ(str, "not a typewriter");
1243*61c4878aSAndroid Build Coastguard Worker
1244*61c4878aSAndroid Build Coastguard Worker reader = stream::MemoryReader(as_bytes(span(proto_data)));
1245*61c4878aSAndroid Build Coastguard Worker InlineString<32> error_message;
1246*61c4878aSAndroid Build Coastguard Worker result = Pigweed::FindErrorMessage(reader, error_message);
1247*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.status(), OkStatus());
1248*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.size(), 16u);
1249*61c4878aSAndroid Build Coastguard Worker EXPECT_STREQ(error_message.c_str(), "not a typewriter");
1250*61c4878aSAndroid Build Coastguard Worker
1251*61c4878aSAndroid Build Coastguard Worker reader = stream::MemoryReader(as_bytes(span(proto_data)));
1252*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Pigweed::FindBin(reader).value(), Pigweed::Protobuf::Binary::ZERO);
1253*61c4878aSAndroid Build Coastguard Worker
1254*61c4878aSAndroid Build Coastguard Worker // Nonexisting fields.
1255*61c4878aSAndroid Build Coastguard Worker reader = stream::MemoryReader(as_bytes(span(proto_data)));
1256*61c4878aSAndroid Build Coastguard Worker std::byte buf[32];
1257*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Pigweed::FindData(reader, buf).status(), Status::NotFound());
1258*61c4878aSAndroid Build Coastguard Worker
1259*61c4878aSAndroid Build Coastguard Worker reader = stream::MemoryReader(as_bytes(span(proto_data)));
1260*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Pigweed::FindDescription(reader, str).status(), Status::NotFound());
1261*61c4878aSAndroid Build Coastguard Worker
1262*61c4878aSAndroid Build Coastguard Worker reader = stream::MemoryReader(as_bytes(span(proto_data)));
1263*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Pigweed::FindSpecialProperty(reader).status(), Status::NotFound());
1264*61c4878aSAndroid Build Coastguard Worker
1265*61c4878aSAndroid Build Coastguard Worker reader = stream::MemoryReader(as_bytes(span(proto_data)));
1266*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Pigweed::FindBungle(reader).status(), Status::NotFound());
1267*61c4878aSAndroid Build Coastguard Worker
1268*61c4878aSAndroid Build Coastguard Worker // Advance the stream past `magic_number`, then attempt to find it.
1269*61c4878aSAndroid Build Coastguard Worker reader = stream::MemoryReader(as_bytes(span(proto_data)));
1270*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Pigweed::FindZiggy(reader).status(), OkStatus());
1271*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(Pigweed::FindMagicNumber(reader).status(), Status::NotFound());
1272*61c4878aSAndroid Build Coastguard Worker }
1273*61c4878aSAndroid Build Coastguard Worker
TEST(CodegenRepeated,Find)1274*61c4878aSAndroid Build Coastguard Worker TEST(CodegenRepeated, Find) {
1275*61c4878aSAndroid Build Coastguard Worker // clang-format off
1276*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t proto_data[] = {
1277*61c4878aSAndroid Build Coastguard Worker // uint32s[], v={0, 16, 32, 48}
1278*61c4878aSAndroid Build Coastguard Worker 0x08, 0x00,
1279*61c4878aSAndroid Build Coastguard Worker 0x08, 0x10,
1280*61c4878aSAndroid Build Coastguard Worker 0x08, 0x20,
1281*61c4878aSAndroid Build Coastguard Worker 0x08, 0x30,
1282*61c4878aSAndroid Build Coastguard Worker // fixed32s[]. v={0, 16, 32, 48}
1283*61c4878aSAndroid Build Coastguard Worker 0x35, 0x00, 0x00, 0x00, 0x00,
1284*61c4878aSAndroid Build Coastguard Worker 0x35, 0x10, 0x00, 0x00, 0x00,
1285*61c4878aSAndroid Build Coastguard Worker 0x35, 0x20, 0x00, 0x00, 0x00,
1286*61c4878aSAndroid Build Coastguard Worker 0x35, 0x30, 0x00, 0x00, 0x00,
1287*61c4878aSAndroid Build Coastguard Worker };
1288*61c4878aSAndroid Build Coastguard Worker // clang-format on
1289*61c4878aSAndroid Build Coastguard Worker
1290*61c4878aSAndroid Build Coastguard Worker Uint32Finder uint32s_finder =
1291*61c4878aSAndroid Build Coastguard Worker RepeatedTest::FindUint32s(as_bytes(span(proto_data)));
1292*61c4878aSAndroid Build Coastguard Worker
1293*61c4878aSAndroid Build Coastguard Worker for (uint32_t i = 0; i < 4; ++i) {
1294*61c4878aSAndroid Build Coastguard Worker Result<uint32_t> result = uint32s_finder.Next();
1295*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.status(), OkStatus());
1296*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.value(), i * 16u);
1297*61c4878aSAndroid Build Coastguard Worker }
1298*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(uint32s_finder.Next().status(), Status::NotFound());
1299*61c4878aSAndroid Build Coastguard Worker
1300*61c4878aSAndroid Build Coastguard Worker Fixed32Finder fixed32s_finder =
1301*61c4878aSAndroid Build Coastguard Worker RepeatedTest::FindFixed32s(as_bytes(span(proto_data)));
1302*61c4878aSAndroid Build Coastguard Worker
1303*61c4878aSAndroid Build Coastguard Worker for (unsigned i = 0; i < 4; ++i) {
1304*61c4878aSAndroid Build Coastguard Worker Result<uint32_t> result = fixed32s_finder.Next();
1305*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.status(), OkStatus());
1306*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.value(), i * 16u);
1307*61c4878aSAndroid Build Coastguard Worker }
1308*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(fixed32s_finder.Next().status(), Status::NotFound());
1309*61c4878aSAndroid Build Coastguard Worker }
1310*61c4878aSAndroid Build Coastguard Worker
TEST(CodegenRepeated,FindStream)1311*61c4878aSAndroid Build Coastguard Worker TEST(CodegenRepeated, FindStream) {
1312*61c4878aSAndroid Build Coastguard Worker // clang-format off
1313*61c4878aSAndroid Build Coastguard Worker constexpr uint8_t proto_data[] = {
1314*61c4878aSAndroid Build Coastguard Worker // uint32s[], v={0, 16, 32, 48}
1315*61c4878aSAndroid Build Coastguard Worker 0x08, 0x00,
1316*61c4878aSAndroid Build Coastguard Worker 0x08, 0x10,
1317*61c4878aSAndroid Build Coastguard Worker 0x08, 0x20,
1318*61c4878aSAndroid Build Coastguard Worker 0x08, 0x30,
1319*61c4878aSAndroid Build Coastguard Worker // fixed32s[]. v={0, 16, 32, 48}
1320*61c4878aSAndroid Build Coastguard Worker 0x35, 0x00, 0x00, 0x00, 0x00,
1321*61c4878aSAndroid Build Coastguard Worker 0x35, 0x10, 0x00, 0x00, 0x00,
1322*61c4878aSAndroid Build Coastguard Worker 0x35, 0x20, 0x00, 0x00, 0x00,
1323*61c4878aSAndroid Build Coastguard Worker 0x35, 0x30, 0x00, 0x00, 0x00,
1324*61c4878aSAndroid Build Coastguard Worker };
1325*61c4878aSAndroid Build Coastguard Worker // clang-format on
1326*61c4878aSAndroid Build Coastguard Worker
1327*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(as_bytes(span(proto_data)));
1328*61c4878aSAndroid Build Coastguard Worker Uint32StreamFinder uint32s_finder = RepeatedTest::FindUint32s(reader);
1329*61c4878aSAndroid Build Coastguard Worker
1330*61c4878aSAndroid Build Coastguard Worker for (uint32_t i = 0; i < 4; ++i) {
1331*61c4878aSAndroid Build Coastguard Worker Result<uint32_t> result = uint32s_finder.Next();
1332*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.status(), OkStatus());
1333*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.value(), i * 16u);
1334*61c4878aSAndroid Build Coastguard Worker }
1335*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(uint32s_finder.Next().status(), Status::NotFound());
1336*61c4878aSAndroid Build Coastguard Worker
1337*61c4878aSAndroid Build Coastguard Worker ASSERT_EQ(reader.Seek(0), OkStatus());
1338*61c4878aSAndroid Build Coastguard Worker
1339*61c4878aSAndroid Build Coastguard Worker Fixed32StreamFinder fixed32s_finder = RepeatedTest::FindFixed32s(reader);
1340*61c4878aSAndroid Build Coastguard Worker
1341*61c4878aSAndroid Build Coastguard Worker for (unsigned i = 0; i < 4; ++i) {
1342*61c4878aSAndroid Build Coastguard Worker Result<uint32_t> result = fixed32s_finder.Next();
1343*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.status(), OkStatus());
1344*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(result.value(), i * 16u);
1345*61c4878aSAndroid Build Coastguard Worker }
1346*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(fixed32s_finder.Next().status(), Status::NotFound());
1347*61c4878aSAndroid Build Coastguard Worker }
1348*61c4878aSAndroid Build Coastguard Worker
1349*61c4878aSAndroid Build Coastguard Worker } // namespace
1350*61c4878aSAndroid Build Coastguard Worker } // namespace pw::protobuf
1351