aboutsummaryrefslogtreecommitdiff
path: root/src/zenhttp/httpclient.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2026-02-12 10:58:41 +0100
committerGitHub Enterprise <[email protected]>2026-02-12 10:58:41 +0100
commitc37421a3b4493c0b0f9afef15a4ea7b74d152067 (patch)
treeb1d95430ed3518490304a6a128aee4e2aeed84d3 /src/zenhttp/httpclient.cpp
parentreduce lock time for project store gc precache and gc validate (#750) (diff)
downloadzen-c37421a3b4493c0b0f9afef15a4ea7b74d152067.tar.xz
zen-c37421a3b4493c0b0f9afef15a4ea7b74d152067.zip
add simple http client tests (#751)
* add simple http client tests and fix run loop of http server to not rely on application quit
Diffstat (limited to 'src/zenhttp/httpclient.cpp')
-rw-r--r--src/zenhttp/httpclient.cpp164
1 files changed, 163 insertions, 1 deletions
diff --git a/src/zenhttp/httpclient.cpp b/src/zenhttp/httpclient.cpp
index 43e9fb468..0544bf5c8 100644
--- a/src/zenhttp/httpclient.cpp
+++ b/src/zenhttp/httpclient.cpp
@@ -22,8 +22,13 @@
#include "clients/httpclientcommon.h"
#if ZEN_WITH_TESTS
+# include <zencore/scopeguard.h>
# include <zencore/testing.h>
# include <zencore/testutils.h>
+# include "servers/httpasio.h"
+# include "servers/httpsys.h"
+
+# include <thread>
#endif // ZEN_WITH_TESTS
namespace zen {
@@ -388,7 +393,164 @@ TEST_CASE("httpclient")
{
using namespace std::literals;
- SUBCASE("client") {}
+ struct TestHttpService : public HttpService
+ {
+ TestHttpService() = default;
+
+ virtual const char* BaseUri() const override { return "/test/"; }
+ virtual void HandleRequest(HttpServerRequest& HttpServiceRequest) override
+ {
+ if (HttpServiceRequest.RelativeUri() == "yo")
+ {
+ return HttpServiceRequest.WriteResponse(HttpResponseCode::OK, HttpContentType::kText, "hey man");
+ }
+ return HttpServiceRequest.WriteResponse(HttpResponseCode::OK);
+ }
+ };
+
+ TestHttpService TestService;
+ ScopedTemporaryDirectory TmpDir;
+
+ SUBCASE("asio")
+ {
+ Ref<HttpServer> AsioServer = CreateHttpAsioServer(AsioConfig{});
+
+ int Port = AsioServer->Initialize(7575, TmpDir.Path());
+ REQUIRE(Port != -1);
+
+ AsioServer->RegisterService(TestService);
+
+ std::thread SeverThread([&]() { AsioServer->Run(false); });
+
+ {
+ auto _ = MakeGuard([&]() {
+ if (SeverThread.joinable())
+ {
+ SeverThread.join();
+ }
+ AsioServer->Close();
+ });
+
+ {
+ HttpClient Client(fmt::format("127.0.0.1:{}", Port),
+ HttpClientSettings{},
+ /*CheckIfAbortFunction*/ {});
+
+ ZEN_INFO("Request using {}", Client.GetBaseUri());
+
+ HttpClient::Response TestResponse = Client.Get("/test/yo");
+ CHECK(TestResponse.IsSuccess());
+ }
+
+ if (IsIPv6Capable())
+ {
+ HttpClient Client(fmt::format("[::1]:{}", Port),
+ HttpClientSettings{},
+ /*CheckIfAbortFunction*/ {});
+
+ ZEN_INFO("Request using {}", Client.GetBaseUri());
+
+ HttpClient::Response TestResponse = Client.Get("/test/yo");
+ CHECK(TestResponse.IsSuccess());
+ }
+
+ {
+ HttpClient Client(fmt::format("localhost:{}", Port),
+ HttpClientSettings{},
+ /*CheckIfAbortFunction*/ {});
+
+ ZEN_INFO("Request using {}", Client.GetBaseUri());
+
+ HttpClient::Response TestResponse = Client.Get("/test/yo");
+ CHECK(TestResponse.IsSuccess());
+ }
+# if 0
+ {
+ HttpClient Client(fmt::format("10.24.101.77:{}", Port),
+ HttpClientSettings{},
+ /*CheckIfAbortFunction*/ {});
+
+ ZEN_INFO("Request using {}", Client.GetBaseUri());
+
+ HttpClient::Response TestResponse = Client.Get("/test/yo");
+ CHECK(TestResponse.IsSuccess());
+ }
+# endif // 0
+ AsioServer->RequestExit();
+ }
+ }
+
+# if ZEN_PLATFORM_WINDOWS
+ SUBCASE("httpsys")
+ {
+ Ref<HttpServer> HttpSysServer = CreateHttpSysServer(HttpSysConfig{.ForceLoopback = true});
+
+ int Port = HttpSysServer->Initialize(7575, TmpDir.Path());
+ REQUIRE(Port != -1);
+
+ HttpSysServer->RegisterService(TestService);
+
+ std::thread SeverThread([&]() { HttpSysServer->Run(false); });
+
+ {
+ auto _ = MakeGuard([&]() {
+ if (SeverThread.joinable())
+ {
+ SeverThread.join();
+ }
+ HttpSysServer->Close();
+ });
+
+ if (true)
+ {
+ HttpClient Client(fmt::format("127.0.0.1:{}", Port),
+ HttpClientSettings{},
+ /*CheckIfAbortFunction*/ {});
+
+ ZEN_INFO("Request using {}", Client.GetBaseUri());
+
+ HttpClient::Response TestResponse = Client.Get("/test/yo");
+ CHECK(TestResponse.IsSuccess());
+ }
+
+ if (IsIPv6Capable())
+ {
+ HttpClient Client(fmt::format("[::1]:{}", Port),
+ HttpClientSettings{},
+ /*CheckIfAbortFunction*/ {});
+
+ ZEN_INFO("Request using {}", Client.GetBaseUri());
+
+ HttpClient::Response TestResponse = Client.Get("/test/yo");
+ CHECK(TestResponse.IsSuccess());
+ }
+
+ {
+ HttpClient Client(fmt::format("localhost:{}", Port),
+ HttpClientSettings{},
+ /*CheckIfAbortFunction*/ {});
+
+ ZEN_INFO("Request using {}", Client.GetBaseUri());
+
+ HttpClient::Response TestResponse = Client.Get("/test/yo");
+ CHECK(TestResponse.IsSuccess());
+ }
+# if 0
+ {
+ HttpClient Client(fmt::format("10.24.101.77:{}", Port),
+ HttpClientSettings{},
+ /*CheckIfAbortFunction*/ {});
+
+ ZEN_INFO("Request using {}", Client.GetBaseUri());
+
+ HttpClient::Response TestResponse = Client.Get("/test");
+ CHECK(TestResponse.IsSuccess());
+ }
+# endif // 0
+ HttpSysServer->RequestExit();
+ }
+ }
+# endif // ZEN_PLATFORM_WINDOWS
}
void