xref: /aosp_15_r20/external/libaom/test/aom_integer_test.cc (revision 77c1e3ccc04c968bd2bc212e87364f250e820521)
1*77c1e3ccSAndroid Build Coastguard Worker /*
2*77c1e3ccSAndroid Build Coastguard Worker  * Copyright (c) 2018, Alliance for Open Media. All rights reserved.
3*77c1e3ccSAndroid Build Coastguard Worker  *
4*77c1e3ccSAndroid Build Coastguard Worker  * This source code is subject to the terms of the BSD 2 Clause License and
5*77c1e3ccSAndroid Build Coastguard Worker  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6*77c1e3ccSAndroid Build Coastguard Worker  * was not distributed with this source code in the LICENSE file, you can
7*77c1e3ccSAndroid Build Coastguard Worker  * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8*77c1e3ccSAndroid Build Coastguard Worker  * Media Patent License 1.0 was not distributed with this source code in the
9*77c1e3ccSAndroid Build Coastguard Worker  * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10*77c1e3ccSAndroid Build Coastguard Worker  */
11*77c1e3ccSAndroid Build Coastguard Worker 
12*77c1e3ccSAndroid Build Coastguard Worker #include "aom/aom_integer.h"
13*77c1e3ccSAndroid Build Coastguard Worker #include "gtest/gtest.h"
14*77c1e3ccSAndroid Build Coastguard Worker 
15*77c1e3ccSAndroid Build Coastguard Worker namespace {
16*77c1e3ccSAndroid Build Coastguard Worker const uint64_t kMaximumLeb128CodedSize = 8;
17*77c1e3ccSAndroid Build Coastguard Worker const uint8_t kLeb128PadByte = 0x80;  // Binary: 10000000
18*77c1e3ccSAndroid Build Coastguard Worker const uint64_t kMaximumLeb128Value = UINT32_MAX;
19*77c1e3ccSAndroid Build Coastguard Worker const uint32_t kSizeTestNumValues = 6;
20*77c1e3ccSAndroid Build Coastguard Worker const uint32_t kSizeTestExpectedSizes[kSizeTestNumValues] = {
21*77c1e3ccSAndroid Build Coastguard Worker   1, 1, 2, 3, 4, 5
22*77c1e3ccSAndroid Build Coastguard Worker };
23*77c1e3ccSAndroid Build Coastguard Worker const uint64_t kSizeTestInputs[kSizeTestNumValues] = { 0,        0x7f,
24*77c1e3ccSAndroid Build Coastguard Worker                                                        0x3fff,   0x1fffff,
25*77c1e3ccSAndroid Build Coastguard Worker                                                        0xffffff, 0x10000000 };
26*77c1e3ccSAndroid Build Coastguard Worker 
27*77c1e3ccSAndroid Build Coastguard Worker const uint8_t kOutOfRangeLeb128Value[5] = { 0x80, 0x80, 0x80, 0x80,
28*77c1e3ccSAndroid Build Coastguard Worker                                             0x10 };  // UINT32_MAX + 1
29*77c1e3ccSAndroid Build Coastguard Worker }  // namespace
30*77c1e3ccSAndroid Build Coastguard Worker 
TEST(AomLeb128,DecodeTest)31*77c1e3ccSAndroid Build Coastguard Worker TEST(AomLeb128, DecodeTest) {
32*77c1e3ccSAndroid Build Coastguard Worker   const size_t num_leb128_bytes = 3;
33*77c1e3ccSAndroid Build Coastguard Worker   const uint8_t leb128_bytes[num_leb128_bytes] = { 0xE5, 0x8E, 0x26 };
34*77c1e3ccSAndroid Build Coastguard Worker   const uint64_t expected_value = 0x98765;  // 624485
35*77c1e3ccSAndroid Build Coastguard Worker   const size_t expected_length = 3;
36*77c1e3ccSAndroid Build Coastguard Worker   uint64_t value = ~0ULL;  // make sure value is cleared by the function
37*77c1e3ccSAndroid Build Coastguard Worker   size_t length;
38*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(
39*77c1e3ccSAndroid Build Coastguard Worker       aom_uleb_decode(&leb128_bytes[0], num_leb128_bytes, &value, &length), 0);
40*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(expected_value, value);
41*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(expected_length, length);
42*77c1e3ccSAndroid Build Coastguard Worker 
43*77c1e3ccSAndroid Build Coastguard Worker   // Make sure the decoder stops on the last marked LEB128 byte.
44*77c1e3ccSAndroid Build Coastguard Worker   aom_uleb_decode(&leb128_bytes[0], num_leb128_bytes + 1, &value, &length);
45*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(expected_value, value);
46*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(expected_length, length);
47*77c1e3ccSAndroid Build Coastguard Worker }
48*77c1e3ccSAndroid Build Coastguard Worker 
TEST(AomLeb128,EncodeTest)49*77c1e3ccSAndroid Build Coastguard Worker TEST(AomLeb128, EncodeTest) {
50*77c1e3ccSAndroid Build Coastguard Worker   const uint32_t test_value = 0x98765;  // 624485
51*77c1e3ccSAndroid Build Coastguard Worker   const uint8_t expected_bytes[3] = { 0xE5, 0x8E, 0x26 };
52*77c1e3ccSAndroid Build Coastguard Worker   const size_t kWriteBufferSize = 4;
53*77c1e3ccSAndroid Build Coastguard Worker   uint8_t write_buffer[kWriteBufferSize] = { 0 };
54*77c1e3ccSAndroid Build Coastguard Worker   size_t bytes_written = 0;
55*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(aom_uleb_encode(test_value, kWriteBufferSize, &write_buffer[0],
56*77c1e3ccSAndroid Build Coastguard Worker                             &bytes_written),
57*77c1e3ccSAndroid Build Coastguard Worker             0);
58*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(bytes_written, 3u);
59*77c1e3ccSAndroid Build Coastguard Worker   for (size_t i = 0; i < bytes_written; ++i) {
60*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_EQ(write_buffer[i], expected_bytes[i]);
61*77c1e3ccSAndroid Build Coastguard Worker   }
62*77c1e3ccSAndroid Build Coastguard Worker }
63*77c1e3ccSAndroid Build Coastguard Worker 
TEST(AomLeb128,EncodeDecodeTest)64*77c1e3ccSAndroid Build Coastguard Worker TEST(AomLeb128, EncodeDecodeTest) {
65*77c1e3ccSAndroid Build Coastguard Worker   const uint32_t value = 0x98765;  // 624485
66*77c1e3ccSAndroid Build Coastguard Worker   const size_t kWriteBufferSize = 4;
67*77c1e3ccSAndroid Build Coastguard Worker   uint8_t write_buffer[kWriteBufferSize] = { 0 };
68*77c1e3ccSAndroid Build Coastguard Worker   size_t bytes_written = 0;
69*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(aom_uleb_encode(value, kWriteBufferSize, &write_buffer[0],
70*77c1e3ccSAndroid Build Coastguard Worker                             &bytes_written),
71*77c1e3ccSAndroid Build Coastguard Worker             0);
72*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(bytes_written, 3u);
73*77c1e3ccSAndroid Build Coastguard Worker   uint64_t decoded_value;
74*77c1e3ccSAndroid Build Coastguard Worker   size_t decoded_length;
75*77c1e3ccSAndroid Build Coastguard Worker   aom_uleb_decode(&write_buffer[0], bytes_written, &decoded_value,
76*77c1e3ccSAndroid Build Coastguard Worker                   &decoded_length);
77*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(value, decoded_value);
78*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(bytes_written, decoded_length);
79*77c1e3ccSAndroid Build Coastguard Worker }
80*77c1e3ccSAndroid Build Coastguard Worker 
TEST(AomLeb128,FixedSizeEncodeTest)81*77c1e3ccSAndroid Build Coastguard Worker TEST(AomLeb128, FixedSizeEncodeTest) {
82*77c1e3ccSAndroid Build Coastguard Worker   const uint32_t test_value = 0x123;
83*77c1e3ccSAndroid Build Coastguard Worker   const uint8_t expected_bytes[4] = { 0xa3, 0x82, 0x80, 0x00 };
84*77c1e3ccSAndroid Build Coastguard Worker   const size_t kWriteBufferSize = 4;
85*77c1e3ccSAndroid Build Coastguard Worker   uint8_t write_buffer[kWriteBufferSize] = { 0 };
86*77c1e3ccSAndroid Build Coastguard Worker   size_t bytes_written = 0;
87*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(0, aom_uleb_encode_fixed_size(test_value, kWriteBufferSize,
88*77c1e3ccSAndroid Build Coastguard Worker                                           kWriteBufferSize, &write_buffer[0],
89*77c1e3ccSAndroid Build Coastguard Worker                                           &bytes_written));
90*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(kWriteBufferSize, bytes_written);
91*77c1e3ccSAndroid Build Coastguard Worker   for (size_t i = 0; i < bytes_written; ++i) {
92*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_EQ(write_buffer[i], expected_bytes[i]);
93*77c1e3ccSAndroid Build Coastguard Worker   }
94*77c1e3ccSAndroid Build Coastguard Worker }
95*77c1e3ccSAndroid Build Coastguard Worker 
TEST(AomLeb128,FixedSizeEncodeDecodeTest)96*77c1e3ccSAndroid Build Coastguard Worker TEST(AomLeb128, FixedSizeEncodeDecodeTest) {
97*77c1e3ccSAndroid Build Coastguard Worker   const uint32_t value = 0x1;
98*77c1e3ccSAndroid Build Coastguard Worker   const size_t kWriteBufferSize = 4;
99*77c1e3ccSAndroid Build Coastguard Worker   uint8_t write_buffer[kWriteBufferSize] = { 0 };
100*77c1e3ccSAndroid Build Coastguard Worker   size_t bytes_written = 0;
101*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(
102*77c1e3ccSAndroid Build Coastguard Worker       aom_uleb_encode_fixed_size(value, kWriteBufferSize, kWriteBufferSize,
103*77c1e3ccSAndroid Build Coastguard Worker                                  &write_buffer[0], &bytes_written),
104*77c1e3ccSAndroid Build Coastguard Worker       0);
105*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(bytes_written, 4u);
106*77c1e3ccSAndroid Build Coastguard Worker   uint64_t decoded_value;
107*77c1e3ccSAndroid Build Coastguard Worker   size_t decoded_length;
108*77c1e3ccSAndroid Build Coastguard Worker   aom_uleb_decode(&write_buffer[0], bytes_written, &decoded_value,
109*77c1e3ccSAndroid Build Coastguard Worker                   &decoded_length);
110*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(value, decoded_value);
111*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(bytes_written, decoded_length);
112*77c1e3ccSAndroid Build Coastguard Worker }
113*77c1e3ccSAndroid Build Coastguard Worker 
TEST(AomLeb128,SizeTest)114*77c1e3ccSAndroid Build Coastguard Worker TEST(AomLeb128, SizeTest) {
115*77c1e3ccSAndroid Build Coastguard Worker   for (size_t i = 0; i < kSizeTestNumValues; ++i) {
116*77c1e3ccSAndroid Build Coastguard Worker     ASSERT_EQ(kSizeTestExpectedSizes[i],
117*77c1e3ccSAndroid Build Coastguard Worker               aom_uleb_size_in_bytes(kSizeTestInputs[i]));
118*77c1e3ccSAndroid Build Coastguard Worker   }
119*77c1e3ccSAndroid Build Coastguard Worker }
120*77c1e3ccSAndroid Build Coastguard Worker 
TEST(AomLeb128,DecodeFailTest)121*77c1e3ccSAndroid Build Coastguard Worker TEST(AomLeb128, DecodeFailTest) {
122*77c1e3ccSAndroid Build Coastguard Worker   // Input buffer containing what would be a valid 9 byte LEB128 encoded
123*77c1e3ccSAndroid Build Coastguard Worker   // unsigned integer.
124*77c1e3ccSAndroid Build Coastguard Worker   const uint8_t kAllPadBytesBuffer[kMaximumLeb128CodedSize + 1] = {
125*77c1e3ccSAndroid Build Coastguard Worker     kLeb128PadByte, kLeb128PadByte, kLeb128PadByte,
126*77c1e3ccSAndroid Build Coastguard Worker     kLeb128PadByte, kLeb128PadByte, kLeb128PadByte,
127*77c1e3ccSAndroid Build Coastguard Worker     kLeb128PadByte, kLeb128PadByte, 0
128*77c1e3ccSAndroid Build Coastguard Worker   };
129*77c1e3ccSAndroid Build Coastguard Worker   uint64_t decoded_value;
130*77c1e3ccSAndroid Build Coastguard Worker 
131*77c1e3ccSAndroid Build Coastguard Worker   // Test that decode fails when result would be valid 9 byte integer.
132*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(aom_uleb_decode(&kAllPadBytesBuffer[0], kMaximumLeb128CodedSize + 1,
133*77c1e3ccSAndroid Build Coastguard Worker                             &decoded_value, nullptr),
134*77c1e3ccSAndroid Build Coastguard Worker             -1);
135*77c1e3ccSAndroid Build Coastguard Worker 
136*77c1e3ccSAndroid Build Coastguard Worker   // Test that encoded value missing terminator byte within available buffer
137*77c1e3ccSAndroid Build Coastguard Worker   // range causes decode error.
138*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(aom_uleb_decode(&kAllPadBytesBuffer[0], kMaximumLeb128CodedSize,
139*77c1e3ccSAndroid Build Coastguard Worker                             &decoded_value, nullptr),
140*77c1e3ccSAndroid Build Coastguard Worker             -1);
141*77c1e3ccSAndroid Build Coastguard Worker 
142*77c1e3ccSAndroid Build Coastguard Worker   // Test that LEB128 input that decodes to a value larger than 32-bits fails.
143*77c1e3ccSAndroid Build Coastguard Worker   size_t value_size = 0;
144*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(aom_uleb_decode(&kOutOfRangeLeb128Value[0],
145*77c1e3ccSAndroid Build Coastguard Worker                             sizeof(kOutOfRangeLeb128Value), &decoded_value,
146*77c1e3ccSAndroid Build Coastguard Worker                             &value_size),
147*77c1e3ccSAndroid Build Coastguard Worker             -1);
148*77c1e3ccSAndroid Build Coastguard Worker }
149*77c1e3ccSAndroid Build Coastguard Worker 
TEST(AomLeb128,EncodeFailTest)150*77c1e3ccSAndroid Build Coastguard Worker TEST(AomLeb128, EncodeFailTest) {
151*77c1e3ccSAndroid Build Coastguard Worker   const size_t kWriteBufferSize = 4;
152*77c1e3ccSAndroid Build Coastguard Worker   const uint32_t kValidTestValue = 1;
153*77c1e3ccSAndroid Build Coastguard Worker   uint8_t write_buffer[kWriteBufferSize] = { 0 };
154*77c1e3ccSAndroid Build Coastguard Worker   size_t coded_size = 0;
155*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(
156*77c1e3ccSAndroid Build Coastguard Worker       aom_uleb_encode(kValidTestValue, kWriteBufferSize, nullptr, &coded_size),
157*77c1e3ccSAndroid Build Coastguard Worker       -1);
158*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(aom_uleb_encode(kValidTestValue, kWriteBufferSize, &write_buffer[0],
159*77c1e3ccSAndroid Build Coastguard Worker                             nullptr),
160*77c1e3ccSAndroid Build Coastguard Worker             -1);
161*77c1e3ccSAndroid Build Coastguard Worker 
162*77c1e3ccSAndroid Build Coastguard Worker   const uint32_t kValueOutOfRangeForBuffer = 0xFFFFFFFF;
163*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(aom_uleb_encode(kValueOutOfRangeForBuffer, kWriteBufferSize,
164*77c1e3ccSAndroid Build Coastguard Worker                             &write_buffer[0], &coded_size),
165*77c1e3ccSAndroid Build Coastguard Worker             -1);
166*77c1e3ccSAndroid Build Coastguard Worker 
167*77c1e3ccSAndroid Build Coastguard Worker   const uint64_t kValueOutOfRange = kMaximumLeb128Value + 1;
168*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(aom_uleb_encode(kValueOutOfRange, kWriteBufferSize,
169*77c1e3ccSAndroid Build Coastguard Worker                             &write_buffer[0], &coded_size),
170*77c1e3ccSAndroid Build Coastguard Worker             -1);
171*77c1e3ccSAndroid Build Coastguard Worker 
172*77c1e3ccSAndroid Build Coastguard Worker   const size_t kPadSizeOutOfRange = 5;
173*77c1e3ccSAndroid Build Coastguard Worker   ASSERT_EQ(aom_uleb_encode_fixed_size(kValidTestValue, kWriteBufferSize,
174*77c1e3ccSAndroid Build Coastguard Worker                                        kPadSizeOutOfRange, &write_buffer[0],
175*77c1e3ccSAndroid Build Coastguard Worker                                        &coded_size),
176*77c1e3ccSAndroid Build Coastguard Worker             -1);
177*77c1e3ccSAndroid Build Coastguard Worker }
178