@@ -15,10 +15,11 @@ import (
1515 "testing"
1616 "time"
1717
18- "github.com/cloudflare/cloudflared/logger"
1918 "github.com/pkg/errors"
2019 "github.com/stretchr/testify/assert"
2120 "golang.org/x/sync/errgroup"
21+
22+ "github.com/cloudflare/cloudflared/logger"
2223)
2324
2425const (
@@ -1032,3 +1033,108 @@ func openStreams(b *testing.B, muxPair *DefaultMuxerPair, n int) {
10321033 }
10331034 assert .NoError (b , errGroup .Wait ())
10341035}
1036+
1037+ func BenchmarkSingleStreamLargeResponseBody (b * testing.B ) {
1038+ const bodySize = 1 << 24
1039+
1040+ const writeBufferSize = 16 << 10
1041+ const writeN = bodySize / writeBufferSize
1042+ payload := make ([]byte , writeBufferSize )
1043+ for i := range payload {
1044+ payload [i ] = byte (i % 256 )
1045+ }
1046+
1047+ const readBufferSize = 16 << 10
1048+ const readN = bodySize / readBufferSize
1049+ responseBody := make ([]byte , readBufferSize )
1050+
1051+ f := MuxedStreamFunc (func (stream * MuxedStream ) error {
1052+ if len (stream .Headers ) != 1 {
1053+ b .Fatalf ("expected %d headers, got %d" , 1 , len (stream .Headers ))
1054+ }
1055+ if stream .Headers [0 ].Name != "test-header" {
1056+ b .Fatalf ("expected header name %s, got %s" , "test-header" , stream .Headers [0 ].Name )
1057+ }
1058+ if stream .Headers [0 ].Value != "headerValue" {
1059+ b .Fatalf ("expected header value %s, got %s" , "headerValue" , stream .Headers [0 ].Value )
1060+ }
1061+ stream .WriteHeaders ([]Header {
1062+ {Name : "response-header" , Value : "responseValue" },
1063+ })
1064+ for i := 0 ; i < writeN ; i ++ {
1065+ n , err := stream .Write (payload )
1066+ if err != nil {
1067+ b .Fatalf ("origin write error: %s" , err )
1068+ }
1069+ if n != len (payload ) {
1070+ b .Fatalf ("origin short write: %d/%d bytes" , n , len (payload ))
1071+ }
1072+ }
1073+
1074+ return nil
1075+ })
1076+
1077+ name := fmt .Sprintf ("%s_%d" , b .Name (), rand .Int ())
1078+ origin , edge := net .Pipe ()
1079+
1080+ muxPair := & DefaultMuxerPair {
1081+ OriginMuxConfig : MuxerConfig {
1082+ Timeout : testHandshakeTimeout ,
1083+ Handler : f ,
1084+ IsClient : true ,
1085+ Name : "origin" ,
1086+ Logger : logger .NewOutputWriter (logger .NewMockWriteManager ()),
1087+ DefaultWindowSize : defaultWindowSize ,
1088+ MaxWindowSize : maxWindowSize ,
1089+ StreamWriteBufferMaxLen : defaultWriteBufferMaxLen ,
1090+ HeartbeatInterval : defaultTimeout ,
1091+ MaxHeartbeats : defaultRetries ,
1092+ },
1093+ OriginConn : origin ,
1094+ EdgeMuxConfig : MuxerConfig {
1095+ Timeout : testHandshakeTimeout ,
1096+ IsClient : false ,
1097+ Name : "edge" ,
1098+ Logger : logger .NewOutputWriter (logger .NewMockWriteManager ()),
1099+ DefaultWindowSize : defaultWindowSize ,
1100+ MaxWindowSize : maxWindowSize ,
1101+ StreamWriteBufferMaxLen : defaultWriteBufferMaxLen ,
1102+ HeartbeatInterval : defaultTimeout ,
1103+ MaxHeartbeats : defaultRetries ,
1104+ },
1105+ EdgeConn : edge ,
1106+ doneC : make (chan struct {}),
1107+ }
1108+ assert .NoError (b , muxPair .Handshake (name ))
1109+ muxPair .Serve (b )
1110+
1111+ b .ReportAllocs ()
1112+ for i := 0 ; i < b .N ; i ++ {
1113+ stream , err := muxPair .OpenEdgeMuxStream (
1114+ []Header {{Name : "test-header" , Value : "headerValue" }},
1115+ nil ,
1116+ )
1117+ if err != nil {
1118+ b .Fatalf ("error in OpenStream: %s" , err )
1119+ }
1120+ if len (stream .Headers ) != 1 {
1121+ b .Fatalf ("expected %d headers, got %d" , 1 , len (stream .Headers ))
1122+ }
1123+ if stream .Headers [0 ].Name != "response-header" {
1124+ b .Fatalf ("expected header name %s, got %s" , "response-header" , stream .Headers [0 ].Name )
1125+ }
1126+ if stream .Headers [0 ].Value != "responseValue" {
1127+ b .Fatalf ("expected header value %s, got %s" , "responseValue" , stream .Headers [0 ].Value )
1128+ }
1129+
1130+ for k := 0 ; k < readN ; k ++ {
1131+ n , err := io .ReadFull (stream , responseBody )
1132+ if err != nil {
1133+ b .Fatalf ("error from (*MuxedStream).Read: %s" , err )
1134+ }
1135+ if n != len (responseBody ) {
1136+ b .Fatalf ("expected response body to have %d bytes, got %d" , len (responseBody ), n )
1137+ }
1138+ }
1139+ }
1140+ }
0 commit comments