From d124dec32e1b02e4e936272e00babfaf860443d4 Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Fri, 23 Dec 2016 15:19:25 +0000 Subject: Refactor to make available some classes for testing --- icespider/Jamfile.jam | 2 + icespider/core/core.cpp | 54 +++++++++-- icespider/core/core.h | 15 ++- icespider/fcgi/cgiCore.cpp | 51 ---------- icespider/fcgi/cgiCore.h | 21 ---- icespider/fcgi/main.cpp | 4 +- icespider/testing/Jamfile.jam | 8 ++ icespider/testing/testRequest.cpp | 95 ++++++++++++++++++ icespider/testing/testRequest.h | 43 +++++++++ icespider/unittests/Jamfile.jam | 4 +- icespider/unittests/testApp.cpp | 159 +++++++------------------------ icespider/unittests/testFcgi.cpp | 4 +- icespider/unittests/testFileSessions.cpp | 4 +- 13 files changed, 250 insertions(+), 214 deletions(-) delete mode 100644 icespider/fcgi/cgiCore.cpp delete mode 100644 icespider/fcgi/cgiCore.h create mode 100644 icespider/testing/Jamfile.jam create mode 100644 icespider/testing/testRequest.cpp create mode 100644 icespider/testing/testRequest.h diff --git a/icespider/Jamfile.jam b/icespider/Jamfile.jam index 30efa98..02644a2 100644 --- a/icespider/Jamfile.jam +++ b/icespider/Jamfile.jam @@ -6,6 +6,7 @@ build-project unittests ; build-project fcgi ; build-project xslt ; build-project fileSessions ; +build-project testing ; lib Ice ; lib IceUtil ; @@ -19,6 +20,7 @@ package.install install : : fcgi//icespider-fcgi xslt//icespider-xslt fileSessions//icespider-filesessions + testing//icespider-testing : [ glob-tree *.h : fcgi unittests compile ] ; diff --git a/icespider/core/core.cpp b/icespider/core/core.cpp index 117c869..9d187c9 100644 --- a/icespider/core/core.cpp +++ b/icespider/core/core.cpp @@ -76,12 +76,6 @@ namespace IceSpider { } } - const IceSpider::IRouteHandler * - Core::findRoute(const IceSpider::IHttpRequest *) const - { - throw Http404_NotFound(); - } - Ice::ObjectPrx Core::getProxy(const char * type) const { @@ -102,5 +96,53 @@ namespace IceSpider { free(buf); return i; } + + static + bool + operator/=(const PathElements & pathparts, const IRouteHandler * r) + { + auto rpi = r->parts.begin(); + for (auto ppi = pathparts.begin(); ppi != pathparts.end(); ++ppi, ++rpi) { + if (!(*rpi)->matches(*ppi)) return false; + } + return true; + } + + CoreWithDefaultRouter::CoreWithDefaultRouter(const Ice::StringSeq & opts) : + Core(opts) + { + for (const auto & r : allRoutes) { + if (routes.size() <= r->pathElementCount()) { + routes.resize(r->pathElementCount() + 1); + } + auto & lroutes = routes[r->pathElementCount()]; + lroutes.push_back(r); + } + } + + const IceSpider::IRouteHandler * + CoreWithDefaultRouter::findRoute(const IceSpider::IHttpRequest * request) const + { + const auto & pathparts = request->getRequestPath(); + const auto method = request->getRequestMethod(); + if (pathparts.size() >= routes.size()) { + throw Http404_NotFound(); + } + const auto & routeSet = routes[pathparts.size()]; + bool match = false; + for (const auto & r : routeSet) { + if (pathparts /= r) { + if (r->method == method) { + return r; + } + match = true; + } + } + if (!match) { + throw Http404_NotFound(); + } + throw Http405_MethodNotAllowed(); + } + } diff --git a/icespider/core/core.h b/icespider/core/core.h index d6aa173..b1ea594 100644 --- a/icespider/core/core.h +++ b/icespider/core/core.h @@ -16,7 +16,7 @@ namespace IceSpider { Core(const Ice::StringSeq & = {}); ~Core(); - virtual const IRouteHandler * findRoute(const IHttpRequest *) const; + virtual const IRouteHandler * findRoute(const IHttpRequest *) const = 0; void process(IHttpRequest *, const IRouteHandler * = nullptr) const; Ice::ObjectPrx getProxy(const char * type) const; @@ -33,6 +33,19 @@ namespace IceSpider { static const boost::filesystem::path defaultConfig; }; + + class DLL_PUBLIC CoreWithDefaultRouter : public Core { + public: + typedef std::vector LengthRoutes; + typedef std::vector Routes; + + CoreWithDefaultRouter(const Ice::StringSeq & = {}); + + const IRouteHandler * findRoute(const IHttpRequest *) const override; + + Routes routes; + }; + class DLL_PUBLIC Plugin : public virtual Ice::Object { }; typedef AdHoc::Factory PluginFactory; diff --git a/icespider/fcgi/cgiCore.cpp b/icespider/fcgi/cgiCore.cpp deleted file mode 100644 index 0adefab..0000000 --- a/icespider/fcgi/cgiCore.cpp +++ /dev/null @@ -1,51 +0,0 @@ -#include "cgiCore.h" - -namespace IceSpider { - static - bool - operator/=(const PathElements & pathparts, const IRouteHandler * r) - { - auto rpi = r->parts.begin(); - for (auto ppi = pathparts.begin(); ppi != pathparts.end(); ++ppi, ++rpi) { - if (!(*rpi)->matches(*ppi)) return false; - } - return true; - } - - CgiCore::CgiCore(const Ice::StringSeq & opts) : - Core(opts) - { - for (const auto & r : allRoutes) { - if (routes.size() <= r->pathElementCount()) { - routes.resize(r->pathElementCount() + 1); - } - auto & lroutes = routes[r->pathElementCount()]; - lroutes.push_back(r); - } - } - - const IRouteHandler * - CgiCore::findRoute(const IHttpRequest * request) const - { - const auto & pathparts = request->getRequestPath(); - const auto method = request->getRequestMethod(); - if (pathparts.size() >= routes.size()) { - throw Http404_NotFound(); - } - const auto & routeSet = routes[pathparts.size()]; - bool match = false; - for (const auto & r : routeSet) { - if (pathparts /= r) { - if (r->method == method) { - return r; - } - match = true; - } - } - if (!match) { - throw Http404_NotFound(); - } - throw Http405_MethodNotAllowed(); - } -} - diff --git a/icespider/fcgi/cgiCore.h b/icespider/fcgi/cgiCore.h deleted file mode 100644 index 1915a4d..0000000 --- a/icespider/fcgi/cgiCore.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef ICESPIDER_CGI_CGICORE_H -#define ICESPIDER_CGI_CGICORE_H - -#include - -namespace IceSpider { - class CgiCore : public Core { - public: - typedef std::vector LengthRoutes; - typedef std::vector Routes; - - CgiCore(const Ice::StringSeq & = {}); - - const IRouteHandler * findRoute(const IHttpRequest *) const override; - - Routes routes; - }; -} - -#endif - diff --git a/icespider/fcgi/main.cpp b/icespider/fcgi/main.cpp index 4149cb2..7191310 100644 --- a/icespider/fcgi/main.cpp +++ b/icespider/fcgi/main.cpp @@ -1,7 +1,7 @@ #include #include "fcgiRequest.h" #include "cgiRequest.h" -#include "cgiCore.h" +#include "core.h" using namespace IceSpider; @@ -9,7 +9,7 @@ DLL_PUBLIC int main(int argc, char ** argv, char ** env) { - CgiCore core; + CoreWithDefaultRouter core; if (!FCGX_IsCGI()) { FCGX_Request request; diff --git a/icespider/testing/Jamfile.jam b/icespider/testing/Jamfile.jam new file mode 100644 index 0000000..19d1df2 --- /dev/null +++ b/icespider/testing/Jamfile.jam @@ -0,0 +1,8 @@ +lib icespider-testing : + [ glob-tree *.cpp : bin ] + : + ..//core + : : + ..//core + . + ; diff --git a/icespider/testing/testRequest.cpp b/icespider/testing/testRequest.cpp new file mode 100644 index 0000000..1645445 --- /dev/null +++ b/icespider/testing/testRequest.cpp @@ -0,0 +1,95 @@ +#include "testRequest.h" +#include +#include + +namespace IceSpider { + TestRequest::TestRequest(const Core * c, HttpMethod m, const std::string & p) : + IHttpRequest(c), + method(m) + { + namespace ba = boost::algorithm; + auto path = p.substr(1); + if (!path.empty()) { + ba::split(url, path, ba::is_any_of("/"), ba::token_compress_off); + } + } + + const std::vector & + TestRequest::getRequestPath() const + { + return url; + } + + HttpMethod + TestRequest::getRequestMethod() const + { + return method; + } + + IceUtil::Optional + TestRequest::getEnv(const std::string & key) const + { + return env.find(key) == env.end() ? IceUtil::Optional() : env.find(key)->second; + } + + IceUtil::Optional + TestRequest::getQueryStringParam(const std::string & key) const + { + return qs.find(key) == qs.end() ? IceUtil::Optional() : qs.find(key)->second; + } + + IceUtil::Optional + TestRequest::getCookieParam(const std::string & key) const + { + return cookies.find(key) == cookies.end() ? IceUtil::Optional() : cookies.find(key)->second; + } + + IceUtil::Optional + TestRequest::getHeaderParam(const std::string & key) const + { + return hdr.find(key) == hdr.end() ? IceUtil::Optional() : hdr.find(key)->second; + } + + std::istream & + TestRequest::getInputStream() const + { + return input; + } + + std::ostream & + TestRequest::getOutputStream() const + { + return output; + } + + void + TestRequest::response(short statusCode, const std::string & statusMsg) const + { + getOutputStream() + << "Status: " << statusCode << " " << statusMsg << "\r\n" + << "\r\n"; + } + + void + TestRequest::setHeader(const std::string & header, const std::string & value) const + { + getOutputStream() << header << ": " << value << "\r\n"; + } + + const TestRequest::MapVars & + TestRequest::getResponseHeaders() + { + if (responseHeaders.empty()) { + while (true) { + char buf[BUFSIZ], n[BUFSIZ], v[BUFSIZ]; + output.getline(buf, BUFSIZ); + if (sscanf(buf, "%[^:]: %[^\r]", n, v) != 2) { + break; + } + responseHeaders[n] = v; + } + } + return responseHeaders; + } +} + diff --git a/icespider/testing/testRequest.h b/icespider/testing/testRequest.h new file mode 100644 index 0000000..3fd40f0 --- /dev/null +++ b/icespider/testing/testRequest.h @@ -0,0 +1,43 @@ +#ifndef ICESPIDER_TESTING_TESTREQUEST_H +#define ICESPIDER_TESTING_TESTREQUEST_H + +#include +#include + +namespace IceSpider { + class DLL_PUBLIC TestRequest : public IHttpRequest { + public: + typedef std::map MapVars; + typedef std::vector UrlVars; + + TestRequest(const Core * c, HttpMethod m, const std::string & p); + + const std::vector & getRequestPath() const override; + HttpMethod getRequestMethod() const override; + IceUtil::Optional getEnv(const std::string & key) const override; + IceUtil::Optional getQueryStringParam(const std::string & key) const override; + IceUtil::Optional getCookieParam(const std::string & key) const override; + IceUtil::Optional getHeaderParam(const std::string & key) const override; + std::istream & getInputStream() const override; + std::ostream & getOutputStream() const override; + void response(short statusCode, const std::string & statusMsg) const override; + void setHeader(const std::string & header, const std::string & value) const override; + + const MapVars & getResponseHeaders(); + + UrlVars url; + MapVars qs; + MapVars cookies; + MapVars hdr; + MapVars env; + mutable std::stringstream input; + mutable std::stringstream output; + const HttpMethod method; + + private: + MapVars responseHeaders; + }; +} + +#endif + diff --git a/icespider/unittests/Jamfile.jam b/icespider/unittests/Jamfile.jam index ddc1e4a..2c24e7d 100644 --- a/icespider/unittests/Jamfile.jam +++ b/icespider/unittests/Jamfile.jam @@ -64,7 +64,6 @@ run testApp.cpp base2.cpp testRoutes.json - ../fcgi/cgiCore.cpp : : config/ice.properties xslt/transform.xslt @@ -80,18 +79,17 @@ run ../common//icespider-common ../core//icespider-core ../xslt//icespider-xslt + ../testing//icespider-testing ../common//icespider-common test-api ../compile . - ../fcgi : testApp ; run testFcgi.cpp test-fcgi.ice ../fcgi/cgiRequestBase.cpp - ../fcgi/cgiCore.cpp : : : yes BOOST_TEST_DYN_LINK diff --git a/icespider/unittests/testApp.cpp b/icespider/unittests/testApp.cpp index e42a5aa..a95bca5 100644 --- a/icespider/unittests/testApp.cpp +++ b/icespider/unittests/testApp.cpp @@ -3,7 +3,7 @@ #include #include -#include +#include #include #include #include @@ -17,6 +17,7 @@ #include #include #include +#include using namespace IceSpider; @@ -31,88 +32,10 @@ BOOST_AUTO_TEST_CASE( testLoadConfiguration ) BOOST_REQUIRE_EQUAL(12, AdHoc::PluginManager::getDefault()->getAll().size()); } -class TestRequest : public IHttpRequest { - public: - TestRequest(const Core * c, HttpMethod m, const std::string & p) : - IHttpRequest(c), - method(m) - { - namespace ba = boost::algorithm; - auto path = p.substr(1); - if (!path.empty()) { - ba::split(url, path, ba::is_any_of("/"), ba::token_compress_off); - } - } - - const std::vector & getRequestPath() const override - { - return url; - } - - HttpMethod getRequestMethod() const override - { - return method; - } - - IceUtil::Optional getEnv(const std::string & key) const override - { - return env.find(key) == env.end() ? IceUtil::Optional() : env.find(key)->second; - } - - IceUtil::Optional getQueryStringParam(const std::string & key) const override - { - return qs.find(key) == qs.end() ? IceUtil::Optional() : qs.find(key)->second; - } - - IceUtil::Optional getCookieParam(const std::string & key) const override - { - return cookies.find(key) == cookies.end() ? IceUtil::Optional() : cookies.find(key)->second; - } - - IceUtil::Optional getHeaderParam(const std::string & key) const override - { - return hdr.find(key) == hdr.end() ? IceUtil::Optional() : hdr.find(key)->second; - } - - std::istream & getInputStream() const override - { - return input; - } - - std::ostream & getOutputStream() const override - { - return output; - } - - void response(short statusCode, const std::string & statusMsg) const override - { - getOutputStream() - << "Status: " << statusCode << " " << statusMsg << "\r\n" - << "\r\n"; - } - - void setHeader(const std::string & header, const std::string & value) const override - { - getOutputStream() << header << ": " << value << "\r\n"; - } - - typedef std::map MapVars; - typedef std::vector UrlVars; - UrlVars url; - MapVars qs; - MapVars cookies; - MapVars hdr; - MapVars env; - mutable std::stringstream input; - mutable std::stringstream output; - - const HttpMethod method; -}; - -class CoreWithProps : public CgiCore { +class CoreWithProps : public CoreWithDefaultRouter { public: CoreWithProps() : - CgiCore({ + CoreWithDefaultRouter({ "--Custom.Prop=value" }) { @@ -131,10 +54,10 @@ BOOST_AUTO_TEST_CASE( properties ) BOOST_AUTO_TEST_SUITE_END(); -class CoreWithFileProps : public CgiCore { +class CoreWithFileProps : public CoreWithDefaultRouter { public: CoreWithFileProps() : - CgiCore({ + CoreWithDefaultRouter({ "--IceSpider.Config=config/custom.properties", "--Custom.Prop=value" }) @@ -156,7 +79,7 @@ BOOST_AUTO_TEST_CASE( properties ) BOOST_AUTO_TEST_SUITE_END(); -BOOST_FIXTURE_TEST_SUITE(defaultProps, CgiCore); +BOOST_FIXTURE_TEST_SUITE(defaultProps, CoreWithDefaultRouter); BOOST_AUTO_TEST_CASE( testCoreSettings ) { @@ -240,7 +163,7 @@ class TestSerice : public TestIceSpider::TestApi { } }; -class TestApp : public CgiCore { +class TestApp : public CoreWithDefaultRouter { public: TestApp() : adp(communicator->createObjectAdapterWithEndpoints("test", "default")) @@ -264,22 +187,6 @@ class Dummy : public IceSpider::Plugin, TestIceSpider::DummyPlugin { }; NAMEDFACTORY("DummyPlugin", Dummy, IceSpider::PluginFactory); -typedef std::map Headers; -Headers -parseHeaders(std::istream & strm) -{ - Headers h; - while (true) { - char buf[BUFSIZ], n[BUFSIZ], v[BUFSIZ]; - strm.getline(buf, BUFSIZ); - if (sscanf(buf, "%[^:]: %[^\r]", n, v) != 2) { - break; - } - h[n] = v; - } - return h; -} - BOOST_FIXTURE_TEST_SUITE(ta, TestApp); BOOST_AUTO_TEST_CASE( plugins ) @@ -293,7 +200,7 @@ BOOST_AUTO_TEST_CASE( testCallIndex ) { TestRequest requestGetIndex(this, HttpMethod::GET, "/"); process(&requestGetIndex); - auto h = parseHeaders(requestGetIndex.output); + auto h = requestGetIndex.getResponseHeaders(); BOOST_REQUIRE_EQUAL(h["Status"], "200 OK"); BOOST_REQUIRE_EQUAL(h["Content-Type"], "application/json"); auto v = Slicer::DeserializeAny(requestGetIndex.output); @@ -304,7 +211,7 @@ BOOST_AUTO_TEST_CASE( testCallMashS ) { TestRequest requestGetMashS(this, HttpMethod::GET, "/mashS/something/something/1234"); process(&requestGetMashS); - auto h = parseHeaders(requestGetMashS.output); + auto h = requestGetMashS.getResponseHeaders(); BOOST_REQUIRE_EQUAL(h["Status"], "200 OK"); BOOST_REQUIRE_EQUAL(h["Content-Type"], "application/json"); auto v = Slicer::DeserializeAny(requestGetMashS.output); @@ -316,7 +223,7 @@ BOOST_AUTO_TEST_CASE( testCallMashC ) { TestRequest requestGetMashC(this, HttpMethod::GET, "/mashC/something/something/1234"); process(&requestGetMashC); - auto h = parseHeaders(requestGetMashC.output); + auto h = requestGetMashC.getResponseHeaders(); BOOST_REQUIRE_EQUAL(h["Status"], "200 OK"); BOOST_REQUIRE_EQUAL(h["Content-Type"], "application/json"); auto v = Slicer::DeserializeAny(requestGetMashC.output); @@ -328,7 +235,7 @@ BOOST_AUTO_TEST_CASE( testCallViewSomething1234 ) { TestRequest requestGetItem(this, HttpMethod::GET, "/view/something/1234"); process(&requestGetItem); - auto h = parseHeaders(requestGetItem.output); + auto h = requestGetItem.getResponseHeaders(); BOOST_REQUIRE_EQUAL(h["Status"], "200 OK"); BOOST_REQUIRE_EQUAL(h["Content-Type"], "application/json"); auto v = Slicer::DeserializeAny(requestGetItem.output); @@ -339,7 +246,7 @@ BOOST_AUTO_TEST_CASE( testCallViewSomething1234_ ) { TestRequest requestGetItemGiven(this, HttpMethod::GET, "/item/something/1234"); process(&requestGetItemGiven); - auto h = parseHeaders(requestGetItemGiven.output); + auto h = requestGetItemGiven.getResponseHeaders(); BOOST_REQUIRE_EQUAL(h["Status"], "200 OK"); BOOST_REQUIRE_EQUAL(h["Content-Type"], "application/json"); auto v = Slicer::DeserializeAny(requestGetItemGiven.output); @@ -350,7 +257,7 @@ BOOST_AUTO_TEST_CASE( testCallViewSomething ) { TestRequest requestGetItemDefault(this, HttpMethod::GET, "/item/something"); process(&requestGetItemDefault); - auto h = parseHeaders(requestGetItemDefault.output); + auto h = requestGetItemDefault.getResponseHeaders(); BOOST_REQUIRE_EQUAL(h["Status"], "200 OK"); BOOST_REQUIRE_EQUAL(h["Content-Type"], "application/json"); auto v = Slicer::DeserializeAny(requestGetItemDefault.output); @@ -361,7 +268,7 @@ BOOST_AUTO_TEST_CASE( testCallDeleteSomeValue ) { TestRequest requestDeleteItem(this, HttpMethod::DELETE, "/some value"); process(&requestDeleteItem); - auto h = parseHeaders(requestDeleteItem.output); + auto h = requestDeleteItem.getResponseHeaders(); BOOST_REQUIRE_EQUAL(h["Status"], "200 OK"); requestDeleteItem.output.get(); BOOST_REQUIRE(requestDeleteItem.output.eof()); @@ -373,7 +280,7 @@ BOOST_AUTO_TEST_CASE( testCallPost1234 ) requestUpdateItem.env["CONTENT_TYPE"] = "application/json"; requestUpdateItem.input << "{\"value\": \"some value\"}"; process(&requestUpdateItem); - auto h = parseHeaders(requestUpdateItem.output); + auto h = requestUpdateItem.getResponseHeaders(); BOOST_REQUIRE_EQUAL(h["Status"], "200 OK"); requestUpdateItem.output.get(); BOOST_REQUIRE(requestUpdateItem.output.eof()); @@ -384,7 +291,7 @@ BOOST_AUTO_TEST_CASE( testCallPost1234NoContentType ) TestRequest requestUpdateItem(this, HttpMethod::POST, "/1234"); requestUpdateItem.input << "{\"value\": \"some value\"}"; process(&requestUpdateItem); - auto h = parseHeaders(requestUpdateItem.output); + auto h = requestUpdateItem.getResponseHeaders(); BOOST_REQUIRE_EQUAL(h["Status"], "400 Bad Request"); requestUpdateItem.output.get(); BOOST_REQUIRE(requestUpdateItem.output.eof()); @@ -396,7 +303,7 @@ BOOST_AUTO_TEST_CASE( testCallPost1234UnsupportedMediaType ) requestUpdateItem.env["CONTENT_TYPE"] = "application/notathing"; requestUpdateItem.input << "value=\"some value\""; process(&requestUpdateItem); - auto h = parseHeaders(requestUpdateItem.output); + auto h = requestUpdateItem.getResponseHeaders(); BOOST_REQUIRE_EQUAL(h["Status"], "415 Unsupported Media Type"); requestUpdateItem.output.get(); BOOST_REQUIRE(requestUpdateItem.output.eof()); @@ -407,7 +314,7 @@ BOOST_AUTO_TEST_CASE( testCallIndexAcceptJson ) TestRequest requestJson(this, HttpMethod::GET, "/"); requestJson.hdr["Accept"] = "application/json"; process(&requestJson); - auto h = parseHeaders(requestJson.output); + auto h = requestJson.getResponseHeaders(); BOOST_REQUIRE_EQUAL(h["Status"], "200 OK"); BOOST_REQUIRE_EQUAL(h["Content-Type"], "application/json"); auto v = Slicer::DeserializeAny(requestJson.output); @@ -419,7 +326,7 @@ BOOST_AUTO_TEST_CASE( testCallIndexAcceptAny ) TestRequest requestAnyAny(this, HttpMethod::GET, "/"); requestAnyAny.hdr["Accept"] = "*/*"; process(&requestAnyAny); - auto h = parseHeaders(requestAnyAny.output); + auto h = requestAnyAny.getResponseHeaders(); BOOST_REQUIRE_EQUAL(h["Status"], "200 OK"); auto v = Slicer::DeserializeAny(requestAnyAny.output); BOOST_REQUIRE_EQUAL(v->value, "index"); @@ -430,7 +337,7 @@ BOOST_AUTO_TEST_CASE( testCallIndexAcceptApplicationAny ) TestRequest requestApplicationAny(this, HttpMethod::GET, "/"); requestApplicationAny.hdr["Accept"] = "application/*"; process(&requestApplicationAny); - auto h = parseHeaders(requestApplicationAny.output); + auto h = requestApplicationAny.getResponseHeaders(); BOOST_REQUIRE_EQUAL(h["Status"], "200 OK"); BOOST_REQUIRE(boost::algorithm::starts_with(h["Content-Type"], "application/")); auto v = Slicer::DeserializeAny(requestApplicationAny.output); @@ -442,7 +349,7 @@ BOOST_AUTO_TEST_CASE( testCallIndexAcceptXml ) TestRequest requestXml(this, HttpMethod::GET, "/"); requestXml.hdr["Accept"] = "application/xml"; process(&requestXml); - auto h = parseHeaders(requestXml.output); + auto h = requestXml.getResponseHeaders(); BOOST_REQUIRE_EQUAL(h["Status"], "200 OK"); BOOST_REQUIRE_EQUAL(h["Content-Type"], "application/xml"); auto v = Slicer::DeserializeAny(requestXml.output); @@ -454,7 +361,7 @@ BOOST_AUTO_TEST_CASE( testCallIndexAcceptTextHtml ) TestRequest requestHtml(this, HttpMethod::GET, "/"); requestHtml.hdr["Accept"] = "text/html"; process(&requestHtml); - auto h = parseHeaders(requestHtml.output); + auto h = requestHtml.getResponseHeaders(); BOOST_REQUIRE_EQUAL(h["Status"], "200 OK"); BOOST_REQUIRE_EQUAL(h["Content-Type"], "text/html"); xmlpp::DomParser d; @@ -467,7 +374,7 @@ BOOST_AUTO_TEST_CASE( testCallViewSomethingAcceptHtml ) TestRequest requestHtml(this, HttpMethod::GET, "/view/something/1234"); requestHtml.hdr["Accept"] = "text/html"; process(&requestHtml); - auto h = parseHeaders(requestHtml.output); + auto h = requestHtml.getResponseHeaders(); BOOST_REQUIRE_EQUAL(h["Status"], "406 Not Acceptable"); requestHtml.output.get(); BOOST_REQUIRE(requestHtml.output.eof()); @@ -478,7 +385,7 @@ BOOST_AUTO_TEST_CASE( testCallIndexAcceptNotSupported ) TestRequest requestBadAccept(this, HttpMethod::GET, "/"); requestBadAccept.hdr["Accept"] = "not/supported"; process(&requestBadAccept); - auto h = parseHeaders(requestBadAccept.output); + auto h = requestBadAccept.getResponseHeaders(); BOOST_REQUIRE_EQUAL(h["Status"], "406 Not Acceptable"); requestBadAccept.output.get(); BOOST_REQUIRE(requestBadAccept.output.eof()); @@ -489,7 +396,7 @@ BOOST_AUTO_TEST_CASE( testCallIndexComplexAccept ) TestRequest requestChoice(this, HttpMethod::GET, "/"); requestChoice.hdr["Accept"] = "something/special ; q = 20, application/json, application/xml;q=1.1"; process(&requestChoice); - auto h = parseHeaders(requestChoice.output); + auto h = requestChoice.getResponseHeaders(); BOOST_REQUIRE_EQUAL(h["Status"], "200 OK"); BOOST_REQUIRE_EQUAL(h["Content-Type"], "application/xml"); auto v = Slicer::DeserializeAny(requestChoice.output); @@ -500,7 +407,7 @@ BOOST_AUTO_TEST_CASE( testCall404 ) { TestRequest requestGetIndex(this, HttpMethod::GET, "/this/404"); process(&requestGetIndex); - auto h = parseHeaders(requestGetIndex.output); + auto h = requestGetIndex.getResponseHeaders(); BOOST_REQUIRE_EQUAL(h["Status"], "404 Not found"); requestGetIndex.output.get(); BOOST_REQUIRE(requestGetIndex.output.eof()); @@ -510,7 +417,7 @@ BOOST_AUTO_TEST_CASE( testCall405 ) { TestRequest requestGetIndex(this, HttpMethod::GET, "/405"); process(&requestGetIndex); - auto h = parseHeaders(requestGetIndex.output); + auto h = requestGetIndex.getResponseHeaders(); BOOST_REQUIRE_EQUAL(h["Status"], "405 Method Not Allowed"); requestGetIndex.output.get(); BOOST_REQUIRE(requestGetIndex.output.eof()); @@ -522,7 +429,7 @@ BOOST_AUTO_TEST_CASE( testCallSearch ) request.qs["s"] = "something"; request.qs["i"] = "1234"; process(&request); - auto h = parseHeaders(request.output); + auto h = request.getResponseHeaders(); BOOST_REQUIRE_EQUAL(h["Status"], "200 OK"); Slicer::DeserializeAny(request.output); } @@ -533,7 +440,7 @@ BOOST_AUTO_TEST_CASE( testCallSearchBadLexicalCast ) request.qs["s"] = "something"; request.qs["i"] = "bar"; process(&request); - auto h = parseHeaders(request.output); + auto h = request.getResponseHeaders(); BOOST_REQUIRE_EQUAL(h["Status"], "400 Bad Request"); request.output.get(); BOOST_REQUIRE(request.output.eof()); @@ -544,7 +451,7 @@ BOOST_AUTO_TEST_CASE( testCallSearchMissingS ) TestRequest request(this, HttpMethod::GET, "/search"); request.qs["i"] = "1234"; process(&request); - auto h = parseHeaders(request.output); + auto h = request.getResponseHeaders(); BOOST_REQUIRE_EQUAL(h["Status"], "400 Bad Request"); request.output.get(); BOOST_REQUIRE(request.output.eof()); @@ -555,7 +462,7 @@ BOOST_AUTO_TEST_CASE( testCallSearchMissingI ) TestRequest request(this, HttpMethod::GET, "/search"); request.qs["s"] = "something"; process(&request); - auto h = parseHeaders(request.output); + auto h = request.getResponseHeaders(); BOOST_REQUIRE_EQUAL(h["Status"], "400 Bad Request"); request.output.get(); BOOST_REQUIRE(request.output.eof()); @@ -567,7 +474,7 @@ BOOST_AUTO_TEST_CASE( testCookies ) request.cookies["mycookievar"] = "something"; request.qs["i"] = "1234"; process(&request); - auto h = parseHeaders(request.output); + auto h = request.getResponseHeaders(); BOOST_REQUIRE_EQUAL(h["Status"], "200 OK"); } diff --git a/icespider/unittests/testFcgi.cpp b/icespider/unittests/testFcgi.cpp index 2db9bcf..ae4f1cf 100644 --- a/icespider/unittests/testFcgi.cpp +++ b/icespider/unittests/testFcgi.cpp @@ -1,7 +1,7 @@ #define BOOST_TEST_MODULE TestApp #include -#include +#include #include #include #include @@ -87,7 +87,7 @@ namespace std { // LCOV_EXCL_STOP } -BOOST_FIXTURE_TEST_SUITE( CgiRequestBase, IceSpider::CgiCore ); +BOOST_FIXTURE_TEST_SUITE( CgiRequestBase, IceSpider::CoreWithDefaultRouter ); BOOST_AUTO_TEST_CASE( NoEnvironment ) { diff --git a/icespider/unittests/testFileSessions.cpp b/icespider/unittests/testFileSessions.cpp index 37e6587..c632a34 100644 --- a/icespider/unittests/testFileSessions.cpp +++ b/icespider/unittests/testFileSessions.cpp @@ -9,10 +9,10 @@ BOOST_TEST_DONT_PRINT_LOG_VALUE(IceSpider::StringMap); -class TestCore : public IceSpider::Core { +class TestCore : public IceSpider::CoreWithDefaultRouter { public: TestCore() : - IceSpider::Core({ + IceSpider::CoreWithDefaultRouter({ "--IceSpider.SessionManager=IceSpider-FileSessions", "--IceSpider.FileSessions.Path=" + (binDir / "test-sessions").string(), "--IceSpider.FileSessions.Duration=0" -- cgit v1.2.3