2014-02-11 11:05:02 +00:00
|
|
|
#include <DB/Common/LRUCache.h>
|
2015-05-07 10:31:50 +00:00
|
|
|
|
2014-02-11 11:05:02 +00:00
|
|
|
#include <iostream>
|
|
|
|
#include <string>
|
2015-05-07 10:31:50 +00:00
|
|
|
#include <thread>
|
|
|
|
#include <chrono>
|
|
|
|
|
|
|
|
namespace
|
|
|
|
{
|
|
|
|
|
|
|
|
void run();
|
|
|
|
void runTest(unsigned int num, const std::function<bool()> func);
|
|
|
|
bool test1();
|
|
|
|
bool test2();
|
|
|
|
|
|
|
|
#define ASSERT_CHECK(cond, res) \
|
|
|
|
do \
|
|
|
|
{ \
|
|
|
|
if (!(cond)) \
|
|
|
|
{ \
|
|
|
|
std::cout << __FILE__ << ":" << __LINE__ << ":" \
|
|
|
|
<< "Assertion " << #cond << " failed.\n"; \
|
|
|
|
if ((res)) { (res) = false; } \
|
|
|
|
} \
|
|
|
|
} \
|
|
|
|
while (0)
|
|
|
|
|
|
|
|
void run()
|
|
|
|
{
|
|
|
|
const std::vector<std::function<bool()> > tests =
|
|
|
|
{
|
|
|
|
test1,
|
|
|
|
test2
|
|
|
|
};
|
|
|
|
|
|
|
|
unsigned int num = 0;
|
|
|
|
for (const auto & test : tests)
|
|
|
|
{
|
|
|
|
++num;
|
|
|
|
runTest(num, test);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void runTest(unsigned int num, const std::function<bool()> func)
|
|
|
|
{
|
|
|
|
bool ok;
|
|
|
|
|
|
|
|
try
|
|
|
|
{
|
|
|
|
ok = func();
|
|
|
|
}
|
|
|
|
catch (const DB::Exception & ex)
|
|
|
|
{
|
|
|
|
ok = false;
|
|
|
|
std::cout << "Caught exception " << ex.displayText() << "\n";
|
|
|
|
}
|
|
|
|
catch (const std::exception & ex)
|
|
|
|
{
|
|
|
|
ok = false;
|
|
|
|
std::cout << "Caught exception " << ex.what() << "\n";
|
|
|
|
}
|
|
|
|
catch (...)
|
|
|
|
{
|
|
|
|
ok = false;
|
|
|
|
std::cout << "Caught unhandled exception\n";
|
|
|
|
}
|
2014-02-11 11:05:02 +00:00
|
|
|
|
2015-05-07 10:31:50 +00:00
|
|
|
if (ok)
|
|
|
|
std::cout << "Test " << num << " passed\n";
|
|
|
|
else
|
|
|
|
std::cout << "Test " << num << " failed\n";
|
|
|
|
}
|
2014-02-11 11:05:02 +00:00
|
|
|
|
|
|
|
struct Weight
|
|
|
|
{
|
|
|
|
size_t operator()(const std::string & s) const
|
|
|
|
{
|
|
|
|
return s.size();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2015-05-07 10:31:50 +00:00
|
|
|
bool test1()
|
2014-02-11 11:05:02 +00:00
|
|
|
{
|
2015-05-07 10:31:50 +00:00
|
|
|
using Cache = DB::LRUCache<std::string, std::string, std::hash<std::string>, Weight>;
|
|
|
|
using MappedPtr = Cache::MappedPtr;
|
|
|
|
|
|
|
|
auto ptr = [](const std::string & s)
|
|
|
|
{
|
|
|
|
return MappedPtr(new std::string(s));
|
|
|
|
};
|
2014-02-11 11:05:02 +00:00
|
|
|
|
2015-05-07 10:31:50 +00:00
|
|
|
Cache cache(10);
|
2014-02-11 11:05:02 +00:00
|
|
|
|
2015-05-07 10:31:50 +00:00
|
|
|
bool res = true;
|
|
|
|
|
|
|
|
ASSERT_CHECK(!cache.get("asd"), res);
|
|
|
|
|
|
|
|
cache.set("asd", ptr("qwe"));
|
|
|
|
|
|
|
|
ASSERT_CHECK((*cache.get("asd") == "qwe"), res);
|
|
|
|
|
|
|
|
cache.set("zxcv", ptr("12345"));
|
|
|
|
cache.set("01234567891234567", ptr("--"));
|
|
|
|
|
|
|
|
ASSERT_CHECK((*cache.get("zxcv") == "12345"), res);
|
|
|
|
ASSERT_CHECK((*cache.get("asd") == "qwe"), res);
|
|
|
|
ASSERT_CHECK((*cache.get("01234567891234567") == "--"), res);
|
|
|
|
ASSERT_CHECK(!cache.get("123x"), res);
|
|
|
|
|
|
|
|
cache.set("321x", ptr("+"));
|
|
|
|
|
|
|
|
ASSERT_CHECK(!cache.get("zxcv"), res);
|
|
|
|
ASSERT_CHECK((*cache.get("asd") == "qwe"), res);
|
|
|
|
ASSERT_CHECK((*cache.get("01234567891234567") == "--"), res);
|
|
|
|
ASSERT_CHECK(!cache.get("123x"), res);
|
|
|
|
ASSERT_CHECK((*cache.get("321x") == "+"), res);
|
|
|
|
|
|
|
|
ASSERT_CHECK((cache.weight() == 6), res);
|
|
|
|
ASSERT_CHECK((cache.count() == 3), res);
|
|
|
|
|
|
|
|
return res;
|
2014-02-11 11:05:02 +00:00
|
|
|
}
|
|
|
|
|
2015-05-07 10:31:50 +00:00
|
|
|
bool test2()
|
2014-02-11 11:05:02 +00:00
|
|
|
{
|
2015-05-07 10:31:50 +00:00
|
|
|
using namespace std::literals;
|
2015-05-07 12:28:09 +00:00
|
|
|
using Cache = DB::LRUCache<std::string, std::string, std::hash<std::string>, Weight>;
|
2015-05-07 10:31:50 +00:00
|
|
|
using MappedPtr = Cache::MappedPtr;
|
|
|
|
|
|
|
|
auto ptr = [](const std::string & s)
|
2014-02-11 11:05:02 +00:00
|
|
|
{
|
2015-05-07 10:31:50 +00:00
|
|
|
return MappedPtr(new std::string(s));
|
|
|
|
};
|
|
|
|
|
|
|
|
Cache cache(10, 3s);
|
|
|
|
|
|
|
|
bool res = true;
|
|
|
|
|
|
|
|
ASSERT_CHECK(!cache.get("asd"), res);
|
|
|
|
|
|
|
|
cache.set("asd", ptr("qwe"));
|
|
|
|
|
|
|
|
ASSERT_CHECK((*cache.get("asd") == "qwe"), res);
|
2014-02-11 11:05:02 +00:00
|
|
|
|
2015-05-07 10:31:50 +00:00
|
|
|
cache.set("zxcv", ptr("12345"));
|
|
|
|
cache.set("01234567891234567", ptr("--"));
|
|
|
|
|
|
|
|
ASSERT_CHECK((*cache.get("zxcv") == "12345"), res);
|
|
|
|
ASSERT_CHECK((*cache.get("asd") == "qwe"), res);
|
|
|
|
ASSERT_CHECK((*cache.get("01234567891234567") == "--"), res);
|
|
|
|
ASSERT_CHECK(!cache.get("123x"), res);
|
|
|
|
|
|
|
|
cache.set("321x", ptr("+"));
|
|
|
|
|
|
|
|
ASSERT_CHECK((cache.get("zxcv")), res);
|
|
|
|
ASSERT_CHECK((*cache.get("asd") == "qwe"), res);
|
|
|
|
ASSERT_CHECK((*cache.get("01234567891234567") == "--"), res);
|
|
|
|
ASSERT_CHECK(!cache.get("123x"), res);
|
|
|
|
ASSERT_CHECK((*cache.get("321x") == "+"), res);
|
|
|
|
|
|
|
|
ASSERT_CHECK((cache.weight() == 11), res);
|
|
|
|
ASSERT_CHECK((cache.count() == 4), res);
|
|
|
|
|
|
|
|
std::this_thread::sleep_for(5s);
|
|
|
|
|
|
|
|
cache.set("123x", ptr("2769"));
|
|
|
|
|
|
|
|
ASSERT_CHECK(!cache.get("zxcv"), res);
|
|
|
|
ASSERT_CHECK((*cache.get("asd") == "qwe"), res);
|
|
|
|
ASSERT_CHECK((*cache.get("01234567891234567") == "--"), res);
|
|
|
|
ASSERT_CHECK((*cache.get("321x") == "+"), res);
|
|
|
|
|
|
|
|
ASSERT_CHECK((cache.weight() == 10), res);
|
|
|
|
ASSERT_CHECK((cache.count() == 4), res);
|
|
|
|
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
int main()
|
|
|
|
{
|
|
|
|
run();
|
2014-02-11 11:05:02 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2015-05-07 10:31:50 +00:00
|
|
|
|