blob: 6296e3a5d5dd814b1c34029f0101d54671e8cb55 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* License); you may not use this file except in compliance
* with the License. You may obtain a copy of the License a
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include "common/allocator/byte_stream.h"
#include <gtest/gtest.h>
#include <cstdint>
#include <cstring>
namespace common {
TEST(FloatConversionTest, FloatToBytesAndBytesToFloat) {
float actual_float = -1234.5678f;
uint8_t actual_bytes[4];
float_to_bytes(actual_float, actual_bytes);
float expect_float = bytes_to_float(actual_bytes);
EXPECT_FLOAT_EQ(expect_float, actual_float);
}
TEST(DoubleConversionTest, DoubleToBytesAndBytesToDouble) {
double actual_double = -1.23456789e-20;
uint8_t actual_bytes[8];
double_to_bytes(actual_double, actual_bytes);
double expect_double = bytes_to_double(actual_bytes);
EXPECT_DOUBLE_EQ(expect_double, actual_double);
}
class ByteStreamTest : public ::testing::Test {
protected:
void SetUp() override {
byte_stream_ = new ByteStream(16, MOD_DEFAULT, false);
}
void TearDown() override { delete byte_stream_; }
void write_to_stream(const uint8_t* data, uint32_t size) {
ASSERT_EQ(byte_stream_->write_buf(data, size), common::E_OK);
}
void read_from_stream(uint8_t* buffer, uint32_t want_len,
uint32_t& read_len) {
ASSERT_EQ(byte_stream_->read_buf(buffer, want_len, read_len),
common::E_OK);
}
void wrap_external_buffer(const char* buffer, int32_t size) {
byte_stream_->wrap_from(buffer, size);
}
ByteStream* byte_stream_;
};
TEST_F(ByteStreamTest, WriteReadTest) {
const uint8_t data[] = {0x01, 0x02, 0x03};
const uint32_t data_size = sizeof(data);
write_to_stream(data, data_size);
uint8_t read_buffer[data_size];
uint32_t read_len = 0;
read_from_stream(read_buffer, data_size, read_len);
ASSERT_EQ(read_len, data_size);
for (uint32_t i = 0; i < data_size; ++i) {
ASSERT_EQ(read_buffer[i], data[i]);
}
}
TEST_F(ByteStreamTest, WriteReadLargeQuantities) {
for (int i = 0; i < 1024 * 1024; i++) {
const uint8_t data = i & 0xff;
write_to_stream(&data, 1);
}
uint8_t read_buffer[1024 * 1024];
for (int i = 0; i < 1024 * 1024; i++) {
uint32_t read_len = 0;
read_from_stream(read_buffer + i, 1, read_len);
}
for (int i = 0; i < 1024 * 1024; i++) {
EXPECT_EQ(read_buffer[i], i & 0xff);
}
}
TEST_F(ByteStreamTest, WrapExternalBufferTest) {
const char externalBuffer[] = "Hello, World!";
const int32_t bufferSize = sizeof(externalBuffer);
wrap_external_buffer(externalBuffer, bufferSize);
ASSERT_TRUE(byte_stream_->is_wrapped());
ASSERT_STREQ(byte_stream_->get_wrapped_buf(), externalBuffer);
}
TEST_F(ByteStreamTest, SizeTest) {
const uint8_t data[] = {0x01, 0x02, 0x03};
const uint32_t data_size = sizeof(data);
write_to_stream(data, data_size);
ASSERT_EQ(byte_stream_->total_size(), data_size);
ASSERT_EQ(byte_stream_->remaining_size(), data_size);
uint8_t read_buffer[data_size];
uint32_t read_len = 0;
read_from_stream(read_buffer, 2, read_len);
ASSERT_EQ(byte_stream_->remaining_size(), data_size - 2);
}
TEST_F(ByteStreamTest, MarkReadPositionTest) {
const uint8_t data[] = {0x01, 0x02, 0x03};
const uint32_t data_size = sizeof(data);
write_to_stream(data, data_size);
byte_stream_->mark_read_pos();
uint8_t read_buffer[data_size];
uint32_t read_len = 0;
read_from_stream(read_buffer, 2, read_len);
uint32_t markedLen = byte_stream_->get_mark_len();
ASSERT_EQ(markedLen, read_len);
}
TEST_F(ByteStreamTest, ResetTest) {
const uint8_t data[] = {0x01, 0x02, 0x03};
const uint32_t data_size = sizeof(data);
write_to_stream(data, data_size);
byte_stream_->reset();
ASSERT_EQ(byte_stream_->total_size(), 0);
ASSERT_EQ(byte_stream_->remaining_size(), 0);
ASSERT_EQ(byte_stream_->read_pos(), 0);
ASSERT_FALSE(byte_stream_->is_wrapped());
}
TEST_F(ByteStreamTest, WriteMoreThanPageSizeTest) {
const uint8_t data[20] = {0x01, 0x02, 0x03};
const uint32_t data_size = sizeof(data);
write_to_stream(data, data_size);
ASSERT_EQ(byte_stream_->total_size(), 20);
ASSERT_EQ(byte_stream_->remaining_size(), 20);
uint8_t read_buffer[data_size];
uint32_t read_len = 0;
read_from_stream(read_buffer, data_size, read_len);
ASSERT_EQ(read_len, data_size);
for (uint32_t i = 0; i < data_size; ++i) {
ASSERT_EQ(read_buffer[i], data[i]);
}
}
TEST_F(ByteStreamTest, ReadMoreThanAvailableTest) {
const uint8_t data[] = {0x01, 0x02, 0x03};
const uint32_t data_size = sizeof(data);
write_to_stream(data, data_size);
uint8_t read_buffer[4];
uint32_t read_len = 0;
int readResult = byte_stream_->read_buf(read_buffer, 4, read_len);
ASSERT_EQ(readResult, common::E_PARTIAL_READ);
ASSERT_EQ(read_len, data_size);
}
TEST_F(ByteStreamTest, WrapAndClearTest) {
const char externalBuffer[] = "Hello, World!";
const int32_t bufferSize = sizeof(externalBuffer);
wrap_external_buffer(externalBuffer, bufferSize);
byte_stream_->clear_wrapped_buf();
ASSERT_EQ(byte_stream_->get_wrapped_buf(), nullptr);
}
class SerializationUtilTest : public ::testing::Test {
protected:
void SetUp() override {
byte_stream_ = new ByteStream(16, MOD_DEFAULT, false);
}
void TearDown() override { delete byte_stream_; }
ByteStream* byte_stream_;
};
TEST_F(SerializationUtilTest, WriteReadUI8) {
uint8_t value_to_write = 0x12;
uint8_t value_read = 0;
EXPECT_EQ(SerializationUtil::write_ui8(value_to_write, *byte_stream_),
common::E_OK);
EXPECT_EQ(SerializationUtil::read_ui8(value_read, *byte_stream_),
common::E_OK);
EXPECT_EQ(value_to_write, value_read);
}
TEST_F(SerializationUtilTest, WriteReadUI16) {
uint16_t value_to_write = 0x1234;
uint16_t value_read = 0;
EXPECT_EQ(SerializationUtil::write_ui16(value_to_write, *byte_stream_),
common::E_OK);
EXPECT_EQ(SerializationUtil::read_ui16(value_read, *byte_stream_),
common::E_OK);
EXPECT_EQ(value_to_write, value_read);
}
TEST_F(SerializationUtilTest, WriteReadUI32) {
uint32_t value_to_write = 0x12345678;
uint32_t value_read = 0;
EXPECT_EQ(SerializationUtil::write_ui32(value_to_write, *byte_stream_),
common::E_OK);
EXPECT_EQ(SerializationUtil::read_ui32(value_read, *byte_stream_),
common::E_OK);
EXPECT_EQ(value_to_write, value_read);
}
TEST_F(SerializationUtilTest, WriteReadUI64) {
uint64_t value_to_write = 0x123456789ABCDEF0;
uint64_t value_read = 0;
EXPECT_EQ(SerializationUtil::write_ui64(value_to_write, *byte_stream_),
common::E_OK);
EXPECT_EQ(SerializationUtil::read_ui64(value_read, *byte_stream_),
common::E_OK);
EXPECT_EQ(value_to_write, value_read);
}
TEST_F(SerializationUtilTest, WriteReadFloat) {
float value_to_write = 3.14f;
float value_read = 0.0;
EXPECT_EQ(SerializationUtil::write_float(value_to_write, *byte_stream_),
common::E_OK);
EXPECT_EQ(SerializationUtil::read_float(value_read, *byte_stream_),
common::E_OK);
EXPECT_EQ(value_to_write, value_read);
}
TEST_F(SerializationUtilTest, WriteReadDouble) {
double value_to_write = 3.141592653589793;
double value_read = 0.0;
EXPECT_EQ(SerializationUtil::write_double(value_to_write, *byte_stream_),
common::E_OK);
EXPECT_EQ(SerializationUtil::read_double(value_read, *byte_stream_),
common::E_OK);
EXPECT_EQ(value_to_write, value_read);
}
TEST_F(SerializationUtilTest, WriteReadString) {
std::string value_to_write = "Hello, World!";
std::string value_read = "";
EXPECT_EQ(SerializationUtil::write_str(value_to_write, *byte_stream_),
common::E_OK);
EXPECT_EQ(SerializationUtil::read_str(value_read, *byte_stream_),
common::E_OK);
EXPECT_EQ(value_to_write, value_read);
}
TEST_F(SerializationUtilTest, WriteReadIntLEPaddedBitWidth_BitWidthTooLarge) {
int32_t value = 123;
EXPECT_EQ(SerializationUtil::write_int_little_endian_padded_on_bit_width(
value, *byte_stream_, 40),
common::E_TSFILE_CORRUPTED);
byte_stream_->reset();
int32_t read_val = 0;
EXPECT_EQ(SerializationUtil::read_int_little_endian_padded_on_bit_width(
*byte_stream_, 40, read_val),
common::E_TSFILE_CORRUPTED);
}
TEST_F(SerializationUtilTest, WriteReadIntLEPaddedBitWidthBoundaryValue) {
std::vector<int32_t> test_values = {
132100, 1, -1, 12345678, -87654321, INT32_MAX, INT32_MIN};
int bit_width = 32;
for (int32_t original_value : test_values) {
byte_stream_->reset();
EXPECT_EQ(
SerializationUtil::write_int_little_endian_padded_on_bit_width(
original_value, *byte_stream_, bit_width),
common::E_OK);
int32_t read_value = 0;
EXPECT_EQ(SerializationUtil::read_int_little_endian_padded_on_bit_width(
*byte_stream_, bit_width, read_value),
common::E_OK);
EXPECT_EQ(read_value, original_value)
<< "Mismatch with bit_width = " << bit_width;
}
}
} // namespace common