/
zOMGdev
/
cppcms
Обзор
Документация
Войти
/
zOMGdev
/
cppcms
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
v1.1.1
tests/file_buffer_test.cpp
141 строка
3 KB
Artyom Beilis
Added tests for existance of fseeko/_fseeki64
13 дек 2015, 20:04
13 дек 2015, 20:04
85d9f87
Код
Авторство
О чём код?
/////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2008-2012 Artyom Beilis (Tonkikh) <artyomtnk@yahoo.com> // // See accompanying file COPYING.TXT file for licensing details. // /////////////////////////////////////////////////////////////////////////////// //#define DEBUG_FILE_BUFFER #include "http_file_buffer.h" #include "test.h" #include <iostream> #include <istream> #include <ostream> #include <iomanip> char cfpos(int c) { return '0' + c % 10; } void test_read(std::istream &is,int &oldpos,int size) { //static_cast<cppcms::http::impl::file_buffer *>(is.rdbuf())->status("Before"); for(int i=oldpos;i<size;i++) { int r = is.get(); if(r!=cfpos(i)) printf("pos=%d %d [%c] %c\n",i,r,r,cfpos(i)); TEST(r==cfpos(i)); } TEST(is.get() == EOF); is.clear(); oldpos = size; int limit = 100; if(limit > size * 2) limit = size * 2; for(int i=0;i<limit;i++) { int pos = rand() % size; int chunk = rand() % size + 1; if(chunk+pos > size) { chunk = size - pos; } switch(i%4) { case 0: is.seekg(pos); break; case 1: is.seekg(pos,std::ios_base::beg); break; case 2: is.seekg(pos - size,std::ios_base::end); break; case 3: is.seekg(pos - oldpos,std::ios_base::cur); break; } TEST(int(is.tellg()) == pos); for(int j=0;j<chunk;j++) { TEST(is.get() == cfpos(pos + j)); } oldpos = pos + chunk; TEST(int(is.tellg()) == oldpos); if(oldpos == size) { TEST(is.get()==-1); is.clear(); TEST(int(is.tellg()) == oldpos); } if(rand() % 5==0 && oldpos > 0) { int back = rand() % oldpos + 1; for(int i=0;i<back;i++) { TEST(is.unget()); } oldpos -= back; } TEST(int(is.tellg()) == oldpos); } } void test(int const size,int msize) { std::cout << "Testing for file size = " << std::setw(10) << size << " in memory size " << std::setw(8) << msize << std::endl; int limit = 100; if(limit > size * 2) limit = size * 2; for(int i=0;i<limit;i++) { cppcms::http::impl::file_buffer fb(msize); fb.temp_dir("."); try { std::istream in(&fb); std::ostream out(&fb); int rpos = 0; for(int csize = 0;csize < size;) { int chunk = rand() % size + 1; if(chunk + csize > size) chunk = size - csize; for(int i=0;i<chunk;i++) { out << cfpos(csize + i); TEST(out); } csize += chunk; test_read(in,rpos,csize); } out<<std::flush; if(fb.size() != size) printf("%d %d\n",int(fb.size()),size); TEST(fb.size() == size); TEST(int(out.tellp())==size); TEST(fb.in_memory() == (size <= msize)); } catch(...) { fb.close(); if(!fb.name().empty()) booster::nowide::remove(fb.name().c_str()); throw; } fb.close(); TEST(fb.name().empty() == fb.in_memory()); if(!fb.in_memory()) { fflush(stdout); FILE *f=booster::nowide::fopen(fb.name().c_str(),"rb"); TEST(f); for(int i=0;i<size;i++) { TEST(fgetc(f)==cfpos(i)); } TEST(fgetc(f)==EOF); fclose(f); booster::nowide::remove(fb.name().c_str()); } } } int main() { try { for(int size = 1; size <= 10000; size*= 10) { int inmem[] = { 0, 16, 1024, 20000, -1 }; for(int m=0;inmem[m] != -1;m++) { test(size,inmem[m]); } } } catch(std::exception const &e) { std::cerr << "FAIL: " << e.what() << std::endl; return 1; } std::cout << "Ok" << std::endl; return 0; }