@@ -171,3 +171,96 @@ describe('getWorkflowRunStreamId', () => {
171171 expect ( result . includes ( '_user' ) ) . toBe ( true ) ;
172172 } ) ;
173173} ) ;
174+
175+ describe ( 'getPort' , ( ) => {
176+ const createServer = ( ) =>
177+ http . createServer ( ( _request , response ) => {
178+ response . end ( ) ;
179+ } ) ;
180+
181+ const startServer = async ( port : number , host = '127.0.0.1' ) => {
182+ const server = createServer ( ) . listen ( port , host ) ;
183+ await new Promise < void > ( ( resolve ) => {
184+ server . on ( 'listening' , resolve ) ;
185+ } ) ;
186+ return server ;
187+ } ;
188+
189+ it ( 'should return undefined when process is not listening on any port' , ( ) => {
190+ // This test assumes the test process itself isn't listening on any port
191+ const port = getPort ( ) ;
192+ expect ( port ) . toBeUndefined ( ) ;
193+ } ) ;
194+
195+ it ( 'should detect port when server is listening' , async ( ) => {
196+ // Use a high port number to avoid conflicts
197+ const testPort = 50000 + Math . floor ( Math . random ( ) * 10000 ) ;
198+ const server = await startServer ( testPort ) ;
199+
200+ // Give the OS a moment to register the port
201+ await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
202+
203+ const detectedPort = getPort ( ) ;
204+ expect ( detectedPort ) . toBe ( testPort ) ;
205+
206+ server . close ( ) ;
207+ } ) ;
208+
209+ it ( 'should return smallest port when listening on multiple ports' , async ( ) => {
210+ const port1 = 50000 + Math . floor ( Math . random ( ) * 5000 ) ;
211+ const port2 = port1 + 100 ;
212+ const port3 = port1 + 200 ;
213+
214+ const server1 = await startServer ( port1 ) ;
215+ const server2 = await startServer ( port2 ) ;
216+ const server3 = await startServer ( port3 ) ;
217+
218+ // Give the OS a moment to register the ports
219+ await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
220+
221+ const detectedPort = getPort ( ) ;
222+ expect ( detectedPort ) . toBe ( port1 ) ; // Should return the smallest
223+
224+ server1 . close ( ) ;
225+ server2 . close ( ) ;
226+ server3 . close ( ) ;
227+ } ) ;
228+
229+ it ( 'should work with IPv6 localhost' , async ( ) => {
230+ const testPort = 50000 + Math . floor ( Math . random ( ) * 10000 ) ;
231+ let server : http . Server | undefined ;
232+
233+ try {
234+ server = await startServer ( testPort , '::1' ) ;
235+
236+ // Give the OS a moment to register the port
237+ await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
238+
239+ const detectedPort = getPort ( ) ;
240+ expect ( detectedPort ) . toBe ( testPort ) ;
241+ } catch {
242+ // IPv6 might not be available on all systems, skip the test
243+ if ( server ) server . close ( ) ;
244+ return ;
245+ }
246+
247+ if ( server ) server . close ( ) ;
248+ } ) ;
249+
250+ it ( 'should handle 0.0.0.0 binding' , async ( ) => {
251+ const testPort = 50000 + Math . floor ( Math . random ( ) * 10000 ) ;
252+ const server = createServer ( ) . listen ( testPort , '0.0.0.0' ) ;
253+
254+ await new Promise < void > ( ( resolve ) => {
255+ server . on ( 'listening' , resolve ) ;
256+ } ) ;
257+
258+ // Give the OS a moment to register the port
259+ await new Promise ( ( resolve ) => setTimeout ( resolve , 100 ) ) ;
260+
261+ const detectedPort = getPort ( ) ;
262+ expect ( detectedPort ) . toBe ( testPort ) ;
263+
264+ server . close ( ) ;
265+ } ) ;
266+ } ) ;
0 commit comments