diff options
Diffstat (limited to 'src/zenserver-test/hub-tests.cpp')
| -rw-r--r-- | src/zenserver-test/hub-tests.cpp | 56 |
1 files changed, 56 insertions, 0 deletions
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 <zenutil/consul.h> # include <zencore/thread.h> # include <zencore/timer.h> +# if ZEN_PLATFORM_WINDOWS +# include <zencore/windows.h> +# else +# include <cstdlib> +# 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; |