mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-26 17:41:59 +00:00
Moved a few tests to gtest
This commit is contained in:
parent
b76d5a7cf0
commit
f25b96bed2
@ -41,9 +41,6 @@ target_link_libraries (compact_array PRIVATE clickhouse_common_io ${Boost_FILESY
|
||||
add_executable (radix_sort radix_sort.cpp)
|
||||
target_link_libraries (radix_sort PRIVATE clickhouse_common_io)
|
||||
|
||||
add_executable (shell_command_test shell_command_test.cpp)
|
||||
target_link_libraries (shell_command_test PRIVATE clickhouse_common_io)
|
||||
|
||||
add_executable (arena_with_free_lists arena_with_free_lists.cpp)
|
||||
target_link_libraries (arena_with_free_lists PRIVATE clickhouse_compression clickhouse_common_io)
|
||||
|
||||
@ -53,18 +50,6 @@ target_link_libraries (pod_array PRIVATE clickhouse_common_io)
|
||||
add_executable (thread_creation_latency thread_creation_latency.cpp)
|
||||
target_link_libraries (thread_creation_latency PRIVATE clickhouse_common_io)
|
||||
|
||||
add_executable (thread_pool thread_pool.cpp)
|
||||
target_link_libraries (thread_pool PRIVATE clickhouse_common_io)
|
||||
|
||||
add_executable (thread_pool_2 thread_pool_2.cpp)
|
||||
target_link_libraries (thread_pool_2 PRIVATE clickhouse_common_io)
|
||||
|
||||
add_executable (thread_pool_3 thread_pool_3.cpp)
|
||||
target_link_libraries (thread_pool_3 PRIVATE clickhouse_common_io)
|
||||
|
||||
add_executable (thread_pool_schedule_exception thread_pool_schedule_exception.cpp)
|
||||
target_link_libraries (thread_pool_schedule_exception PRIVATE clickhouse_common_io)
|
||||
|
||||
add_executable (multi_version multi_version.cpp)
|
||||
target_link_libraries (multi_version PRIVATE clickhouse_common_io)
|
||||
add_check(multi_version)
|
||||
|
72
dbms/src/Common/tests/gtest_shell_command.cpp
Normal file
72
dbms/src/Common/tests/gtest_shell_command.cpp
Normal file
@ -0,0 +1,72 @@
|
||||
#include <iostream>
|
||||
#include <Core/Types.h>
|
||||
#include <Common/ShellCommand.h>
|
||||
#include <IO/copyData.h>
|
||||
#include <IO/WriteBufferFromFileDescriptor.h>
|
||||
#include <IO/ReadBufferFromString.h>
|
||||
#include <IO/ReadHelpers.h>
|
||||
|
||||
#include <chrono>
|
||||
#include <thread>
|
||||
|
||||
#pragma GCC diagnostic ignored "-Wsign-compare"
|
||||
#ifdef __clang__
|
||||
#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
|
||||
#pragma clang diagnostic ignored "-Wundef"
|
||||
#endif
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
|
||||
using namespace DB;
|
||||
|
||||
|
||||
TEST(ShellCommand, Execute)
|
||||
{
|
||||
auto command = ShellCommand::execute("echo 'Hello, world!'");
|
||||
|
||||
std::string res;
|
||||
readStringUntilEOF(res, command->out);
|
||||
command->wait();
|
||||
|
||||
EXPECT_EQ(res, "Hello, world!\n");
|
||||
}
|
||||
|
||||
TEST(ShellCommand, ExecuteDirect)
|
||||
{
|
||||
auto command = ShellCommand::executeDirect("/bin/echo", {"Hello, world!"});
|
||||
|
||||
std::string res;
|
||||
readStringUntilEOF(res, command->out);
|
||||
command->wait();
|
||||
|
||||
EXPECT_EQ(res, "Hello, world!\n");
|
||||
}
|
||||
|
||||
TEST(ShellCommand, ExecuteWithInput)
|
||||
{
|
||||
auto command = ShellCommand::execute("cat");
|
||||
|
||||
String in_str = "Hello, world!\n";
|
||||
ReadBufferFromString in(in_str);
|
||||
copyData(in, command->in);
|
||||
command->in.close();
|
||||
|
||||
std::string res;
|
||||
readStringUntilEOF(res, command->out);
|
||||
command->wait();
|
||||
|
||||
EXPECT_EQ(res, "Hello, world!\n");
|
||||
}
|
||||
|
||||
TEST(ShellCommand, AutoWait)
|
||||
{
|
||||
// <defunct> hunting:
|
||||
for (int i = 0; i < 1000; ++i)
|
||||
{
|
||||
auto command = ShellCommand::execute("echo " + std::to_string(i));
|
||||
//command->wait(); // now automatic
|
||||
}
|
||||
|
||||
// std::cerr << "inspect me: ps auxwwf" << "\n";
|
||||
// std::this_thread::sleep_for(std::chrono::seconds(100));
|
||||
}
|
@ -1,11 +1,18 @@
|
||||
#include <Common/ThreadPool.h>
|
||||
|
||||
#pragma GCC diagnostic ignored "-Wsign-compare"
|
||||
#ifdef __clang__
|
||||
#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
|
||||
#pragma clang diagnostic ignored "-Wundef"
|
||||
#endif
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
/** Reproduces bug in ThreadPool.
|
||||
* It get stuck if we call 'wait' many times from many other threads simultaneously.
|
||||
*/
|
||||
|
||||
|
||||
int main(int, char **)
|
||||
TEST(ThreadPool, ConcurrentWait)
|
||||
{
|
||||
auto worker = []
|
||||
{
|
||||
@ -29,6 +36,4 @@ int main(int, char **)
|
||||
waiting_pool.schedule([&pool]{ pool.wait(); });
|
||||
|
||||
waiting_pool.wait();
|
||||
|
||||
return 0;
|
||||
}
|
32
dbms/src/Common/tests/gtest_thread_pool_limit.cpp
Normal file
32
dbms/src/Common/tests/gtest_thread_pool_limit.cpp
Normal file
@ -0,0 +1,32 @@
|
||||
#include <atomic>
|
||||
#include <iostream>
|
||||
#include <Common/ThreadPool.h>
|
||||
|
||||
#pragma GCC diagnostic ignored "-Wsign-compare"
|
||||
#ifdef __clang__
|
||||
#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
|
||||
#pragma clang diagnostic ignored "-Wundef"
|
||||
#endif
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
/// Test for thread self-removal when number of free threads in pool is too large.
|
||||
/// Just checks that nothing weird happens.
|
||||
|
||||
template <typename Pool>
|
||||
int test()
|
||||
{
|
||||
Pool pool(10, 2, 10);
|
||||
|
||||
std::atomic<int> counter{0};
|
||||
for (size_t i = 0; i < 10; ++i)
|
||||
pool.schedule([&]{ ++counter; });
|
||||
pool.wait();
|
||||
|
||||
return counter;
|
||||
}
|
||||
|
||||
TEST(ThreadPool, ThreadRemoval)
|
||||
{
|
||||
EXPECT_EQ(test<FreeThreadPool>(), 10);
|
||||
EXPECT_EQ(test<ThreadPool>(), 10);
|
||||
}
|
@ -2,10 +2,17 @@
|
||||
#include <iostream>
|
||||
#include <Common/ThreadPool.h>
|
||||
|
||||
#pragma GCC diagnostic ignored "-Wsign-compare"
|
||||
#ifdef __clang__
|
||||
#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
|
||||
#pragma clang diagnostic ignored "-Wundef"
|
||||
#endif
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
int main(int, char **)
|
||||
|
||||
TEST(ThreadPool, Loop)
|
||||
{
|
||||
std::atomic<size_t> res{0};
|
||||
std::atomic<int> res{0};
|
||||
|
||||
for (size_t i = 0; i < 1000; ++i)
|
||||
{
|
||||
@ -16,6 +23,5 @@ int main(int, char **)
|
||||
pool.wait();
|
||||
}
|
||||
|
||||
std::cerr << res << "\n";
|
||||
return 0;
|
||||
EXPECT_EQ(res, 16000);
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
#include <iostream>
|
||||
#include <stdexcept>
|
||||
#include <Common/ThreadPool.h>
|
||||
|
||||
#pragma GCC diagnostic ignored "-Wsign-compare"
|
||||
#ifdef __clang__
|
||||
#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
|
||||
#pragma clang diagnostic ignored "-Wundef"
|
||||
#endif
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
|
||||
bool check()
|
||||
{
|
||||
ThreadPool pool(10);
|
||||
|
||||
pool.schedule([]{ throw std::runtime_error("Hello, world!"); });
|
||||
|
||||
try
|
||||
{
|
||||
for (size_t i = 0; i < 100; ++i)
|
||||
pool.schedule([]{}); /// An exception will be rethrown from this method.
|
||||
}
|
||||
catch (const std::runtime_error &)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
pool.wait();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
TEST(ThreadPool, ExceptionFromSchedule)
|
||||
{
|
||||
EXPECT_TRUE(check());
|
||||
}
|
@ -1,63 +0,0 @@
|
||||
#include <iostream>
|
||||
#include <Core/Types.h>
|
||||
#include <Common/ShellCommand.h>
|
||||
#include <IO/copyData.h>
|
||||
#include <IO/WriteBufferFromFileDescriptor.h>
|
||||
#include <IO/ReadBufferFromString.h>
|
||||
|
||||
#include <chrono>
|
||||
#include <thread>
|
||||
|
||||
using namespace DB;
|
||||
|
||||
|
||||
int main(int, char **)
|
||||
try
|
||||
{
|
||||
{
|
||||
auto command = ShellCommand::execute("echo 'Hello, world!'");
|
||||
|
||||
WriteBufferFromFileDescriptor out(STDOUT_FILENO);
|
||||
copyData(command->out, out);
|
||||
|
||||
command->wait();
|
||||
}
|
||||
|
||||
{
|
||||
auto command = ShellCommand::executeDirect("/bin/echo", {"Hello, world!"});
|
||||
|
||||
WriteBufferFromFileDescriptor out(STDOUT_FILENO);
|
||||
copyData(command->out, out);
|
||||
|
||||
command->wait();
|
||||
}
|
||||
|
||||
{
|
||||
auto command = ShellCommand::execute("cat");
|
||||
|
||||
String in_str = "Hello, world!\n";
|
||||
ReadBufferFromString in(in_str);
|
||||
copyData(in, command->in);
|
||||
command->in.close();
|
||||
|
||||
WriteBufferFromFileDescriptor out(STDOUT_FILENO);
|
||||
copyData(command->out, out);
|
||||
|
||||
command->wait();
|
||||
}
|
||||
|
||||
// <defunct> hunting:
|
||||
for (int i = 0; i < 1000; ++i)
|
||||
{
|
||||
auto command = ShellCommand::execute("echo " + std::to_string(i));
|
||||
//command->wait(); // now automatic
|
||||
}
|
||||
|
||||
// std::cerr << "inspect me: ps auxwwf" << "\n";
|
||||
// std::this_thread::sleep_for(std::chrono::seconds(100));
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
std::cerr << getCurrentExceptionMessage(false) << "\n";
|
||||
return 1;
|
||||
}
|
@ -1,27 +0,0 @@
|
||||
#include <mutex>
|
||||
#include <iostream>
|
||||
#include <Common/ThreadPool.h>
|
||||
|
||||
/// Test for thread self-removal when number of free threads in pool is too large.
|
||||
/// Just checks that nothing weird happens.
|
||||
|
||||
template <typename Pool>
|
||||
void test()
|
||||
{
|
||||
Pool pool(10, 2, 10);
|
||||
|
||||
std::mutex mutex;
|
||||
for (size_t i = 0; i < 10; ++i)
|
||||
pool.schedule([&]{ std::lock_guard lock(mutex); std::cerr << '.'; });
|
||||
pool.wait();
|
||||
}
|
||||
|
||||
int main(int, char **)
|
||||
{
|
||||
test<FreeThreadPool>();
|
||||
std::cerr << '\n';
|
||||
test<ThreadPool>();
|
||||
std::cerr << '\n';
|
||||
|
||||
return 0;
|
||||
}
|
@ -1,25 +0,0 @@
|
||||
#include <iostream>
|
||||
#include <stdexcept>
|
||||
#include <Common/ThreadPool.h>
|
||||
|
||||
|
||||
int main(int, char **)
|
||||
{
|
||||
ThreadPool pool(10);
|
||||
|
||||
pool.schedule([]{ throw std::runtime_error("Hello, world!"); });
|
||||
|
||||
try
|
||||
{
|
||||
while (true)
|
||||
pool.schedule([]{}); /// An exception will be rethrown from this method.
|
||||
}
|
||||
catch (const std::runtime_error & e)
|
||||
{
|
||||
std::cerr << e.what() << "\n";
|
||||
}
|
||||
|
||||
pool.wait();
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user