diff options
| -rw-r--r-- | icespider/Jamfile.jam | 2 | ||||
| -rw-r--r-- | icespider/core/core.cpp | 54 | ||||
| -rw-r--r-- | icespider/core/core.h | 15 | ||||
| -rw-r--r-- | icespider/fcgi/cgiCore.cpp | 51 | ||||
| -rw-r--r-- | icespider/fcgi/cgiCore.h | 21 | ||||
| -rw-r--r-- | icespider/fcgi/main.cpp | 4 | ||||
| -rw-r--r-- | icespider/testing/Jamfile.jam | 8 | ||||
| -rw-r--r-- | icespider/testing/testRequest.cpp | 95 | ||||
| -rw-r--r-- | icespider/testing/testRequest.h | 43 | ||||
| -rw-r--r-- | icespider/unittests/Jamfile.jam | 4 | ||||
| -rw-r--r-- | icespider/unittests/testApp.cpp | 159 | ||||
| -rw-r--r-- | icespider/unittests/testFcgi.cpp | 4 | ||||
| -rw-r--r-- | icespider/unittests/testFileSessions.cpp | 4 | 
13 files changed, 250 insertions, 214 deletions
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<const IRouteHandler *> LengthRoutes; +			typedef std::vector<LengthRoutes> 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<Plugin, Ice::CommunicatorPtr, Ice::PropertiesPtr> 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 <core.h> - -namespace IceSpider { -	class CgiCore : public Core { -		public: -			typedef std::vector<const IRouteHandler *> LengthRoutes; -			typedef std::vector<LengthRoutes> 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 <visibility.h>  #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 ] +	: +	<library>..//core +	: : +	<library>..//core +	<include>. +	; 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 <boost/algorithm/string/split.hpp> +#include <boost/algorithm/string/classification.hpp> + +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<std::string> & +	TestRequest::getRequestPath() const +	{ +		return url; +	} + +	HttpMethod +	TestRequest::getRequestMethod() const +	{ +		return method; +	} + +	IceUtil::Optional<std::string> +	TestRequest::getEnv(const std::string & key) const +	{ +		return env.find(key) == env.end() ? IceUtil::Optional<std::string>() : env.find(key)->second; +	} + +	IceUtil::Optional<std::string> +	TestRequest::getQueryStringParam(const std::string & key) const +	{ +		return qs.find(key) == qs.end() ? IceUtil::Optional<std::string>() : qs.find(key)->second; +	} + +	IceUtil::Optional<std::string> +	TestRequest::getCookieParam(const std::string & key) const +	{ +		return cookies.find(key) == cookies.end() ? IceUtil::Optional<std::string>() : cookies.find(key)->second; +	} + +	IceUtil::Optional<std::string> +	TestRequest::getHeaderParam(const std::string & key) const +	{ +		return hdr.find(key) == hdr.end() ? IceUtil::Optional<std::string>() : 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 <ihttpRequest.h> +#include <visibility.h> + +namespace IceSpider { +	class DLL_PUBLIC TestRequest : public IHttpRequest { +		public: +			typedef std::map<std::string, std::string> MapVars; +			typedef std::vector<std::string> UrlVars; + +			TestRequest(const Core * c, HttpMethod m, const std::string & p); + +			const std::vector<std::string> & getRequestPath() const override; +			HttpMethod getRequestMethod() const override; +			IceUtil::Optional<std::string> getEnv(const std::string & key) const override; +			IceUtil::Optional<std::string> getQueryStringParam(const std::string & key) const override; +			IceUtil::Optional<std::string> getCookieParam(const std::string & key) const override; +			IceUtil::Optional<std::string> 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  	<library>../common//icespider-common  	<library>../core//icespider-core  	<library>../xslt//icespider-xslt +	<library>../testing//icespider-testing  	<implicit-dependency>../common//icespider-common  	<implicit-dependency>test-api  	<dependency>../compile  	<include>. -	<include>../fcgi  	: testApp ;  run  	testFcgi.cpp  	test-fcgi.ice  	../fcgi/cgiRequestBase.cpp -	../fcgi/cgiCore.cpp  	: : :  	<slicer>yes  	<define>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 <safeMapFind.h>  #include <irouteHandler.h> -#include <cgiCore.h> +#include <core.h>  #include <exceptions.h>  #include <test-api.h>  #include <Ice/ObjectAdapter.h> @@ -17,6 +17,7 @@  #include <json/serializer.h>  #include <libxml++/parsers/domparser.h>  #include <factory.impl.h> +#include <testRequest.h>  using namespace IceSpider; @@ -31,88 +32,10 @@ BOOST_AUTO_TEST_CASE( testLoadConfiguration )  	BOOST_REQUIRE_EQUAL(12, AdHoc::PluginManager::getDefault()->getAll<IceSpider::RouteHandlerFactory>().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<std::string> & getRequestPath() const override -		{ -			return url; -		} - -		HttpMethod getRequestMethod() const override -		{ -			return method; -		} - -		IceUtil::Optional<std::string> getEnv(const std::string & key) const override -		{ -			return env.find(key) == env.end() ? IceUtil::Optional<std::string>() : env.find(key)->second; -		} - -		IceUtil::Optional<std::string> getQueryStringParam(const std::string & key) const override -		{ -			return qs.find(key) == qs.end() ? IceUtil::Optional<std::string>() : qs.find(key)->second; -		} - -		IceUtil::Optional<std::string> getCookieParam(const std::string & key) const override -		{ -			return cookies.find(key) == cookies.end() ? IceUtil::Optional<std::string>() : cookies.find(key)->second; -		} - -		IceUtil::Optional<std::string> getHeaderParam(const std::string & key) const override -		{ -			return hdr.find(key) == hdr.end() ? IceUtil::Optional<std::string>() : 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<std::string, std::string> MapVars; -		typedef std::vector<std::string> 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<std::string, std::string> 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<Slicer::JsonStreamDeserializer, TestIceSpider::SomeModelPtr>(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<Slicer::JsonStreamDeserializer, TestIceSpider::Mash1>(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<Slicer::JsonStreamDeserializer, TestIceSpider::Mash2Ptr>(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<Slicer::JsonStreamDeserializer, TestIceSpider::SomeModelPtr>(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<Slicer::JsonStreamDeserializer, TestIceSpider::SomeModelPtr>(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<Slicer::JsonStreamDeserializer, TestIceSpider::SomeModelPtr>(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<Slicer::JsonStreamDeserializer, TestIceSpider::SomeModelPtr>(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<Slicer::JsonStreamDeserializer, TestIceSpider::SomeModelPtr>(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<Slicer::JsonStreamDeserializer, TestIceSpider::SomeModelPtr>(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<Slicer::XmlStreamDeserializer, TestIceSpider::SomeModelPtr>(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<Slicer::XmlStreamDeserializer, TestIceSpider::SomeModelPtr>(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<Slicer::JsonStreamDeserializer, TestIceSpider::SomeModelPtr>(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 <boost/test/unit_test.hpp> -#include <cgiCore.h> +#include <core.h>  #include <definedDirs.h>  #include <cgiRequestBase.h>  #include <test-fcgi.h> @@ -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"  | 
