From cbe059df8be44ebaa25a3c4ce24e1be6b1c44883 Mon Sep 17 00:00:00 2001 From: oneiric Date: Sun, 18 Mar 2018 02:10:53 +0000 Subject: [PATCH] Tests: resolve HTTP Proxy unit-test TODOs Refs #835 + #838 --- tests/unit_tests/client/proxy/http.cc | 166 +++++++++++++++++++------- 1 file changed, 120 insertions(+), 46 deletions(-) diff --git a/tests/unit_tests/client/proxy/http.cc b/tests/unit_tests/client/proxy/http.cc index e50191fe..37d9736a 100644 --- a/tests/unit_tests/client/proxy/http.cc +++ b/tests/unit_tests/client/proxy/http.cc @@ -40,55 +40,97 @@ struct HTTPProxyRequestFixture class HTTPMessage { public: + HTTPMessage() : m_Request("") {}; + explicit HTTPMessage(const std::string& request) : m_Request(request) { m_Request.append("GET " + request + " HTTP/1.1\r\n\r\n"); - // TODO(unassigned): message class should have private handlers. This would be useful within its ctor. - if (!m_Message.HandleData(m_Request)) - throw std::runtime_error("HTTPMessage: invalid request"); + HandleData(); + } + + bool HandleData(const std::string& request) + { + return m_Message.HandleData(request); + } + + bool ExtractIncomingRequest() + { + return m_Message.ExtractIncomingRequest(); + } + + bool HandleJumpService() + { + return m_Message.HandleJumpService(); + } + + bool CreateHTTPRequest() + { + return m_Message.CreateHTTPRequest(); } - // TODO(unassigned): message API needs a proper interface - kovri::client::HTTPMessage& get() + bool IsJumpServiceRequest() { - return m_Message; + return m_Message.IsJumpServiceRequest(); } + bool ExtractBase64Destination() + { + return m_Message.ExtractBase64Destination(); + } + + bool SaveJumpServiceAddress() + { + return m_Message.SaveJumpServiceAddress(); + } private: + void HandleData() + { + if (!m_Message.HandleData(m_Request)) + throw std::runtime_error("HTTPMessage: invalid request"); + } + std::string m_Request; - // TODO(unassigned): message API needs a proper ctor + // TODO(oneiric): message API needs a proper ctor kovri::client::HTTPMessage m_Message; }; // Valid web-safe destination - std::string const valid_dest = "0UVPqAA4xUSfPYPBca24h8fdokhwcJZ-5OsBYvK7byXtXT~fOV2pExi8vrkgarGTNDfJbB2KCsdVS3V7qwtTvoCGYyklcDBlJsWMj7H763hEz5rt9SzLkcpwhOjXL1UB-QW8KxM30t-ZOfPc6OiJ1QpnE6Bo5OUm6jPurQGXdWCAPio5Z-YnRL46n0IHWOQPYYSSt-S75rMIKbZbEMDraRvSzYAphUaHfvtWr2rCSPkKh3EbrOiBYiAP2oWvAQCsjouPgVBbiAezHedM2gXzkgIyCV2kGOOcHhiihd~7fWwJOloH-gO78QkmCuY-3kp3633v3MB-XNKWnATZOuf2syWVBZbTnOXsWf41tu6a33HOuNsMxAOUrwbu7Q-EITwNlKN6~yZm4RKsJUsBGfVtKl8PBMak3flQAg95oV0OBDGuizIQ9vREOWvPGlQCAXZzEg~cUNbfBQAEAAcAAA%3D%3D"; + std::string const valid_dest = "BDjEtdR5pId1dTP0byigcsqNajxqlk1aHVuE~02pWXRhk3boPpys8VAf5qy~0dpvp-LJxKE95~vmmoq4-KfQyhX~uSVADWJ8K071UHjqW3KBzJOPYl5lxI7G-QGazuYDfwXF87o0LuA8HIy5~NylBSJ3qLk~wZPBxVrWbNRyH6iAFuNM4hF9YWuYpa3UWnbxtpjLccMiMYU~ao4w3wpwAMln-e1NYNXcpDJKCaYjLqkov32mRrUDYue78GMNTZooRij4Iwwlpt4HX6r8cwSznBBy78EGw4pEwTHBlA3i05m3Y7cCB1LKbtbepdnMGCSTLvOycbPVba8qekzHSjoHYWzoRF-0tALWAL5w~~9sSOD2YTph-4b7qleccnS1mneNkQR6-Z8rCDVS5hIWJoc6yCMTzuFnQnGRglhYCuwLtkwB5EcOHHYPpbp0CRuaajBbqnQLitKvGXssxLvgPMRGYYFk4qFxMshNoO3I4Qj-SZtIk4JwzJQm4e5rVSkgyZ0mBQAEAAcAAA%3D%3D"; + // Valid, unique web-safe subscription + std::string const unique_dest = "G8O8giyRQK80mr-belRjV5y9mY02MO6WJOnFotV-WMglROY-i2yCuUixwYNtD9RM7lSiJUvrTDFMd-1Kcn4IWH-I9hgSLsHR3JP77cgwk3i94MIiEHRNL6-~D9H32MDExmXOd-2SPtb-A~g9hqvXl2n6Ysloy2meAGUUZjXC-dz9MquzLceCEH3vlgLvZMc6dBNUWpvjFtWlAOO~beNOfVWnnOkfrTpoWAP9JKsBgE6q856W-qA9Xi6-9Wi4EZVXTus-lyTtVuTJ4PCMT8oXixlCkWIy2cRFCQiJ73ICmYWqJkKOb8ovJ1JtWySW8sXUTtFjsPF-V~SLzB-2jv6nKnGMisE6dljD0gWRkfsp3lpOjYqVf8oKo5d5uhXR0GB8dzea1OqsTs1kCMqwac10~Rz~PMl7Mbd8MN1gg16aQdenoogt6mTGrPxiAbbNmXeTa7~v7PAVezP0hoQTrCYN1TYO~cH24ekk35Sv8esB2HrmaO9rFBVjHI5ufCgWuDY8BQAEAAcAAA%3D%3D"; }; -BOOST_AUTO_TEST_SUITE(HTTPMessageHeader) +BOOST_FIXTURE_TEST_SUITE(HTTPMessageHeader, HTTPProxyRequestFixture) BOOST_AUTO_TEST_CASE(Short) { - kovri::client::HTTPMessage tmp; - BOOST_CHECK(!tmp.HandleData("GET kovri.i2p HTTP/1.1")); + HTTPMessage message; + BOOST_CHECK(!message.HandleData("GET kovri.i2p HTTP/1.1")); } BOOST_AUTO_TEST_CASE(MissingRequest) { - kovri::client::HTTPMessage tmp; - BOOST_CHECK(!tmp.HandleData("GET HTTP/1.1")); + HTTPMessage message; + BOOST_CHECK(!message.HandleData("GET HTTP/1.1")); } BOOST_AUTO_TEST_CASE(MissingHeaders) { - kovri::client::HTTPMessage tmp; - BOOST_CHECK(!tmp.HandleData("\r\n")); + HTTPMessage message; + BOOST_CHECK(!message.HandleData("\r\n")); } BOOST_AUTO_TEST_CASE(Valid) { - kovri::client::HTTPMessage tmp; - BOOST_CHECK( - tmp.HandleData("GET kovri.i2p HTTP/1.1\r\nUser-Agent: dummy\r\n\r\n")); + HTTPMessage message; + BOOST_CHECK(message.HandleData("GET kovri.i2p HTTP/1.1\r\nUser-Agent: dummy\r\n\r\n")); +} + +BOOST_AUTO_TEST_CASE(InvalidHTTP) +{ + HTTPMessage message; + BOOST_CHECK(message.HandleData("GET kovri.i2p HTTP/1.9\r\n\r\n")); + BOOST_CHECK(!message.ExtractIncomingRequest()); } BOOST_AUTO_TEST_SUITE_END() @@ -103,81 +145,102 @@ BOOST_FIXTURE_TEST_SUITE(JumpServiceHandler, HTTPProxyRequestFixture) BOOST_AUTO_TEST_CASE(Valid) { - std::string const request("stats.i2p?i2paddresshelper=" + valid_dest); + std::string const request("valid.i2p?i2paddresshelper=" + valid_dest); + BOOST_CHECK_NO_THROW(HTTPMessage message(request)); + + HTTPMessage message(request); + BOOST_CHECK(message.HandleJumpService()); +} + +BOOST_AUTO_TEST_CASE(SaveValid) +{ + std::string const request("valid.i2p?i2paddresshelper=" + valid_dest); BOOST_CHECK_NO_THROW(HTTPMessage message(request)); HTTPMessage message(request); - BOOST_CHECK(message.get().HandleJumpService()); + BOOST_CHECK(message.HandleJumpService()); + BOOST_CHECK(message.SaveJumpServiceAddress()); } BOOST_AUTO_TEST_CASE(WithURIQuery) { std::string const request( - "stats.i2p?some=key&i2paddresshelper=" + valid_dest); + "invalid.i2p?some=key&i2paddresshelper=" + valid_dest); BOOST_CHECK_NO_THROW(HTTPMessage message(request)); HTTPMessage message(request); - BOOST_CHECK(message.get().HandleJumpService()); + // Jump service only supports one query parameter + BOOST_CHECK(!message.IsJumpServiceRequest()); + BOOST_CHECK(!message.HandleJumpService()); } BOOST_AUTO_TEST_CASE(InvalidDest) { - std::string const request( - "stats.i2p?i2paddresshelper=someinvalidbase64&i2paddresshelper=" - + valid_dest); + std::string const request("invalid.i2p?i2paddresshelper=someinvalidbase64"); BOOST_CHECK_NO_THROW(HTTPMessage message(request)); HTTPMessage message(request); - // TODO(unassigned): if this is an invalid test-case, then check false - BOOST_CHECK(message.get().HandleJumpService()); + BOOST_CHECK(!message.ExtractBase64Destination()); + BOOST_CHECK(!message.HandleJumpService()); + BOOST_CHECK(!message.SaveJumpServiceAddress()); } BOOST_AUTO_TEST_CASE(InvalidDestWithURIQuery) { std::string const request( - "stats.i2p?some=key&i2paddresshelper=someinvalidbase64?i2paddresshelper=" + "invalid.i2p?some=key&i2paddresshelper=someinvalidbase64?i2paddresshelper=" + valid_dest); BOOST_CHECK_NO_THROW(HTTPMessage message(request)); HTTPMessage message(request); - // TODO(unassigned): if this is an invalid test-case, then check false - BOOST_CHECK(message.get().HandleJumpService()); + BOOST_CHECK(!message.IsJumpServiceRequest()); + BOOST_CHECK(!message.ExtractBase64Destination()); + BOOST_CHECK(!message.HandleJumpService()); + BOOST_CHECK(!message.SaveJumpServiceAddress()); } BOOST_AUTO_TEST_CASE(InvalidHelper) { - std::string const request("stats.i2p?invalid=" + valid_dest); + std::string const request("invalid.i2p?invalid=" + valid_dest); BOOST_CHECK_NO_THROW(HTTPMessage message(request)); HTTPMessage message(request); - BOOST_CHECK(!message.get().HandleJumpService()); + BOOST_CHECK(!message.IsJumpServiceRequest()); + BOOST_CHECK(!message.HandleJumpService()); + BOOST_CHECK(!message.SaveJumpServiceAddress()); } BOOST_AUTO_TEST_CASE(InvalidHelperWithURIQuery) { - std::string const request("stats.i2p?some=key&invalid=" + valid_dest); + std::string const request("invalid.i2p?some=key&invalid=" + valid_dest); BOOST_CHECK_NO_THROW(HTTPMessage message(request)); HTTPMessage message(request); - BOOST_CHECK(!message.get().HandleJumpService()); + BOOST_CHECK(!message.IsJumpServiceRequest()); + BOOST_CHECK(!message.HandleJumpService()); + BOOST_CHECK(!message.SaveJumpServiceAddress()); } BOOST_AUTO_TEST_CASE(NoHelper) { - std::string const request("stats.i2p"); + std::string const request("invalid.i2p"); BOOST_CHECK_NO_THROW(HTTPMessage message(request)); HTTPMessage message(request); - BOOST_CHECK(!message.get().HandleJumpService()); + BOOST_CHECK(!message.IsJumpServiceRequest()); + BOOST_CHECK(!message.HandleJumpService()); + BOOST_CHECK(!message.SaveJumpServiceAddress()); } BOOST_AUTO_TEST_CASE(NoDest) { - std::string const request("stats.i2p?i2paddresshelper="); + std::string const request("invalid.i2p?i2paddresshelper="); BOOST_CHECK_NO_THROW(HTTPMessage message(request)); HTTPMessage message(request); - BOOST_CHECK(!message.get().HandleJumpService()); + BOOST_CHECK(!message.ExtractBase64Destination()); + BOOST_CHECK(!message.HandleJumpService()); + BOOST_CHECK(!message.SaveJumpServiceAddress()); } BOOST_AUTO_TEST_SUITE_END() @@ -192,30 +255,41 @@ BOOST_FIXTURE_TEST_SUITE(CreateHTTPRequest, HTTPProxyRequestFixture) BOOST_AUTO_TEST_CASE(ValidHelper) { - std::string const request("stats.i2p?i2paddresshelper=" + valid_dest); + std::string const request("valid-unique.i2p?i2paddresshelper=" + unique_dest); BOOST_CHECK_NO_THROW(HTTPMessage message(request)); HTTPMessage message(request); - BOOST_CHECK(message.get().CreateHTTPRequest(false)); + BOOST_CHECK(message.CreateHTTPRequest()); } -BOOST_AUTO_TEST_CASE(InvalidHelper) +BOOST_AUTO_TEST_CASE(ValidRequestNoJumpService) { - std::string const request("stats.i2p?invalid=" + valid_dest); + std::string const request("valid.i2p"); BOOST_CHECK_NO_THROW(HTTPMessage message(request)); HTTPMessage message(request); - // TODO(unassigned): if this is an invalid test-case, then check false - BOOST_CHECK(message.get().CreateHTTPRequest(false)); + BOOST_CHECK(!message.HandleJumpService()); + BOOST_CHECK(message.CreateHTTPRequest()); } BOOST_AUTO_TEST_CASE(NoDest) { - std::string const request("stats.i2p?i2paddresshelper="); + std::string const request("invalid.i2p?i2paddresshelper="); + BOOST_CHECK_NO_THROW(HTTPMessage message(request)); + + HTTPMessage message(request); + BOOST_CHECK(!message.HandleJumpService()); + BOOST_CHECK(message.CreateHTTPRequest()); +} + +BOOST_AUTO_TEST_CASE(InvalidDest) +{ + std::string const request("invalid.i2p?i2paddresshelper=invalidbase64"); BOOST_CHECK_NO_THROW(HTTPMessage message(request)); HTTPMessage message(request); - BOOST_CHECK(!message.get().CreateHTTPRequest(false)); + BOOST_CHECK(!message.HandleJumpService()); + BOOST_CHECK(message.CreateHTTPRequest()); } BOOST_AUTO_TEST_SUITE_END()