1*635a8641SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Worker #include "base/big_endian.h"
6*635a8641SAndroid Build Coastguard Worker
7*635a8641SAndroid Build Coastguard Worker #include <stdint.h>
8*635a8641SAndroid Build Coastguard Worker
9*635a8641SAndroid Build Coastguard Worker #include "base/strings/string_piece.h"
10*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
11*635a8641SAndroid Build Coastguard Worker
12*635a8641SAndroid Build Coastguard Worker namespace base {
13*635a8641SAndroid Build Coastguard Worker
TEST(BigEndianReaderTest,ReadsValues)14*635a8641SAndroid Build Coastguard Worker TEST(BigEndianReaderTest, ReadsValues) {
15*635a8641SAndroid Build Coastguard Worker char data[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF,
16*635a8641SAndroid Build Coastguard Worker 0x1A, 0x2B, 0x3C, 0x4D, 0x5E };
17*635a8641SAndroid Build Coastguard Worker char buf[2];
18*635a8641SAndroid Build Coastguard Worker uint8_t u8;
19*635a8641SAndroid Build Coastguard Worker uint16_t u16;
20*635a8641SAndroid Build Coastguard Worker uint32_t u32;
21*635a8641SAndroid Build Coastguard Worker uint64_t u64;
22*635a8641SAndroid Build Coastguard Worker base::StringPiece piece;
23*635a8641SAndroid Build Coastguard Worker BigEndianReader reader(data, sizeof(data));
24*635a8641SAndroid Build Coastguard Worker
25*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(reader.Skip(2));
26*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(data + 2, reader.ptr());
27*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(reader.remaining(), static_cast<int>(sizeof(data)) - 2);
28*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(reader.ReadBytes(buf, sizeof(buf)));
29*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0x2, buf[0]);
30*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0x3, buf[1]);
31*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(reader.ReadU8(&u8));
32*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0x4, u8);
33*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(reader.ReadU16(&u16));
34*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0x0506, u16);
35*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(reader.ReadU32(&u32));
36*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0x0708090Au, u32);
37*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(reader.ReadU64(&u64));
38*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0x0B0C0D0E0F1A2B3Cllu, u64);
39*635a8641SAndroid Build Coastguard Worker base::StringPiece expected(reader.ptr(), 2);
40*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(reader.ReadPiece(&piece, 2));
41*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(2u, piece.size());
42*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected.data(), piece.data());
43*635a8641SAndroid Build Coastguard Worker }
44*635a8641SAndroid Build Coastguard Worker
TEST(BigEndianReaderTest,RespectsLength)45*635a8641SAndroid Build Coastguard Worker TEST(BigEndianReaderTest, RespectsLength) {
46*635a8641SAndroid Build Coastguard Worker char data[8];
47*635a8641SAndroid Build Coastguard Worker char buf[2];
48*635a8641SAndroid Build Coastguard Worker uint8_t u8;
49*635a8641SAndroid Build Coastguard Worker uint16_t u16;
50*635a8641SAndroid Build Coastguard Worker uint32_t u32;
51*635a8641SAndroid Build Coastguard Worker uint64_t u64;
52*635a8641SAndroid Build Coastguard Worker base::StringPiece piece;
53*635a8641SAndroid Build Coastguard Worker BigEndianReader reader(data, sizeof(data));
54*635a8641SAndroid Build Coastguard Worker // 8 left
55*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(reader.Skip(9));
56*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(reader.Skip(1));
57*635a8641SAndroid Build Coastguard Worker // 7 left
58*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(reader.ReadU64(&u64));
59*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(reader.Skip(4));
60*635a8641SAndroid Build Coastguard Worker // 3 left
61*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(reader.ReadU32(&u32));
62*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(reader.ReadPiece(&piece, 4));
63*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(reader.Skip(2));
64*635a8641SAndroid Build Coastguard Worker // 1 left
65*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(reader.ReadU16(&u16));
66*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(reader.ReadBytes(buf, 2));
67*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(reader.Skip(1));
68*635a8641SAndroid Build Coastguard Worker // 0 left
69*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(reader.ReadU8(&u8));
70*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, reader.remaining());
71*635a8641SAndroid Build Coastguard Worker }
72*635a8641SAndroid Build Coastguard Worker
TEST(BigEndianWriterTest,WritesValues)73*635a8641SAndroid Build Coastguard Worker TEST(BigEndianWriterTest, WritesValues) {
74*635a8641SAndroid Build Coastguard Worker char expected[] = { 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 0xA, 0xB, 0xC, 0xD, 0xE,
75*635a8641SAndroid Build Coastguard Worker 0xF, 0x1A, 0x2B, 0x3C };
76*635a8641SAndroid Build Coastguard Worker char data[sizeof(expected)];
77*635a8641SAndroid Build Coastguard Worker char buf[] = { 0x2, 0x3 };
78*635a8641SAndroid Build Coastguard Worker memset(data, 0, sizeof(data));
79*635a8641SAndroid Build Coastguard Worker BigEndianWriter writer(data, sizeof(data));
80*635a8641SAndroid Build Coastguard Worker
81*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(writer.Skip(2));
82*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(writer.WriteBytes(buf, sizeof(buf)));
83*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(writer.WriteU8(0x4));
84*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(writer.WriteU16(0x0506));
85*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(writer.WriteU32(0x0708090A));
86*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(writer.WriteU64(0x0B0C0D0E0F1A2B3Cllu));
87*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, memcmp(expected, data, sizeof(expected)));
88*635a8641SAndroid Build Coastguard Worker }
89*635a8641SAndroid Build Coastguard Worker
TEST(BigEndianWriterTest,RespectsLength)90*635a8641SAndroid Build Coastguard Worker TEST(BigEndianWriterTest, RespectsLength) {
91*635a8641SAndroid Build Coastguard Worker char data[8];
92*635a8641SAndroid Build Coastguard Worker char buf[2];
93*635a8641SAndroid Build Coastguard Worker uint8_t u8 = 0;
94*635a8641SAndroid Build Coastguard Worker uint16_t u16 = 0;
95*635a8641SAndroid Build Coastguard Worker uint32_t u32 = 0;
96*635a8641SAndroid Build Coastguard Worker uint64_t u64 = 0;
97*635a8641SAndroid Build Coastguard Worker BigEndianWriter writer(data, sizeof(data));
98*635a8641SAndroid Build Coastguard Worker // 8 left
99*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(writer.Skip(9));
100*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(writer.Skip(1));
101*635a8641SAndroid Build Coastguard Worker // 7 left
102*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(writer.WriteU64(u64));
103*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(writer.Skip(4));
104*635a8641SAndroid Build Coastguard Worker // 3 left
105*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(writer.WriteU32(u32));
106*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(writer.Skip(2));
107*635a8641SAndroid Build Coastguard Worker // 1 left
108*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(writer.WriteU16(u16));
109*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(writer.WriteBytes(buf, 2));
110*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(writer.Skip(1));
111*635a8641SAndroid Build Coastguard Worker // 0 left
112*635a8641SAndroid Build Coastguard Worker EXPECT_FALSE(writer.WriteU8(u8));
113*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(0, writer.remaining());
114*635a8641SAndroid Build Coastguard Worker }
115*635a8641SAndroid Build Coastguard Worker
116*635a8641SAndroid Build Coastguard Worker } // namespace base
117