/
zOMGdev
/
cppcms
Обзор
Документация
Войти
/
zOMGdev
/
cppcms
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
v1.0.5
tests/disco_test.cpp
123 строки
3 KB
Artyom Beilis
- Update copyright notice,
03 янв 2012, 17:58
03 янв 2012, 17:58
068d3f9
Код
Авторство
О чём код?
/////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2008-2012 Artyom Beilis (Tonkikh) <artyomtnk@yahoo.com> // // See accompanying file COPYING.TXT file for licensing details. // /////////////////////////////////////////////////////////////////////////////// #include <cppcms/service.h> #include <cppcms/application.h> #include <cppcms/applications_pool.h> #include <cppcms/http_request.h> #include <cppcms/http_response.h> #include <cppcms/http_context.h> #include <cppcms/url_dispatcher.h> #include <cppcms/mount_point.h> #include <cppcms/json.h> #include <iostream> #include "client.h" #include "test.h" int bad_count = 0; int calls = 0; class unit_test : public cppcms::application { public: unit_test(cppcms::service &s) : cppcms::application(s) { } virtual void main(std::string /*unused*/) { calls ++; bool bad_found = false; std::ostream &out = response().out(); for(unsigned i=0;i<10000000;i++) { if(!(out << i << '\n')) { bad_found = true; break; } } if(bad_found) { std::cout << "Disconned as expected" << std::endl; bad_count++; } else { std::cout << "Not disconnected!" << std::endl; } } }; class async_unit_test : public cppcms::application { public: async_unit_test(cppcms::service &s) : cppcms::application(s) { dispatcher().assign("/single",&async_unit_test::single,this); dispatcher().assign("/multiple",&async_unit_test::multiple,this); } struct binder { booster::shared_ptr<cppcms::http::context> context; int counter; void operator()(cppcms::http::context::completion_type ct) { if(ct == cppcms::http::context::operation_aborted) { bad_count++; return; } if(counter > 0) { counter --; std::ostream &out = context->response().out(); for(unsigned i=0;i<1000;i++) { out << i << '\n'; } context->async_flush_output(*this); } else { context->async_complete_response(); } } }; void multiple() { calls ++; binder call; call.context = release_context(); call.counter = 10000; call(cppcms::http::context::operation_completed); } void single() { calls ++; std::ostream &out = response().out(); for(unsigned i=0;i<100000;i++) { out << i << '\n'; } release_context()->async_complete_response(); } }; int main(int argc,char **argv) { try { cppcms::service srv(argc,argv); booster::intrusive_ptr<cppcms::application> async = new async_unit_test(srv); srv.applications_pool().mount( async, cppcms::mount_point("/async") ); srv.applications_pool().mount( cppcms::applications_factory<unit_test>(), cppcms::mount_point("/sync")); srv.after_fork(submitter(srv)); srv.run(); } catch(std::exception const &e) { std::cerr << e.what() << std::endl; return EXIT_FAILURE; } if(bad_count != 3 || calls != 4) { std::cerr << "Failed bad_count = " << bad_count << " calls = " << calls << std::endl; return EXIT_FAILURE; } std::cout << "Ok" << std::endl; return EXIT_SUCCESS; }