|
- ///////////////////////////////////////////////////////////////////////////////
- //
- // Copyright (C) 2008-2012 Artyom Beilis (Tonkikh) <artyomtnk@yahoo.com>
- //
- // See accompanying file COPYING.TXT file for licensing details.
- //
- ///////////////////////////////////////////////////////////////////////////////
- #include <cppcms/defs.h>
- #include <cppcms/config.h>
- #include "test.h"
- #include <cppcms/session_storage.h>
- #include "session_memory_storage.h"
- #ifdef CPPCMS_WIN_NATIVE
- #include "session_win32_file_storage.h"
- #include <windows.h>
- #else
- #include "session_posix_file_storage.h"
- #include <sys/types.h>
- #include <dirent.h>
- #endif
- #ifndef CPPCMS_NO_TCP_CACHE
- #include "tcp_cache_server.h"
- #include "session_tcp_storage.h"
- #endif
- #include <booster/function.h>
- #include <booster/backtrace.h>
- #include <string.h>
- #include <booster/auto_ptr_inc.h>
- #include <iostream>
- #include <vector>
- #include <stdio.h>
- #include <time.h>
-
-
-
- std::string dir = "./sessions";
- std::string bs="0123456789abcdef0123456789abcde";
-
- void do_nothing() {}
-
- void test(booster::shared_ptr<cppcms::sessions::session_storage> storage,cppcms::sessions::session_storage_factory &f)
- {
- time_t now=time(0)+3;
- storage->save(bs+"1",now,"");
- std::string out="xx";
- time_t tout;
- TEST(storage->load(bs+"1",tout,out));
- TEST(out.empty());
- TEST(tout==now);
- storage->remove(bs+"1");
- TEST(!storage->load(bs+"1",tout,out));
- storage->save(bs+"1",now-4,"hello world");
- TEST(!storage->load(bs+"1",tout,out));
- storage->save(bs+"1",now,"hello world");
- TEST(storage->load(bs+"1",tout,out));
- TEST(out=="hello world");
- storage->save(bs+"2",now,"x");
- storage->remove(bs+"2");
- TEST(storage->load(bs+"1",tout,out));
- TEST(out=="hello world");
- storage->remove(bs+"1");
- storage->remove(bs+"2");
- f.gc_job();
- }
-
- int count_files()
- {
- #ifndef CPPCMS_WIN_NATIVE
- DIR *d=opendir(dir.c_str());
- TEST(d);
- int counter = 0;
- struct dirent *de;
- while((de=readdir(d))!=0) {
- if(strlen(de->d_name)==32)
- counter++;
- }
- closedir(d);
- return counter;
- #else
- WIN32_FIND_DATA entry;
- HANDLE d=FindFirstFile((dir+"/*").c_str(),&entry);
- int counter=0;
- if(d==INVALID_HANDLE_VALUE) {
- return 0;
- }
- do {
- if(strlen(entry.cFileName)==32)
- counter++;
- }while(FindNextFile(d,&entry));
- FindClose(d);
- return counter;
- #endif
- }
-
- void test_files(booster::shared_ptr<cppcms::sessions::session_storage> storage,
- cppcms::sessions::session_storage_factory &f)
- {
- test(storage,f);
- TEST(f.requires_gc());
- time_t now=time(0);
- storage->save(bs+"1",now,"test");
- TEST(count_files()==1);
- storage->remove(bs+"1");
- TEST(count_files()==0);
- storage->save(bs+"1",now-1,"test");
- storage->save(bs+"2",now+1,"test2");
- TEST(count_files()==2);
- f.gc_job();
- TEST(count_files()==1);
- std::string tstr;
- time_t ttime;
- TEST(!storage->load(bs+"1",ttime,tstr));
- TEST(storage->load(bs+"2",ttime,tstr));
- TEST(ttime==now+1 && tstr=="test2");
- storage->save(bs+"2",now-1,"test2");
- TEST(count_files()==1);
- f.gc_job();
- TEST(count_files()==0);
- }
-
-
-
- int main()
- {
- try {
-
- booster::shared_ptr<cppcms::sessions::session_storage> storage;
- std::auto_ptr<cppcms::sessions::session_storage_factory> storage_factory;
- using namespace cppcms::sessions;
-
- std::cout << "Testing memory storage" << std::endl;
- session_memory_storage_factory mem;
- storage=mem.get();
- test(storage,mem);
- std::cout << "Testing file storage" << std::endl;
- #ifndef CPPCMS_NO_GZIP
- #ifndef CPPCMS_WIN_NATIVE
- std::cout << "Testing single process" << std::endl;
- session_file_storage_factory f1(dir,5,1,false);
- storage=f1.get();
- test_files(storage,f1);
- std::cout << "Testing multiple process" << std::endl;
- session_file_storage_factory f2(dir,5,5,false);
- storage=f2.get();
- test_files(storage,f2);
- std::cout << "Testing single process over NFS" << std::endl;
- session_file_storage_factory f3(dir,5,1,true);
- storage=f3.get();
- test_files(storage,f3);
- #else
- session_file_storage_factory f(dir);
- storage=f.get();
- test_files(storage,f);
- #endif
- #endif
- #ifndef CPPCMS_NO_TCP_CACHE
- std::cout << "Testing network backend" << std::endl;
-
- std::vector<std::string> ips;
- ips.push_back("127.0.0.1");
- std::vector<int> ports;
- ports.push_back(8080);
- tcp_factory f4(ips,ports);
- booster::shared_ptr<cppcms::sessions::session_storage_factory>
- mem_ptr(new session_memory_storage_factory());
- cppcms::impl::tcp_cache_service service(0,mem_ptr,1,"127.0.0.1",8080);
- storage=f4.get();
- test(storage,f4);
- service.stop();
- mem_ptr.reset();
- #endif
- }
- catch(std::exception const &e) {
- std::cerr <<"Fail: " << e.what() << std::endl;
- std::cerr << booster::trace(e) << std::endl;
- return 1;
- }
- std::cout << "Ok" << std::endl;
- return 0;
- }
|