blob: fe88a54e9e400858dae1ab20b0dedb1cec082527 [file] [log] [blame]
Tom Finegan10fea492018-01-08 18:07:46 -08001/*
2 * Copyright (c) 2018, Alliance for Open Media. All rights reserved
3 *
4 * This source code is subject to the terms of the BSD 2 Clause License and
5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6 * was not distributed with this source code in the LICENSE file, you can
7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8 * Media Patent License 1.0 was not distributed with this source code in the
9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10 */
Tom Finegan10fea492018-01-08 18:07:46 -080011
12#include "aom/aom_integer.h"
Sarah Parker86bec882018-02-21 16:20:57 -080013#include "third_party/googletest/src/googletest/include/gtest/gtest.h"
Tom Finegan10fea492018-01-08 18:07:46 -080014
15namespace {
Tom Fineganf4129062018-02-08 08:32:42 -080016const uint64_t kMaximumLeb128CodedSize = 8;
Tom Finegan46fc1f02018-05-16 10:34:25 -070017const uint8_t kLeb128PadByte = 0x80; // Binary: 10000000
18const uint64_t kMaximumLeb128Value = UINT32_MAX;
Tom Finegan10fea492018-01-08 18:07:46 -080019const uint32_t kSizeTestNumValues = 6;
20const uint32_t kSizeTestExpectedSizes[kSizeTestNumValues] = {
21 1, 1, 2, 3, 4, 5
22};
Tom Finegan9540d592018-02-06 10:04:31 -080023const uint64_t kSizeTestInputs[kSizeTestNumValues] = {
Tom Finegan10fea492018-01-08 18:07:46 -080024 0, 0x7f, 0x3fff, 0x1fffff, 0xffffff, 0x10000000
25};
Tom Finegan46fc1f02018-05-16 10:34:25 -070026
27const uint8_t kOutOfRangeLeb128Value[5] = { 0x80, 0x80, 0x80, 0x80,
28 0x10 }; // UINT32_MAX + 1
Tom Finegan10fea492018-01-08 18:07:46 -080029} // namespace
30
31TEST(AomLeb128, DecodeTest) {
32 const size_t num_leb128_bytes = 3;
33 const uint8_t leb128_bytes[num_leb128_bytes] = { 0xE5, 0x8E, 0x26 };
Tom Finegan9540d592018-02-06 10:04:31 -080034 const uint64_t expected_value = 0x98765; // 624485
David Barker0debbaa2018-02-23 14:39:01 +000035 const size_t expected_length = 3;
James Zernbd5aba02018-03-10 14:56:21 -080036 uint64_t value = ~0ULL; // make sure value is cleared by the function
37 size_t length;
David Barker0debbaa2018-02-23 14:39:01 +000038 ASSERT_EQ(
39 aom_uleb_decode(&leb128_bytes[0], num_leb128_bytes, &value, &length), 0);
Tom Finegan10fea492018-01-08 18:07:46 -080040 ASSERT_EQ(expected_value, value);
David Barker0debbaa2018-02-23 14:39:01 +000041 ASSERT_EQ(expected_length, length);
Tom Fineganf2d40f62018-02-01 11:52:49 -080042
43 // Make sure the decoder stops on the last marked LEB128 byte.
David Barker0debbaa2018-02-23 14:39:01 +000044 aom_uleb_decode(&leb128_bytes[0], num_leb128_bytes + 1, &value, &length);
Tom Fineganf2d40f62018-02-01 11:52:49 -080045 ASSERT_EQ(expected_value, value);
David Barker0debbaa2018-02-23 14:39:01 +000046 ASSERT_EQ(expected_length, length);
Tom Finegan10fea492018-01-08 18:07:46 -080047}
48
49TEST(AomLeb128, EncodeTest) {
50 const uint32_t test_value = 0x98765; // 624485
David Barker0debbaa2018-02-23 14:39:01 +000051 const uint8_t expected_bytes[3] = { 0xE5, 0x8E, 0x26 };
Tom Finegan10fea492018-01-08 18:07:46 -080052 const size_t kWriteBufferSize = 4;
53 uint8_t write_buffer[kWriteBufferSize] = { 0 };
54 size_t bytes_written = 0;
55 ASSERT_EQ(aom_uleb_encode(test_value, kWriteBufferSize, &write_buffer[0],
56 &bytes_written),
57 0);
58 ASSERT_EQ(bytes_written, 3u);
Tom Finegan10fea492018-01-08 18:07:46 -080059 for (size_t i = 0; i < bytes_written; ++i) {
David Barker0debbaa2018-02-23 14:39:01 +000060 ASSERT_EQ(write_buffer[i], expected_bytes[i]);
Tom Finegan10fea492018-01-08 18:07:46 -080061 }
Tom Finegan10fea492018-01-08 18:07:46 -080062}
63
Tom Fineganf4129062018-02-08 08:32:42 -080064TEST(AomLeb128, EncodeDecodeTest) {
Tom Finegan10fea492018-01-08 18:07:46 -080065 const uint32_t value = 0x98765; // 624485
66 const size_t kWriteBufferSize = 4;
67 uint8_t write_buffer[kWriteBufferSize] = { 0 };
68 size_t bytes_written = 0;
69 ASSERT_EQ(aom_uleb_encode(value, kWriteBufferSize, &write_buffer[0],
70 &bytes_written),
71 0);
72 ASSERT_EQ(bytes_written, 3u);
James Zernbd5aba02018-03-10 14:56:21 -080073 uint64_t decoded_value;
74 size_t decoded_length;
David Barker0debbaa2018-02-23 14:39:01 +000075 aom_uleb_decode(&write_buffer[0], bytes_written, &decoded_value,
76 &decoded_length);
Tom Finegan10fea492018-01-08 18:07:46 -080077 ASSERT_EQ(value, decoded_value);
David Barker0debbaa2018-02-23 14:39:01 +000078 ASSERT_EQ(bytes_written, decoded_length);
Tom Finegan10fea492018-01-08 18:07:46 -080079}
80
81TEST(AomLeb128, FixedSizeEncodeTest) {
David Barker0debbaa2018-02-23 14:39:01 +000082 const uint32_t test_value = 0x123;
83 const uint8_t expected_bytes[4] = { 0xa3, 0x82, 0x80, 0x00 };
Tom Finegan10fea492018-01-08 18:07:46 -080084 const size_t kWriteBufferSize = 4;
85 uint8_t write_buffer[kWriteBufferSize] = { 0 };
86 size_t bytes_written = 0;
87 ASSERT_EQ(0, aom_uleb_encode_fixed_size(test_value, kWriteBufferSize,
88 kWriteBufferSize, &write_buffer[0],
89 &bytes_written));
90 ASSERT_EQ(kWriteBufferSize, bytes_written);
Tom Finegan10fea492018-01-08 18:07:46 -080091 for (size_t i = 0; i < bytes_written; ++i) {
David Barker0debbaa2018-02-23 14:39:01 +000092 ASSERT_EQ(write_buffer[i], expected_bytes[i]);
Tom Finegan10fea492018-01-08 18:07:46 -080093 }
Tom Finegan10fea492018-01-08 18:07:46 -080094}
95
Tom Fineganf4129062018-02-08 08:32:42 -080096TEST(AomLeb128, FixedSizeEncodeDecodeTest) {
Tom Finegan10fea492018-01-08 18:07:46 -080097 const uint32_t value = 0x1;
98 const size_t kWriteBufferSize = 4;
99 uint8_t write_buffer[kWriteBufferSize] = { 0 };
100 size_t bytes_written = 0;
101 ASSERT_EQ(
102 aom_uleb_encode_fixed_size(value, kWriteBufferSize, kWriteBufferSize,
103 &write_buffer[0], &bytes_written),
104 0);
105 ASSERT_EQ(bytes_written, 4u);
James Zernbd5aba02018-03-10 14:56:21 -0800106 uint64_t decoded_value;
107 size_t decoded_length;
David Barker0debbaa2018-02-23 14:39:01 +0000108 aom_uleb_decode(&write_buffer[0], bytes_written, &decoded_value,
109 &decoded_length);
Tom Finegan10fea492018-01-08 18:07:46 -0800110 ASSERT_EQ(value, decoded_value);
David Barker0debbaa2018-02-23 14:39:01 +0000111 ASSERT_EQ(bytes_written, decoded_length);
Tom Finegan10fea492018-01-08 18:07:46 -0800112}
113
114TEST(AomLeb128, SizeTest) {
115 for (size_t i = 0; i < kSizeTestNumValues; ++i) {
116 ASSERT_EQ(kSizeTestExpectedSizes[i],
117 aom_uleb_size_in_bytes(kSizeTestInputs[i]));
118 }
119}
Tom Finegan209ba852018-01-10 08:36:40 -0800120
Tom Fineganf4129062018-02-08 08:32:42 -0800121TEST(AomLeb128, DecodeFailTest) {
122 // Input buffer containing what would be a valid 9 byte LEB128 encoded
123 // unsigned integer.
124 const uint8_t kAllPadBytesBuffer[kMaximumLeb128CodedSize + 1] = {
125 kLeb128PadByte, kLeb128PadByte, kLeb128PadByte,
126 kLeb128PadByte, kLeb128PadByte, kLeb128PadByte,
127 kLeb128PadByte, kLeb128PadByte, 0
128 };
James Zernbd5aba02018-03-10 14:56:21 -0800129 uint64_t decoded_value;
Tom Fineganf4129062018-02-08 08:32:42 -0800130
131 // Test that decode fails when result would be valid 9 byte integer.
132 ASSERT_EQ(aom_uleb_decode(&kAllPadBytesBuffer[0], kMaximumLeb128CodedSize + 1,
David Barker0debbaa2018-02-23 14:39:01 +0000133 &decoded_value, NULL),
Tom Fineganf4129062018-02-08 08:32:42 -0800134 -1);
135
136 // Test that encoded value missing terminator byte within available buffer
137 // range causes decode error.
138 ASSERT_EQ(aom_uleb_decode(&kAllPadBytesBuffer[0], kMaximumLeb128CodedSize,
David Barker0debbaa2018-02-23 14:39:01 +0000139 &decoded_value, NULL),
Tom Fineganf4129062018-02-08 08:32:42 -0800140 -1);
Tom Fineganba7fa412018-05-15 11:23:54 -0700141
142 // Test that LEB128 input that decodes to a value larger than 32-bits fails.
Tom Fineganba7fa412018-05-15 11:23:54 -0700143 size_t value_size = 0;
Tom Finegan46fc1f02018-05-16 10:34:25 -0700144 ASSERT_EQ(aom_uleb_decode(&kOutOfRangeLeb128Value[0],
145 sizeof(kOutOfRangeLeb128Value), &decoded_value,
Tom Finegan2c468f52018-05-16 10:00:12 -0700146 &value_size),
Tom Fineganba7fa412018-05-15 11:23:54 -0700147 -1);
Tom Fineganf4129062018-02-08 08:32:42 -0800148}
149
150TEST(AomLeb128, EncodeFailTest) {
Tom Finegan209ba852018-01-10 08:36:40 -0800151 const size_t kWriteBufferSize = 4;
152 const uint32_t kValidTestValue = 1;
153 uint8_t write_buffer[kWriteBufferSize] = { 0 };
154 size_t coded_size = 0;
155 ASSERT_EQ(
156 aom_uleb_encode(kValidTestValue, kWriteBufferSize, NULL, &coded_size),
157 -1);
158 ASSERT_EQ(aom_uleb_encode(kValidTestValue, kWriteBufferSize, &write_buffer[0],
159 NULL),
160 -1);
161
Tom Fineganf4129062018-02-08 08:32:42 -0800162 const uint32_t kValueOutOfRangeForBuffer = 0xFFFFFFFF;
163 ASSERT_EQ(aom_uleb_encode(kValueOutOfRangeForBuffer, kWriteBufferSize,
164 &write_buffer[0], &coded_size),
165 -1);
166
167 const uint64_t kValueOutOfRange = kMaximumLeb128Value + 1;
Tom Finegan209ba852018-01-10 08:36:40 -0800168 ASSERT_EQ(aom_uleb_encode(kValueOutOfRange, kWriteBufferSize,
169 &write_buffer[0], &coded_size),
170 -1);
171
172 const size_t kPadSizeOutOfRange = 5;
173 ASSERT_EQ(aom_uleb_encode_fixed_size(kValidTestValue, kWriteBufferSize,
174 kPadSizeOutOfRange, &write_buffer[0],
175 &coded_size),
176 -1);
177}