@@ -161,15 +161,75 @@ describe("release bootstrap smoke", () => {
161161 const installedBinaryStat = await readFile ( installedBinaryPath ) ;
162162 expect ( installedBinaryStat . byteLength ) . toBeGreaterThan ( 0 ) ;
163163
164- const secondRun = await runCommand (
164+ const probeServer = createServer ( ( _ , response ) => {
165+ response . statusCode = 204 ;
166+ response . end ( ) ;
167+ } ) ;
168+ const webPort = await listen ( probeServer ) ;
169+ await closeServer ( probeServer ) ;
170+
171+ const webProcess = spawn (
165172 process . execPath ,
166- [ join ( installedPackageDir , "bin" , "executor" ) , "--help" ] ,
167- installedPackageDir ,
173+ [ join ( installedPackageDir , "bin" , "executor" ) , "web" , "--port" , String ( webPort ) ] ,
174+ {
175+ cwd : installedPackageDir ,
176+ stdio : [ "ignore" , "pipe" , "pipe" ] ,
177+ } ,
168178 ) ;
169- const secondCombinedOutput = `${ secondRun . stdout } \n${ secondRun . stderr } ` ;
170179
171- expect ( secondRun . exitCode , secondCombinedOutput ) . toBe ( 0 ) ;
172- expect ( secondCombinedOutput ) . not . toContain ( "downloading release asset" ) ;
180+ let webStdout = "" ;
181+ let webStderr = "" ;
182+ webProcess . stdout . setEncoding ( "utf8" ) ;
183+ webProcess . stdout . on ( "data" , ( chunk ) => {
184+ webStdout += chunk ;
185+ } ) ;
186+ webProcess . stderr . setEncoding ( "utf8" ) ;
187+ webProcess . stderr . on ( "data" , ( chunk ) => {
188+ webStderr += chunk ;
189+ } ) ;
190+
191+ try {
192+ const deadline = Date . now ( ) + 30_000 ;
193+ let rootResponse : Response | null = null ;
194+ while ( Date . now ( ) < deadline ) {
195+ await new Promise ( ( resolveDelay ) => setTimeout ( resolveDelay , 250 ) ) ;
196+ try {
197+ rootResponse = await fetch ( `http://127.0.0.1:${ webPort } /` ) ;
198+ if ( rootResponse . ok ) {
199+ break ;
200+ }
201+ } catch {
202+ // keep polling until the server is ready
203+ }
204+ }
205+
206+ expect ( rootResponse , `${ webStdout } \n${ webStderr } ` ) . not . toBeNull ( ) ;
207+ expect ( rootResponse ! . status , `${ webStdout } \n${ webStderr } ` ) . toBe ( 200 ) ;
208+ const rootHtml = await rootResponse ! . text ( ) ;
209+ expect ( rootHtml . toLowerCase ( ) ) . toContain ( "<html" ) ;
210+
211+ const docsResponse = await fetch ( `http://127.0.0.1:${ webPort } /docs` ) ;
212+ expect ( docsResponse . status , `${ webStdout } \n${ webStderr } ` ) . toBe ( 200 ) ;
213+
214+ const secondRun = await runCommand (
215+ process . execPath ,
216+ [ join ( installedPackageDir , "bin" , "executor" ) , "--help" ] ,
217+ installedPackageDir ,
218+ ) ;
219+ const secondCombinedOutput = `${ secondRun . stdout } \n${ secondRun . stderr } ` ;
220+
221+ expect ( secondRun . exitCode , secondCombinedOutput ) . toBe ( 0 ) ;
222+ expect ( secondCombinedOutput ) . not . toContain ( "downloading release asset" ) ;
223+ } finally {
224+ webProcess . kill ( "SIGTERM" ) ;
225+ await Promise . race ( [
226+ new Promise ( ( resolveClose ) => webProcess . once ( "close" , ( ) => resolveClose ( undefined ) ) ) ,
227+ new Promise ( ( resolveClose ) => setTimeout ( resolveClose , 5_000 ) ) ,
228+ ] ) ;
229+ if ( webProcess . exitCode === null ) {
230+ webProcess . kill ( "SIGKILL" ) ;
231+ }
232+ }
173233 } finally {
174234 await closeServer ( server ) ;
175235 await rm ( tempRoot , { recursive : true , force : true } ) ;
0 commit comments