diff options
| -rw-r--r-- | icespider/fcgi/cgiRequestBase.cpp | 4 | ||||
| -rw-r--r-- | icespider/fcgi/cgiRequestBase.h | 2 | ||||
| -rw-r--r-- | icespider/unittests/Jamfile.jam | 12 | ||||
| -rw-r--r-- | icespider/unittests/testFcgi.cpp | 152 | 
4 files changed, 161 insertions, 9 deletions
| diff --git a/icespider/fcgi/cgiRequestBase.cpp b/icespider/fcgi/cgiRequestBase.cpp index b818285..922ba9a 100644 --- a/icespider/fcgi/cgiRequestBase.cpp +++ b/icespider/fcgi/cgiRequestBase.cpp @@ -43,14 +43,12 @@ namespace IceSpider {  			while (start < end) {  				auto amp = orelse(strchr(start, '&'), end);  				auto eq = orelse(strchr(start, '='), end); +				*amp = '\0';  				if (eq < amp) {  					*eq = '\0'; -					*amp = '\0';  					qsmap.insert({ start, Env( eq + 1, amp ) });  				}  				else { -					*eq = '\0'; -					*amp = '\0';  					qsmap.insert({ start, Env( eq + 1, eq + 1 ) });  				}  				start = amp + 1; diff --git a/icespider/fcgi/cgiRequestBase.h b/icespider/fcgi/cgiRequestBase.h index b8dcd1f..cc67407 100644 --- a/icespider/fcgi/cgiRequestBase.h +++ b/icespider/fcgi/cgiRequestBase.h @@ -20,11 +20,13 @@ namespace IceSpider {  			void addenv(char *);  			void initialize(); +		public:  			const PathElements & getRequestPath() const override;  			HttpMethod getRequestMethod() const override;  			OptionalString getQueryStringParam(const std::string & key) const override;  			OptionalString getHeaderParam(const std::string & key) const override; +		private:  			static OptionalString optionalLookup(const std::string & key, const VarMap &);  			VarMap envmap; diff --git a/icespider/unittests/Jamfile.jam b/icespider/unittests/Jamfile.jam index 05fecb4..3ce12f0 100644 --- a/icespider/unittests/Jamfile.jam +++ b/icespider/unittests/Jamfile.jam @@ -22,6 +22,7 @@ lib slicer : : : : <include>/usr/include/slicer ;  lib slicer-json : : : : <include>/usr/include/slicer ;  lib slicer-xml : : : : <include>/usr/include/slicer ;  lib boost_utf : : <name>boost_unit_test_framework ; +lib boost_system ;  lib dl ;  path-constant me : . ; @@ -79,13 +80,14 @@ run  run  	testFcgi.cpp -	: -	'QUERY_STRING=noeq&noval=&someval=here&another=here' -	'REDIRECT_URL=/' -	: : +	../fcgi/cgiRequestBase.cpp +	: : : +	<define>BOOST_TEST_DYN_LINK +	<library>testCommon  	<library>../common//icespider-common  	<library>../core//icespider-core -	<library>../fcgi//icespider-fcgi +	<library>boost_system +	<include>../fcgi  	: testFcgi ;  lib test-api : diff --git a/icespider/unittests/testFcgi.cpp b/icespider/unittests/testFcgi.cpp index 65e2cc3..a717c4d 100644 --- a/icespider/unittests/testFcgi.cpp +++ b/icespider/unittests/testFcgi.cpp @@ -1 +1,151 @@ -// intentionally blank +#define BOOST_TEST_MODULE TestApp +#include <boost/test/unit_test.hpp> + +#include <core.h> +#include <cgiRequestBase.h> + +class TestRequest : public IceSpider::CgiRequestBase { +	public: +		TestRequest(IceSpider::Core * c, char ** env) : IceSpider::CgiRequestBase(c, env) +		{ +			initialize(); +		} + +		std::ostream & getOutputStream() const override +		{ +			return std::cout; +		} + +		std::istream & getInputStream() const override +		{ +			return std::cin; +		} +}; + +class CharPtrPtrArray : public std::vector<char *> { +	public: +		CharPtrPtrArray() +		{ +			push_back(NULL); +		} + +		CharPtrPtrArray(const std::vector<std::string> & a) +		{ +			for (const auto & e : a) { +				push_back(strdup(e.c_str())); +			} +			push_back(NULL); +		} + +		~CharPtrPtrArray() +		{ +			for (const auto & e : *this) { +				free(e); +			} +		} + +		operator char **() +		{ +			return &front(); +		} +}; + +namespace std { +	static +	std::ostream & +	operator<<(std::ostream & s, const IceSpider::PathElements & pe) +	{ +		for (const auto & e : pe) { +			s << "/" << e; +		} +		return s; +	} +} + +BOOST_FIXTURE_TEST_SUITE( CgiRequestBase, IceSpider::Core ); + +BOOST_AUTO_TEST_CASE( NoEnvironment ) +{ +	BOOST_REQUIRE_THROW({ +		CharPtrPtrArray env; +		TestRequest r(this, env); +	}, std::runtime_error); +} + +BOOST_AUTO_TEST_CASE( script_name_root ) +{ +	CharPtrPtrArray env ({ "SCRIPT_NAME=/" }); +	TestRequest r(this, env); +	BOOST_REQUIRE(r.getRequestPath().empty()); +} + +BOOST_AUTO_TEST_CASE( redirect_uri_root ) +{ +	CharPtrPtrArray env ({ "REDIRECT_URL=/" }); +	TestRequest r(this, env); +	BOOST_REQUIRE(r.getRequestPath().empty()); +} + +BOOST_AUTO_TEST_CASE( script_name_foobar ) +{ +	CharPtrPtrArray env ({ "SCRIPT_NAME=/foo/bar" }); +	TestRequest r(this, env); +	BOOST_REQUIRE_EQUAL(IceSpider::PathElements({"foo", "bar"}), r.getRequestPath()); +} + +BOOST_AUTO_TEST_CASE( query_string_empty ) +{ +	CharPtrPtrArray env ({ "SCRIPT_NAME=/foo/bar", "QUERY_STRING=" }); +	TestRequest r(this, env); +	BOOST_REQUIRE(!r.getQueryStringParam("")); +} + +BOOST_AUTO_TEST_CASE( query_string_one ) +{ +	CharPtrPtrArray env ({ "SCRIPT_NAME=/foo/bar", "QUERY_STRING=one=1" }); +	TestRequest r(this, env); +	BOOST_REQUIRE(!r.getQueryStringParam("")); +	BOOST_REQUIRE_EQUAL("1", *r.getQueryStringParam("one")); +} + +BOOST_AUTO_TEST_CASE( query_string_two ) +{ +	CharPtrPtrArray env ({ "SCRIPT_NAME=/foo/bar", "QUERY_STRING=one=1&two=2" }); +	TestRequest r(this, env); +	BOOST_REQUIRE(!r.getQueryStringParam("")); +	BOOST_REQUIRE_EQUAL("1", *r.getQueryStringParam("one")); +	BOOST_REQUIRE_EQUAL("2", *r.getQueryStringParam("two")); +} + +BOOST_AUTO_TEST_CASE( query_string_three ) +{ +	CharPtrPtrArray env ({ "SCRIPT_NAME=/foo/bar", "QUERY_STRING=one=1&two=2&three=3" }); +	TestRequest r(this, env); +	BOOST_REQUIRE(!r.getQueryStringParam("")); +	BOOST_REQUIRE_EQUAL("1", *r.getQueryStringParam("one")); +	BOOST_REQUIRE_EQUAL("2", *r.getQueryStringParam("two")); +	BOOST_REQUIRE_EQUAL("3", *r.getQueryStringParam("three")); +} + +BOOST_AUTO_TEST_CASE( query_string_three_emptyVal ) +{ +	CharPtrPtrArray env ({ "SCRIPT_NAME=/foo/bar", "QUERY_STRING=one=1&two=&three=3" }); +	TestRequest r(this, env); +	BOOST_REQUIRE(!r.getQueryStringParam("")); +	BOOST_REQUIRE_EQUAL("1", *r.getQueryStringParam("one")); +	BOOST_REQUIRE_EQUAL("", *r.getQueryStringParam("two")); +	BOOST_REQUIRE_EQUAL("3", *r.getQueryStringParam("three")); +} + +BOOST_AUTO_TEST_CASE( query_string_three_noVal ) +{ +	CharPtrPtrArray env ({ "SCRIPT_NAME=/foo/bar", "QUERY_STRING=one=1&two&three=3" }); +	TestRequest r(this, env); +	BOOST_REQUIRE(!r.getQueryStringParam("")); +	BOOST_REQUIRE_EQUAL("1", *r.getQueryStringParam("one")); +	BOOST_REQUIRE_EQUAL("", *r.getQueryStringParam("two")); +	BOOST_REQUIRE_EQUAL("3", *r.getQueryStringParam("three")); +} + +BOOST_AUTO_TEST_SUITE_END(); + | 
