Skip to content

Commit a887e5d

Browse files
committed
- Added unittests for the type-specific byte_buffer implementations.
1 parent 3da8fa5 commit a887e5d

4 files changed

Lines changed: 547 additions & 30 deletions

File tree

CMakeLists.txt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,14 @@ if(BUILD_TESTS)
341341
)
342342
target_include_directories(typed_buffer_test PRIVATE src/processing src/common)
343343

344+
# Typed buffer values tests
345+
add_executable(typed_buffer_values_test src/processing/typed_buffer_values_test.cpp)
346+
target_link_libraries(typed_buffer_values_test
347+
dbps_byte_buffer_lib
348+
gtest_main
349+
)
350+
target_include_directories(typed_buffer_values_test PRIVATE src/processing src/common)
351+
344352
# Basic encryptor tests
345353
add_executable(basic_encryptor_test src/processing/encryptors/basic_encryptor_test.cpp)
346354
target_link_libraries(basic_encryptor_test
@@ -535,6 +543,7 @@ if(BUILD_TESTS)
535543
bytes_utils_test
536544
compression_utils_test
537545
typed_buffer_test
546+
typed_buffer_values_test
538547
basic_encryptor_test
539548
auth_utils_test
540549
dbpa_interface_test
@@ -558,6 +567,7 @@ if(BUILD_TESTS)
558567
gtest_discover_tests(bytes_utils_test)
559568
gtest_discover_tests(compression_utils_test)
560569
gtest_discover_tests(typed_buffer_test)
570+
gtest_discover_tests(typed_buffer_values_test)
561571
gtest_discover_tests(basic_encryptor_test)
562572
gtest_discover_tests(auth_utils_test)
563573
gtest_discover_tests(dbpa_interface_test)

src/processing/typed_buffer.h

Lines changed: 33 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -535,39 +535,42 @@ void ByteBuffer<Codec>::SetElement(size_t position, const value_type& element) {
535535
codec_.Encode(element, write_span);
536536
return;
537537
}
538+
539+
// Variable-sized elements - `else` is needed because it's a compile-time check.
540+
else {
541+
const size_t element_size = static_cast<size_t>(element.size());
538542

539-
const size_t element_size = static_cast<size_t>(element.size());
540-
541-
// Defensive check for unlikely extremely large element size that exceeds uint32.
542-
if (element_size > static_cast<size_t>(std::numeric_limits<uint32_t>::max())) {
543-
throw InvalidInputException("Variable-size element payload exceeds uint32 capacity.. Woohhh!!");
544-
}
545-
546-
// For variable-size elements, we append the element to the write buffer and update offsets_.
547-
//
548-
// We append the element to the write buffer and update offsets_.
549-
//
550-
// This can result on orphaned bytes if a position is set multiple times or positions written out of order.
551-
// This is intentional to allow random writes of elements while the buffer is built.
552-
// During FinalizeAndTakeBuffer, the buffer is rebuilt to be sequential and orphaned bytes are removed.
553-
const size_t offset = write_buffer_.size();
554-
offsets_[position] = offset;
555-
append_u32_le(write_buffer_, static_cast<uint32_t>(element_size));
556-
const size_t payload_offset = write_buffer_.size();
557-
write_buffer_.resize(payload_offset + element_size);
558-
auto write_span = tcb::span<uint8_t>(write_buffer_.data() + payload_offset, element_size);
559-
codec_.Encode(element, write_span);
560-
561-
// Update next_expected_write_position_ for sequential write checking.
562-
if (next_expected_write_position_ != kUnsetVariableElementOffset) {
563-
if (position == next_expected_write_position_) {
564-
next_expected_write_position_ += 1;
565-
} else {
566-
next_expected_write_position_ = kUnsetVariableElementOffset;
543+
// Defensive check for unlikely extremely large element size that exceeds uint32.
544+
if (element_size > static_cast<size_t>(std::numeric_limits<uint32_t>::max())) {
545+
throw InvalidInputException("Variable-size element payload exceeds uint32 capacity.. Woohhh!!");
567546
}
568-
}
569547

570-
RebindSpanToWriteBuffer();
548+
// For variable-size elements, we append the element to the write buffer and update offsets_.
549+
//
550+
// We append the element to the write buffer and update offsets_.
551+
//
552+
// This can result on orphaned bytes if a position is set multiple times or positions written out of order.
553+
// This is intentional to allow random writes of elements while the buffer is built.
554+
// During FinalizeAndTakeBuffer, the buffer is rebuilt to be sequential and orphaned bytes are removed.
555+
const size_t offset = write_buffer_.size();
556+
offsets_[position] = offset;
557+
append_u32_le(write_buffer_, static_cast<uint32_t>(element_size));
558+
const size_t payload_offset = write_buffer_.size();
559+
write_buffer_.resize(payload_offset + element_size);
560+
auto write_span = tcb::span<uint8_t>(write_buffer_.data() + payload_offset, element_size);
561+
codec_.Encode(element, write_span);
562+
563+
// Update next_expected_write_position_ for sequential write checking.
564+
if (next_expected_write_position_ != kUnsetVariableElementOffset) {
565+
if (position == next_expected_write_position_) {
566+
next_expected_write_position_ += 1;
567+
} else {
568+
next_expected_write_position_ = kUnsetVariableElementOffset;
569+
}
570+
}
571+
572+
RebindSpanToWriteBuffer();
573+
}
571574
}
572575

573576
template <class Codec>

src/processing/typed_buffer_codecs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
#include <cstddef>
2121
#include <cstdint>
22+
#include <cstring>
2223
#include <string_view>
2324
#include <tcb/span.hpp>
2425
#include "exceptions.h"

0 commit comments

Comments
 (0)