1
0
cuberite-2a/tests/HTTP/UrlClientTest.cpp

256 lines
4.3 KiB
C++
Raw Normal View History

2016-08-22 13:49:33 -04:00
#include "Globals.h"
#include "HTTP/UrlClient.h"
#include "OSSupport/NetworkSingleton.h"
namespace
{
/** Track number of cCallbacks instances alive. */
std::atomic<int> g_ActiveCallbacks{ 0 };
2016-08-22 13:49:33 -04:00
2016-08-22 13:53:34 -04:00
/** Simple callbacks that dump the events to the console and signalize a cEvent when the request is finished. */
2016-08-22 13:49:33 -04:00
class cCallbacks:
public cUrlClient::cCallbacks
{
public:
cCallbacks(cEvent & a_Event):
m_Event(a_Event)
{
++g_ActiveCallbacks;
2016-08-22 13:53:34 -04:00
LOGD("Created a cCallbacks instance at %p", reinterpret_cast<void *>(this));
2016-08-22 13:49:33 -04:00
}
2016-08-22 13:53:34 -04:00
virtual ~cCallbacks() override
2016-08-22 13:53:34 -04:00
{
--g_ActiveCallbacks;
2016-08-22 13:53:34 -04:00
LOGD("Deleting the cCallbacks instance at %p", reinterpret_cast<void *>(this));
}
2016-08-22 13:49:33 -04:00
virtual void OnConnected(cTCPLink & a_Link) override
{
LOG("Link connected to %s:%u", a_Link.GetRemoteIP().c_str(), a_Link.GetRemotePort());
}
2016-08-22 13:53:34 -04:00
2016-08-22 13:49:33 -04:00
virtual bool OnCertificateReceived() override
{
LOG("Server certificate received");
return true;
}
2016-08-22 13:53:34 -04:00
virtual void OnTlsHandshakeCompleted() override
{
LOG("TLS handshake has completed.");
}
2016-08-22 13:49:33 -04:00
virtual void OnRequestSent() override
{
LOG("Request has been sent");
}
2016-08-22 13:53:34 -04:00
2016-08-22 13:49:33 -04:00
virtual void OnHeader(const AString & a_Key, const AString & a_Value) override
{
LOG("HTTP Header: \"%s\" -> \"%s\"", a_Key.c_str(), a_Value.c_str());
}
2016-08-22 13:53:34 -04:00
2016-08-22 13:49:33 -04:00
virtual void OnHeadersFinished() override
{
LOG("HTTP headers finished.");
}
2016-08-22 13:53:34 -04:00
2016-08-22 13:49:33 -04:00
virtual void OnBodyData(const void * a_Data, size_t a_Size) override
{
2016-08-22 13:53:34 -04:00
#if 0
// Output the whole received data blob:
AString body(reinterpret_cast<const char *>(a_Data), a_Size);
LOG("Body part:\n%s", body.c_str());
#else
// Output only the data size, to keep the log short:
LOG("Body part: %u bytes", static_cast<unsigned>(a_Size));
#endif
2016-08-22 13:49:33 -04:00
}
2016-08-22 13:53:34 -04:00
2016-08-22 13:49:33 -04:00
virtual void OnBodyFinished() override
{
LOG("Body finished.");
m_Event.Set();
}
2016-08-22 13:53:34 -04:00
2016-08-22 13:49:33 -04:00
virtual void OnRedirecting(const AString & a_RedirectUrl) override
{
LOG("Redirecting to \"%s\".", a_RedirectUrl.c_str());
}
2016-08-22 13:53:34 -04:00
2016-08-22 13:49:33 -04:00
virtual void OnError(const AString & a_ErrorMsg) override
{
LOG("Error: %s", a_ErrorMsg.c_str());
m_Event.Set();
}
protected:
cEvent & m_Event;
};
int TestRequest1()
2016-08-22 13:49:33 -04:00
{
LOG("Running test 1");
cEvent evtFinished;
auto callbacks = cpp14::make_unique<cCallbacks>(evtFinished);
2016-08-22 13:49:33 -04:00
AStringMap options;
options["MaxRedirects"] = "0";
auto res = cUrlClient::Get("http://github.com", std::move(callbacks), AStringMap(), AString(), options);
2016-08-22 13:49:33 -04:00
if (res.first)
{
evtFinished.Wait();
}
else
{
LOG("Immediate error: %s", res.second.c_str());
return 1;
}
return 0;
}
int TestRequest2()
2016-08-22 13:49:33 -04:00
{
LOG("Running test 2");
cEvent evtFinished;
auto callbacks = cpp14::make_unique<cCallbacks>(evtFinished);
auto res = cUrlClient::Get("http://github.com", std::move(callbacks));
2016-08-22 13:49:33 -04:00
if (res.first)
{
evtFinished.Wait();
}
else
{
LOG("Immediate error: %s", res.second.c_str());
return 1;
}
return 0;
}
int TestRequest3()
2016-08-22 13:53:34 -04:00
{
LOG("Running test 3");
cEvent evtFinished;
auto callbacks = cpp14::make_unique<cCallbacks>(evtFinished);
2016-08-22 13:53:34 -04:00
AStringMap options;
options["MaxRedirects"] = "0";
auto res = cUrlClient::Get("https://github.com", std::move(callbacks), AStringMap(), AString(), options);
2016-08-22 13:53:34 -04:00
if (res.first)
{
evtFinished.Wait();
}
else
{
LOG("Immediate error: %s", res.second.c_str());
return 1;
}
return 0;
}
int TestRequest4()
2016-08-22 13:49:33 -04:00
{
2016-08-22 13:53:34 -04:00
LOG("Running test 4");
cEvent evtFinished;
auto callbacks = cpp14::make_unique<cCallbacks>(evtFinished);
auto res = cUrlClient::Get("https://github.com", std::move(callbacks));
2016-08-22 13:53:34 -04:00
if (res.first)
2016-08-22 13:49:33 -04:00
{
2016-08-22 13:53:34 -04:00
evtFinished.Wait();
2016-08-22 13:49:33 -04:00
}
2016-08-22 13:53:34 -04:00
else
2016-08-22 13:49:33 -04:00
{
2016-08-22 13:53:34 -04:00
LOG("Immediate error: %s", res.second.c_str());
return 1;
}
return 0;
}
int TestRequests()
2016-08-22 13:53:34 -04:00
{
std::function<int(void)> tests[] =
{
&TestRequest1,
&TestRequest2,
&TestRequest3,
&TestRequest4,
};
for (const auto & test: tests)
{
LOG("%s", AString(60, '-').c_str());
auto res = test();
if (res != 0)
{
return res;
}
2016-08-22 13:49:33 -04:00
}
return 0;
}
} // namespace (anonymous)
2016-08-22 13:49:33 -04:00
int main()
{
LOGD("Test started");
LOGD("Initializing cNetwork...");
cNetworkSingleton::Get().Initialise();
LOGD("Testing...");
auto res = TestRequests();
LOGD("Terminating cNetwork...");
cNetworkSingleton::Get().Terminate();
// No leaked callback instances
LOGD("cCallback instances still alive: %d", g_ActiveCallbacks.load());
assert_test(g_ActiveCallbacks == 0);
2016-08-22 13:49:33 -04:00
LOGD("cUrlClient test finished");
return res;
}