From d44a692aaeb6f78e8cf7520236b21977333fa3c3 Mon Sep 17 00:00:00 2001 From: Zousar Shaker Date: Fri, 20 Mar 2026 05:45:44 -0600 Subject: Zs/consul token (#870) - Feature: Added support for consul token passed via environment variable, and specified a default env var name of CONSUL_HTTP_TOKEN for it in hub mode --- src/zenserver-test/hub-tests.cpp | 56 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) (limited to 'src/zenserver-test/hub-tests.cpp') diff --git a/src/zenserver-test/hub-tests.cpp b/src/zenserver-test/hub-tests.cpp index 958a0b050..29c3b76ba 100644 --- a/src/zenserver-test/hub-tests.cpp +++ b/src/zenserver-test/hub-tests.cpp @@ -21,6 +21,11 @@ # include # include # include +# if ZEN_PLATFORM_WINDOWS +# include +# else +# include +# endif namespace zen::tests::hub { @@ -290,6 +295,57 @@ TEST_CASE("hub.consul.hub.registration") ConsulProc.StopConsulAgent(); } +TEST_CASE("hub.consul.hub.registration.token") +{ + // Set an env var that the server will read its Consul token from. + // Children inherit parent environment, so the spawned server will see it. + constexpr const char* TokenEnvVarName = "ZEN_TEST_CONSUL_TOKEN"; + constexpr const char* TokenValue = "test-token-value"; +# if ZEN_PLATFORM_WINDOWS + char PrevBuf[1024] = {}; + DWORD PrevLen = GetEnvironmentVariableA(TokenEnvVarName, PrevBuf, sizeof(PrevBuf)); + REQUIRE(PrevLen < sizeof(PrevBuf)); + SetEnvironmentVariableA(TokenEnvVarName, TokenValue); + auto EnvCleanup = MakeGuard([PrevEnvValue = std::string(PrevBuf, PrevLen), HadPrevToken = PrevLen > 0] { + SetEnvironmentVariableA(TokenEnvVarName, HadPrevToken ? PrevEnvValue.c_str() : nullptr); + }); +# else + const char* PrevEnvPtr = getenv(TokenEnvVarName); + setenv(TokenEnvVarName, TokenValue, /*overwrite=*/1); + auto EnvCleanup = MakeGuard([PrevEnvValue = std::string(PrevEnvPtr ? PrevEnvPtr : ""), HadPrevToken = PrevEnvPtr != nullptr] { + if (HadPrevToken) + { + setenv(TokenEnvVarName, PrevEnvValue.c_str(), /*overwrite=*/1); + } + else + { + unsetenv(TokenEnvVarName); + } + }); +# endif + + consul::ConsulProcess ConsulProc; + ConsulProc.SpawnConsulAgent(); + + ZenServerInstance Instance(TestEnv, ZenServerInstance::ServerMode::kHubServer); + const uint16_t PortNumber = Instance.SpawnServerAndWaitUntilReady( + "--consul-endpoint=http://localhost:8500/ --instance-id=test-instance " + "--consul-token-env=ZEN_TEST_CONSUL_TOKEN"); + REQUIRE(PortNumber != 0); + + // Use a plain client — dev-mode Consul doesn't enforce ACLs, but the + // server has exercised the ConsulTokenEnv -> GetEnvVariable -> ConsulClient path. + consul::ConsulClient Client("http://localhost:8500/"); + + REQUIRE(WaitForConsulService(Client, "zen-hub-test-instance", true, 5000)); + + Instance.Shutdown(); + + CHECK(!Client.HasService("zen-hub-test-instance")); + + ConsulProc.StopConsulAgent(); +} + TEST_CASE("hub.consul.provision.registration") { consul::ConsulProcess ConsulProc; -- cgit v1.2.3