diff options
| author | Stefan Boberg <[email protected]> | 2023-11-17 10:30:51 +0100 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-11-17 10:30:51 +0100 |
| commit | 68915961c397c9f06930f80677d131a25d045962 (patch) | |
| tree | 91a68aa26506e9314738b566645572faf76a1668 /src/zenutil/include | |
| parent | removed zen runtests command (#551) (diff) | |
| download | zen-68915961c397c9f06930f80677d131a25d045962.tar.xz zen-68915961c397c9f06930f80677d131a25d045962.zip | |
use dynamic port assignment for tests (#545)
this change replaces hard-coded port numbers in tests with dynamically assigned ports, to avoid potential issues around socket lifetimes and re-use policies
Diffstat (limited to 'src/zenutil/include')
| -rw-r--r-- | src/zenutil/include/zenutil/zenserverprocess.h | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/src/zenutil/include/zenutil/zenserverprocess.h b/src/zenutil/include/zenutil/zenserverprocess.h index 14d19ad39..ce6a990f8 100644 --- a/src/zenutil/include/zenutil/zenserverprocess.h +++ b/src/zenutil/include/zenutil/zenserverprocess.h @@ -38,6 +38,7 @@ public: inline bool IsInitialized() const { return m_IsInitialized; } inline bool IsTestEnvironment() const { return m_IsTestInstance; } inline std::string_view GetServerClass() const { return m_ServerClass; } + inline uint16_t GetNewPortNumber() { return m_NextPortNumber.fetch_add(1); } private: std::filesystem::path m_ProgramBaseDir; @@ -45,6 +46,7 @@ private: bool m_IsInitialized = false; bool m_IsTestInstance = false; std::string m_ServerClass; + std::atomic_uint16_t m_NextPortNumber{20000}; }; /** Zen Server Instance management @@ -63,7 +65,7 @@ struct ZenServerInstance void Shutdown(); void SignalShutdown(); - void WaitUntilReady(); + uint16_t WaitUntilReady(); [[nodiscard]] bool WaitUntilReady(int Timeout); void EnableTermination() { m_Terminate = true; } void DisableShutdownOnDestroy() { m_ShutdownOnDestroy = false; } @@ -72,8 +74,20 @@ struct ZenServerInstance inline void SetOwnerPid(int Pid) { m_OwnerPid = Pid; } bool IsRunning(); - void SetTestDir(std::filesystem::path TestDir); - inline void SpawnServer(int BasePort = 0, std::string_view AdditionalServerArgs = std::string_view()) + void SetTestDir(std::filesystem::path TestDir); + + inline void SpawnServer(std::string_view AdditionalServerArgs = std::string_view()) + { + SpawnServer(m_Env.GetNewPortNumber(), AdditionalServerArgs, /* WaitTimeoutMs */ 0); + } + + inline uint16_t SpawnServerAndWaitUntilReady(std::string_view AdditionalServerArgs = std::string_view()) + { + SpawnServer(m_Env.GetNewPortNumber(), AdditionalServerArgs, /* WaitTimeoutMs */ 100'000); + return GetBasePort(); + } + + inline void SpawnServer(int BasePort, std::string_view AdditionalServerArgs = std::string_view()) { SpawnServer(BasePort, AdditionalServerArgs, /* WaitTimeoutMs */ 0); } @@ -85,6 +99,7 @@ struct ZenServerInstance void AttachToRunningServer(int BasePort = 0); std::string GetBaseUri() const; + uint16_t GetBasePort() const { return m_BasePort; } private: ZenServerEnvironment& m_Env; @@ -94,12 +109,13 @@ private: bool m_Terminate = false; bool m_ShutdownOnDestroy = true; std::filesystem::path m_TestDir; - int m_BasePort = 0; + uint16_t m_BasePort = 0; std::optional<int> m_OwnerPid; std::string m_Name; void CreateShutdownEvent(int BasePort); void SpawnServer(int BasePort, std::string_view AdditionalServerArgs, int WaitTimeoutMs); + void OnServerReady(); }; /** Shared system state |