Skip to content

Commit e61baa0

Browse files
committed
{channel,server}_test: add tests for message limits.
Adjust unit test to accomodate for altered internal interfaces. Add unit tests to exercise the new message size limit options. Signed-off-by: Krisztian Litkey <krisztian.litkey@intel.com>
1 parent 0753662 commit e61baa0

2 files changed

Lines changed: 125 additions & 33 deletions

File tree

channel_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ import (
3131
func TestReadWriteMessage(t *testing.T) {
3232
var (
3333
w, r = net.Pipe()
34-
ch = newChannel(w)
35-
rch = newChannel(r)
34+
ch = newChannel(w, 0)
35+
rch = newChannel(r, 0)
3636
messages = [][]byte{
3737
[]byte("hello"),
3838
[]byte("this is a test"),
@@ -90,7 +90,7 @@ func TestReadWriteMessage(t *testing.T) {
9090
func TestMessageOversize(t *testing.T) {
9191
var (
9292
w, r = net.Pipe()
93-
wch, rch = newChannel(w), newChannel(r)
93+
wch, rch = newChannel(w, 0), newChannel(r, 0)
9494
msg = bytes.Repeat([]byte("a message of massive length"), 512<<10)
9595
errs = make(chan error, 1)
9696
)

server_test.go

Lines changed: 122 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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

6668
func (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

301308
func 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

Comments
 (0)