@@ -61,10 +61,17 @@ func (tc *testingClient) Test(ctx context.Context, req *internal.TestPayload) (*
6161}
6262
6363// testingServer is what would be implemented by the user of this package.
64- type testingServer struct {}
64+ type testingServer struct {
65+ echoOnce bool
66+ }
6567
6668func (s * testingServer ) Test (ctx context.Context , req * internal.TestPayload ) (* internal.TestPayload , error ) {
67- tp := & internal.TestPayload {Foo : strings .Repeat (req .Foo , 2 )}
69+ tp := & internal.TestPayload {}
70+ if s .echoOnce {
71+ tp .Foo = req .Foo
72+ } else {
73+ tp .Foo = strings .Repeat (req .Foo , 2 )
74+ }
6875 if dl , ok := ctx .Deadline (); ok {
6976 tp .Deadline = dl .UnixNano ()
7077 }
@@ -299,37 +306,122 @@ func TestServerClose(t *testing.T) {
299306}
300307
301308func TestOversizeCall (t * testing.T ) {
302- var (
303- ctx = context .Background ()
304- server = mustServer (t )(NewServer ())
305- addr , listener = newTestListener (t )
306- errs = make (chan error , 1 )
307- client , cleanup = newTestClient (t , addr )
308- )
309- defer cleanup ()
310- defer listener .Close ()
311- go func () {
312- errs <- server .Serve (ctx , listener )
313- }()
314-
315- registerTestingService (server , & testingServer {})
309+ type testCase struct {
310+ name string
311+ echoOnce bool
312+ clientLimit int
313+ serverLimit int
314+ requestSize int
315+ shouldFail bool
316+ }
317+
318+ runTest := func (t * testing.T , tc * testCase ) {
319+ var (
320+ ctx = context .Background ()
321+ server = mustServer (t )(NewServer (WithServerWireMessageLimit (tc .serverLimit )))
322+ addr , listener = newTestListener (t )
323+ errs = make (chan error , 1 )
324+ client , cleanup = newTestClient (t , addr , WithClientWireMessageLimit (tc .clientLimit ))
325+ )
326+ defer cleanup ()
327+ defer listener .Close ()
328+ go func () {
329+ errs <- server .Serve (ctx , listener )
330+ }()
331+
332+ registerTestingService (server , & testingServer {echoOnce : tc .echoOnce })
333+
334+ req := & internal.TestPayload {
335+ Foo : strings .Repeat ("a" , tc .requestSize ),
336+ }
337+ rsp := & internal.TestPayload {}
338+
339+ err := client .Call (ctx , serviceName , "Test" , req , rsp )
340+ if tc .shouldFail {
341+ if err == nil {
342+ t .Fatalf ("expected error from oversized message" )
343+ } else if status , ok := status .FromError (err ); ! ok {
344+ t .Fatalf ("expected status present in error: %v" , err )
345+ } else if status .Code () != codes .ResourceExhausted {
346+ t .Fatalf ("expected code: %v != %v" , status .Code (), codes .ResourceExhausted )
347+ }
348+ } else {
349+ if err != nil {
350+ t .Fatalf ("expected success, got error %v" , err )
351+ }
352+ }
316353
317- tp := & internal.TestPayload {
318- Foo : strings .Repeat ("a" , 1 + messageLengthMax ),
319- }
320- if err := client .Call (ctx , serviceName , "Test" , tp , tp ); err == nil {
321- t .Fatalf ("expected error from oversized message" )
322- } else if status , ok := status .FromError (err ); ! ok {
323- t .Fatalf ("expected status present in error: %v" , err )
324- } else if status .Code () != codes .ResourceExhausted {
325- t .Fatalf ("expected code: %v != %v" , status .Code (), codes .ResourceExhausted )
354+ if err := server .Shutdown (ctx ); err != nil {
355+ t .Fatal (err )
356+ }
357+ if err := <- errs ; err != ErrServerClosed {
358+ t .Fatal (err )
359+ }
326360 }
327361
328- if err := server .Shutdown (ctx ); err != nil {
329- t .Fatal (err )
330- }
331- if err := <- errs ; err != ErrServerClosed {
332- t .Fatal (err )
362+ // in principle min. marshalled Request{} + messageheaderLength == 29 would be enough
363+ overhead := 32
364+
365+ for _ , tc := range []* testCase {
366+ {
367+ name : "default limits, fitting request and response" ,
368+ echoOnce : true ,
369+ clientLimit : 0 ,
370+ serverLimit : 0 ,
371+ requestSize : messageLengthMax - overhead ,
372+ shouldFail : false ,
373+ },
374+ {
375+ name : "default limits, oversized request" ,
376+ echoOnce : true ,
377+ clientLimit : 0 ,
378+ serverLimit : 0 ,
379+ requestSize : messageLengthMax ,
380+ shouldFail : true ,
381+ },
382+ {
383+ name : "default limits, oversized response" ,
384+ clientLimit : 0 ,
385+ serverLimit : 0 ,
386+ requestSize : messageLengthMax / 2 ,
387+ shouldFail : true ,
388+ },
389+ {
390+ name : "8K limits, fitting 4K request and response" ,
391+ echoOnce : true ,
392+ clientLimit : 8 * 1024 ,
393+ serverLimit : 8 * 1024 ,
394+ requestSize : 4 * 1024 ,
395+ shouldFail : false ,
396+ },
397+ {
398+ name : "8K client limit, 4K server limit, fitting cc. 4K request and response" ,
399+ echoOnce : true ,
400+ clientLimit : 4 * 1024 ,
401+ serverLimit : 4 * 1024 ,
402+ requestSize : 4 * 1024 - overhead ,
403+ shouldFail : false ,
404+ },
405+ {
406+ name : "8K client limit, 4K server limit, non-fitting 4K response" ,
407+ echoOnce : true ,
408+ clientLimit : 4 * 1024 ,
409+ serverLimit : 4 * 1024 ,
410+ requestSize : 4 * 1024 ,
411+ shouldFail : true ,
412+ },
413+ {
414+ name : "too small limits, adjusted to minimum accepted limit" ,
415+ echoOnce : true ,
416+ clientLimit : 4 ,
417+ serverLimit : 4 ,
418+ requestSize : 4 * 1024 - overhead ,
419+ shouldFail : false ,
420+ },
421+ } {
422+ t .Run (tc .name , func (t * testing.T ) {
423+ runTest (t , tc )
424+ })
333425 }
334426}
335427
0 commit comments