xref: /aosp_15_r20/external/cronet/base/containers/span_reader_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2024 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/containers/span_reader.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include "testing/gmock/include/gmock/gmock.h"
8*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker using testing::Optional;
11*6777b538SAndroid Build Coastguard Worker 
12*6777b538SAndroid Build Coastguard Worker namespace base {
13*6777b538SAndroid Build Coastguard Worker namespace {
14*6777b538SAndroid Build Coastguard Worker 
TEST(SpanReaderTest,Construct)15*6777b538SAndroid Build Coastguard Worker TEST(SpanReaderTest, Construct) {
16*6777b538SAndroid Build Coastguard Worker   std::array<const int, 5u> kArray = {1, 2, 3, 4, 5};
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker   auto r = SpanReader(base::span(kArray));
19*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(r.remaining(), 5u);
20*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(r.remaining_span().data(), &kArray[0u]);
21*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(r.remaining_span().size(), 5u);
22*6777b538SAndroid Build Coastguard Worker }
23*6777b538SAndroid Build Coastguard Worker 
TEST(SpanReaderTest,Skip)24*6777b538SAndroid Build Coastguard Worker TEST(SpanReaderTest, Skip) {
25*6777b538SAndroid Build Coastguard Worker   std::array<const int, 5u> kArray = {1, 2, 3, 4, 5};
26*6777b538SAndroid Build Coastguard Worker 
27*6777b538SAndroid Build Coastguard Worker   auto r = SpanReader(base::span(kArray));
28*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(r.num_read(), 0u);
29*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(r.Skip(6u));
30*6777b538SAndroid Build Coastguard Worker   EXPECT_THAT(r.Skip(2u), Optional(base::span(kArray).first(2u)));
31*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(r.num_read(), 2u);
32*6777b538SAndroid Build Coastguard Worker }
33*6777b538SAndroid Build Coastguard Worker 
TEST(SpanReaderTest,Read)34*6777b538SAndroid Build Coastguard Worker TEST(SpanReaderTest, Read) {
35*6777b538SAndroid Build Coastguard Worker   std::array<const int, 5u> kArray = {1, 2, 3, 4, 5};
36*6777b538SAndroid Build Coastguard Worker 
37*6777b538SAndroid Build Coastguard Worker   auto r = SpanReader(base::span(kArray));
38*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(r.num_read(), 0u);
39*6777b538SAndroid Build Coastguard Worker   {
40*6777b538SAndroid Build Coastguard Worker     auto o = r.Read(2u);
41*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(*o), span<const int>&>);
42*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(o.has_value());
43*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(*o == base::span(kArray).subspan(0u, 2u));
44*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 3u);
45*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.num_read(), 2u);
46*6777b538SAndroid Build Coastguard Worker   }
47*6777b538SAndroid Build Coastguard Worker   {
48*6777b538SAndroid Build Coastguard Worker     auto o = r.Read(5u);
49*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(*o), span<const int>&>);
50*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(o.has_value());
51*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 3u);
52*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.num_read(), 2u);
53*6777b538SAndroid Build Coastguard Worker   }
54*6777b538SAndroid Build Coastguard Worker   {
55*6777b538SAndroid Build Coastguard Worker     auto o = r.Read(1u);
56*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(*o), span<const int>&>);
57*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(o.has_value());
58*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(*o == base::span(kArray).subspan(2u, 1u));
59*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 2u);
60*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.num_read(), 3u);
61*6777b538SAndroid Build Coastguard Worker   }
62*6777b538SAndroid Build Coastguard Worker   {
63*6777b538SAndroid Build Coastguard Worker     auto o = r.Read(2u);
64*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(*o), span<const int>&>);
65*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(o.has_value());
66*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(*o == base::span(kArray).subspan(3u, 2u));
67*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 0u);
68*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.num_read(), 5u);
69*6777b538SAndroid Build Coastguard Worker   }
70*6777b538SAndroid Build Coastguard Worker }
71*6777b538SAndroid Build Coastguard Worker 
TEST(SpanReaderTest,ReadFixed)72*6777b538SAndroid Build Coastguard Worker TEST(SpanReaderTest, ReadFixed) {
73*6777b538SAndroid Build Coastguard Worker   std::array<const int, 5u> kArray = {1, 2, 3, 4, 5};
74*6777b538SAndroid Build Coastguard Worker 
75*6777b538SAndroid Build Coastguard Worker   auto r = SpanReader(base::span(kArray));
76*6777b538SAndroid Build Coastguard Worker   {
77*6777b538SAndroid Build Coastguard Worker     auto o = r.Read<2u>();
78*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(*o), span<const int, 2u>&>);
79*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(o.has_value());
80*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(*o == base::span(kArray).subspan(0u, 2u));
81*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 3u);
82*6777b538SAndroid Build Coastguard Worker   }
83*6777b538SAndroid Build Coastguard Worker   {
84*6777b538SAndroid Build Coastguard Worker     auto o = r.Read<5u>();
85*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(*o), span<const int, 5u>&>);
86*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(o.has_value());
87*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 3u);
88*6777b538SAndroid Build Coastguard Worker   }
89*6777b538SAndroid Build Coastguard Worker   {
90*6777b538SAndroid Build Coastguard Worker     auto o = r.Read<1u>();
91*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(*o), span<const int, 1u>&>);
92*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(o.has_value());
93*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(*o == base::span(kArray).subspan(2u, 1u));
94*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 2u);
95*6777b538SAndroid Build Coastguard Worker   }
96*6777b538SAndroid Build Coastguard Worker   {
97*6777b538SAndroid Build Coastguard Worker     auto o = r.Read<2u>();
98*6777b538SAndroid Build Coastguard Worker     static_assert(std::same_as<decltype(*o), span<const int, 2u>&>);
99*6777b538SAndroid Build Coastguard Worker     ASSERT_TRUE(o.has_value());
100*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(*o == base::span(kArray).subspan(3u, 2u));
101*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 0u);
102*6777b538SAndroid Build Coastguard Worker   }
103*6777b538SAndroid Build Coastguard Worker }
104*6777b538SAndroid Build Coastguard Worker 
TEST(SpanReaderTest,ReadInto)105*6777b538SAndroid Build Coastguard Worker TEST(SpanReaderTest, ReadInto) {
106*6777b538SAndroid Build Coastguard Worker   std::array<const int, 5u> kArray = {1, 2, 3, 4, 5};
107*6777b538SAndroid Build Coastguard Worker 
108*6777b538SAndroid Build Coastguard Worker   auto r = SpanReader(base::span(kArray));
109*6777b538SAndroid Build Coastguard Worker   {
110*6777b538SAndroid Build Coastguard Worker     base::span<const int> s;
111*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.ReadInto(2u, s));
112*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(s == base::span(kArray).subspan(0u, 2u));
113*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 3u);
114*6777b538SAndroid Build Coastguard Worker   }
115*6777b538SAndroid Build Coastguard Worker   {
116*6777b538SAndroid Build Coastguard Worker     base::span<const int> s;
117*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(r.ReadInto(5u, s));
118*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 3u);
119*6777b538SAndroid Build Coastguard Worker   }
120*6777b538SAndroid Build Coastguard Worker   {
121*6777b538SAndroid Build Coastguard Worker     base::span<const int> s;
122*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.ReadInto(1u, s));
123*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(s == base::span(kArray).subspan(2u, 1u));
124*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 2u);
125*6777b538SAndroid Build Coastguard Worker   }
126*6777b538SAndroid Build Coastguard Worker   {
127*6777b538SAndroid Build Coastguard Worker     base::span<const int> s;
128*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.ReadInto(2u, s));
129*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(s == base::span(kArray).subspan(3u, 2u));
130*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 0u);
131*6777b538SAndroid Build Coastguard Worker   }
132*6777b538SAndroid Build Coastguard Worker }
133*6777b538SAndroid Build Coastguard Worker 
TEST(SpanReaderTest,ReadCopy)134*6777b538SAndroid Build Coastguard Worker TEST(SpanReaderTest, ReadCopy) {
135*6777b538SAndroid Build Coastguard Worker   std::array<const int, 5u> kArray = {1, 2, 3, 4, 5};
136*6777b538SAndroid Build Coastguard Worker 
137*6777b538SAndroid Build Coastguard Worker   auto r = SpanReader(base::span(kArray));
138*6777b538SAndroid Build Coastguard Worker   {
139*6777b538SAndroid Build Coastguard Worker     std::array<int, 2u> s;
140*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.ReadCopy(s));
141*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(s == base::span(kArray).subspan(0u, 2u));
142*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 3u);
143*6777b538SAndroid Build Coastguard Worker   }
144*6777b538SAndroid Build Coastguard Worker   {
145*6777b538SAndroid Build Coastguard Worker     std::array<int, 5u> s;
146*6777b538SAndroid Build Coastguard Worker     EXPECT_FALSE(r.ReadCopy(s));
147*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 3u);
148*6777b538SAndroid Build Coastguard Worker   }
149*6777b538SAndroid Build Coastguard Worker   {
150*6777b538SAndroid Build Coastguard Worker     std::array<int, 1u> s;
151*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.ReadCopy(s));
152*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(s == base::span(kArray).subspan(2u, 1u));
153*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 2u);
154*6777b538SAndroid Build Coastguard Worker   }
155*6777b538SAndroid Build Coastguard Worker   {
156*6777b538SAndroid Build Coastguard Worker     std::array<int, 2u> s;
157*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.ReadCopy(s));
158*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(s == base::span(kArray).subspan(3u, 2u));
159*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 0u);
160*6777b538SAndroid Build Coastguard Worker   }
161*6777b538SAndroid Build Coastguard Worker }
162*6777b538SAndroid Build Coastguard Worker 
TEST(SpanReaderTest,ReadBigEndian)163*6777b538SAndroid Build Coastguard Worker TEST(SpanReaderTest, ReadBigEndian) {
164*6777b538SAndroid Build Coastguard Worker   const std::array<uint8_t, 5u> kArray = {uint8_t{1}, uint8_t{2}, uint8_t{3},
165*6777b538SAndroid Build Coastguard Worker                                           uint8_t{4}, uint8_t{5}};
166*6777b538SAndroid Build Coastguard Worker 
167*6777b538SAndroid Build Coastguard Worker   {
168*6777b538SAndroid Build Coastguard Worker     uint8_t val;
169*6777b538SAndroid Build Coastguard Worker 
170*6777b538SAndroid Build Coastguard Worker     auto r = SpanReader(base::span(kArray));
171*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.Skip(1u));
172*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.ReadU8BigEndian(val));
173*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 3u);
174*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(val, 0x02u);
175*6777b538SAndroid Build Coastguard Worker   }
176*6777b538SAndroid Build Coastguard Worker 
177*6777b538SAndroid Build Coastguard Worker   {
178*6777b538SAndroid Build Coastguard Worker     uint16_t val;
179*6777b538SAndroid Build Coastguard Worker 
180*6777b538SAndroid Build Coastguard Worker     auto r = SpanReader(base::span(kArray));
181*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.Skip(1u));
182*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.ReadU16BigEndian(val));
183*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 2u);
184*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(val, 0x0203u);
185*6777b538SAndroid Build Coastguard Worker   }
186*6777b538SAndroid Build Coastguard Worker 
187*6777b538SAndroid Build Coastguard Worker   {
188*6777b538SAndroid Build Coastguard Worker     uint32_t val;
189*6777b538SAndroid Build Coastguard Worker 
190*6777b538SAndroid Build Coastguard Worker     auto r = SpanReader(base::span(kArray));
191*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.Skip(1u));
192*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.ReadU32BigEndian(val));
193*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 0u);
194*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(val, 0x02030405u);
195*6777b538SAndroid Build Coastguard Worker   }
196*6777b538SAndroid Build Coastguard Worker 
197*6777b538SAndroid Build Coastguard Worker   std::array<uint8_t, 9u> kBigArray = {uint8_t{1}, uint8_t{2}, uint8_t{3},
198*6777b538SAndroid Build Coastguard Worker                                        uint8_t{4}, uint8_t{5}, uint8_t{6},
199*6777b538SAndroid Build Coastguard Worker                                        uint8_t{7}, uint8_t{8}, uint8_t{9}};
200*6777b538SAndroid Build Coastguard Worker 
201*6777b538SAndroid Build Coastguard Worker   {
202*6777b538SAndroid Build Coastguard Worker     uint64_t val;
203*6777b538SAndroid Build Coastguard Worker 
204*6777b538SAndroid Build Coastguard Worker     auto r = SpanReader(base::span(kBigArray));
205*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.Skip(1u));
206*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.ReadU64BigEndian(val));
207*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 0u);
208*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(val, 0x0203040506070809llu);
209*6777b538SAndroid Build Coastguard Worker   }
210*6777b538SAndroid Build Coastguard Worker }
211*6777b538SAndroid Build Coastguard Worker 
TEST(SpanReaderTest,ReadLittleEndian)212*6777b538SAndroid Build Coastguard Worker TEST(SpanReaderTest, ReadLittleEndian) {
213*6777b538SAndroid Build Coastguard Worker   const std::array<uint8_t, 5u> kArray = {uint8_t{1}, uint8_t{2}, uint8_t{3},
214*6777b538SAndroid Build Coastguard Worker                                           uint8_t{4}, uint8_t{5}};
215*6777b538SAndroid Build Coastguard Worker 
216*6777b538SAndroid Build Coastguard Worker   {
217*6777b538SAndroid Build Coastguard Worker     uint8_t val;
218*6777b538SAndroid Build Coastguard Worker 
219*6777b538SAndroid Build Coastguard Worker     auto r = SpanReader(base::span(kArray));
220*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.Skip(1u));
221*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.ReadU8LittleEndian(val));
222*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 3u);
223*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(val, 0x02u);
224*6777b538SAndroid Build Coastguard Worker   }
225*6777b538SAndroid Build Coastguard Worker 
226*6777b538SAndroid Build Coastguard Worker   {
227*6777b538SAndroid Build Coastguard Worker     uint16_t val;
228*6777b538SAndroid Build Coastguard Worker 
229*6777b538SAndroid Build Coastguard Worker     auto r = SpanReader(base::span(kArray));
230*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.Skip(1u));
231*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.ReadU16LittleEndian(val));
232*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 2u);
233*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(val, 0x0302u);
234*6777b538SAndroid Build Coastguard Worker   }
235*6777b538SAndroid Build Coastguard Worker 
236*6777b538SAndroid Build Coastguard Worker   {
237*6777b538SAndroid Build Coastguard Worker     uint32_t val;
238*6777b538SAndroid Build Coastguard Worker 
239*6777b538SAndroid Build Coastguard Worker     auto r = SpanReader(base::span(kArray));
240*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.Skip(1u));
241*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.ReadU32LittleEndian(val));
242*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 0u);
243*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(val, 0x05040302u);
244*6777b538SAndroid Build Coastguard Worker   }
245*6777b538SAndroid Build Coastguard Worker 
246*6777b538SAndroid Build Coastguard Worker   std::array<uint8_t, 9u> kBigArray = {uint8_t{1}, uint8_t{2}, uint8_t{3},
247*6777b538SAndroid Build Coastguard Worker                                        uint8_t{4}, uint8_t{5}, uint8_t{6},
248*6777b538SAndroid Build Coastguard Worker                                        uint8_t{7}, uint8_t{8}, uint8_t{9}};
249*6777b538SAndroid Build Coastguard Worker 
250*6777b538SAndroid Build Coastguard Worker   {
251*6777b538SAndroid Build Coastguard Worker     uint64_t val;
252*6777b538SAndroid Build Coastguard Worker 
253*6777b538SAndroid Build Coastguard Worker     auto r = SpanReader(base::span(kBigArray));
254*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.Skip(1u));
255*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.ReadU64LittleEndian(val));
256*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 0u);
257*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(val, 0x0908070605040302llu);
258*6777b538SAndroid Build Coastguard Worker   }
259*6777b538SAndroid Build Coastguard Worker }
260*6777b538SAndroid Build Coastguard Worker 
TEST(SpanReaderTest,ReadNativeEndian)261*6777b538SAndroid Build Coastguard Worker TEST(SpanReaderTest, ReadNativeEndian) {
262*6777b538SAndroid Build Coastguard Worker   const std::array<uint8_t, 5u> kArray = {uint8_t{1}, uint8_t{2}, uint8_t{3},
263*6777b538SAndroid Build Coastguard Worker                                           uint8_t{4}, uint8_t{5}};
264*6777b538SAndroid Build Coastguard Worker 
265*6777b538SAndroid Build Coastguard Worker   {
266*6777b538SAndroid Build Coastguard Worker     uint8_t val;
267*6777b538SAndroid Build Coastguard Worker 
268*6777b538SAndroid Build Coastguard Worker     auto r = SpanReader(base::span(kArray));
269*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.Skip(1u));
270*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.ReadU8NativeEndian(val));
271*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 3u);
272*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(val, 0x02u);
273*6777b538SAndroid Build Coastguard Worker   }
274*6777b538SAndroid Build Coastguard Worker 
275*6777b538SAndroid Build Coastguard Worker   {
276*6777b538SAndroid Build Coastguard Worker     uint16_t val;
277*6777b538SAndroid Build Coastguard Worker 
278*6777b538SAndroid Build Coastguard Worker     auto r = SpanReader(base::span(kArray));
279*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.Skip(1u));
280*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.ReadU16NativeEndian(val));
281*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 2u);
282*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(val, 0x0302u);
283*6777b538SAndroid Build Coastguard Worker   }
284*6777b538SAndroid Build Coastguard Worker 
285*6777b538SAndroid Build Coastguard Worker   {
286*6777b538SAndroid Build Coastguard Worker     uint32_t val;
287*6777b538SAndroid Build Coastguard Worker 
288*6777b538SAndroid Build Coastguard Worker     auto r = SpanReader(base::span(kArray));
289*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.Skip(1u));
290*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.ReadU32NativeEndian(val));
291*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 0u);
292*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(val, 0x05040302u);
293*6777b538SAndroid Build Coastguard Worker   }
294*6777b538SAndroid Build Coastguard Worker 
295*6777b538SAndroid Build Coastguard Worker   std::array<uint8_t, 9u> kBigArray = {uint8_t{1}, uint8_t{2}, uint8_t{3},
296*6777b538SAndroid Build Coastguard Worker                                        uint8_t{4}, uint8_t{5}, uint8_t{6},
297*6777b538SAndroid Build Coastguard Worker                                        uint8_t{7}, uint8_t{8}, uint8_t{9}};
298*6777b538SAndroid Build Coastguard Worker 
299*6777b538SAndroid Build Coastguard Worker   {
300*6777b538SAndroid Build Coastguard Worker     uint64_t val;
301*6777b538SAndroid Build Coastguard Worker 
302*6777b538SAndroid Build Coastguard Worker     auto r = SpanReader(base::span(kBigArray));
303*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.Skip(1u));
304*6777b538SAndroid Build Coastguard Worker     EXPECT_TRUE(r.ReadU64NativeEndian(val));
305*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(r.remaining(), 0u);
306*6777b538SAndroid Build Coastguard Worker     EXPECT_EQ(val, 0x0908070605040302llu);
307*6777b538SAndroid Build Coastguard Worker   }
308*6777b538SAndroid Build Coastguard Worker }
309*6777b538SAndroid Build Coastguard Worker 
TEST(SpanReaderTest,ReadChar)310*6777b538SAndroid Build Coastguard Worker TEST(SpanReaderTest, ReadChar) {
311*6777b538SAndroid Build Coastguard Worker   std::array<const uint8_t, 5u> kArray = {uint8_t{1}, uint8_t{2}, uint8_t{3},
312*6777b538SAndroid Build Coastguard Worker                                           uint8_t{4}, uint8_t{5}};
313*6777b538SAndroid Build Coastguard Worker 
314*6777b538SAndroid Build Coastguard Worker   auto r = SpanReader(base::span(kArray));
315*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(r.num_read(), 0u);
316*6777b538SAndroid Build Coastguard Worker 
317*6777b538SAndroid Build Coastguard Worker   char c;
318*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(r.ReadChar(c));
319*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(c, char{1});
320*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(r.Skip(3u));
321*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(r.ReadChar(c));
322*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(c, char{5});
323*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(r.ReadChar(c));
324*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(c, char{5});
325*6777b538SAndroid Build Coastguard Worker }
326*6777b538SAndroid Build Coastguard Worker 
327*6777b538SAndroid Build Coastguard Worker }  // namespace
328*6777b538SAndroid Build Coastguard Worker }  // namespace base
329