@@ -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