blob: 21dfb19cd2e5ea08aff358695e10eaced2463edb [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 at
//
// 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 <gtest/gtest.h>
#include "olap/byte_buffer.h"
#include "olap/in_stream.h"
#include "olap/out_stream.h"
#include "olap/rowset/bit_field_reader.h"
#include "olap/rowset/bit_field_writer.h"
#include "util/logging.h"
namespace doris {
class TestBitField : public testing::Test {
public:
TestBitField() {}
virtual ~TestBitField() {}
void SetUp() {
system("mkdir -p ./ut_dir/");
system("rm ./ut_dir/tmp_file");
_out_stream = new (std::nothrow) OutStream(OLAP_DEFAULT_COLUMN_STREAM_BUFFER_SIZE, NULL);
ASSERT_TRUE(_out_stream != NULL);
_writer = new (std::nothrow) BitFieldWriter(_out_stream);
ASSERT_TRUE(_writer != NULL);
_writer->init();
}
void TearDown() {
SAFE_DELETE(_reader);
SAFE_DELETE(_out_stream);
SAFE_DELETE(_writer);
SAFE_DELETE(_shared_buffer);
SAFE_DELETE(_stream);
}
void CreateReader() {
ASSERT_EQ(OLAP_SUCCESS,
_helper.open_with_mode(_file_path.c_str(), O_CREAT | O_EXCL | O_WRONLY,
S_IRUSR | S_IWUSR));
_out_stream->write_to_file(&_helper, 0);
_helper.close();
ASSERT_EQ(OLAP_SUCCESS,
_helper.open_with_mode(_file_path.c_str(), O_RDONLY, S_IRUSR | S_IWUSR));
_shared_buffer = StorageByteBuffer::create(OLAP_DEFAULT_COLUMN_STREAM_BUFFER_SIZE +
sizeof(StreamHead));
ASSERT_TRUE(_shared_buffer != NULL);
_stream = new (std::nothrow)
ReadOnlyFileStream(&_helper, &_shared_buffer, 0, _helper.length(), NULL,
OLAP_DEFAULT_COLUMN_STREAM_BUFFER_SIZE, &_stats);
ASSERT_EQ(OLAP_SUCCESS, _stream->init());
_reader = new (std::nothrow) BitFieldReader(_stream);
ASSERT_TRUE(_reader != NULL);
_reader->init();
}
BitFieldReader* _reader;
OutStream* _out_stream;
BitFieldWriter* _writer;
FileHandler _helper;
StorageByteBuffer* _shared_buffer;
ReadOnlyFileStream* _stream;
OlapReaderStatistics _stats;
std::string _file_path = "./ut_dir/tmp_file";
};
TEST_F(TestBitField, ReadWriteOneBit) {
// write data
ASSERT_EQ(OLAP_SUCCESS, _writer->write(true));
ASSERT_EQ(OLAP_SUCCESS, _writer->flush());
// read data
CreateReader();
char value = 0;
ASSERT_EQ(OLAP_SUCCESS, _reader->next(&value));
ASSERT_EQ(value, 1);
}
TEST_F(TestBitField, ReadWriteMultiBits) {
// write data
for (int32_t i = 0; i < 100; i++) {
if (0 == i % 2) {
ASSERT_EQ(OLAP_SUCCESS, _writer->write(true));
} else {
ASSERT_EQ(OLAP_SUCCESS, _writer->write(false));
}
}
ASSERT_EQ(OLAP_SUCCESS, _writer->flush());
// read data
CreateReader();
char value = 0;
for (int32_t i = 0; i < 100; i++) {
ASSERT_EQ(OLAP_SUCCESS, _reader->next(&value));
if (0 == i % 2) {
ASSERT_EQ(value, 1);
} else {
ASSERT_EQ(value, 0);
}
}
}
TEST_F(TestBitField, Seek) {
// write data
for (int32_t i = 0; i < 100; i++) {
if (0 == i % 2) {
ASSERT_EQ(OLAP_SUCCESS, _writer->write(true));
} else {
ASSERT_EQ(OLAP_SUCCESS, _writer->write(false));
}
}
PositionEntryWriter index_entry;
_writer->get_position(&index_entry);
ASSERT_EQ(OLAP_SUCCESS, _writer->write(true));
ASSERT_EQ(OLAP_SUCCESS, _writer->flush());
// read data
CreateReader();
char value = 0;
PositionEntryReader entry;
entry._positions = index_entry._positions;
entry._positions_count = index_entry._positions_count;
entry._statistics.init(OLAP_FIELD_TYPE_TINYINT, false);
PositionProvider position(&entry);
_reader->seek(&position);
ASSERT_EQ(OLAP_SUCCESS, _reader->next(&value));
ASSERT_EQ(value, 1);
}
TEST_F(TestBitField, Skip) {
// write data
for (int32_t i = 0; i < 100; i++) {
if (0 == i % 2) {
ASSERT_EQ(OLAP_SUCCESS, _writer->write(true));
} else {
ASSERT_EQ(OLAP_SUCCESS, _writer->write(false));
}
}
ASSERT_EQ(OLAP_SUCCESS, _writer->write(true));
ASSERT_EQ(OLAP_SUCCESS, _writer->flush());
// read data
CreateReader();
char value = 0;
_reader->skip(100);
ASSERT_EQ(OLAP_SUCCESS, _reader->next(&value));
ASSERT_EQ(value, 1);
}
} // namespace doris
int main(int argc, char** argv) {
std::string conffile = std::string(getenv("DORIS_HOME")) + "/conf/be.conf";
if (!doris::config::init(conffile.c_str(), false)) {
fprintf(stderr, "error read config file. \n");
return -1;
}
doris::init_glog("be-test");
int ret = doris::OLAP_SUCCESS;
testing::InitGoogleTest(&argc, argv);
ret = RUN_ALL_TESTS();
google::protobuf::ShutdownProtobufLibrary();
return ret;
}