/
zOMGdev
/
cppcms
Обзор
Документация
Войти
/
zOMGdev
/
cppcms
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
v1.2.0
tests/cache_backend_test.cpp
192 строки
6 KB
Artyom Beilis
Cleanup of auto_ptr and some other warnings
02 мар 2017, 13:32
02 мар 2017, 13:32
d1de6e5
Код
Авторство
О чём код?
/////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2008-2012 Artyom Beilis (Tonkikh) <artyomtnk@yahoo.com> // // See accompanying file COPYING.TXT file for licensing details. // /////////////////////////////////////////////////////////////////////////////// #include "test.h" #include "cache_storage.h" #include "tcp_cache_server.h" #include "cache_over_ip.h" #include "base_cache.h" #include <booster/intrusive_ptr.h> #include <cppcms/config.h> #include "test.h" #include <iostream> #include <booster/auto_ptr_inc.h> #include <time.h> #ifdef CPPCMS_WIN_NATIVE #include <windows.h> void ssleep(int x) { Sleep(x*1000); } #else #include <unistd.h> void ssleep(int x) { sleep(x); } #endif void test_cache(booster::intrusive_ptr<cppcms::impl::base_cache> cache,bool test_generators=true) { std::string tmp; std::set<std::string> tags; TEST(cache->fetch("foo",tmp,0)==false); time_t t_and_1=time(0)+1,ttmp=0; cache->store("foo","bar",tags,t_and_1); TEST(cache->fetch("foo",tmp,&tags)==true); TEST(tmp=="bar"); TEST(tags.size()==1); TEST(tags.find("foo")!=tags.end()); TEST(cache->fetch("foo",0,0,&ttmp)==true); TEST(ttmp==t_and_1); ssleep(2); TEST(cache->fetch("foo",tmp,0)==false); tags.clear(); cache->clear(); tags.insert("beep"); cache->store("foo","bar",tags,time(0)+5); cache->store("bar","foo",tags,time(0)+5); tags.clear(); cache->store("bee","bzzz",tags,time(0)+5); TEST(cache->fetch("foo",tmp,0) && tmp=="bar"); TEST(cache->fetch("bar",tmp,0) && tmp=="foo"); TEST(cache->fetch("bee",tmp,0) && tmp=="bzzz"); unsigned keys=0,triggers=0; cache->stats(keys,triggers); TEST(keys==3 && triggers==5); cache->rise("beep"); cache->stats(keys,triggers); TEST(keys==1 && triggers==1); TEST(cache->fetch("foo",tmp,0)==false); TEST(cache->fetch("bar",tmp,0)==false); TEST(cache->fetch("bee",tmp,0) && tmp=="bzzz"); cache->clear(); tags.clear(); cache->store("fu","fu",tags,time(0)+25); // 25 - make sure it works on slow platforms like // ARM emulator for(unsigned i=0;i<1000;i++) { std::ostringstream key; key << i; cache->store(key.str(),key.str(),tags,time(0)+5); TEST(cache->fetch("fu",tmp,0) && tmp=="fu"); } TEST(cache->fetch("fu",tmp,0) && tmp=="fu"); TEST(cache->fetch("1",tmp,0)==false); TEST(cache->fetch("999",tmp,0)==true && tmp=="999"); cache->clear(); tags.clear(); if(test_generators) { cache->store("test","test",tags,time(0)+5); cppcms::uint64_t my_gen=2; cache->store("test2","x",tags,time(0)+5,&my_gen); cppcms::uint64_t g1=0,g2=0,g3=0; TEST(cache->fetch("test",0,0,0,&g1)); cache->store("test","test2",tags,time(0)+5); TEST(cache->fetch("test",&tmp,0,0,&g2)); TEST(tmp=="test2"); TEST(g1!=0 && g2!=0 && g1!=g2); TEST(cache->fetch("test2",0,0,0,&g3)); TEST(g3==my_gen); cache->clear(); } } void test_two_clients(booster::intrusive_ptr<cppcms::impl::base_cache> c1,booster::intrusive_ptr<cppcms::impl::base_cache> c2) { std::string tmp; std::set<std::string> tags; c1->store("foo","test",tags,time(0)+1); TEST(c2->fetch("foo",tmp,0)); TEST(tmp=="test"); c2->store("foo","test2",tags,time(0)+1); TEST(c1->fetch("foo",tmp,0) && tmp=="test2"); c2->rise("foo"); TEST(c1->fetch("foo",tmp,0)==false); c2->store("foo","test3",tags,time(0)+1); TEST(c1->fetch("foo",tmp,0) && tmp=="test3"); c2->clear(); TEST(c1->fetch("foo",tmp,0)==false); } int main() { typedef booster::shared_ptr<cppcms::sessions::session_storage_factory> sfact_type; try { std::cout << "Testing thread cache... "<< std::flush; test_cache(cppcms::impl::thread_cache_factory(20)); std::cout << "Ok" << std::endl; #if !defined(CPPCMS_WIN32) && !defined(CPPCMS_NO_PREFOK_CACHE) std::cout << "Testing process cache... " << std::flush; test_cache(cppcms::impl::process_cache_factory(16*1024*1024,20)); std::cout << "Ok" << std::endl; #endif std::auto_ptr<cppcms::impl::tcp_cache_service> srv1,srv2; { try { std::cout << "Testing cache over ip, single server... "<<std::flush; std::vector<std::string> ips; std::vector<int> ports; ips.push_back("127.0.0.1"); ports.push_back(6001); srv1.reset(new cppcms::impl::tcp_cache_service( cppcms::impl::thread_cache_factory(20), sfact_type(), 1,"127.0.0.1",6001)); test_cache(cppcms::impl::tcp_cache_factory(ips,ports,0),false); std::cout << "Ok" << std::endl; std::cout << "Testing cache over ip, single server with L1 cache... "<<std::flush; test_cache(cppcms::impl::tcp_cache_factory(ips,ports,cppcms::impl::thread_cache_factory(5)),false); std::cout << "Ok" << std::endl; srv2.reset(new cppcms::impl::tcp_cache_service( cppcms::impl::thread_cache_factory(20), sfact_type(), 1,"127.0.0.1",6002)); ips.push_back("127.0.0.1"); ports.push_back(6002); std::cout << "Testing cache over ip, multiple server... "<<std::flush; test_cache(cppcms::impl::tcp_cache_factory(ips,ports,0),false); std::cout << "Ok" << std::endl; std::cout << "Testing cache over ip, multiple server with L1 cache... "<<std::flush; test_cache(cppcms::impl::tcp_cache_factory(ips,ports,cppcms::impl::thread_cache_factory(5)),false); std::cout << "Ok" <<std::endl; ips.resize(1); ports.resize(1); std::cout << "Testing two clients... "<<std::flush; test_two_clients( cppcms::impl::tcp_cache_factory(ips,ports,cppcms::impl::thread_cache_factory(5)), cppcms::impl::tcp_cache_factory(ips,ports,cppcms::impl::thread_cache_factory(5))); std::cout << "Ok" <<std::endl; std::cout << "Testing two clients with L1 cache... "<<std::flush; test_two_clients( cppcms::impl::tcp_cache_factory(ips,ports,0), cppcms::impl::tcp_cache_factory(ips,ports,0)); std::cout << "Ok" <<std::endl; } catch(...) { if(srv1.get()) { srv1->stop(); srv1.reset(); } if(srv2.get()) { srv2->stop(); srv2.reset(); } throw; } srv1->stop(); srv2->stop(); } } catch(std::exception const &e) { std::cerr << "\nFail " << e.what() << std::endl; return 1; } return 0; }