Skip to content

Commit

Permalink
Tests: resolve HTTP Proxy unit-test TODOs
Browse files Browse the repository at this point in the history
  • Loading branch information
coneiric committed Mar 20, 2018
1 parent dee8b7a commit cbe059d
Showing 1 changed file with 120 additions and 46 deletions.
166 changes: 120 additions & 46 deletions tests/unit_tests/client/proxy/http.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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()
Expand All @@ -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()

0 comments on commit cbe059d

Please sign in to comment.