xref: /aosp_15_r20/art/libartbase/base/leb128_test.cc (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2013 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #include "leb128.h"
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker #include "gtest/gtest.h"
20*795d594fSAndroid Build Coastguard Worker #include "histogram-inl.h"
21*795d594fSAndroid Build Coastguard Worker #include "time_utils.h"
22*795d594fSAndroid Build Coastguard Worker 
23*795d594fSAndroid Build Coastguard Worker namespace art {
24*795d594fSAndroid Build Coastguard Worker 
25*795d594fSAndroid Build Coastguard Worker struct DecodeUnsignedLeb128TestCase {
26*795d594fSAndroid Build Coastguard Worker   uint32_t decoded;
27*795d594fSAndroid Build Coastguard Worker   uint8_t leb128_data[5];
28*795d594fSAndroid Build Coastguard Worker };
29*795d594fSAndroid Build Coastguard Worker 
30*795d594fSAndroid Build Coastguard Worker static const DecodeUnsignedLeb128TestCase uleb128_tests[] = {
31*795d594fSAndroid Build Coastguard Worker     {0,          {0, 0, 0, 0, 0}},
32*795d594fSAndroid Build Coastguard Worker     {1,          {1, 0, 0, 0, 0}},
33*795d594fSAndroid Build Coastguard Worker     {0x7F,       {0x7F, 0, 0, 0, 0}},
34*795d594fSAndroid Build Coastguard Worker     {0x80,       {0x80, 1, 0, 0, 0}},
35*795d594fSAndroid Build Coastguard Worker     {0x81,       {0x81, 1, 0, 0, 0}},
36*795d594fSAndroid Build Coastguard Worker     {0xFF,       {0xFF, 1, 0, 0, 0}},
37*795d594fSAndroid Build Coastguard Worker     {0x4000,     {0x80, 0x80, 1, 0, 0}},
38*795d594fSAndroid Build Coastguard Worker     {0x4001,     {0x81, 0x80, 1, 0, 0}},
39*795d594fSAndroid Build Coastguard Worker     {0x4081,     {0x81, 0x81, 1, 0, 0}},
40*795d594fSAndroid Build Coastguard Worker     {0x0FFFFFFF, {0xFF, 0xFF, 0xFF, 0x7F, 0}},
41*795d594fSAndroid Build Coastguard Worker     {0xFFFFFFFF, {0xFF, 0xFF, 0xFF, 0xFF, 0xF}},
42*795d594fSAndroid Build Coastguard Worker };
43*795d594fSAndroid Build Coastguard Worker 
44*795d594fSAndroid Build Coastguard Worker struct Decode64bitUnsignedLeb128TestCase {
45*795d594fSAndroid Build Coastguard Worker   uint64_t decoded;
46*795d594fSAndroid Build Coastguard Worker   uint8_t leb128_data[10];
47*795d594fSAndroid Build Coastguard Worker };
48*795d594fSAndroid Build Coastguard Worker 
49*795d594fSAndroid Build Coastguard Worker static const Decode64bitUnsignedLeb128TestCase uleb128_64bit_tests[] = {
50*795d594fSAndroid Build Coastguard Worker     {0,                  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
51*795d594fSAndroid Build Coastguard Worker     {1,                  {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
52*795d594fSAndroid Build Coastguard Worker     {0x7F,               {0x7F, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
53*795d594fSAndroid Build Coastguard Worker     {0x80,               {0x80, 1, 0, 0, 0, 0, 0, 0, 0, 0}},
54*795d594fSAndroid Build Coastguard Worker     {0x81,               {0x81, 1, 0, 0, 0, 0, 0, 0, 0, 0}},
55*795d594fSAndroid Build Coastguard Worker     {0xFF,               {0xFF, 1, 0, 0, 0, 0, 0, 0, 0, 0}},
56*795d594fSAndroid Build Coastguard Worker     {0x4000,             {0x80, 0x80, 1, 0, 0, 0, 0, 0, 0, 0}},
57*795d594fSAndroid Build Coastguard Worker     {0x4001,             {0x81, 0x80, 1, 0, 0, 0, 0, 0, 0, 0}},
58*795d594fSAndroid Build Coastguard Worker     {0x4081,             {0x81, 0x81, 1, 0, 0, 0, 0, 0, 0, 0}},
59*795d594fSAndroid Build Coastguard Worker     {0x0FFFFFFF,         {0xFF, 0xFF, 0xFF, 0x7F, 0, 0, 0, 0, 0, 0}},
60*795d594fSAndroid Build Coastguard Worker     {0xFFFFFFFF,         {0xFF, 0xFF, 0xFF, 0xFF, 0xF, 0, 0, 0, 0, 0}},
61*795d594fSAndroid Build Coastguard Worker     {0x1FFFFFFFF,        {0xFF, 0xFF, 0xFF, 0xFF, 0x1F, 0, 0, 0, 0, 0}},
62*795d594fSAndroid Build Coastguard Worker     {0x100000000,        {0x80, 0x80, 0x80, 0x80, 0x10, 0, 0, 0, 0, 0}},
63*795d594fSAndroid Build Coastguard Worker     {0x8FFFFFFFF,        {0xFF, 0xFF, 0xFF, 0xFF, 0x8F, 0x01, 0, 0, 0, 0}},
64*795d594fSAndroid Build Coastguard Worker     {0x8000000000000000, {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01}},
65*795d594fSAndroid Build Coastguard Worker     {0xFFFFFFFFFFFFFFFF, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01}},
66*795d594fSAndroid Build Coastguard Worker };
67*795d594fSAndroid Build Coastguard Worker 
68*795d594fSAndroid Build Coastguard Worker struct DecodeSignedLeb128TestCase {
69*795d594fSAndroid Build Coastguard Worker   int32_t decoded;
70*795d594fSAndroid Build Coastguard Worker   uint8_t leb128_data[5];
71*795d594fSAndroid Build Coastguard Worker };
72*795d594fSAndroid Build Coastguard Worker 
73*795d594fSAndroid Build Coastguard Worker static const DecodeSignedLeb128TestCase sleb128_tests[] = {
74*795d594fSAndroid Build Coastguard Worker     {0,          {0, 0, 0, 0, 0}},
75*795d594fSAndroid Build Coastguard Worker     {1,          {1, 0, 0, 0, 0}},
76*795d594fSAndroid Build Coastguard Worker     {0x3F,       {0x3F, 0, 0, 0, 0}},
77*795d594fSAndroid Build Coastguard Worker     {0x40,       {0xC0, 0 /* sign bit */, 0, 0, 0}},
78*795d594fSAndroid Build Coastguard Worker     {0x41,       {0xC1, 0 /* sign bit */, 0, 0, 0}},
79*795d594fSAndroid Build Coastguard Worker     {0x80,       {0x80, 1, 0, 0, 0}},
80*795d594fSAndroid Build Coastguard Worker     {0xFF,       {0xFF, 1, 0, 0, 0}},
81*795d594fSAndroid Build Coastguard Worker     {0x1FFF,     {0xFF, 0x3F, 0, 0, 0}},
82*795d594fSAndroid Build Coastguard Worker     {0x2000,     {0x80, 0xC0, 0 /* sign bit */, 0, 0}},
83*795d594fSAndroid Build Coastguard Worker     {0x2001,     {0x81, 0xC0, 0 /* sign bit */, 0, 0}},
84*795d594fSAndroid Build Coastguard Worker     {0x2081,     {0x81, 0xC1, 0 /* sign bit */, 0, 0}},
85*795d594fSAndroid Build Coastguard Worker     {0x4000,     {0x80, 0x80, 1, 0, 0}},
86*795d594fSAndroid Build Coastguard Worker     {0x0FFFFF,   {0xFF, 0xFF, 0x3F, 0, 0}},
87*795d594fSAndroid Build Coastguard Worker     {0x100000,   {0x80, 0x80, 0xC0, 0 /* sign bit */, 0}},
88*795d594fSAndroid Build Coastguard Worker     {0x100001,   {0x81, 0x80, 0xC0, 0 /* sign bit */, 0}},
89*795d594fSAndroid Build Coastguard Worker     {0x100081,   {0x81, 0x81, 0xC0, 0 /* sign bit */, 0}},
90*795d594fSAndroid Build Coastguard Worker     {0x104081,   {0x81, 0x81, 0xC1, 0 /* sign bit */, 0}},
91*795d594fSAndroid Build Coastguard Worker     {0x200000,   {0x80, 0x80, 0x80, 1, 0}},
92*795d594fSAndroid Build Coastguard Worker     {0x7FFFFFF,  {0xFF, 0xFF, 0xFF, 0x3F, 0}},
93*795d594fSAndroid Build Coastguard Worker     {0x8000000,  {0x80, 0x80, 0x80, 0xC0, 0 /* sign bit */}},
94*795d594fSAndroid Build Coastguard Worker     {0x8000001,  {0x81, 0x80, 0x80, 0xC0, 0 /* sign bit */}},
95*795d594fSAndroid Build Coastguard Worker     {0x8000081,  {0x81, 0x81, 0x80, 0xC0, 0 /* sign bit */}},
96*795d594fSAndroid Build Coastguard Worker     {0x8004081,  {0x81, 0x81, 0x81, 0xC0, 0 /* sign bit */}},
97*795d594fSAndroid Build Coastguard Worker     {0x8204081,  {0x81, 0x81, 0x81, 0xC1, 0 /* sign bit */}},
98*795d594fSAndroid Build Coastguard Worker     {0x0FFFFFFF, {0xFF, 0xFF, 0xFF, 0xFF, 0 /* sign bit */}},
99*795d594fSAndroid Build Coastguard Worker     {0x10000000, {0x80, 0x80, 0x80, 0x80, 1}},
100*795d594fSAndroid Build Coastguard Worker     {0x7FFFFFFF, {0xFF, 0xFF, 0xFF, 0xFF, 0x7}},
101*795d594fSAndroid Build Coastguard Worker     {-1,         {0x7F, 0, 0, 0, 0}},
102*795d594fSAndroid Build Coastguard Worker     {-2,         {0x7E, 0, 0, 0, 0}},
103*795d594fSAndroid Build Coastguard Worker     {-0x3F,      {0x41, 0, 0, 0, 0}},
104*795d594fSAndroid Build Coastguard Worker     {-0x40,      {0x40, 0, 0, 0, 0}},
105*795d594fSAndroid Build Coastguard Worker     {-0x41,      {0xBF, 0x7F, 0, 0, 0}},
106*795d594fSAndroid Build Coastguard Worker     {-0x80,      {0x80, 0x7F, 0, 0, 0}},
107*795d594fSAndroid Build Coastguard Worker     {-0x81,      {0xFF, 0x7E, 0, 0, 0}},
108*795d594fSAndroid Build Coastguard Worker     {-0x00002000, {0x80, 0x40, 0, 0, 0}},
109*795d594fSAndroid Build Coastguard Worker     {-0x00002001, {0xFF, 0xBF, 0x7F, 0, 0}},
110*795d594fSAndroid Build Coastguard Worker     {-0x00100000, {0x80, 0x80, 0x40, 0, 0}},
111*795d594fSAndroid Build Coastguard Worker     {-0x00100001, {0xFF, 0xFF, 0xBF, 0x7F, 0}},
112*795d594fSAndroid Build Coastguard Worker     {-0x08000000, {0x80, 0x80, 0x80, 0x40, 0}},
113*795d594fSAndroid Build Coastguard Worker     {-0x08000001, {0xFF, 0xFF, 0xFF, 0xBF, 0x7F}},
114*795d594fSAndroid Build Coastguard Worker     {-0x20000000, {0x80, 0x80, 0x80, 0x80, 0x7E}},
115*795d594fSAndroid Build Coastguard Worker     {static_cast<int32_t>(0x80000000), {0x80, 0x80, 0x80, 0x80, 0x78}},
116*795d594fSAndroid Build Coastguard Worker };
117*795d594fSAndroid Build Coastguard Worker 
118*795d594fSAndroid Build Coastguard Worker struct Decode64bitSignedLeb128TestCase {
119*795d594fSAndroid Build Coastguard Worker   int64_t decoded;
120*795d594fSAndroid Build Coastguard Worker   uint8_t leb128_data[10];
121*795d594fSAndroid Build Coastguard Worker };
122*795d594fSAndroid Build Coastguard Worker 
123*795d594fSAndroid Build Coastguard Worker static const Decode64bitSignedLeb128TestCase sleb128_64bit_tests[] = {
124*795d594fSAndroid Build Coastguard Worker     {0,                   {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
125*795d594fSAndroid Build Coastguard Worker     {1,                   {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
126*795d594fSAndroid Build Coastguard Worker     {0x3F,                {0x3F, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
127*795d594fSAndroid Build Coastguard Worker     {0x40,                {0xC0, 0 /* sign bit */, 0, 0, 0, 0, 0, 0, 0, 0}},
128*795d594fSAndroid Build Coastguard Worker     {0x800000000,         {0x80, 0x80, 0x80, 0x80, 0x80, 0x01, 0, 0, 0, 0}},
129*795d594fSAndroid Build Coastguard Worker     {0x100000000,         {0x80, 0x80, 0x80, 0x80, 0x10, 0, 0, 0, 0, 0}},
130*795d594fSAndroid Build Coastguard Worker     {0x700000000,         {0x80, 0x80, 0x80, 0x80, 0xF0, 0 /* sign bit */, 0, 0, 0, 0}},
131*795d594fSAndroid Build Coastguard Worker     {0x704081002,         {0x82, 0xA0, 0xA0, 0xA0, 0xF0, 0 /* sign bit*/, 0, 0, 0}},
132*795d594fSAndroid Build Coastguard Worker     {0x07FFFFFFFFFFFFFF,  {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x07, 0}},
133*795d594fSAndroid Build Coastguard Worker     {0x23FFFFFFFFFFFFFF,  {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x23, 0}},
134*795d594fSAndroid Build Coastguard Worker     {0x0800000000000000,  {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x08, 0}},
135*795d594fSAndroid Build Coastguard Worker     {0x0800000008400421,  {0xA1, 0x88, 0x80, 0xC2, 0x80, 0x80, 0x80, 0x80, 0x08, 0}},
136*795d594fSAndroid Build Coastguard Worker     {0x70FFFFFFFFFFFFFF,  {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0 /* sign bit*/}},
137*795d594fSAndroid Build Coastguard Worker     {0x7000000000000081,  {0x81, 0x81, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xF0, 0 /* sign bit*/}},
138*795d594fSAndroid Build Coastguard Worker     {0x0FFFFFFFFFFFFFFF,  {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0}},
139*795d594fSAndroid Build Coastguard Worker     {-1,                  {0x7F, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
140*795d594fSAndroid Build Coastguard Worker     {-2,                  {0x7E, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
141*795d594fSAndroid Build Coastguard Worker     {-0x3F,               {0x41, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
142*795d594fSAndroid Build Coastguard Worker     {-0x40,               {0x40, 0, 0, 0, 0, 0, 0, 0, 0, 0}},
143*795d594fSAndroid Build Coastguard Worker     {-0x200000000,        {0x80, 0x80, 0x80, 0x80, 0x60, 0, 0, 0, 0}},
144*795d594fSAndroid Build Coastguard Worker     {-0x200000001,        {0xFF, 0xFF, 0xFF, 0xFF, 0x5F, 0, 0, 0, 0}},
145*795d594fSAndroid Build Coastguard Worker     {-0x0800000000000000, {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x78, 0}},
146*795d594fSAndroid Build Coastguard Worker     {-0x0800000000000001, {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x77, 0}},
147*795d594fSAndroid Build Coastguard Worker     {-0x2000000000000000, {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x60, 0}},
148*795d594fSAndroid Build Coastguard Worker     {static_cast<int64_t>(0x8000000000000000),
149*795d594fSAndroid Build Coastguard Worker      {0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x7F}},
150*795d594fSAndroid Build Coastguard Worker };
151*795d594fSAndroid Build Coastguard Worker 
TEST(Leb128Test,UnsignedSinglesVector)152*795d594fSAndroid Build Coastguard Worker TEST(Leb128Test, UnsignedSinglesVector) {
153*795d594fSAndroid Build Coastguard Worker   // Test individual encodings.
154*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(uleb128_tests); ++i) {
155*795d594fSAndroid Build Coastguard Worker     Leb128EncodingVector<> builder;
156*795d594fSAndroid Build Coastguard Worker     builder.PushBackUnsigned(uleb128_tests[i].decoded);
157*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(UnsignedLeb128Size(uleb128_tests[i].decoded), builder.GetData().size());
158*795d594fSAndroid Build Coastguard Worker     const uint8_t* data_ptr = &uleb128_tests[i].leb128_data[0];
159*795d594fSAndroid Build Coastguard Worker     const uint8_t* encoded_data_ptr = &builder.GetData()[0];
160*795d594fSAndroid Build Coastguard Worker     for (size_t j = 0; j < 5; ++j) {
161*795d594fSAndroid Build Coastguard Worker       if (j < builder.GetData().size()) {
162*795d594fSAndroid Build Coastguard Worker         EXPECT_EQ(data_ptr[j], encoded_data_ptr[j]) << " i = " << i << " j = " << j;
163*795d594fSAndroid Build Coastguard Worker       } else {
164*795d594fSAndroid Build Coastguard Worker         EXPECT_EQ(data_ptr[j], 0U) << " i = " << i << " j = " << j;
165*795d594fSAndroid Build Coastguard Worker       }
166*795d594fSAndroid Build Coastguard Worker     }
167*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(DecodeUnsignedLeb128(&data_ptr), uleb128_tests[i].decoded) << " i = " << i;
168*795d594fSAndroid Build Coastguard Worker   }
169*795d594fSAndroid Build Coastguard Worker }
170*795d594fSAndroid Build Coastguard Worker 
TEST(Leb128Test,UnsignedSingles)171*795d594fSAndroid Build Coastguard Worker TEST(Leb128Test, UnsignedSingles) {
172*795d594fSAndroid Build Coastguard Worker   // Test individual encodings.
173*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(uleb128_tests); ++i) {
174*795d594fSAndroid Build Coastguard Worker     uint8_t encoded_data[5];
175*795d594fSAndroid Build Coastguard Worker     uint8_t* end = EncodeUnsignedLeb128(encoded_data, uleb128_tests[i].decoded);
176*795d594fSAndroid Build Coastguard Worker     size_t data_size = static_cast<size_t>(end - encoded_data);
177*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(UnsignedLeb128Size(uleb128_tests[i].decoded), data_size);
178*795d594fSAndroid Build Coastguard Worker     const uint8_t* data_ptr = &uleb128_tests[i].leb128_data[0];
179*795d594fSAndroid Build Coastguard Worker     for (size_t j = 0; j < 5; ++j) {
180*795d594fSAndroid Build Coastguard Worker       if (j < data_size) {
181*795d594fSAndroid Build Coastguard Worker         EXPECT_EQ(data_ptr[j], encoded_data[j]) << " i = " << i << " j = " << j;
182*795d594fSAndroid Build Coastguard Worker       } else {
183*795d594fSAndroid Build Coastguard Worker         EXPECT_EQ(data_ptr[j], 0U) << " i = " << i << " j = " << j;
184*795d594fSAndroid Build Coastguard Worker       }
185*795d594fSAndroid Build Coastguard Worker     }
186*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(DecodeUnsignedLeb128(&data_ptr), uleb128_tests[i].decoded) << " i = " << i;
187*795d594fSAndroid Build Coastguard Worker   }
188*795d594fSAndroid Build Coastguard Worker }
189*795d594fSAndroid Build Coastguard Worker 
TEST(Leb128Test,UnsignedSingles64bit)190*795d594fSAndroid Build Coastguard Worker TEST(Leb128Test, UnsignedSingles64bit) {
191*795d594fSAndroid Build Coastguard Worker   // Test individual encodings.
192*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(uleb128_64bit_tests); ++i) {
193*795d594fSAndroid Build Coastguard Worker     uint8_t encoded_data[10];
194*795d594fSAndroid Build Coastguard Worker     uint8_t* end = EncodeUnsignedLeb128(encoded_data, uleb128_64bit_tests[i].decoded);
195*795d594fSAndroid Build Coastguard Worker     size_t data_size = static_cast<size_t>(end - encoded_data);
196*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(UnsignedLeb128Size(uleb128_64bit_tests[i].decoded), data_size);
197*795d594fSAndroid Build Coastguard Worker     const uint8_t* data_ptr = &uleb128_64bit_tests[i].leb128_data[0];
198*795d594fSAndroid Build Coastguard Worker     for (size_t j = 0; j < 10; ++j) {
199*795d594fSAndroid Build Coastguard Worker       if (j < data_size) {
200*795d594fSAndroid Build Coastguard Worker         EXPECT_EQ(data_ptr[j], encoded_data[j]) << " i = " << i << " j = " << j;
201*795d594fSAndroid Build Coastguard Worker       } else {
202*795d594fSAndroid Build Coastguard Worker         EXPECT_EQ(data_ptr[j], 0U) << " i = " << i << " j = " << j;
203*795d594fSAndroid Build Coastguard Worker       }
204*795d594fSAndroid Build Coastguard Worker     }
205*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(DecodeUnsignedLeb128<uint64_t>(&data_ptr), uleb128_64bit_tests[i].decoded)
206*795d594fSAndroid Build Coastguard Worker         << " i = " << i;
207*795d594fSAndroid Build Coastguard Worker   }
208*795d594fSAndroid Build Coastguard Worker }
209*795d594fSAndroid Build Coastguard Worker 
TEST(Leb128Test,UnsignedStreamVector)210*795d594fSAndroid Build Coastguard Worker TEST(Leb128Test, UnsignedStreamVector) {
211*795d594fSAndroid Build Coastguard Worker   // Encode a number of entries.
212*795d594fSAndroid Build Coastguard Worker   Leb128EncodingVector<> builder;
213*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(uleb128_tests); ++i) {
214*795d594fSAndroid Build Coastguard Worker     builder.PushBackUnsigned(uleb128_tests[i].decoded);
215*795d594fSAndroid Build Coastguard Worker   }
216*795d594fSAndroid Build Coastguard Worker   const uint8_t* encoded_data_ptr = &builder.GetData()[0];
217*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(uleb128_tests); ++i) {
218*795d594fSAndroid Build Coastguard Worker     const uint8_t* data_ptr = &uleb128_tests[i].leb128_data[0];
219*795d594fSAndroid Build Coastguard Worker     for (size_t j = 0; j < UnsignedLeb128Size(uleb128_tests[i].decoded); ++j) {
220*795d594fSAndroid Build Coastguard Worker       EXPECT_EQ(data_ptr[j], encoded_data_ptr[j]) << " i = " << i << " j = " << j;
221*795d594fSAndroid Build Coastguard Worker     }
222*795d594fSAndroid Build Coastguard Worker     for (size_t j = UnsignedLeb128Size(uleb128_tests[i].decoded); j < 5; ++j) {
223*795d594fSAndroid Build Coastguard Worker       EXPECT_EQ(data_ptr[j], 0) << " i = " << i << " j = " << j;
224*795d594fSAndroid Build Coastguard Worker     }
225*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(DecodeUnsignedLeb128(&encoded_data_ptr), uleb128_tests[i].decoded) << " i = " << i;
226*795d594fSAndroid Build Coastguard Worker   }
227*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(builder.GetData().size(),
228*795d594fSAndroid Build Coastguard Worker             static_cast<size_t>(encoded_data_ptr - &builder.GetData()[0]));
229*795d594fSAndroid Build Coastguard Worker }
230*795d594fSAndroid Build Coastguard Worker 
TEST(Leb128Test,UnsignedStream)231*795d594fSAndroid Build Coastguard Worker TEST(Leb128Test, UnsignedStream) {
232*795d594fSAndroid Build Coastguard Worker   // Encode a number of entries.
233*795d594fSAndroid Build Coastguard Worker   uint8_t encoded_data[5 * arraysize(uleb128_tests)];
234*795d594fSAndroid Build Coastguard Worker   uint8_t* end = encoded_data;
235*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(uleb128_tests); ++i) {
236*795d594fSAndroid Build Coastguard Worker     end = EncodeUnsignedLeb128(end, uleb128_tests[i].decoded);
237*795d594fSAndroid Build Coastguard Worker   }
238*795d594fSAndroid Build Coastguard Worker   size_t data_size = static_cast<size_t>(end - encoded_data);
239*795d594fSAndroid Build Coastguard Worker   const uint8_t* encoded_data_ptr = encoded_data;
240*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(uleb128_tests); ++i) {
241*795d594fSAndroid Build Coastguard Worker     const uint8_t* data_ptr = &uleb128_tests[i].leb128_data[0];
242*795d594fSAndroid Build Coastguard Worker     for (size_t j = 0; j < UnsignedLeb128Size(uleb128_tests[i].decoded); ++j) {
243*795d594fSAndroid Build Coastguard Worker       EXPECT_EQ(data_ptr[j], encoded_data_ptr[j]) << " i = " << i << " j = " << j;
244*795d594fSAndroid Build Coastguard Worker     }
245*795d594fSAndroid Build Coastguard Worker     for (size_t j = UnsignedLeb128Size(uleb128_tests[i].decoded); j < 5; ++j) {
246*795d594fSAndroid Build Coastguard Worker       EXPECT_EQ(data_ptr[j], 0) << " i = " << i << " j = " << j;
247*795d594fSAndroid Build Coastguard Worker     }
248*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(DecodeUnsignedLeb128(&encoded_data_ptr), uleb128_tests[i].decoded) << " i = " << i;
249*795d594fSAndroid Build Coastguard Worker   }
250*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(data_size, static_cast<size_t>(encoded_data_ptr - encoded_data));
251*795d594fSAndroid Build Coastguard Worker }
252*795d594fSAndroid Build Coastguard Worker 
TEST(Leb128Test,Unsigned64bitStream)253*795d594fSAndroid Build Coastguard Worker TEST(Leb128Test, Unsigned64bitStream) {
254*795d594fSAndroid Build Coastguard Worker   // Encode a number of entries.
255*795d594fSAndroid Build Coastguard Worker   uint8_t encoded_data[10 * arraysize(uleb128_64bit_tests)];
256*795d594fSAndroid Build Coastguard Worker   uint8_t* end = encoded_data;
257*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(uleb128_64bit_tests); ++i) {
258*795d594fSAndroid Build Coastguard Worker     end = EncodeUnsignedLeb128(end, uleb128_64bit_tests[i].decoded);
259*795d594fSAndroid Build Coastguard Worker   }
260*795d594fSAndroid Build Coastguard Worker   size_t data_size = static_cast<size_t>(end - encoded_data);
261*795d594fSAndroid Build Coastguard Worker   const uint8_t* encoded_data_ptr = encoded_data;
262*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(uleb128_64bit_tests); ++i) {
263*795d594fSAndroid Build Coastguard Worker     const uint8_t* data_ptr = &uleb128_64bit_tests[i].leb128_data[0];
264*795d594fSAndroid Build Coastguard Worker     for (size_t j = 0; j < UnsignedLeb128Size(uleb128_64bit_tests[i].decoded); ++j) {
265*795d594fSAndroid Build Coastguard Worker       EXPECT_EQ(data_ptr[j], encoded_data_ptr[j]) << " i = " << i << " j = " << j;
266*795d594fSAndroid Build Coastguard Worker     }
267*795d594fSAndroid Build Coastguard Worker     for (size_t j = UnsignedLeb128Size(uleb128_64bit_tests[i].decoded); j < 10; ++j) {
268*795d594fSAndroid Build Coastguard Worker       EXPECT_EQ(data_ptr[j], 0U) << " i = " << i << " j = " << j;
269*795d594fSAndroid Build Coastguard Worker     }
270*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(DecodeUnsignedLeb128<uint64_t>(&encoded_data_ptr), uleb128_64bit_tests[i].decoded)
271*795d594fSAndroid Build Coastguard Worker         << " i = " << i;
272*795d594fSAndroid Build Coastguard Worker   }
273*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(data_size, static_cast<size_t>(encoded_data_ptr - encoded_data));
274*795d594fSAndroid Build Coastguard Worker }
275*795d594fSAndroid Build Coastguard Worker 
TEST(Leb128Test,SignedSinglesVector)276*795d594fSAndroid Build Coastguard Worker TEST(Leb128Test, SignedSinglesVector) {
277*795d594fSAndroid Build Coastguard Worker   // Test individual encodings.
278*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(sleb128_tests); ++i) {
279*795d594fSAndroid Build Coastguard Worker     Leb128EncodingVector<> builder;
280*795d594fSAndroid Build Coastguard Worker     builder.PushBackSigned(sleb128_tests[i].decoded);
281*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(SignedLeb128Size(sleb128_tests[i].decoded), builder.GetData().size());
282*795d594fSAndroid Build Coastguard Worker     const uint8_t* data_ptr = &sleb128_tests[i].leb128_data[0];
283*795d594fSAndroid Build Coastguard Worker     const uint8_t* encoded_data_ptr = &builder.GetData()[0];
284*795d594fSAndroid Build Coastguard Worker     for (size_t j = 0; j < 5; ++j) {
285*795d594fSAndroid Build Coastguard Worker       if (j < builder.GetData().size()) {
286*795d594fSAndroid Build Coastguard Worker         EXPECT_EQ(data_ptr[j], encoded_data_ptr[j]) << " i = " << i << " j = " << j;
287*795d594fSAndroid Build Coastguard Worker       } else {
288*795d594fSAndroid Build Coastguard Worker         EXPECT_EQ(data_ptr[j], 0U) << " i = " << i << " j = " << j;
289*795d594fSAndroid Build Coastguard Worker       }
290*795d594fSAndroid Build Coastguard Worker     }
291*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(DecodeSignedLeb128(&data_ptr), sleb128_tests[i].decoded) << " i = " << i;
292*795d594fSAndroid Build Coastguard Worker   }
293*795d594fSAndroid Build Coastguard Worker }
294*795d594fSAndroid Build Coastguard Worker 
TEST(Leb128Test,SignedSingles)295*795d594fSAndroid Build Coastguard Worker TEST(Leb128Test, SignedSingles) {
296*795d594fSAndroid Build Coastguard Worker   // Test individual encodings.
297*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(sleb128_tests); ++i) {
298*795d594fSAndroid Build Coastguard Worker     uint8_t encoded_data[5];
299*795d594fSAndroid Build Coastguard Worker     uint8_t* end = EncodeSignedLeb128(encoded_data, sleb128_tests[i].decoded);
300*795d594fSAndroid Build Coastguard Worker     size_t data_size = static_cast<size_t>(end - encoded_data);
301*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(SignedLeb128Size(sleb128_tests[i].decoded), data_size);
302*795d594fSAndroid Build Coastguard Worker     const uint8_t* data_ptr = &sleb128_tests[i].leb128_data[0];
303*795d594fSAndroid Build Coastguard Worker     for (size_t j = 0; j < 5; ++j) {
304*795d594fSAndroid Build Coastguard Worker       if (j < data_size) {
305*795d594fSAndroid Build Coastguard Worker         EXPECT_EQ(data_ptr[j], encoded_data[j]) << " i = " << i << " j = " << j;
306*795d594fSAndroid Build Coastguard Worker       } else {
307*795d594fSAndroid Build Coastguard Worker         EXPECT_EQ(data_ptr[j], 0U) << " i = " << i << " j = " << j;
308*795d594fSAndroid Build Coastguard Worker       }
309*795d594fSAndroid Build Coastguard Worker     }
310*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(DecodeSignedLeb128(&data_ptr), sleb128_tests[i].decoded) << " i = " << i;
311*795d594fSAndroid Build Coastguard Worker   }
312*795d594fSAndroid Build Coastguard Worker }
313*795d594fSAndroid Build Coastguard Worker 
TEST(Leb128Test,SignedSingles64bit)314*795d594fSAndroid Build Coastguard Worker TEST(Leb128Test, SignedSingles64bit) {
315*795d594fSAndroid Build Coastguard Worker   // Test individual encodings.
316*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(sleb128_64bit_tests); ++i) {
317*795d594fSAndroid Build Coastguard Worker     uint8_t encoded_data[10];
318*795d594fSAndroid Build Coastguard Worker     uint8_t* end = EncodeSignedLeb128(encoded_data, sleb128_64bit_tests[i].decoded);
319*795d594fSAndroid Build Coastguard Worker     size_t data_size = static_cast<size_t>(end - encoded_data);
320*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(SignedLeb128Size(sleb128_64bit_tests[i].decoded), data_size);
321*795d594fSAndroid Build Coastguard Worker     const uint8_t* data_ptr = &sleb128_64bit_tests[i].leb128_data[0];
322*795d594fSAndroid Build Coastguard Worker     for (size_t j = 0; j < 10; ++j) {
323*795d594fSAndroid Build Coastguard Worker       if (j < data_size) {
324*795d594fSAndroid Build Coastguard Worker         EXPECT_EQ(data_ptr[j], encoded_data[j]) << " i = " << i << " j = " << j;
325*795d594fSAndroid Build Coastguard Worker       } else {
326*795d594fSAndroid Build Coastguard Worker         EXPECT_EQ(data_ptr[j], 0U) << " i = " << i << " j = " << j;
327*795d594fSAndroid Build Coastguard Worker       }
328*795d594fSAndroid Build Coastguard Worker     }
329*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(DecodeSignedLeb128<int64_t>(&data_ptr), sleb128_64bit_tests[i].decoded)
330*795d594fSAndroid Build Coastguard Worker         << " i = " << i;
331*795d594fSAndroid Build Coastguard Worker   }
332*795d594fSAndroid Build Coastguard Worker }
333*795d594fSAndroid Build Coastguard Worker 
TEST(Leb128Test,SignedStreamVector)334*795d594fSAndroid Build Coastguard Worker TEST(Leb128Test, SignedStreamVector) {
335*795d594fSAndroid Build Coastguard Worker   // Encode a number of entries.
336*795d594fSAndroid Build Coastguard Worker   Leb128EncodingVector<> builder;
337*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(sleb128_tests); ++i) {
338*795d594fSAndroid Build Coastguard Worker     builder.PushBackSigned(sleb128_tests[i].decoded);
339*795d594fSAndroid Build Coastguard Worker   }
340*795d594fSAndroid Build Coastguard Worker   const uint8_t* encoded_data_ptr = &builder.GetData()[0];
341*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(sleb128_tests); ++i) {
342*795d594fSAndroid Build Coastguard Worker     const uint8_t* data_ptr = &sleb128_tests[i].leb128_data[0];
343*795d594fSAndroid Build Coastguard Worker     for (size_t j = 0; j < SignedLeb128Size(sleb128_tests[i].decoded); ++j) {
344*795d594fSAndroid Build Coastguard Worker       EXPECT_EQ(data_ptr[j], encoded_data_ptr[j]) << " i = " << i << " j = " << j;
345*795d594fSAndroid Build Coastguard Worker     }
346*795d594fSAndroid Build Coastguard Worker     for (size_t j = SignedLeb128Size(sleb128_tests[i].decoded); j < 5; ++j) {
347*795d594fSAndroid Build Coastguard Worker       EXPECT_EQ(data_ptr[j], 0) << " i = " << i << " j = " << j;
348*795d594fSAndroid Build Coastguard Worker     }
349*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(DecodeSignedLeb128(&encoded_data_ptr), sleb128_tests[i].decoded) << " i = " << i;
350*795d594fSAndroid Build Coastguard Worker   }
351*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(builder.GetData().size(),
352*795d594fSAndroid Build Coastguard Worker             static_cast<size_t>(encoded_data_ptr - &builder.GetData()[0]));
353*795d594fSAndroid Build Coastguard Worker }
354*795d594fSAndroid Build Coastguard Worker 
TEST(Leb128Test,SignedStream)355*795d594fSAndroid Build Coastguard Worker TEST(Leb128Test, SignedStream) {
356*795d594fSAndroid Build Coastguard Worker   // Encode a number of entries.
357*795d594fSAndroid Build Coastguard Worker   uint8_t encoded_data[5 * arraysize(sleb128_tests)];
358*795d594fSAndroid Build Coastguard Worker   uint8_t* end = encoded_data;
359*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(sleb128_tests); ++i) {
360*795d594fSAndroid Build Coastguard Worker     end = EncodeSignedLeb128(end, sleb128_tests[i].decoded);
361*795d594fSAndroid Build Coastguard Worker   }
362*795d594fSAndroid Build Coastguard Worker   size_t data_size = static_cast<size_t>(end - encoded_data);
363*795d594fSAndroid Build Coastguard Worker   const uint8_t* encoded_data_ptr = encoded_data;
364*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(sleb128_tests); ++i) {
365*795d594fSAndroid Build Coastguard Worker     const uint8_t* data_ptr = &sleb128_tests[i].leb128_data[0];
366*795d594fSAndroid Build Coastguard Worker     for (size_t j = 0; j < SignedLeb128Size(sleb128_tests[i].decoded); ++j) {
367*795d594fSAndroid Build Coastguard Worker       EXPECT_EQ(data_ptr[j], encoded_data_ptr[j]) << " i = " << i << " j = " << j;
368*795d594fSAndroid Build Coastguard Worker     }
369*795d594fSAndroid Build Coastguard Worker     for (size_t j = SignedLeb128Size(sleb128_tests[i].decoded); j < 5; ++j) {
370*795d594fSAndroid Build Coastguard Worker       EXPECT_EQ(data_ptr[j], 0) << " i = " << i << " j = " << j;
371*795d594fSAndroid Build Coastguard Worker     }
372*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(DecodeSignedLeb128(&encoded_data_ptr), sleb128_tests[i].decoded) << " i = " << i;
373*795d594fSAndroid Build Coastguard Worker   }
374*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(data_size, static_cast<size_t>(encoded_data_ptr - encoded_data));
375*795d594fSAndroid Build Coastguard Worker }
376*795d594fSAndroid Build Coastguard Worker 
TEST(Leb128Test,SignedStream64bit)377*795d594fSAndroid Build Coastguard Worker TEST(Leb128Test, SignedStream64bit) {
378*795d594fSAndroid Build Coastguard Worker   // Encode a number of entries.
379*795d594fSAndroid Build Coastguard Worker   uint8_t encoded_data[10 * arraysize(sleb128_64bit_tests)];
380*795d594fSAndroid Build Coastguard Worker   uint8_t* end = encoded_data;
381*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(sleb128_64bit_tests); ++i) {
382*795d594fSAndroid Build Coastguard Worker     end = EncodeSignedLeb128(end, sleb128_64bit_tests[i].decoded);
383*795d594fSAndroid Build Coastguard Worker   }
384*795d594fSAndroid Build Coastguard Worker   size_t data_size = static_cast<size_t>(end - encoded_data);
385*795d594fSAndroid Build Coastguard Worker   const uint8_t* encoded_data_ptr = encoded_data;
386*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(sleb128_64bit_tests); ++i) {
387*795d594fSAndroid Build Coastguard Worker     const uint8_t* data_ptr = &sleb128_64bit_tests[i].leb128_data[0];
388*795d594fSAndroid Build Coastguard Worker     for (size_t j = 0; j < SignedLeb128Size(sleb128_64bit_tests[i].decoded); ++j) {
389*795d594fSAndroid Build Coastguard Worker       EXPECT_EQ(data_ptr[j], encoded_data_ptr[j]) << " i = " << i << " j = " << j;
390*795d594fSAndroid Build Coastguard Worker     }
391*795d594fSAndroid Build Coastguard Worker     for (size_t j = SignedLeb128Size(sleb128_64bit_tests[i].decoded); j < 10; ++j) {
392*795d594fSAndroid Build Coastguard Worker       EXPECT_EQ(data_ptr[j], 0) << " i = " << i << " j = " << j;
393*795d594fSAndroid Build Coastguard Worker     }
394*795d594fSAndroid Build Coastguard Worker     EXPECT_EQ(DecodeSignedLeb128<int64_t>(&encoded_data_ptr), sleb128_64bit_tests[i].decoded)
395*795d594fSAndroid Build Coastguard Worker         << " i = " << i;
396*795d594fSAndroid Build Coastguard Worker   }
397*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(data_size, static_cast<size_t>(encoded_data_ptr - encoded_data));
398*795d594fSAndroid Build Coastguard Worker }
399*795d594fSAndroid Build Coastguard Worker 
TEST(Leb128Test,UnsignedUpdate)400*795d594fSAndroid Build Coastguard Worker TEST(Leb128Test, UnsignedUpdate) {
401*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(uleb128_tests); ++i) {
402*795d594fSAndroid Build Coastguard Worker     for (size_t j = 0; j < arraysize(uleb128_tests); ++j) {
403*795d594fSAndroid Build Coastguard Worker       uint32_t old_value = uleb128_tests[i].decoded;
404*795d594fSAndroid Build Coastguard Worker       uint32_t new_value = uleb128_tests[j].decoded;
405*795d594fSAndroid Build Coastguard Worker       // We can only make the encoded value smaller.
406*795d594fSAndroid Build Coastguard Worker       if (new_value <= old_value) {
407*795d594fSAndroid Build Coastguard Worker         uint8_t encoded_data[5];
408*795d594fSAndroid Build Coastguard Worker         uint8_t* old_end = EncodeUnsignedLeb128(encoded_data, old_value);
409*795d594fSAndroid Build Coastguard Worker         UpdateUnsignedLeb128(encoded_data, new_value);
410*795d594fSAndroid Build Coastguard Worker         const uint8_t* new_end = encoded_data;
411*795d594fSAndroid Build Coastguard Worker         EXPECT_EQ(DecodeUnsignedLeb128(&new_end), new_value);
412*795d594fSAndroid Build Coastguard Worker         // Even if the new value needs fewer bytes, we should fill the space.
413*795d594fSAndroid Build Coastguard Worker         EXPECT_EQ(new_end, old_end);
414*795d594fSAndroid Build Coastguard Worker       }
415*795d594fSAndroid Build Coastguard Worker     }
416*795d594fSAndroid Build Coastguard Worker   }
417*795d594fSAndroid Build Coastguard Worker }
418*795d594fSAndroid Build Coastguard Worker 
TEST(Leb128Test,Speed)419*795d594fSAndroid Build Coastguard Worker TEST(Leb128Test, Speed) {
420*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<Histogram<uint64_t>> enc_hist(new Histogram<uint64_t>("Leb128EncodeSpeedTest", 5));
421*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<Histogram<uint64_t>> dec_hist(new Histogram<uint64_t>("Leb128DecodeSpeedTest", 5));
422*795d594fSAndroid Build Coastguard Worker   Leb128EncodingVector<> builder;
423*795d594fSAndroid Build Coastguard Worker   // Push back 1024 chunks of 1024 values measuring encoding speed.
424*795d594fSAndroid Build Coastguard Worker   uint64_t last_time = NanoTime();
425*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < 1024; i++) {
426*795d594fSAndroid Build Coastguard Worker     for (size_t j = 0; j < 1024; j++) {
427*795d594fSAndroid Build Coastguard Worker       builder.PushBackUnsigned((i * 1024) + j);
428*795d594fSAndroid Build Coastguard Worker     }
429*795d594fSAndroid Build Coastguard Worker     uint64_t cur_time = NanoTime();
430*795d594fSAndroid Build Coastguard Worker     enc_hist->AddValue(cur_time - last_time);
431*795d594fSAndroid Build Coastguard Worker     last_time = cur_time;
432*795d594fSAndroid Build Coastguard Worker   }
433*795d594fSAndroid Build Coastguard Worker   // Verify encoding and measure decode speed.
434*795d594fSAndroid Build Coastguard Worker   const uint8_t* encoded_data_ptr = &builder.GetData()[0];
435*795d594fSAndroid Build Coastguard Worker   last_time = NanoTime();
436*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < 1024; i++) {
437*795d594fSAndroid Build Coastguard Worker     for (size_t j = 0; j < 1024; j++) {
438*795d594fSAndroid Build Coastguard Worker       EXPECT_EQ(DecodeUnsignedLeb128(&encoded_data_ptr), (i * 1024) + j);
439*795d594fSAndroid Build Coastguard Worker     }
440*795d594fSAndroid Build Coastguard Worker     uint64_t cur_time = NanoTime();
441*795d594fSAndroid Build Coastguard Worker     dec_hist->AddValue(cur_time - last_time);
442*795d594fSAndroid Build Coastguard Worker     last_time = cur_time;
443*795d594fSAndroid Build Coastguard Worker   }
444*795d594fSAndroid Build Coastguard Worker 
445*795d594fSAndroid Build Coastguard Worker   Histogram<uint64_t>::CumulativeData enc_data;
446*795d594fSAndroid Build Coastguard Worker   enc_hist->CreateHistogram(&enc_data);
447*795d594fSAndroid Build Coastguard Worker   enc_hist->PrintConfidenceIntervals(std::cout, 0.99, enc_data);
448*795d594fSAndroid Build Coastguard Worker 
449*795d594fSAndroid Build Coastguard Worker   Histogram<uint64_t>::CumulativeData dec_data;
450*795d594fSAndroid Build Coastguard Worker   dec_hist->CreateHistogram(&dec_data);
451*795d594fSAndroid Build Coastguard Worker   dec_hist->PrintConfidenceIntervals(std::cout, 0.99, dec_data);
452*795d594fSAndroid Build Coastguard Worker }
453*795d594fSAndroid Build Coastguard Worker 
454*795d594fSAndroid Build Coastguard Worker }  // namespace art
455