@@ -12,6 +12,7 @@ import (
1212	"compress/gzip" 
1313	"compress/zlib" 
1414	"context" 
15+ 	crand "crypto/rand" 
1516	"crypto/tls" 
1617	"crypto/x509" 
1718	"encoding/json" 
@@ -5281,8 +5282,8 @@ func benchmarkClientServerParallel(b *testing.B, parallelism int, mode testMode)
52815282func  BenchmarkServer (b  * testing.B ) {
52825283	b .ReportAllocs ()
52835284	// Child process mode; 
5284- 	if  url  :=  os .Getenv ("TEST_BENCH_SERVER_URL " ); url  !=  ""  {
5285- 		n , err  :=  strconv .Atoi (os .Getenv ("TEST_BENCH_CLIENT_N " ))
5285+ 	if  url  :=  os .Getenv ("GO_TEST_BENCH_SERVER_URL " ); url  !=  ""  {
5286+ 		n , err  :=  strconv .Atoi (os .Getenv ("GO_TEST_BENCH_CLIENT_N " ))
52865287		if  err  !=  nil  {
52875288			panic (err )
52885289		}
@@ -5316,8 +5317,8 @@ func BenchmarkServer(b *testing.B) {
53165317
53175318	cmd  :=  testenv .Command (b , os .Args [0 ], "-test.run=^$" , "-test.bench=^BenchmarkServer$" )
53185319	cmd .Env  =  append ([]string {
5319- 		fmt .Sprintf ("TEST_BENCH_CLIENT_N =%d" , b .N ),
5320- 		fmt .Sprintf ("TEST_BENCH_SERVER_URL =%s" , ts .URL ),
5320+ 		fmt .Sprintf ("GO_TEST_BENCH_CLIENT_N =%d" , b .N ),
5321+ 		fmt .Sprintf ("GO_TEST_BENCH_SERVER_URL =%s" , ts .URL ),
53215322	}, os .Environ ()... )
53225323	out , err  :=  cmd .CombinedOutput ()
53235324	if  err  !=  nil  {
@@ -5338,39 +5339,63 @@ func getNoBody(urlStr string) (*Response, error) {
53385339// A benchmark for profiling the client without the HTTP server code. 
53395340// The server code runs in a subprocess. 
53405341func  BenchmarkClient (b  * testing.B ) {
5342+ 	var  data  =  []byte ("Hello world.\n " )
5343+ 
5344+ 	url  :=  startClientBenchmarkServer (b , HandlerFunc (func (w  ResponseWriter , _  * Request ) {
5345+ 		w .Header ().Set ("Content-Type" , "text/html; charset=utf-8" )
5346+ 		w .Write (data )
5347+ 	}))
5348+ 
5349+ 	// Do b.N requests to the server. 
5350+ 	b .StartTimer ()
5351+ 	for  i  :=  0 ; i  <  b .N ; i ++  {
5352+ 		res , err  :=  Get (url )
5353+ 		if  err  !=  nil  {
5354+ 			b .Fatalf ("Get: %v" , err )
5355+ 		}
5356+ 		body , err  :=  io .ReadAll (res .Body )
5357+ 		res .Body .Close ()
5358+ 		if  err  !=  nil  {
5359+ 			b .Fatalf ("ReadAll: %v" , err )
5360+ 		}
5361+ 		if  ! bytes .Equal (body , data ) {
5362+ 			b .Fatalf ("Got body: %q" , body )
5363+ 		}
5364+ 	}
5365+ 	b .StopTimer ()
5366+ }
5367+ 
5368+ func  startClientBenchmarkServer (b  * testing.B , handler  Handler ) string  {
53415369	b .ReportAllocs ()
53425370	b .StopTimer ()
5343- 	defer  afterTest (b )
53445371
5345- 	var  data  =  []byte ("Hello world.\n " )
5346- 	if  server  :=  os .Getenv ("TEST_BENCH_SERVER" ); server  !=  ""  {
5372+ 	if  server  :=  os .Getenv ("GO_TEST_BENCH_SERVER" ); server  !=  ""  {
53475373		// Server process mode. 
5348- 		port  :=  os .Getenv ("TEST_BENCH_SERVER_PORT " ) // can be set by user 
5374+ 		port  :=  os .Getenv ("GO_TEST_BENCH_SERVER_PORT " ) // can be set by user 
53495375		if  port  ==  ""  {
53505376			port  =  "0" 
53515377		}
53525378		ln , err  :=  net .Listen ("tcp" , "localhost:" + port )
53535379		if  err  !=  nil  {
5354- 			fmt .Fprintln (os .Stderr , err .Error ())
5355- 			os .Exit (1 )
5380+ 			log .Fatal (err )
53565381		}
53575382		fmt .Println (ln .Addr ().String ())
5383+ 
53585384		HandleFunc ("/" , func (w  ResponseWriter , r  * Request ) {
53595385			r .ParseForm ()
53605386			if  r .Form .Get ("stop" ) !=  ""  {
53615387				os .Exit (0 )
53625388			}
5363- 			w .Header ().Set ("Content-Type" , "text/html; charset=utf-8" )
5364- 			w .Write (data )
5389+ 			handler .ServeHTTP (w , r )
53655390		})
53665391		var  srv  Server 
53675392		log .Fatal (srv .Serve (ln ))
53685393	}
53695394
53705395	// Start server process. 
53715396	ctx , cancel  :=  context .WithCancel (context .Background ())
5372- 	cmd  :=  testenv .CommandContext (b , ctx , os .Args [0 ], "-test.run=^$" , "-test.bench=^BenchmarkClient $" )
5373- 	cmd .Env  =  append (cmd .Environ (), "TEST_BENCH_SERVER =yes" )
5397+ 	cmd  :=  testenv .CommandContext (b , ctx , os .Args [0 ], "-test.run=^$" , "-test.bench=^"  + b . Name () + " $"
5398+ 	cmd .Env  =  append (cmd .Environ (), "GO_TEST_BENCH_SERVER =yes" )
53745399	cmd .Stderr  =  os .Stderr 
53755400	stdout , err  :=  cmd .StdoutPipe ()
53765401	if  err  !=  nil  {
@@ -5385,10 +5410,6 @@ func BenchmarkClient(b *testing.B) {
53855410		done  <-  cmd .Wait ()
53865411		close (done )
53875412	}()
5388- 	defer  func () {
5389- 		cancel ()
5390- 		<- done 
5391- 	}()
53925413
53935414	// Wait for the server in the child process to respond and tell us 
53945415	// its listening address, once it's started listening: 
@@ -5401,29 +5422,56 @@ func BenchmarkClient(b *testing.B) {
54015422		b .Fatalf ("initial probe of child process failed: %v" , err )
54025423	}
54035424
5425+ 	// Instruct server process to stop. 
5426+ 	b .Cleanup (func () {
5427+ 		getNoBody (url  +  "?stop=yes" )
5428+ 		if  err  :=  <- done ; err  !=  nil  {
5429+ 			b .Fatalf ("subprocess failed: %v" , err )
5430+ 		}
5431+ 
5432+ 		cancel ()
5433+ 		<- done 
5434+ 
5435+ 		afterTest (b )
5436+ 	})
5437+ 
5438+ 	return  url 
5439+ }
5440+ 
5441+ func  BenchmarkClientGzip (b  * testing.B ) {
5442+ 	const  responseSize  =  1024  *  1024 
5443+ 
5444+ 	var  buf  bytes.Buffer 
5445+ 	gz  :=  gzip .NewWriter (& buf )
5446+ 	if  _ , err  :=  io .CopyN (gz , crand .Reader , responseSize ); err  !=  nil  {
5447+ 		b .Fatal (err )
5448+ 	}
5449+ 	gz .Close ()
5450+ 
5451+ 	data  :=  buf .Bytes ()
5452+ 
5453+ 	url  :=  startClientBenchmarkServer (b , HandlerFunc (func (w  ResponseWriter , _  * Request ) {
5454+ 		w .Header ().Set ("Content-Encoding" , "gzip" )
5455+ 		w .Write (data )
5456+ 	}))
5457+ 
54045458	// Do b.N requests to the server. 
54055459	b .StartTimer ()
54065460	for  i  :=  0 ; i  <  b .N ; i ++  {
54075461		res , err  :=  Get (url )
54085462		if  err  !=  nil  {
54095463			b .Fatalf ("Get: %v" , err )
54105464		}
5411- 		body , err  :=  io .ReadAll ( res .Body )
5465+ 		n , err  :=  io .Copy ( io . Discard ,  res .Body )
54125466		res .Body .Close ()
54135467		if  err  !=  nil  {
54145468			b .Fatalf ("ReadAll: %v" , err )
54155469		}
5416- 		if  ! bytes . Equal ( body ,  data )  {
5417- 			b .Fatalf ("Got body: %q " , body )
5470+ 		if  n   !=   responseSize  {
5471+ 			b .Fatalf ("ReadAll: expected %d bytes, got %d " , responseSize ,  n )
54185472		}
54195473	}
54205474	b .StopTimer ()
5421- 
5422- 	// Instruct server process to stop. 
5423- 	getNoBody (url  +  "?stop=yes" )
5424- 	if  err  :=  <- done ; err  !=  nil  {
5425- 		b .Fatalf ("subprocess failed: %v" , err )
5426- 	}
54275475}
54285476
54295477func  BenchmarkServerFakeConnNoKeepAlive (b  * testing.B ) {
0 commit comments