1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package v3rpc
16
17 import (
18 "bytes"
19 "math"
20 "testing"
21
22 pb "go.etcd.io/etcd/api/v3/etcdserverpb"
23 "go.etcd.io/etcd/api/v3/mvccpb"
24 )
25
26 func TestSendFragment(t *testing.T) {
27 tt := []struct {
28 wr *pb.WatchResponse
29 maxRequestBytes int
30 fragments int
31 werr error
32 }{
33 {
34 wr: createResponse(100, 1),
35 maxRequestBytes: math.MaxInt32,
36 fragments: 1,
37 },
38 {
39 wr: createResponse(10, 2),
40 maxRequestBytes: 50,
41 fragments: 1,
42 },
43 {
44 wr: createResponse(1024, 1),
45 maxRequestBytes: 1,
46 fragments: 1,
47 },
48 {
49 wr: createResponse(11, 5),
50 maxRequestBytes: 20,
51 fragments: 5,
52 },
53 {
54 wr: createResponse(15, 5),
55 maxRequestBytes: 10,
56 fragments: 5,
57 },
58 {
59 wr: createResponse(10, 4),
60 maxRequestBytes: 35,
61 fragments: 2,
62 },
63 }
64
65 for i := range tt {
66 fragmentedResp := make([]*pb.WatchResponse, 0)
67 testSend := func(wr *pb.WatchResponse) error {
68 fragmentedResp = append(fragmentedResp, wr)
69 return nil
70 }
71 err := sendFragments(tt[i].wr, tt[i].maxRequestBytes, testSend)
72 if err != tt[i].werr {
73 t.Errorf("#%d: expected error %v, got %v", i, tt[i].werr, err)
74 }
75 got := len(fragmentedResp)
76 if got != tt[i].fragments {
77 t.Errorf("#%d: expected response number %d, got %d", i, tt[i].fragments, got)
78 }
79 if got > 0 && fragmentedResp[got-1].Fragment {
80 t.Errorf("#%d: expected fragment=false in last response, got %+v", i, fragmentedResp[got-1])
81 }
82 }
83 }
84
85 func createResponse(dataSize, events int) (resp *pb.WatchResponse) {
86 resp = &pb.WatchResponse{Events: make([]*mvccpb.Event, events)}
87 for i := range resp.Events {
88 resp.Events[i] = &mvccpb.Event{
89 Kv: &mvccpb.KeyValue{
90 Key: bytes.Repeat([]byte("a"), dataSize),
91 },
92 }
93 }
94 return resp
95 }
96
View as plain text