xref: /aosp_15_r20/external/openscreen/util/big_endian_unittest.cc (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
1*3f982cf4SFabien Sanglard // Copyright 2019 The Chromium Authors. All rights reserved.
2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be
3*3f982cf4SFabien Sanglard // found in the LICENSE file.
4*3f982cf4SFabien Sanglard 
5*3f982cf4SFabien Sanglard #include "util/big_endian.h"
6*3f982cf4SFabien Sanglard 
7*3f982cf4SFabien Sanglard #include "gmock/gmock.h"
8*3f982cf4SFabien Sanglard #include "gtest/gtest.h"
9*3f982cf4SFabien Sanglard 
10*3f982cf4SFabien Sanglard namespace openscreen {
11*3f982cf4SFabien Sanglard namespace {
12*3f982cf4SFabien Sanglard 
13*3f982cf4SFabien Sanglard // Tests that ReadBigEndian() correctly imports values from various offsets in
14*3f982cf4SFabien Sanglard // memory.
TEST(BigEndianTest,ReadValues)15*3f982cf4SFabien Sanglard TEST(BigEndianTest, ReadValues) {
16*3f982cf4SFabien Sanglard   const uint8_t kInput[] = {
17*3f982cf4SFabien Sanglard       0,    1,    2,    3,    4,    5,    6,    7,    8,    9,    0xa,
18*3f982cf4SFabien Sanglard       0xb,  0xc,  0xd,  0xe,  0xf,  0xff, 0xff, 0xfe, 0xff, 0xff, 0xff,
19*3f982cf4SFabien Sanglard       0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe,
20*3f982cf4SFabien Sanglard   };
21*3f982cf4SFabien Sanglard 
22*3f982cf4SFabien Sanglard   EXPECT_EQ(UINT8_C(0x05), ReadBigEndian<uint8_t>(kInput + 5));
23*3f982cf4SFabien Sanglard   EXPECT_EQ(UINT8_C(0xff), ReadBigEndian<uint8_t>(kInput + 16));
24*3f982cf4SFabien Sanglard   EXPECT_EQ(7, ReadBigEndian<int8_t>(kInput + 7));
25*3f982cf4SFabien Sanglard   EXPECT_EQ(-1, ReadBigEndian<int8_t>(kInput + 17));
26*3f982cf4SFabien Sanglard 
27*3f982cf4SFabien Sanglard   EXPECT_EQ(UINT16_C(0x0001), ReadBigEndian<uint16_t>(kInput));
28*3f982cf4SFabien Sanglard   EXPECT_EQ(UINT16_C(0x0102), ReadBigEndian<uint16_t>(kInput + 1));
29*3f982cf4SFabien Sanglard   EXPECT_EQ(UINT16_C(0x0203), ReadBigEndian<uint16_t>(kInput + 2));
30*3f982cf4SFabien Sanglard   EXPECT_EQ(-1, ReadBigEndian<int16_t>(kInput + 16));
31*3f982cf4SFabien Sanglard   EXPECT_EQ(-2, ReadBigEndian<int16_t>(kInput + 17));
32*3f982cf4SFabien Sanglard 
33*3f982cf4SFabien Sanglard   EXPECT_EQ(UINT32_C(0x03040506), ReadBigEndian<uint32_t>(kInput + 3));
34*3f982cf4SFabien Sanglard   EXPECT_EQ(UINT32_C(0x04050607), ReadBigEndian<uint32_t>(kInput + 4));
35*3f982cf4SFabien Sanglard   EXPECT_EQ(UINT32_C(0x05060708), ReadBigEndian<uint32_t>(kInput + 5));
36*3f982cf4SFabien Sanglard   EXPECT_EQ(-1, ReadBigEndian<int32_t>(kInput + 19));
37*3f982cf4SFabien Sanglard   EXPECT_EQ(-2, ReadBigEndian<int32_t>(kInput + 20));
38*3f982cf4SFabien Sanglard 
39*3f982cf4SFabien Sanglard   EXPECT_EQ(UINT64_C(0x0001020304050607), ReadBigEndian<uint64_t>(kInput));
40*3f982cf4SFabien Sanglard   EXPECT_EQ(UINT64_C(0x0102030405060708), ReadBigEndian<uint64_t>(kInput + 1));
41*3f982cf4SFabien Sanglard   EXPECT_EQ(UINT64_C(0x0203040506070809), ReadBigEndian<uint64_t>(kInput + 2));
42*3f982cf4SFabien Sanglard   EXPECT_EQ(-1, ReadBigEndian<int64_t>(kInput + 24));
43*3f982cf4SFabien Sanglard   EXPECT_EQ(-2, ReadBigEndian<int64_t>(kInput + 25));
44*3f982cf4SFabien Sanglard }
45*3f982cf4SFabien Sanglard 
46*3f982cf4SFabien Sanglard // Tests that WriteBigEndian() correctly writes-out values to various offsets in
47*3f982cf4SFabien Sanglard // memory. This test assumes ReadBigEndian() is working, using it to verify that
48*3f982cf4SFabien Sanglard // WriteBigEndian() is working.
TEST(BigEndianTest,WriteValues)49*3f982cf4SFabien Sanglard TEST(BigEndianTest, WriteValues) {
50*3f982cf4SFabien Sanglard   uint8_t scratch[16];
51*3f982cf4SFabien Sanglard 
52*3f982cf4SFabien Sanglard   WriteBigEndian<uint8_t>(0x07, scratch);
53*3f982cf4SFabien Sanglard   EXPECT_EQ(UINT8_C(0x07), ReadBigEndian<uint8_t>(scratch));
54*3f982cf4SFabien Sanglard   WriteBigEndian<uint8_t>(0xf0, scratch + 1);
55*3f982cf4SFabien Sanglard   EXPECT_EQ(UINT8_C(0xf0), ReadBigEndian<uint8_t>(scratch + 1));
56*3f982cf4SFabien Sanglard   WriteBigEndian<int8_t>(23, scratch + 2);
57*3f982cf4SFabien Sanglard   EXPECT_EQ(23, ReadBigEndian<int8_t>(scratch + 2));
58*3f982cf4SFabien Sanglard   WriteBigEndian<int8_t>(-25, scratch + 3);
59*3f982cf4SFabien Sanglard   EXPECT_EQ(-25, ReadBigEndian<int8_t>(scratch + 3));
60*3f982cf4SFabien Sanglard 
61*3f982cf4SFabien Sanglard   WriteBigEndian<uint16_t>(0x0102, scratch);
62*3f982cf4SFabien Sanglard   EXPECT_EQ(UINT16_C(0x0102), ReadBigEndian<uint16_t>(scratch));
63*3f982cf4SFabien Sanglard   WriteBigEndian<uint16_t>(0x0304, scratch + 1);
64*3f982cf4SFabien Sanglard   EXPECT_EQ(UINT16_C(0x0304), ReadBigEndian<uint16_t>(scratch + 1));
65*3f982cf4SFabien Sanglard   WriteBigEndian<uint16_t>(0x0506, scratch + 2);
66*3f982cf4SFabien Sanglard   EXPECT_EQ(UINT16_C(0x0506), ReadBigEndian<uint16_t>(scratch + 2));
67*3f982cf4SFabien Sanglard   WriteBigEndian<int16_t>(42, scratch + 3);
68*3f982cf4SFabien Sanglard   EXPECT_EQ(42, ReadBigEndian<int16_t>(scratch + 3));
69*3f982cf4SFabien Sanglard   WriteBigEndian<int16_t>(-1, scratch + 4);
70*3f982cf4SFabien Sanglard   EXPECT_EQ(-1, ReadBigEndian<int16_t>(scratch + 4));
71*3f982cf4SFabien Sanglard   WriteBigEndian<int16_t>(-2, scratch + 5);
72*3f982cf4SFabien Sanglard   EXPECT_EQ(-2, ReadBigEndian<int16_t>(scratch + 5));
73*3f982cf4SFabien Sanglard 
74*3f982cf4SFabien Sanglard   WriteBigEndian<uint32_t>(UINT32_C(0x03040506), scratch);
75*3f982cf4SFabien Sanglard   EXPECT_EQ(UINT32_C(0x03040506), ReadBigEndian<uint32_t>(scratch));
76*3f982cf4SFabien Sanglard   WriteBigEndian<uint32_t>(UINT32_C(0x0708090a), scratch + 1);
77*3f982cf4SFabien Sanglard   EXPECT_EQ(UINT32_C(0x0708090a), ReadBigEndian<uint32_t>(scratch + 1));
78*3f982cf4SFabien Sanglard   WriteBigEndian<uint32_t>(UINT32_C(0x0b0c0d0e), scratch + 2);
79*3f982cf4SFabien Sanglard   EXPECT_EQ(UINT32_C(0x0b0c0d0e), ReadBigEndian<uint32_t>(scratch + 2));
80*3f982cf4SFabien Sanglard   WriteBigEndian<int32_t>(42, scratch + 3);
81*3f982cf4SFabien Sanglard   EXPECT_EQ(42, ReadBigEndian<int32_t>(scratch + 3));
82*3f982cf4SFabien Sanglard   WriteBigEndian<int32_t>(-1, scratch + 4);
83*3f982cf4SFabien Sanglard   EXPECT_EQ(-1, ReadBigEndian<int32_t>(scratch + 4));
84*3f982cf4SFabien Sanglard   WriteBigEndian<int32_t>(-2, scratch + 5);
85*3f982cf4SFabien Sanglard   EXPECT_EQ(-2, ReadBigEndian<int32_t>(scratch + 5));
86*3f982cf4SFabien Sanglard 
87*3f982cf4SFabien Sanglard   WriteBigEndian<uint64_t>(UINT64_C(0x0f0e0d0c0b0a0908), scratch);
88*3f982cf4SFabien Sanglard   EXPECT_EQ(UINT64_C(0x0f0e0d0c0b0a0908), ReadBigEndian<uint64_t>(scratch));
89*3f982cf4SFabien Sanglard   WriteBigEndian<uint64_t>(UINT64_C(0x0708090a0b0c0d0e), scratch + 1);
90*3f982cf4SFabien Sanglard   EXPECT_EQ(UINT64_C(0x0708090a0b0c0d0e), ReadBigEndian<uint64_t>(scratch + 1));
91*3f982cf4SFabien Sanglard   WriteBigEndian<uint64_t>(UINT64_C(0x99aa88bb77cc66dd), scratch + 2);
92*3f982cf4SFabien Sanglard   EXPECT_EQ(UINT64_C(0x99aa88bb77cc66dd), ReadBigEndian<uint64_t>(scratch + 2));
93*3f982cf4SFabien Sanglard   WriteBigEndian<int64_t>(42, scratch + 3);
94*3f982cf4SFabien Sanglard   EXPECT_EQ(42, ReadBigEndian<int64_t>(scratch + 3));
95*3f982cf4SFabien Sanglard   WriteBigEndian<int64_t>(-1, scratch + 4);
96*3f982cf4SFabien Sanglard   EXPECT_EQ(-1, ReadBigEndian<int64_t>(scratch + 4));
97*3f982cf4SFabien Sanglard   WriteBigEndian<int64_t>(-2, scratch + 5);
98*3f982cf4SFabien Sanglard   EXPECT_EQ(-2, ReadBigEndian<int64_t>(scratch + 5));
99*3f982cf4SFabien Sanglard }
100*3f982cf4SFabien Sanglard 
TEST(BigEndianReaderTest,ConstructWithValidBuffer)101*3f982cf4SFabien Sanglard TEST(BigEndianReaderTest, ConstructWithValidBuffer) {
102*3f982cf4SFabien Sanglard   uint8_t data[64];
103*3f982cf4SFabien Sanglard   BigEndianReader reader(data, sizeof(data));
104*3f982cf4SFabien Sanglard 
105*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.begin(), data);
106*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.current(), data);
107*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.end(), data + 64);
108*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.offset(), 0u);
109*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.remaining(), 64u);
110*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.length(), 64u);
111*3f982cf4SFabien Sanglard }
112*3f982cf4SFabien Sanglard 
TEST(BigEndianReaderTest,SkipLessThanRemaining)113*3f982cf4SFabien Sanglard TEST(BigEndianReaderTest, SkipLessThanRemaining) {
114*3f982cf4SFabien Sanglard   uint8_t data[64];
115*3f982cf4SFabien Sanglard   BigEndianReader reader(data, sizeof(data));
116*3f982cf4SFabien Sanglard 
117*3f982cf4SFabien Sanglard   EXPECT_TRUE(reader.Skip(16));
118*3f982cf4SFabien Sanglard 
119*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.begin(), data);
120*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.current(), data + 16);
121*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.end(), data + 64);
122*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.offset(), 16u);
123*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.remaining(), 48u);
124*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.length(), 64u);
125*3f982cf4SFabien Sanglard }
126*3f982cf4SFabien Sanglard 
TEST(BigEndianReaderTest,SkipMoreThanRemaining)127*3f982cf4SFabien Sanglard TEST(BigEndianReaderTest, SkipMoreThanRemaining) {
128*3f982cf4SFabien Sanglard   uint8_t data[64];
129*3f982cf4SFabien Sanglard   BigEndianReader reader(data, sizeof(data));
130*3f982cf4SFabien Sanglard 
131*3f982cf4SFabien Sanglard   EXPECT_TRUE(reader.Skip(16));
132*3f982cf4SFabien Sanglard   EXPECT_FALSE(reader.Skip(64));
133*3f982cf4SFabien Sanglard 
134*3f982cf4SFabien Sanglard   // Check that failed Skip does not modify any pointers or offsets.
135*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.begin(), data);
136*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.current(), data + 16);
137*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.end(), data + 64);
138*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.offset(), 16u);
139*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.remaining(), 48u);
140*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.length(), 64u);
141*3f982cf4SFabien Sanglard }
142*3f982cf4SFabien Sanglard 
TEST(BigEndianReaderTest,ConstructWithZeroLengthBuffer)143*3f982cf4SFabien Sanglard TEST(BigEndianReaderTest, ConstructWithZeroLengthBuffer) {
144*3f982cf4SFabien Sanglard   uint8_t data[8];
145*3f982cf4SFabien Sanglard   BigEndianReader reader(data, 0);
146*3f982cf4SFabien Sanglard 
147*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.begin(), data);
148*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.current(), data);
149*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.end(), data);
150*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.offset(), 0u);
151*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.remaining(), 0u);
152*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.length(), 0u);
153*3f982cf4SFabien Sanglard 
154*3f982cf4SFabien Sanglard   EXPECT_FALSE(reader.Skip(1));
155*3f982cf4SFabien Sanglard }
156*3f982cf4SFabien Sanglard 
TEST(BigEndianReaderTest,ReadValues)157*3f982cf4SFabien Sanglard TEST(BigEndianReaderTest, ReadValues) {
158*3f982cf4SFabien Sanglard   uint8_t data[17] = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
159*3f982cf4SFabien Sanglard                       0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x10};
160*3f982cf4SFabien Sanglard   BigEndianReader reader(data, sizeof(data));
161*3f982cf4SFabien Sanglard 
162*3f982cf4SFabien Sanglard   uint8_t buffer[2];
163*3f982cf4SFabien Sanglard   EXPECT_TRUE(reader.Read(sizeof(buffer), buffer));
164*3f982cf4SFabien Sanglard   EXPECT_EQ(buffer[0], UINT8_C(0x0));
165*3f982cf4SFabien Sanglard   EXPECT_EQ(buffer[1], UINT8_C(0x1));
166*3f982cf4SFabien Sanglard 
167*3f982cf4SFabien Sanglard   uint8_t u8;
168*3f982cf4SFabien Sanglard   EXPECT_TRUE(reader.Read<uint8_t>(&u8));
169*3f982cf4SFabien Sanglard   EXPECT_EQ(u8, UINT8_C(0x2));
170*3f982cf4SFabien Sanglard 
171*3f982cf4SFabien Sanglard   uint16_t u16;
172*3f982cf4SFabien Sanglard   EXPECT_TRUE(reader.Read<uint16_t>(&u16));
173*3f982cf4SFabien Sanglard   EXPECT_EQ(u16, UINT16_C(0x0304));
174*3f982cf4SFabien Sanglard 
175*3f982cf4SFabien Sanglard   uint32_t u32;
176*3f982cf4SFabien Sanglard   EXPECT_TRUE(reader.Read<uint32_t>(&u32));
177*3f982cf4SFabien Sanglard   EXPECT_EQ(u32, UINT32_C(0x05060708));
178*3f982cf4SFabien Sanglard 
179*3f982cf4SFabien Sanglard   uint64_t u64;
180*3f982cf4SFabien Sanglard   EXPECT_TRUE(reader.Read<uint64_t>(&u64));
181*3f982cf4SFabien Sanglard   EXPECT_EQ(u64, UINT64_C(0x090A0B0C0D0E0F10));
182*3f982cf4SFabien Sanglard 
183*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.begin(), data);
184*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.current(), data + 17);
185*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.end(), data + 17);
186*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.offset(), 17u);
187*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.remaining(), 0u);
188*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.length(), 17u);
189*3f982cf4SFabien Sanglard }
190*3f982cf4SFabien Sanglard 
TEST(BigEndianReaderTest,RespectLength)191*3f982cf4SFabien Sanglard TEST(BigEndianReaderTest, RespectLength) {
192*3f982cf4SFabien Sanglard   uint8_t data[8];
193*3f982cf4SFabien Sanglard   BigEndianReader reader(data, sizeof(data));
194*3f982cf4SFabien Sanglard 
195*3f982cf4SFabien Sanglard   // 8 left
196*3f982cf4SFabien Sanglard   EXPECT_FALSE(reader.Skip(9));
197*3f982cf4SFabien Sanglard   EXPECT_TRUE(reader.Skip(1));
198*3f982cf4SFabien Sanglard 
199*3f982cf4SFabien Sanglard   // 7 left
200*3f982cf4SFabien Sanglard   uint64_t u64;
201*3f982cf4SFabien Sanglard   EXPECT_FALSE(reader.Read<uint64_t>(&u64));
202*3f982cf4SFabien Sanglard   EXPECT_TRUE(reader.Skip(4));
203*3f982cf4SFabien Sanglard 
204*3f982cf4SFabien Sanglard   // 3 left
205*3f982cf4SFabien Sanglard   uint32_t u32;
206*3f982cf4SFabien Sanglard   EXPECT_FALSE(reader.Read<uint32_t>(&u32));
207*3f982cf4SFabien Sanglard   EXPECT_TRUE(reader.Skip(2));
208*3f982cf4SFabien Sanglard 
209*3f982cf4SFabien Sanglard   // 1 left
210*3f982cf4SFabien Sanglard   uint16_t u16;
211*3f982cf4SFabien Sanglard   EXPECT_FALSE(reader.Read<uint16_t>(&u16));
212*3f982cf4SFabien Sanglard 
213*3f982cf4SFabien Sanglard   uint8_t buffer[2];
214*3f982cf4SFabien Sanglard   EXPECT_FALSE(reader.Read(2, buffer));
215*3f982cf4SFabien Sanglard   EXPECT_TRUE(reader.Skip(1));
216*3f982cf4SFabien Sanglard 
217*3f982cf4SFabien Sanglard   // 0 left
218*3f982cf4SFabien Sanglard   uint8_t u8;
219*3f982cf4SFabien Sanglard   EXPECT_FALSE(reader.Read<uint8_t>(&u8));
220*3f982cf4SFabien Sanglard 
221*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.begin(), data);
222*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.current(), data + 8);
223*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.end(), data + 8);
224*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.offset(), 8u);
225*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.remaining(), 0u);
226*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.length(), 8u);
227*3f982cf4SFabien Sanglard }
228*3f982cf4SFabien Sanglard 
TEST(BigEndianBufferCursorTest,CursorCommit)229*3f982cf4SFabien Sanglard TEST(BigEndianBufferCursorTest, CursorCommit) {
230*3f982cf4SFabien Sanglard   uint8_t data[16] = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,
231*3f982cf4SFabien Sanglard                       0x8, 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF};
232*3f982cf4SFabien Sanglard   BigEndianReader reader(data, sizeof(data));
233*3f982cf4SFabien Sanglard 
234*3f982cf4SFabien Sanglard   {
235*3f982cf4SFabien Sanglard     BigEndianReader::Cursor cursor(&reader);
236*3f982cf4SFabien Sanglard 
237*3f982cf4SFabien Sanglard     uint8_t u8;
238*3f982cf4SFabien Sanglard     EXPECT_TRUE(reader.Read<uint8_t>(&u8));
239*3f982cf4SFabien Sanglard     EXPECT_EQ(cursor.delta(), 1u);
240*3f982cf4SFabien Sanglard 
241*3f982cf4SFabien Sanglard     uint16_t u16;
242*3f982cf4SFabien Sanglard     EXPECT_TRUE(reader.Read<uint16_t>(&u16));
243*3f982cf4SFabien Sanglard     EXPECT_EQ(cursor.delta(), 3u);
244*3f982cf4SFabien Sanglard 
245*3f982cf4SFabien Sanglard     uint32_t u32;
246*3f982cf4SFabien Sanglard     EXPECT_TRUE(reader.Read<uint32_t>(&u32));
247*3f982cf4SFabien Sanglard     EXPECT_EQ(cursor.delta(), 7u);
248*3f982cf4SFabien Sanglard 
249*3f982cf4SFabien Sanglard     uint64_t u64;
250*3f982cf4SFabien Sanglard     EXPECT_TRUE(reader.Read<uint64_t>(&u64));
251*3f982cf4SFabien Sanglard     EXPECT_EQ(cursor.delta(), 15u);
252*3f982cf4SFabien Sanglard 
253*3f982cf4SFabien Sanglard     EXPECT_FALSE(reader.Skip(2));
254*3f982cf4SFabien Sanglard     EXPECT_EQ(cursor.delta(), 15u);
255*3f982cf4SFabien Sanglard     EXPECT_EQ(static_cast<size_t>(reader.current() - cursor.origin()),
256*3f982cf4SFabien Sanglard               cursor.delta());
257*3f982cf4SFabien Sanglard 
258*3f982cf4SFabien Sanglard     cursor.Commit();
259*3f982cf4SFabien Sanglard   }
260*3f982cf4SFabien Sanglard 
261*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.begin(), data);
262*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.current(), data + 15);
263*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.end(), data + 16);
264*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.offset(), 15u);
265*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.remaining(), 1u);
266*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.length(), 16u);
267*3f982cf4SFabien Sanglard }
268*3f982cf4SFabien Sanglard 
TEST(BigEndianBufferCursorTest,CursorRollback)269*3f982cf4SFabien Sanglard TEST(BigEndianBufferCursorTest, CursorRollback) {
270*3f982cf4SFabien Sanglard   uint8_t data[16];
271*3f982cf4SFabien Sanglard   BigEndianReader reader(data, sizeof(data));
272*3f982cf4SFabien Sanglard 
273*3f982cf4SFabien Sanglard   {
274*3f982cf4SFabien Sanglard     BigEndianReader::Cursor cursor(&reader);
275*3f982cf4SFabien Sanglard 
276*3f982cf4SFabien Sanglard     EXPECT_TRUE(reader.Skip(4));
277*3f982cf4SFabien Sanglard     EXPECT_EQ(cursor.delta(), 4u);
278*3f982cf4SFabien Sanglard   }
279*3f982cf4SFabien Sanglard 
280*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.begin(), data);
281*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.current(), data);
282*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.end(), data + 16u);
283*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.offset(), 0u);
284*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.remaining(), 16u);
285*3f982cf4SFabien Sanglard   EXPECT_EQ(reader.length(), 16u);
286*3f982cf4SFabien Sanglard }
287*3f982cf4SFabien Sanglard 
TEST(BigEndianWriterTest,ConstructWithValidBuffer)288*3f982cf4SFabien Sanglard TEST(BigEndianWriterTest, ConstructWithValidBuffer) {
289*3f982cf4SFabien Sanglard   uint8_t data[64];
290*3f982cf4SFabien Sanglard   BigEndianWriter writer(data, sizeof(data));
291*3f982cf4SFabien Sanglard 
292*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.begin(), data);
293*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.current(), data);
294*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.end(), data + 64u);
295*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.offset(), 0u);
296*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.remaining(), 64u);
297*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.length(), 64u);
298*3f982cf4SFabien Sanglard }
299*3f982cf4SFabien Sanglard 
TEST(BigEndianWriterTest,SkipLessThanRemaining)300*3f982cf4SFabien Sanglard TEST(BigEndianWriterTest, SkipLessThanRemaining) {
301*3f982cf4SFabien Sanglard   uint8_t data[64];
302*3f982cf4SFabien Sanglard   BigEndianWriter writer(data, sizeof(data));
303*3f982cf4SFabien Sanglard 
304*3f982cf4SFabien Sanglard   EXPECT_TRUE(writer.Skip(16));
305*3f982cf4SFabien Sanglard 
306*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.begin(), data);
307*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.current(), data + 16u);
308*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.end(), data + 64);
309*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.offset(), 16u);
310*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.remaining(), 48u);
311*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.length(), 64u);
312*3f982cf4SFabien Sanglard }
313*3f982cf4SFabien Sanglard 
TEST(BigEndianWriterTest,SkipMoreThanRemaining)314*3f982cf4SFabien Sanglard TEST(BigEndianWriterTest, SkipMoreThanRemaining) {
315*3f982cf4SFabien Sanglard   uint8_t data[64];
316*3f982cf4SFabien Sanglard   BigEndianWriter writer(data, sizeof(data));
317*3f982cf4SFabien Sanglard 
318*3f982cf4SFabien Sanglard   EXPECT_TRUE(writer.Skip(16));
319*3f982cf4SFabien Sanglard   EXPECT_FALSE(writer.Skip(64));
320*3f982cf4SFabien Sanglard 
321*3f982cf4SFabien Sanglard   // Check that failed Skip does not modify any pointers or offsets.
322*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.begin(), data);
323*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.current(), data + 16u);
324*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.end(), data + 64u);
325*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.offset(), 16u);
326*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.remaining(), 48u);
327*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.length(), 64u);
328*3f982cf4SFabien Sanglard }
329*3f982cf4SFabien Sanglard 
TEST(BigEndianWriterTest,ConstructWithZeroLengthBuffer)330*3f982cf4SFabien Sanglard TEST(BigEndianWriterTest, ConstructWithZeroLengthBuffer) {
331*3f982cf4SFabien Sanglard   uint8_t data[8];
332*3f982cf4SFabien Sanglard   BigEndianWriter writer(data, 0);
333*3f982cf4SFabien Sanglard 
334*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.begin(), data);
335*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.current(), data);
336*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.end(), data);
337*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.offset(), 0u);
338*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.remaining(), 0u);
339*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.length(), 0u);
340*3f982cf4SFabien Sanglard 
341*3f982cf4SFabien Sanglard   EXPECT_FALSE(writer.Skip(1));
342*3f982cf4SFabien Sanglard }
343*3f982cf4SFabien Sanglard 
TEST(BigEndianWriterTest,WriteValues)344*3f982cf4SFabien Sanglard TEST(BigEndianWriterTest, WriteValues) {
345*3f982cf4SFabien Sanglard   uint8_t expected[17] = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
346*3f982cf4SFabien Sanglard                           0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x10};
347*3f982cf4SFabien Sanglard 
348*3f982cf4SFabien Sanglard   uint8_t data[17];
349*3f982cf4SFabien Sanglard   memset(data, 0xFF, sizeof(data));
350*3f982cf4SFabien Sanglard   BigEndianWriter writer(data, sizeof(data));
351*3f982cf4SFabien Sanglard 
352*3f982cf4SFabien Sanglard   uint8_t buffer[] = {0x0, 0x1};
353*3f982cf4SFabien Sanglard   EXPECT_TRUE(writer.Write(buffer, sizeof(buffer)));
354*3f982cf4SFabien Sanglard   EXPECT_TRUE(writer.Write<uint8_t>(UINT8_C(0x2)));
355*3f982cf4SFabien Sanglard   EXPECT_TRUE(writer.Write<uint16_t>(UINT16_C(0x0304)));
356*3f982cf4SFabien Sanglard   EXPECT_TRUE(writer.Write<uint32_t>(UINT32_C(0x05060708)));
357*3f982cf4SFabien Sanglard   EXPECT_TRUE(writer.Write<uint64_t>(UINT64_C(0x090A0B0C0D0E0F10)));
358*3f982cf4SFabien Sanglard   EXPECT_THAT(data, testing::ElementsAreArray(expected));
359*3f982cf4SFabien Sanglard 
360*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.begin(), data);
361*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.current(), data + 17);
362*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.end(), data + 17);
363*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.offset(), 17u);
364*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.remaining(), 0u);
365*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.length(), 17u);
366*3f982cf4SFabien Sanglard }
367*3f982cf4SFabien Sanglard 
TEST(BigEndianWriterTest,RespectLength)368*3f982cf4SFabien Sanglard TEST(BigEndianWriterTest, RespectLength) {
369*3f982cf4SFabien Sanglard   uint8_t data[8];
370*3f982cf4SFabien Sanglard   BigEndianWriter writer(data, sizeof(data));
371*3f982cf4SFabien Sanglard 
372*3f982cf4SFabien Sanglard   // 8 left
373*3f982cf4SFabien Sanglard   EXPECT_FALSE(writer.Skip(9));
374*3f982cf4SFabien Sanglard   EXPECT_TRUE(writer.Skip(1));
375*3f982cf4SFabien Sanglard 
376*3f982cf4SFabien Sanglard   // 7 left
377*3f982cf4SFabien Sanglard   EXPECT_FALSE(writer.Write<uint64_t>(0));
378*3f982cf4SFabien Sanglard   EXPECT_TRUE(writer.Skip(4));
379*3f982cf4SFabien Sanglard 
380*3f982cf4SFabien Sanglard   // 3 left
381*3f982cf4SFabien Sanglard   EXPECT_FALSE(writer.Write<uint32_t>(0));
382*3f982cf4SFabien Sanglard   EXPECT_TRUE(writer.Skip(2));
383*3f982cf4SFabien Sanglard 
384*3f982cf4SFabien Sanglard   // 1 left
385*3f982cf4SFabien Sanglard   EXPECT_FALSE(writer.Write<uint16_t>(0));
386*3f982cf4SFabien Sanglard 
387*3f982cf4SFabien Sanglard   uint8_t buffer[2];
388*3f982cf4SFabien Sanglard   EXPECT_FALSE(writer.Write(buffer, 2));
389*3f982cf4SFabien Sanglard   EXPECT_TRUE(writer.Skip(1));
390*3f982cf4SFabien Sanglard 
391*3f982cf4SFabien Sanglard   // 0 left
392*3f982cf4SFabien Sanglard   EXPECT_FALSE(writer.Write<uint8_t>(0));
393*3f982cf4SFabien Sanglard   EXPECT_EQ(0u, writer.remaining());
394*3f982cf4SFabien Sanglard 
395*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.begin(), data);
396*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.current(), data + 8);
397*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.end(), data + 8);
398*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.offset(), 8u);
399*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.remaining(), 0u);
400*3f982cf4SFabien Sanglard   EXPECT_EQ(writer.length(), 8u);
401*3f982cf4SFabien Sanglard }
402*3f982cf4SFabien Sanglard 
403*3f982cf4SFabien Sanglard }  // namespace
404*3f982cf4SFabien Sanglard }  // namespace openscreen
405