@@ -4416,13 +4416,19 @@ func BenchmarkClient(b *testing.B) {
4416
4416
b .StopTimer ()
4417
4417
defer afterTest (b )
4418
4418
4419
- port := os .Getenv ("TEST_BENCH_SERVER_PORT" ) // can be set by user
4420
- if port == "" {
4421
- port = "39207"
4422
- }
4423
4419
var data = []byte ("Hello world.\n " )
4424
4420
if server := os .Getenv ("TEST_BENCH_SERVER" ); server != "" {
4425
4421
// Server process mode.
4422
+ port := os .Getenv ("TEST_BENCH_SERVER_PORT" ) // can be set by user
4423
+ if port == "" {
4424
+ port = "0"
4425
+ }
4426
+ ln , err := net .Listen ("tcp" , "localhost:" + port )
4427
+ if err != nil {
4428
+ fmt .Fprintln (os .Stderr , err .Error ())
4429
+ os .Exit (1 )
4430
+ }
4431
+ fmt .Println (ln .Addr ().String ())
4426
4432
HandleFunc ("/" , func (w ResponseWriter , r * Request ) {
4427
4433
r .ParseForm ()
4428
4434
if r .Form .Get ("stop" ) != "" {
@@ -4431,33 +4437,44 @@ func BenchmarkClient(b *testing.B) {
4431
4437
w .Header ().Set ("Content-Type" , "text/html; charset=utf-8" )
4432
4438
w .Write (data )
4433
4439
})
4434
- log .Fatal (ListenAndServe ("localhost:" + port , nil ))
4440
+ var srv Server
4441
+ log .Fatal (srv .Serve (ln ))
4435
4442
}
4436
4443
4437
4444
// Start server process.
4438
4445
cmd := exec .Command (os .Args [0 ], "-test.run=XXXX" , "-test.bench=BenchmarkClient$" )
4439
4446
cmd .Env = append (os .Environ (), "TEST_BENCH_SERVER=yes" )
4447
+ cmd .Stderr = os .Stderr
4448
+ stdout , err := cmd .StdoutPipe ()
4449
+ if err != nil {
4450
+ b .Fatal (err )
4451
+ }
4440
4452
if err := cmd .Start (); err != nil {
4441
4453
b .Fatalf ("subprocess failed to start: %v" , err )
4442
4454
}
4443
4455
defer cmd .Process .Kill ()
4456
+
4457
+ // Wait for the server in the child process to respond and tell us
4458
+ // its listening address, once it's started listening:
4459
+ timer := time .AfterFunc (10 * time .Second , func () {
4460
+ cmd .Process .Kill ()
4461
+ })
4462
+ defer timer .Stop ()
4463
+ bs := bufio .NewScanner (stdout )
4464
+ if ! bs .Scan () {
4465
+ b .Fatalf ("failed to read listening URL from child: %v" , bs .Err ())
4466
+ }
4467
+ url := "http://" + strings .TrimSpace (bs .Text ()) + "/"
4468
+ timer .Stop ()
4469
+ if _ , err := getNoBody (url ); err != nil {
4470
+ b .Fatalf ("initial probe of child process failed: %v" , err )
4471
+ }
4472
+
4444
4473
done := make (chan error )
4445
4474
go func () {
4446
4475
done <- cmd .Wait ()
4447
4476
}()
4448
4477
4449
- // Wait for the server process to respond.
4450
- url := "http://localhost:" + port + "/"
4451
- for i := 0 ; i < 100 ; i ++ {
4452
- time .Sleep (100 * time .Millisecond )
4453
- if _ , err := getNoBody (url ); err == nil {
4454
- break
4455
- }
4456
- if i == 99 {
4457
- b .Fatalf ("subprocess does not respond" )
4458
- }
4459
- }
4460
-
4461
4478
// Do b.N requests to the server.
4462
4479
b .StartTimer ()
4463
4480
for i := 0 ; i < b .N ; i ++ {
0 commit comments