1 /*
2 * Copyright (c) 2023, Alliance for Open Media. All rights reserved
3 *
4 * This source code is subject to the terms of the BSD 3-Clause Clear License
5 * and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear
6 * License was not distributed with this source code in the LICENSE file, you
7 * can obtain it at www.aomedia.org/license/software-license/bsd-3-c-c. If the
8 * Alliance for Open Media Patent License 1.0 was not distributed with this
9 * source code in the PATENTS file, you can obtain it at
10 * www.aomedia.org/license/patent.
11 */
12 #include "iamf/common/write_bit_buffer.h"
13
14 #include <array>
15 #include <cstdint>
16 #include <filesystem>
17 #include <fstream>
18 #include <ios>
19 #include <limits>
20 #include <memory>
21 #include <optional>
22 #include <string>
23 #include <vector>
24
25 #include "absl/status/status.h"
26 #include "absl/status/status_matchers.h"
27 #include "absl/strings/str_cat.h"
28 #include "absl/types/span.h"
29 #include "gmock/gmock.h"
30 #include "gtest/gtest.h"
31 #include "iamf/cli/tests/cli_test_utils.h"
32 #include "iamf/common/leb_generator.h"
33 #include "iamf/common/utils/bit_buffer_util.h"
34 #include "iamf/common/utils/tests/test_utils.h"
35 #include "iamf/obu/types.h"
36
37 namespace iamf_tools {
38 namespace {
39
40 using ::absl::StatusCode::kInvalidArgument;
41 using ::absl_testing::IsOk;
42 using ::absl_testing::StatusIs;
43
TEST(FlushAndWriteToStream,WritesToOutputStream)44 TEST(FlushAndWriteToStream, WritesToOutputStream) {
45 constexpr std::array<uint8_t, 4> kDataToOutput = {0x00, '\r', '\n', 0x1a};
46 const auto file_to_write_to = GetAndCleanupOutputFileName(".bin");
47 auto output_stream = std::make_optional<std::fstream>(
48 file_to_write_to, std::ios::binary | std::ios::out);
49
50 WriteBitBuffer wb(0);
51 EXPECT_THAT(wb.WriteUint8Span(absl::MakeConstSpan(kDataToOutput)), IsOk());
52 EXPECT_THAT(wb.FlushAndWriteToFile(output_stream), IsOk());
53 output_stream->close();
54
55 EXPECT_EQ(std::filesystem::file_size(file_to_write_to), kDataToOutput.size());
56 }
57
TEST(FlushAndWriteToStream,SucceedsWithoutOutputStream)58 TEST(FlushAndWriteToStream, SucceedsWithoutOutputStream) {
59 std::optional<std::fstream> omit_output_stream = std::nullopt;
60 WriteBitBuffer wb(0);
61
62 EXPECT_THAT(wb.FlushAndWriteToFile(omit_output_stream), IsOk());
63 }
64
TEST(FlushAndWriteToStream,FlushesBuffer)65 TEST(FlushAndWriteToStream, FlushesBuffer) {
66 std::optional<std::fstream> omit_output_stream = std::nullopt;
67 WriteBitBuffer wb(0);
68 EXPECT_THAT(wb.WriteUnsignedLiteral(0x01, 8), IsOk());
69
70 EXPECT_THAT(wb.FlushAndWriteToFile(omit_output_stream), IsOk());
71
72 EXPECT_TRUE(wb.bit_buffer().empty());
73 }
74
75 class WriteBitBufferTest : public ::testing::Test {
76 protected:
77 // Validates a write buffer that may or may not be byte-aligned.
ValidateMaybeNotAlignedWriteBuffer(int64_t num_bits,const std::vector<uint8_t> & expected_data)78 void ValidateMaybeNotAlignedWriteBuffer(
79 int64_t num_bits, const std::vector<uint8_t>& expected_data) {
80 // Verify exact number of expected bits were written.
81 EXPECT_EQ(wb_->bit_offset(), num_bits);
82
83 const unsigned int ceil_num_bytes =
84 num_bits / 8 + (num_bits % 8 == 0 ? 0 : 1);
85
86 ASSERT_LE(expected_data.size(), ceil_num_bytes);
87
88 // Compare rounded up to the nearest byte with expected result.
89 EXPECT_EQ(wb_->bit_buffer(), expected_data);
90 }
91
92 // The buffer is resizable; the initial capacity does not matter.
93 std::unique_ptr<WriteBitBuffer> wb_ = std::make_unique<WriteBitBuffer>(0);
94 };
95
TEST_F(WriteBitBufferTest,UnsignedLiteralNumBitsEqualsZero)96 TEST_F(WriteBitBufferTest, UnsignedLiteralNumBitsEqualsZero) {
97 EXPECT_THAT(wb_->WriteUnsignedLiteral(0x00, 0), IsOk());
98 ValidateWriteResults(*wb_, {});
99 }
100
TEST_F(WriteBitBufferTest,UnsignedLiteralOneByteZero)101 TEST_F(WriteBitBufferTest, UnsignedLiteralOneByteZero) {
102 EXPECT_THAT(wb_->WriteUnsignedLiteral(0x00, 8), IsOk());
103 ValidateWriteResults(*wb_, {0x00});
104 }
105
TEST_F(WriteBitBufferTest,UnsignedLiteralOneByteNonZero)106 TEST_F(WriteBitBufferTest, UnsignedLiteralOneByteNonZero) {
107 EXPECT_THAT(wb_->WriteUnsignedLiteral(0xab, 8), IsOk());
108 ValidateWriteResults(*wb_, {0xab});
109 }
110
TEST_F(WriteBitBufferTest,UnsignedLiteralTwoBytes)111 TEST_F(WriteBitBufferTest, UnsignedLiteralTwoBytes) {
112 EXPECT_THAT(wb_->WriteUnsignedLiteral(0xffee, 16), IsOk());
113 ValidateWriteResults(*wb_, {0xff, 0xee});
114 }
115
TEST_F(WriteBitBufferTest,UnsignedLiteralFourBytes)116 TEST_F(WriteBitBufferTest, UnsignedLiteralFourBytes) {
117 EXPECT_THAT(wb_->WriteUnsignedLiteral(0xffeeddcc, 32), IsOk());
118 ValidateWriteResults(*wb_, {0xff, 0xee, 0xdd, 0xcc});
119 }
120
121 // This test is not byte aligned. So all expected result bits required to
122 // round up to the nearest byte are set to zero.
TEST_F(WriteBitBufferTest,UnsignedLiteralNotByteAligned)123 TEST_F(WriteBitBufferTest, UnsignedLiteralNotByteAligned) {
124 EXPECT_THAT(wb_->WriteUnsignedLiteral(0b11, 2), IsOk());
125 ValidateMaybeNotAlignedWriteBuffer(2, {0b1100'0000});
126 }
127
TEST_F(WriteBitBufferTest,UnsignedLiteralMixedAlignedAndNotAligned)128 TEST_F(WriteBitBufferTest, UnsignedLiteralMixedAlignedAndNotAligned) {
129 EXPECT_THAT(wb_->WriteUnsignedLiteral(0, 1), IsOk());
130 EXPECT_THAT(wb_->WriteUnsignedLiteral(0xff, 8), IsOk());
131 EXPECT_THAT(wb_->WriteUnsignedLiteral(0, 7), IsOk());
132 ValidateWriteResults(*wb_, {0x7f, 0x80});
133 }
134
TEST_F(WriteBitBufferTest,UnsignedLiteralNotByteAlignedLarge)135 TEST_F(WriteBitBufferTest, UnsignedLiteralNotByteAlignedLarge) {
136 EXPECT_THAT(
137 wb_->WriteUnsignedLiteral(0b0001'0010'0011'0100'0101'0110'0111, 28),
138 IsOk());
139 ValidateMaybeNotAlignedWriteBuffer(
140 28, {0b0001'0010, 0b0011'0100, 0b0101'0110, 0b0111'0000});
141 }
142
TEST_F(WriteBitBufferTest,InvalidUnsignedLiteralOverflowOverRequestedNumBits)143 TEST_F(WriteBitBufferTest, InvalidUnsignedLiteralOverflowOverRequestedNumBits) {
144 EXPECT_THAT(wb_->WriteUnsignedLiteral(16, 4), StatusIs(kInvalidArgument));
145 }
146
TEST_F(WriteBitBufferTest,InvalidUnsignedLiteralOverNumBitsOver32)147 TEST_F(WriteBitBufferTest, InvalidUnsignedLiteralOverNumBitsOver32) {
148 EXPECT_THAT(wb_->WriteUnsignedLiteral(0, /*num_bits=*/33),
149 StatusIs(kInvalidArgument));
150 }
151
TEST_F(WriteBitBufferTest,UnsignedLiteralZeroNumBits)152 TEST_F(WriteBitBufferTest, UnsignedLiteralZeroNumBits) {
153 EXPECT_THAT(wb_->WriteUnsignedLiteral(0, /*num_bits=*/0), IsOk());
154 EXPECT_THAT(wb_->bit_offset(), 0);
155 }
156
TEST_F(WriteBitBufferTest,InvalidUnsignedLiteralNegativeNumBits)157 TEST_F(WriteBitBufferTest, InvalidUnsignedLiteralNegativeNumBits) {
158 EXPECT_THAT(wb_->WriteUnsignedLiteral(0, /*num_bits=*/-1),
159 StatusIs(kInvalidArgument));
160 }
161
TEST_F(WriteBitBufferTest,UnsignedLiteral64OneByteZero)162 TEST_F(WriteBitBufferTest, UnsignedLiteral64OneByteZero) {
163 EXPECT_THAT(wb_->WriteUnsignedLiteral64(0x00, 8), IsOk());
164 ValidateWriteResults(*wb_, {0x00});
165 }
166
TEST_F(WriteBitBufferTest,UnsignedLiteral64FiveBytes)167 TEST_F(WriteBitBufferTest, UnsignedLiteral64FiveBytes) {
168 EXPECT_THAT(wb_->WriteUnsignedLiteral64(0xffffffffff, 40), IsOk());
169 ValidateWriteResults(*wb_, {0xff, 0xff, 0xff, 0xff, 0xff});
170 }
171
TEST_F(WriteBitBufferTest,UnsignedLiteral64EightBytes)172 TEST_F(WriteBitBufferTest, UnsignedLiteral64EightBytes) {
173 EXPECT_THAT(wb_->WriteUnsignedLiteral64(0xfedcba9876543210l, 64), IsOk());
174 ValidateWriteResults(*wb_, {0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10});
175 }
176
177 // These tests are not byte aligned. So all expected result bits required to
178 // round up to the nearest byte are set to zero.
TEST_F(WriteBitBufferTest,UnsignedLiteral64NotByteAlignedSmall)179 TEST_F(WriteBitBufferTest, UnsignedLiteral64NotByteAlignedSmall) {
180 EXPECT_THAT(wb_->WriteUnsignedLiteral64(0b101, 3), IsOk());
181 ValidateMaybeNotAlignedWriteBuffer(3, {0b1010'0000});
182 }
183
TEST_F(WriteBitBufferTest,UnsignedLiteral64NotByteAlignedLarge)184 TEST_F(WriteBitBufferTest, UnsignedLiteral64NotByteAlignedLarge) {
185 EXPECT_THAT(wb_->WriteUnsignedLiteral64(0x7fffffffffffffff, 63), IsOk());
186 ValidateMaybeNotAlignedWriteBuffer(
187 63, {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe});
188 }
189
TEST_F(WriteBitBufferTest,InvalidUnsignedLiteral64OverflowOverRequestedNumBits)190 TEST_F(WriteBitBufferTest,
191 InvalidUnsignedLiteral64OverflowOverRequestedNumBits) {
192 EXPECT_THAT(wb_->WriteUnsignedLiteral64(uint64_t{1} << 34, 34),
193 StatusIs(kInvalidArgument));
194 }
195
TEST_F(WriteBitBufferTest,InvalidUnsignedLiteral64NumBitsOver64)196 TEST_F(WriteBitBufferTest, InvalidUnsignedLiteral64NumBitsOver64) {
197 EXPECT_THAT(wb_->WriteUnsignedLiteral64(0, /*num_bits=*/65),
198 StatusIs(kInvalidArgument));
199 }
200
TEST_F(WriteBitBufferTest,Signed8Zero)201 TEST_F(WriteBitBufferTest, Signed8Zero) {
202 EXPECT_THAT(wb_->WriteSigned8(0x00), IsOk());
203 ValidateWriteResults(*wb_, {0x00});
204 }
205
TEST_F(WriteBitBufferTest,Signed8MaxPositive)206 TEST_F(WriteBitBufferTest, Signed8MaxPositive) {
207 EXPECT_THAT(wb_->WriteSigned8(127), IsOk());
208 ValidateWriteResults(*wb_, {0x7f});
209 }
210
TEST_F(WriteBitBufferTest,Signed8MinPositive)211 TEST_F(WriteBitBufferTest, Signed8MinPositive) {
212 EXPECT_THAT(wb_->WriteSigned8(1), IsOk());
213 ValidateWriteResults(*wb_, {0x01});
214 }
215
TEST_F(WriteBitBufferTest,Signed8MinNegative)216 TEST_F(WriteBitBufferTest, Signed8MinNegative) {
217 EXPECT_THAT(wb_->WriteSigned8(-128), IsOk());
218 ValidateWriteResults(*wb_, {0x80});
219 }
220
TEST_F(WriteBitBufferTest,Signed8MaxNegative)221 TEST_F(WriteBitBufferTest, Signed8MaxNegative) {
222 EXPECT_THAT(wb_->WriteSigned8(-1), IsOk());
223 ValidateWriteResults(*wb_, {0xff});
224 }
225
TEST_F(WriteBitBufferTest,Signed16Zero)226 TEST_F(WriteBitBufferTest, Signed16Zero) {
227 EXPECT_THAT(wb_->WriteSigned16(0x00), IsOk());
228 ValidateWriteResults(*wb_, {0x00, 0x00});
229 }
230
TEST_F(WriteBitBufferTest,Signed16MaxPositive)231 TEST_F(WriteBitBufferTest, Signed16MaxPositive) {
232 EXPECT_THAT(wb_->WriteSigned16(32767), IsOk());
233 ValidateWriteResults(*wb_, {0x7f, 0xff});
234 }
235
TEST_F(WriteBitBufferTest,Signed16MinPositive)236 TEST_F(WriteBitBufferTest, Signed16MinPositive) {
237 EXPECT_THAT(wb_->WriteSigned16(1), IsOk());
238 ValidateWriteResults(*wb_, {0x00, 0x01});
239 }
240
TEST_F(WriteBitBufferTest,Signed16MinNegative)241 TEST_F(WriteBitBufferTest, Signed16MinNegative) {
242 EXPECT_THAT(wb_->WriteSigned16(-32768), IsOk());
243 ValidateWriteResults(*wb_, {0x80, 0x00});
244 }
245
TEST_F(WriteBitBufferTest,Signed16MaxNegative)246 TEST_F(WriteBitBufferTest, Signed16MaxNegative) {
247 EXPECT_THAT(wb_->WriteSigned16(-1), IsOk());
248 ValidateWriteResults(*wb_, {0xff, 0xff});
249 }
250
TEST_F(WriteBitBufferTest,InvalidInternalNullTerminator)251 TEST_F(WriteBitBufferTest, InvalidInternalNullTerminator) {
252 const std::string kInternalNull("a\0b", 3);
253
254 EXPECT_THAT(wb_->WriteString(kInternalNull), StatusIs(kInvalidArgument));
255 EXPECT_EQ(wb_->bit_offset(), 0);
256 }
257
TEST_F(WriteBitBufferTest,EmptyLiteralString)258 TEST_F(WriteBitBufferTest, EmptyLiteralString) {
259 const std::string kEmptyString = "";
260
261 EXPECT_THAT(wb_->WriteString(kEmptyString), IsOk());
262
263 ValidateWriteResults(*wb_, {'\0'});
264 }
265
TEST_F(WriteBitBufferTest,StringOnlyNullCharacter)266 TEST_F(WriteBitBufferTest, StringOnlyNullCharacter) {
267 const std::string kEmptyString = "\0";
268
269 EXPECT_THAT(wb_->WriteString(kEmptyString), IsOk());
270
271 ValidateWriteResults(*wb_, {'\0'});
272 }
273
TEST_F(WriteBitBufferTest,StringAscii)274 TEST_F(WriteBitBufferTest, StringAscii) {
275 const std::string kAsciiInput = "ABC\0";
276
277 EXPECT_THAT(wb_->WriteString(kAsciiInput), IsOk());
278
279 ValidateWriteResults(*wb_, {'A', 'B', 'C', '\0'});
280 }
281
TEST_F(WriteBitBufferTest,StringUtf8)282 TEST_F(WriteBitBufferTest, StringUtf8) {
283 const std::string kUtf8Input(
284 "\xc3\xb3" // A 1-byte UTF-8 character.
285 "\xf0\x9d\x85\x9f" // A 4-byte UTF-8 character.
286 "\0");
287
288 EXPECT_THAT(wb_->WriteString(kUtf8Input), IsOk());
289
290 ValidateWriteResults(*wb_,
291 {0xc3, 0xb3, // A 1-byte UTF-8 character.
292 0xf0, 0x9d, 0x85, 0x9f, // A 4-byte UTF-8 character.
293 '\0'});
294 }
295
TEST_F(WriteBitBufferTest,StringMaxLength)296 TEST_F(WriteBitBufferTest, StringMaxLength) {
297 // Make a string and expected output with 127 non-NULL characters, followed by
298 // a NULL character.
299 const std::string kMaxLengthString =
300 absl::StrCat(std::string(kIamfMaxStringSize - 1, 'a'), "\0");
301 std::vector<uint8_t> expected_result(kIamfMaxStringSize, 'a');
302 expected_result.back() = '\0';
303
304 EXPECT_THAT(wb_->WriteString(kMaxLengthString), IsOk());
305 ValidateWriteResults(*wb_, expected_result);
306 }
307
TEST_F(WriteBitBufferTest,InvalidStringTooLong)308 TEST_F(WriteBitBufferTest, InvalidStringTooLong) {
309 const std::string kMaxLengthString(kIamfMaxStringSize, 'a');
310
311 EXPECT_THAT(wb_->WriteString(kMaxLengthString), StatusIs(kInvalidArgument));
312 EXPECT_EQ(wb_->bit_offset(), 0);
313 }
314
TEST_F(WriteBitBufferTest,WriteUint8SpanWorksForEmptySpan)315 TEST_F(WriteBitBufferTest, WriteUint8SpanWorksForEmptySpan) {
316 constexpr absl::Span<const uint8_t> kEmptySpan = {};
317
318 EXPECT_THAT(wb_->WriteUint8Span(kEmptySpan), IsOk());
319
320 ValidateWriteResults(*wb_, {});
321 }
322
TEST_F(WriteBitBufferTest,WriteUint8SpanWorksWhenBufferIsByteAligned)323 TEST_F(WriteBitBufferTest, WriteUint8SpanWorksWhenBufferIsByteAligned) {
324 const std::vector<uint8_t> kFivebytes = {0, 10, 20, 30, 255};
325
326 EXPECT_THAT(wb_->WriteUint8Span(absl::MakeConstSpan(kFivebytes)), IsOk());
327
328 ValidateWriteResults(*wb_, kFivebytes);
329 }
330
TEST_F(WriteBitBufferTest,WriteUint8SpanWorksWhenBufferIsNotByteAligned)331 TEST_F(WriteBitBufferTest, WriteUint8SpanWorksWhenBufferIsNotByteAligned) {
332 // Force the buffer to be mis-aligned.
333 EXPECT_THAT(wb_->WriteUnsignedLiteral(0, 1), IsOk());
334 // It is OK to write a span, even when the underlying buffer is mis-aligned.
335 EXPECT_THAT(wb_->WriteUint8Span({0xff}), IsOk());
336 EXPECT_THAT(wb_->WriteUnsignedLiteral(0, 7), IsOk());
337
338 ValidateWriteResults(*wb_,
339 {
340 0b0111'1111, // The first mis-aligned bit, then
341 // the first 7-bits of the span.
342 0b1000'0000 // The final bit of the span, then the
343 // final 7 mis-aligned bits.
344 });
345 }
346
TEST_F(WriteBitBufferTest,WriteUleb128Min)347 TEST_F(WriteBitBufferTest, WriteUleb128Min) {
348 EXPECT_THAT(wb_->WriteUleb128(0), IsOk());
349 ValidateWriteResults(*wb_, {0x00});
350 }
351
TEST_F(WriteBitBufferTest,WriteUleb128Max)352 TEST_F(WriteBitBufferTest, WriteUleb128Max) {
353 EXPECT_THAT(wb_->WriteUleb128(std::numeric_limits<DecodedUleb128>::max()),
354 IsOk());
355 ValidateWriteResults(*wb_, {0xff, 0xff, 0xff, 0xff, 0x0f});
356 }
357
TEST_F(WriteBitBufferTest,WriteUleb128IsControlledByGeneratorPassedInConstructor)358 TEST_F(WriteBitBufferTest,
359 WriteUleb128IsControlledByGeneratorPassedInConstructor) {
360 auto leb_generator =
361 LebGenerator::Create(LebGenerator::GenerationMode::kFixedSize, 5);
362 ASSERT_NE(leb_generator, nullptr);
363 wb_ = std::make_unique<WriteBitBuffer>(1, *leb_generator);
364
365 EXPECT_THAT(wb_->WriteUleb128(0), IsOk());
366
367 ValidateWriteResults(*wb_, {0x80, 0x80, 0x80, 0x80, 0x00});
368 }
369
TEST_F(WriteBitBufferTest,WriteMinUleb128DefaultsToGeneratingMinimalUleb128s)370 TEST_F(WriteBitBufferTest, WriteMinUleb128DefaultsToGeneratingMinimalUleb128s) {
371 EXPECT_THAT(wb_->WriteUleb128(129), IsOk());
372
373 ValidateWriteResults(*wb_, {0x81, 0x01});
374 }
375
TEST_F(WriteBitBufferTest,WriteMinUleb128CanFailWithFixedSizeGenerator)376 TEST_F(WriteBitBufferTest, WriteMinUleb128CanFailWithFixedSizeGenerator) {
377 auto leb_generator =
378 LebGenerator::Create(LebGenerator::GenerationMode::kFixedSize, 1);
379 ASSERT_NE(leb_generator, nullptr);
380 wb_ = std::make_unique<WriteBitBuffer>(1, *leb_generator);
381
382 EXPECT_FALSE(wb_->WriteUleb128(128).ok());
383 }
384
385 struct WriteIso14496_1ExpandedTestCase {
386 uint32_t size_of_instance;
387 const std::vector<uint8_t> expected_source_data;
388 };
389
390 using WriteIso14496_1Expanded =
391 ::testing::TestWithParam<WriteIso14496_1ExpandedTestCase>;
392
TEST_P(WriteIso14496_1Expanded,WriteIso14496_1Expanded)393 TEST_P(WriteIso14496_1Expanded, WriteIso14496_1Expanded) {
394 WriteBitBuffer wb(0);
395 EXPECT_THAT(wb.WriteIso14496_1Expanded(GetParam().size_of_instance), IsOk());
396
397 EXPECT_EQ(wb.bit_buffer(), GetParam().expected_source_data);
398 }
399
400 INSTANTIATE_TEST_SUITE_P(OneByteOutput, WriteIso14496_1Expanded,
401 testing::ValuesIn<WriteIso14496_1ExpandedTestCase>({
402 {0, {0x00}},
403 {1, {0x01}},
404 {127, {0x7f}},
405 }));
406
407 INSTANTIATE_TEST_SUITE_P(TwoByteOutput, WriteIso14496_1Expanded,
408 testing::ValuesIn<WriteIso14496_1ExpandedTestCase>({
409 {128, {0x81, 0x00}},
410 {129, {0x81, 0x01}},
411 {0x3fff, {0xff, 0x7f}},
412 }));
413
414 INSTANTIATE_TEST_SUITE_P(FiveByteOutput, WriteIso14496_1Expanded,
415 testing::ValuesIn<WriteIso14496_1ExpandedTestCase>({
416 {0x10000000, {0x81, 0x80, 0x80, 0x80, 0x00}},
417 {0xf0000000, {0x8f, 0x80, 0x80, 0x80, 0x00}},
418 }));
419
420 INSTANTIATE_TEST_SUITE_P(MaxOutput, WriteIso14496_1Expanded,
421 testing::ValuesIn<WriteIso14496_1ExpandedTestCase>({
422 {std::numeric_limits<uint32_t>::max(),
423 {0x8f, 0xff, 0xff, 0xff, 0x7f}},
424 }));
425
TEST_F(WriteBitBufferTest,CapacityMayBeSmaller)426 TEST_F(WriteBitBufferTest, CapacityMayBeSmaller) {
427 // The buffer may have a small initial capacity and resize as needed.
428 constexpr int64_t kInitialCapacity = 0;
429 wb_ = std::make_unique<WriteBitBuffer>(kInitialCapacity);
430 const std::vector<uint8_t> kSixBytes = {0, 1, 2, 3, 4, 5};
431
432 EXPECT_THAT(wb_->WriteUint8Span(absl::MakeConstSpan(kSixBytes)), IsOk());
433 ValidateWriteResults(*wb_, kSixBytes);
434 }
435
TEST_F(WriteBitBufferTest,CapacityMayBeLarger)436 TEST_F(WriteBitBufferTest, CapacityMayBeLarger) {
437 // The buffer may have a larger that capacity that necessary.
438 wb_ = std::make_unique<WriteBitBuffer>(/*initial_capacity=*/100);
439 const std::vector<uint8_t> kSixBytes = {0, 1, 2, 3, 4, 5};
440
441 EXPECT_THAT(wb_->WriteUint8Span(absl::MakeConstSpan(kSixBytes)), IsOk());
442 ValidateWriteResults(*wb_, kSixBytes);
443 }
444
TEST_F(WriteBitBufferTest,ConsecutiveWrites)445 TEST_F(WriteBitBufferTest, ConsecutiveWrites) {
446 // The buffer accumulates data from all write calls.
447 EXPECT_THAT(wb_->WriteUnsignedLiteral(0x01, 8), IsOk());
448 EXPECT_THAT(wb_->WriteUnsignedLiteral64(0x0203040506070809, 64), IsOk());
449 EXPECT_THAT(wb_->WriteUleb128(128), IsOk());
450 ValidateWriteResults(*wb_,
451 {// From `WriteUnsignedLiteral()`.
452 0x01,
453 // From `WriteUnsignedLiteral64()`.
454 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
455 // From `WriteLeb128()`.
456 0x80, 0x01});
457 }
458
TEST_F(WriteBitBufferTest,UseAfterReset)459 TEST_F(WriteBitBufferTest, UseAfterReset) {
460 EXPECT_THAT(wb_->WriteUnsignedLiteral(0xabcd, 16), IsOk());
461 ValidateWriteResults(*wb_, {0xab, 0xcd});
462
463 // Resetting the buffer clears it.
464 wb_->Reset();
465 ValidateWriteResults(*wb_, {});
466
467 // The buffer can be used after reset . There is no trace of data before the
468 // reset.
469 EXPECT_THAT(wb_->WriteUnsignedLiteral(100, 8), IsOk());
470 ValidateWriteResults(*wb_, {100});
471 }
472
473 } // namespace
474 } // namespace iamf_tools
475