1*61c4878aSAndroid Build Coastguard Worker // Copyright 2021 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
15*61c4878aSAndroid Build Coastguard Worker #include "pw_varint/stream.h"
16*61c4878aSAndroid Build Coastguard Worker
17*61c4878aSAndroid Build Coastguard Worker #include <array>
18*61c4878aSAndroid Build Coastguard Worker #include <cstddef>
19*61c4878aSAndroid Build Coastguard Worker #include <cstdint>
20*61c4878aSAndroid Build Coastguard Worker #include <cstring>
21*61c4878aSAndroid Build Coastguard Worker #include <limits>
22*61c4878aSAndroid Build Coastguard Worker
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 #include "pw_varint/varint.h"
26*61c4878aSAndroid Build Coastguard Worker
27*61c4878aSAndroid Build Coastguard Worker namespace pw::varint {
28*61c4878aSAndroid Build Coastguard Worker namespace {
29*61c4878aSAndroid Build Coastguard Worker template <size_t kStringSize>
MakeBuffer(const char (& data)[kStringSize])30*61c4878aSAndroid Build Coastguard Worker auto MakeBuffer(const char (&data)[kStringSize]) {
31*61c4878aSAndroid Build Coastguard Worker constexpr size_t kSizeBytes = kStringSize - 1;
32*61c4878aSAndroid Build Coastguard Worker static_assert(kSizeBytes <= 10, "Varint arrays never need be larger than 10");
33*61c4878aSAndroid Build Coastguard Worker
34*61c4878aSAndroid Build Coastguard Worker std::array<std::byte, kSizeBytes> array;
35*61c4878aSAndroid Build Coastguard Worker std::memcpy(array.data(), data, kSizeBytes);
36*61c4878aSAndroid Build Coastguard Worker return array;
37*61c4878aSAndroid Build Coastguard Worker }
38*61c4878aSAndroid Build Coastguard Worker } // namespace
39*61c4878aSAndroid Build Coastguard Worker
TEST(VarintRead,Signed64_SingleByte)40*61c4878aSAndroid Build Coastguard Worker TEST(VarintRead, Signed64_SingleByte) {
41*61c4878aSAndroid Build Coastguard Worker int64_t value = -1234;
42*61c4878aSAndroid Build Coastguard Worker
43*61c4878aSAndroid Build Coastguard Worker {
44*61c4878aSAndroid Build Coastguard Worker const auto buffer = MakeBuffer("\x00");
45*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
46*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value);
47*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(sws.ok());
48*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 1u);
49*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 0);
50*61c4878aSAndroid Build Coastguard Worker }
51*61c4878aSAndroid Build Coastguard Worker
52*61c4878aSAndroid Build Coastguard Worker {
53*61c4878aSAndroid Build Coastguard Worker const auto buffer = MakeBuffer("\x01");
54*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
55*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value);
56*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(sws.ok());
57*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 1u);
58*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, -1);
59*61c4878aSAndroid Build Coastguard Worker }
60*61c4878aSAndroid Build Coastguard Worker
61*61c4878aSAndroid Build Coastguard Worker {
62*61c4878aSAndroid Build Coastguard Worker const auto buffer = MakeBuffer("\x02");
63*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
64*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value);
65*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(sws.ok());
66*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 1u);
67*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 1);
68*61c4878aSAndroid Build Coastguard Worker }
69*61c4878aSAndroid Build Coastguard Worker
70*61c4878aSAndroid Build Coastguard Worker {
71*61c4878aSAndroid Build Coastguard Worker const auto buffer = MakeBuffer("\x03");
72*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
73*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value);
74*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(sws.ok());
75*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 1u);
76*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, -2);
77*61c4878aSAndroid Build Coastguard Worker }
78*61c4878aSAndroid Build Coastguard Worker
79*61c4878aSAndroid Build Coastguard Worker {
80*61c4878aSAndroid Build Coastguard Worker const auto buffer = MakeBuffer("\x04");
81*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
82*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value);
83*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(sws.ok());
84*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 1u);
85*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 2);
86*61c4878aSAndroid Build Coastguard Worker }
87*61c4878aSAndroid Build Coastguard Worker }
88*61c4878aSAndroid Build Coastguard Worker
TEST(VarintRead,Signed64_MultiByte)89*61c4878aSAndroid Build Coastguard Worker TEST(VarintRead, Signed64_MultiByte) {
90*61c4878aSAndroid Build Coastguard Worker int64_t value = -1234;
91*61c4878aSAndroid Build Coastguard Worker
92*61c4878aSAndroid Build Coastguard Worker {
93*61c4878aSAndroid Build Coastguard Worker const auto buffer = MakeBuffer("\x80\x01");
94*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
95*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value);
96*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(sws.ok());
97*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 2u);
98*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 64);
99*61c4878aSAndroid Build Coastguard Worker }
100*61c4878aSAndroid Build Coastguard Worker
101*61c4878aSAndroid Build Coastguard Worker {
102*61c4878aSAndroid Build Coastguard Worker const auto buffer = MakeBuffer("\x81\x01");
103*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
104*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value);
105*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(sws.ok());
106*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 2u);
107*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, -65);
108*61c4878aSAndroid Build Coastguard Worker }
109*61c4878aSAndroid Build Coastguard Worker
110*61c4878aSAndroid Build Coastguard Worker {
111*61c4878aSAndroid Build Coastguard Worker const auto buffer = MakeBuffer("\x82\x01");
112*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
113*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value);
114*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(sws.ok());
115*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 2u);
116*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 65);
117*61c4878aSAndroid Build Coastguard Worker }
118*61c4878aSAndroid Build Coastguard Worker
119*61c4878aSAndroid Build Coastguard Worker {
120*61c4878aSAndroid Build Coastguard Worker const auto buffer = MakeBuffer("\xff\xff\xff\xff\x0f");
121*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
122*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value);
123*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(sws.ok());
124*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 5u);
125*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, std::numeric_limits<int32_t>::min());
126*61c4878aSAndroid Build Coastguard Worker }
127*61c4878aSAndroid Build Coastguard Worker
128*61c4878aSAndroid Build Coastguard Worker {
129*61c4878aSAndroid Build Coastguard Worker const auto buffer = MakeBuffer("\xfe\xff\xff\xff\x0f");
130*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
131*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value);
132*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(sws.ok());
133*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 5u);
134*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, std::numeric_limits<int32_t>::max());
135*61c4878aSAndroid Build Coastguard Worker }
136*61c4878aSAndroid Build Coastguard Worker
137*61c4878aSAndroid Build Coastguard Worker {
138*61c4878aSAndroid Build Coastguard Worker const auto buffer = MakeBuffer("\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01");
139*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
140*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value);
141*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(sws.ok());
142*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 10u);
143*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, std::numeric_limits<int64_t>::min());
144*61c4878aSAndroid Build Coastguard Worker }
145*61c4878aSAndroid Build Coastguard Worker
146*61c4878aSAndroid Build Coastguard Worker {
147*61c4878aSAndroid Build Coastguard Worker const auto buffer = MakeBuffer("\xfe\xff\xff\xff\xff\xff\xff\xff\xff\x01");
148*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
149*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value);
150*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(sws.ok());
151*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 10u);
152*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, std::numeric_limits<int64_t>::max());
153*61c4878aSAndroid Build Coastguard Worker }
154*61c4878aSAndroid Build Coastguard Worker }
155*61c4878aSAndroid Build Coastguard Worker
TEST(VarintRead,Unsigned64_SingleByte)156*61c4878aSAndroid Build Coastguard Worker TEST(VarintRead, Unsigned64_SingleByte) {
157*61c4878aSAndroid Build Coastguard Worker uint64_t value = 1234;
158*61c4878aSAndroid Build Coastguard Worker
159*61c4878aSAndroid Build Coastguard Worker {
160*61c4878aSAndroid Build Coastguard Worker const auto buffer = MakeBuffer("\x00");
161*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
162*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value);
163*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(sws.ok());
164*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 1u);
165*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 0u);
166*61c4878aSAndroid Build Coastguard Worker }
167*61c4878aSAndroid Build Coastguard Worker
168*61c4878aSAndroid Build Coastguard Worker {
169*61c4878aSAndroid Build Coastguard Worker const auto buffer = MakeBuffer("\x04");
170*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
171*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value);
172*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(sws.ok());
173*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 1u);
174*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 4u);
175*61c4878aSAndroid Build Coastguard Worker }
176*61c4878aSAndroid Build Coastguard Worker
177*61c4878aSAndroid Build Coastguard Worker {
178*61c4878aSAndroid Build Coastguard Worker const auto buffer = MakeBuffer("\x41");
179*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
180*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value);
181*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(sws.ok());
182*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 1u);
183*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 65u);
184*61c4878aSAndroid Build Coastguard Worker }
185*61c4878aSAndroid Build Coastguard Worker }
186*61c4878aSAndroid Build Coastguard Worker
TEST(VarintRead,Unsigned64_MultiByte)187*61c4878aSAndroid Build Coastguard Worker TEST(VarintRead, Unsigned64_MultiByte) {
188*61c4878aSAndroid Build Coastguard Worker uint64_t value;
189*61c4878aSAndroid Build Coastguard Worker
190*61c4878aSAndroid Build Coastguard Worker {
191*61c4878aSAndroid Build Coastguard Worker const auto buffer = MakeBuffer("\x80\x01");
192*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
193*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value);
194*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(sws.ok());
195*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 2u);
196*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 128u);
197*61c4878aSAndroid Build Coastguard Worker }
198*61c4878aSAndroid Build Coastguard Worker
199*61c4878aSAndroid Build Coastguard Worker {
200*61c4878aSAndroid Build Coastguard Worker const auto buffer = MakeBuffer("\x81\x01");
201*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
202*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value);
203*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(sws.ok());
204*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 2u);
205*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, 129u);
206*61c4878aSAndroid Build Coastguard Worker }
207*61c4878aSAndroid Build Coastguard Worker
208*61c4878aSAndroid Build Coastguard Worker {
209*61c4878aSAndroid Build Coastguard Worker const auto buffer = MakeBuffer("\xfe\xff\xff\xff\x0f");
210*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
211*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value);
212*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(sws.ok());
213*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 5u);
214*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, std::numeric_limits<uint32_t>::max() - 1);
215*61c4878aSAndroid Build Coastguard Worker }
216*61c4878aSAndroid Build Coastguard Worker
217*61c4878aSAndroid Build Coastguard Worker {
218*61c4878aSAndroid Build Coastguard Worker const auto buffer = MakeBuffer("\xff\xff\xff\xff\x0f");
219*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
220*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value);
221*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(sws.ok());
222*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 5u);
223*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, std::numeric_limits<uint32_t>::max());
224*61c4878aSAndroid Build Coastguard Worker }
225*61c4878aSAndroid Build Coastguard Worker
226*61c4878aSAndroid Build Coastguard Worker {
227*61c4878aSAndroid Build Coastguard Worker const auto buffer = MakeBuffer("\xfe\xff\xff\xff\xff\xff\xff\xff\xff\x01");
228*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
229*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value);
230*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(sws.ok());
231*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 10u);
232*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, std::numeric_limits<uint64_t>::max() - 1);
233*61c4878aSAndroid Build Coastguard Worker }
234*61c4878aSAndroid Build Coastguard Worker
235*61c4878aSAndroid Build Coastguard Worker {
236*61c4878aSAndroid Build Coastguard Worker const auto buffer = MakeBuffer("\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01");
237*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
238*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value);
239*61c4878aSAndroid Build Coastguard Worker EXPECT_TRUE(sws.ok());
240*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 10u);
241*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(value, std::numeric_limits<uint64_t>::max());
242*61c4878aSAndroid Build Coastguard Worker }
243*61c4878aSAndroid Build Coastguard Worker }
244*61c4878aSAndroid Build Coastguard Worker
TEST(VarintRead,Errors)245*61c4878aSAndroid Build Coastguard Worker TEST(VarintRead, Errors) {
246*61c4878aSAndroid Build Coastguard Worker uint64_t value;
247*61c4878aSAndroid Build Coastguard Worker
248*61c4878aSAndroid Build Coastguard Worker {
249*61c4878aSAndroid Build Coastguard Worker std::array<std::byte, 0> buffer{};
250*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
251*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value);
252*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(sws.ok());
253*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.status(), Status::OutOfRange());
254*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), buffer.size());
255*61c4878aSAndroid Build Coastguard Worker }
256*61c4878aSAndroid Build Coastguard Worker
257*61c4878aSAndroid Build Coastguard Worker {
258*61c4878aSAndroid Build Coastguard Worker const auto buffer = MakeBuffer("\xff\xff");
259*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
260*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value);
261*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(sws.ok());
262*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.status(), Status::DataLoss());
263*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), buffer.size());
264*61c4878aSAndroid Build Coastguard Worker }
265*61c4878aSAndroid Build Coastguard Worker
266*61c4878aSAndroid Build Coastguard Worker {
267*61c4878aSAndroid Build Coastguard Worker std::array<std::byte, varint::kMaxVarint64SizeBytes + 1> buffer{};
268*61c4878aSAndroid Build Coastguard Worker for (auto& b : buffer) {
269*61c4878aSAndroid Build Coastguard Worker b = std::byte{0xff};
270*61c4878aSAndroid Build Coastguard Worker }
271*61c4878aSAndroid Build Coastguard Worker
272*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
273*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value);
274*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(sws.ok());
275*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.status(), Status::DataLoss());
276*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), varint::kMaxVarint64SizeBytes);
277*61c4878aSAndroid Build Coastguard Worker }
278*61c4878aSAndroid Build Coastguard Worker }
279*61c4878aSAndroid Build Coastguard Worker
TEST(VarintRead,SizeLimit)280*61c4878aSAndroid Build Coastguard Worker TEST(VarintRead, SizeLimit) {
281*61c4878aSAndroid Build Coastguard Worker uint64_t value;
282*61c4878aSAndroid Build Coastguard Worker
283*61c4878aSAndroid Build Coastguard Worker {
284*61c4878aSAndroid Build Coastguard Worker // buffer contains a valid varint, but we limit the read length to ensure
285*61c4878aSAndroid Build Coastguard Worker // that the final byte is not read, turning it into an error.
286*61c4878aSAndroid Build Coastguard Worker const auto buffer = MakeBuffer("\xff\xff\xff\xff\x0f");
287*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
288*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value, 4);
289*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(sws.ok());
290*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.status(), Status::DataLoss());
291*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 4u);
292*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(reader.Tell(), 4u);
293*61c4878aSAndroid Build Coastguard Worker }
294*61c4878aSAndroid Build Coastguard Worker
295*61c4878aSAndroid Build Coastguard Worker {
296*61c4878aSAndroid Build Coastguard Worker // If we tell varint::Read() to read zero bytes, it should always return
297*61c4878aSAndroid Build Coastguard Worker // OutOfRange() without moving the reader.
298*61c4878aSAndroid Build Coastguard Worker const auto buffer = MakeBuffer("\xff\xff\xff\xff\x0f");
299*61c4878aSAndroid Build Coastguard Worker stream::MemoryReader reader(buffer);
300*61c4878aSAndroid Build Coastguard Worker const auto sws = Read(reader, &value, 0);
301*61c4878aSAndroid Build Coastguard Worker EXPECT_FALSE(sws.ok());
302*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.status(), Status::OutOfRange());
303*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(sws.size(), 0u);
304*61c4878aSAndroid Build Coastguard Worker EXPECT_EQ(reader.Tell(), 0u);
305*61c4878aSAndroid Build Coastguard Worker }
306*61c4878aSAndroid Build Coastguard Worker }
307*61c4878aSAndroid Build Coastguard Worker
308*61c4878aSAndroid Build Coastguard Worker } // namespace pw::varint
309