mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-26 17:41:59 +00:00
rewrite unit test with gtest
This commit is contained in:
parent
4cbf095a4a
commit
cd5d733f75
@ -77,9 +77,6 @@ target_link_libraries (limit_read_buffer2 PRIVATE clickhouse_common_io)
|
||||
add_executable (parse_date_time_best_effort parse_date_time_best_effort.cpp)
|
||||
target_link_libraries (parse_date_time_best_effort PRIVATE clickhouse_common_io)
|
||||
|
||||
add_executable (peekable_read_buffer peekable_read_buffer.cpp)
|
||||
target_link_libraries (peekable_read_buffer PRIVATE clickhouse_common_io)
|
||||
|
||||
add_executable (zlib_ng_bug zlib_ng_bug.cpp)
|
||||
target_link_libraries (zlib_ng_bug PRIVATE ${Poco_Foundation_LIBRARY})
|
||||
if(NOT USE_INTERNAL_POCO_LIBRARY)
|
||||
|
131
dbms/src/IO/tests/gtest_peekable_read_buffer.cpp
Normal file
131
dbms/src/IO/tests/gtest_peekable_read_buffer.cpp
Normal file
@ -0,0 +1,131 @@
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <Core/Types.h>
|
||||
#include <IO/ReadHelpers.h>
|
||||
#include <IO/ReadBufferFromString.h>
|
||||
#include <IO/ConcatReadBuffer.h>
|
||||
#include <IO/PeekableReadBuffer.h>
|
||||
|
||||
void readAndAssert(DB::ReadBuffer & buf, const char * str)
|
||||
{
|
||||
size_t n = strlen(str);
|
||||
char tmp[n];
|
||||
buf.readStrict(tmp, n);
|
||||
ASSERT_EQ(strncmp(tmp, str, n), 0);
|
||||
}
|
||||
|
||||
void assertAvailable(DB::ReadBuffer & buf, const char * str)
|
||||
{
|
||||
size_t n = strlen(str);
|
||||
ASSERT_EQ(buf.available(), n);
|
||||
ASSERT_EQ(strncmp(buf.position(), str, n), 0);
|
||||
}
|
||||
|
||||
TEST(PeekableReadBuffer, CheckpointsWorkCorrectly)
|
||||
try
|
||||
{
|
||||
std::string s1 = "0123456789";
|
||||
std::string s2 = "qwertyuiop";
|
||||
std::string s3 = "asdfghjkl;";
|
||||
std::string s4 = "zxcvbnm,./";
|
||||
DB::ReadBufferFromString b1(s1);
|
||||
DB::ReadBufferFromString b2(s2);
|
||||
DB::ReadBufferFromString b3(s3);
|
||||
DB::ReadBufferFromString b4(s4);
|
||||
|
||||
DB::ConcatReadBuffer concat({&b1, &b2, &b3, &b4});
|
||||
DB::PeekableReadBuffer peekable(concat, 0, 16);
|
||||
|
||||
ASSERT_TRUE(!peekable.eof());
|
||||
assertAvailable(peekable, "0123456789");
|
||||
{
|
||||
DB::PeekableReadBufferCheckpoint checkpoint{peekable};
|
||||
readAndAssert(peekable, "01234");
|
||||
}
|
||||
bool exception = false;
|
||||
try
|
||||
{
|
||||
peekable.rollbackToCheckpoint();
|
||||
}
|
||||
catch (DB::Exception & e)
|
||||
{
|
||||
if (e.code() != DB::ErrorCodes::LOGICAL_ERROR)
|
||||
throw;
|
||||
exception = true;
|
||||
}
|
||||
ASSERT_TRUE(exception);
|
||||
assertAvailable(peekable, "56789");
|
||||
|
||||
readAndAssert(peekable, "56");
|
||||
|
||||
peekable.setCheckpoint();
|
||||
readAndAssert(peekable, "789qwertyu");
|
||||
peekable.rollbackToCheckpoint();
|
||||
peekable.dropCheckpoint();
|
||||
assertAvailable(peekable, "789");
|
||||
peekable.peekNext();
|
||||
assertAvailable(peekable, "789qwertyuiop");
|
||||
ASSERT_EQ(peekable.lastPeeked().size(), 10);
|
||||
ASSERT_EQ(strncmp(peekable.lastPeeked().begin(), "asdfghjkl;", 10), 0);
|
||||
|
||||
exception = false;
|
||||
try
|
||||
{
|
||||
DB::PeekableReadBufferCheckpoint checkpoint{peekable, true};
|
||||
peekable.ignore(30);
|
||||
}
|
||||
catch (DB::Exception & e)
|
||||
{
|
||||
if (e.code() != DB::ErrorCodes::MEMORY_LIMIT_EXCEEDED)
|
||||
throw;
|
||||
exception = true;
|
||||
}
|
||||
ASSERT_TRUE(exception);
|
||||
assertAvailable(peekable, "789qwertyuiop");
|
||||
ASSERT_EQ(peekable.lastPeeked().size(), 10);
|
||||
ASSERT_EQ(strncmp(peekable.lastPeeked().begin(), "asdfghjkl;", 10), 0);
|
||||
|
||||
readAndAssert(peekable, "789qwertyu");
|
||||
peekable.setCheckpoint();
|
||||
readAndAssert(peekable, "iopasdfghj");
|
||||
assertAvailable(peekable, "kl;");
|
||||
peekable.dropCheckpoint();
|
||||
|
||||
peekable.setCheckpoint();
|
||||
readAndAssert(peekable, "kl;zxcvbnm,./");
|
||||
ASSERT_TRUE(peekable.eof());
|
||||
ASSERT_TRUE(peekable.eof());
|
||||
ASSERT_TRUE(peekable.eof());
|
||||
peekable.rollbackToCheckpoint();
|
||||
readAndAssert(peekable, "kl;zxcvbnm");
|
||||
peekable.dropCheckpoint();
|
||||
|
||||
exception = false;
|
||||
try
|
||||
{
|
||||
peekable.assertCanBeDestructed();
|
||||
}
|
||||
catch (DB::Exception & e)
|
||||
{
|
||||
if (e.code() != DB::ErrorCodes::LOGICAL_ERROR)
|
||||
throw;
|
||||
exception = true;
|
||||
}
|
||||
ASSERT_TRUE(exception);
|
||||
|
||||
auto buf_ptr = peekable.takeUnreadData();
|
||||
ASSERT_TRUE(peekable.eof());
|
||||
ASSERT_TRUE(peekable.eof());
|
||||
ASSERT_TRUE(peekable.eof());
|
||||
|
||||
readAndAssert(*buf_ptr, ",./");
|
||||
ASSERT_TRUE(buf_ptr->eof());
|
||||
|
||||
peekable.assertCanBeDestructed();
|
||||
}
|
||||
catch (const DB::Exception & e)
|
||||
{
|
||||
std::cerr << e.what() << ", " << e.displayText() << std::endl;
|
||||
throw;
|
||||
}
|
||||
|
@ -1,138 +0,0 @@
|
||||
#include <Core/Types.h>
|
||||
#include <IO/ReadHelpers.h>
|
||||
#include <IO/ReadBufferFromString.h>
|
||||
#include <IO/ConcatReadBuffer.h>
|
||||
#include <IO/PeekableReadBuffer.h>
|
||||
|
||||
void assertTrue(bool b)
|
||||
{
|
||||
if (!b)
|
||||
throw DB::Exception("assert failed", DB::ErrorCodes::LOGICAL_ERROR);
|
||||
}
|
||||
|
||||
void readAndAssert(DB::ReadBuffer & buf, const char * str)
|
||||
{
|
||||
size_t n = strlen(str);
|
||||
char tmp[n];
|
||||
buf.readStrict(tmp, n);
|
||||
assertTrue(strncmp(tmp, str, n) == 0);
|
||||
}
|
||||
|
||||
void assertAvailable(DB::ReadBuffer & buf, const char * str)
|
||||
{
|
||||
size_t n = strlen(str);
|
||||
assertTrue(buf.available() == n);
|
||||
assertTrue(strncmp(buf.position(), str, n) == 0);
|
||||
}
|
||||
|
||||
int main(int, char **)
|
||||
{
|
||||
try
|
||||
{
|
||||
std::string s1 = "0123456789";
|
||||
std::string s2 = "qwertyuiop";
|
||||
std::string s3 = "asdfghjkl;";
|
||||
std::string s4 = "zxcvbnm,./";
|
||||
DB::ReadBufferFromString b1(s1);
|
||||
DB::ReadBufferFromString b2(s2);
|
||||
DB::ReadBufferFromString b3(s3);
|
||||
DB::ReadBufferFromString b4(s4);
|
||||
|
||||
DB::ConcatReadBuffer concat({&b1, &b2, &b3, &b4});
|
||||
DB::PeekableReadBuffer peekable(concat, 0, 16);
|
||||
|
||||
assertTrue(!peekable.eof());
|
||||
assertAvailable(peekable, "0123456789");
|
||||
{
|
||||
DB::PeekableReadBufferCheckpoint checkpoint{peekable};
|
||||
readAndAssert(peekable, "01234");
|
||||
}
|
||||
bool exception = false;
|
||||
try
|
||||
{
|
||||
peekable.rollbackToCheckpoint();
|
||||
}
|
||||
catch (DB::Exception & e)
|
||||
{
|
||||
if (e.code() != DB::ErrorCodes::LOGICAL_ERROR)
|
||||
throw;
|
||||
exception = true;
|
||||
}
|
||||
assertTrue(exception);
|
||||
assertAvailable(peekable, "56789");
|
||||
|
||||
readAndAssert(peekable, "56");
|
||||
|
||||
peekable.setCheckpoint();
|
||||
readAndAssert(peekable, "789qwertyu");
|
||||
peekable.rollbackToCheckpoint();
|
||||
peekable.dropCheckpoint();
|
||||
assertAvailable(peekable, "789");
|
||||
peekable.peekNext();
|
||||
assertAvailable(peekable, "789qwertyuiop");
|
||||
assertTrue(peekable.lastPeeked().size() == 10);
|
||||
assertTrue(strncmp(peekable.lastPeeked().begin(), "asdfghjkl;", 10) == 0);
|
||||
|
||||
exception = false;
|
||||
try
|
||||
{
|
||||
DB::PeekableReadBufferCheckpoint checkpoint{peekable, true};
|
||||
peekable.ignore(30);
|
||||
}
|
||||
catch (DB::Exception & e)
|
||||
{
|
||||
if (e.code() != DB::ErrorCodes::MEMORY_LIMIT_EXCEEDED)
|
||||
throw;
|
||||
exception = true;
|
||||
}
|
||||
assertTrue(exception);
|
||||
assertAvailable(peekable, "789qwertyuiop");
|
||||
assertTrue(peekable.lastPeeked().size() == 10);
|
||||
assertTrue(strncmp(peekable.lastPeeked().begin(), "asdfghjkl;", 10) == 0);
|
||||
|
||||
readAndAssert(peekable, "789qwertyu");
|
||||
peekable.setCheckpoint();
|
||||
readAndAssert(peekable, "iopasdfghj");
|
||||
assertAvailable(peekable, "kl;");
|
||||
peekable.dropCheckpoint();
|
||||
|
||||
peekable.setCheckpoint();
|
||||
readAndAssert(peekable, "kl;zxcvbnm,./");
|
||||
assertTrue(peekable.eof());
|
||||
assertTrue(peekable.eof());
|
||||
assertTrue(peekable.eof());
|
||||
peekable.rollbackToCheckpoint();
|
||||
readAndAssert(peekable, "kl;zxcvbnm");
|
||||
peekable.dropCheckpoint();
|
||||
|
||||
exception = false;
|
||||
try
|
||||
{
|
||||
peekable.assertCanBeDestructed();
|
||||
}
|
||||
catch (DB::Exception & e)
|
||||
{
|
||||
if (e.code() != DB::ErrorCodes::LOGICAL_ERROR)
|
||||
throw;
|
||||
exception = true;
|
||||
}
|
||||
assertTrue(exception);
|
||||
|
||||
auto buf_ptr = peekable.takeUnreadData();
|
||||
assertTrue(peekable.eof());
|
||||
assertTrue(peekable.eof());
|
||||
assertTrue(peekable.eof());
|
||||
|
||||
readAndAssert(*buf_ptr, ",./");
|
||||
assertTrue(buf_ptr->eof());
|
||||
|
||||
peekable.assertCanBeDestructed();
|
||||
}
|
||||
catch (const DB::Exception & e)
|
||||
{
|
||||
std::cerr << e.what() << ", " << e.displayText() << std::endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user