forked from johanbrandhorst/protobuf
/
ping.go
146 lines (131 loc) · 3.75 KB
/
ping.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package shared
import (
"context"
"fmt"
"strings"
"github.com/pkg/errors"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/metadata"
)
func testPing(client TestClient, req *Request) error {
headers, trailers := metadata.MD{}, metadata.MD{}
ctx := context.Background()
if req.CheckMetadata {
ctx = metadata.NewOutgoingContext(ctx, metadata.Pairs(ClientMDTestKey, ClientMDTestValue))
}
resp, err := client.Ping(ctx, req, &headers, &trailers)
if err != nil {
return unexpectedError("Ping", err)
}
if resp.Value != req.Value {
return reportError("response value", resp.Value, req.Value)
}
if resp.Counter != req.ResponseCount {
return reportError("response counter", resp.Counter, req.ResponseCount)
}
if req.SendHeaders {
for header, value := range map[string]string{
ServerMDTestKey1: ServerMDTestValue1,
ServerMDTestKey2: ServerMDTestValue2,
} {
if values, ok := headers[strings.ToLower(header)]; !ok {
return reportError("header", headers, header)
} else if len(values) != 1 || values[0] != value {
return reportError("header value", values, value)
}
}
} else {
for _, header := range []string{ServerMDTestKey1, ServerMDTestKey2} {
_, ok := headers[header]
if ok {
return reportError("unexpected header", headers[ServerMDTestKey1], "")
}
}
}
if req.SendTrailers {
for trailer, value := range map[string]string{
ServerTrailerTestKey1: ServerMDTestValue1,
ServerTrailerTestKey2: ServerMDTestValue2,
} {
if values, ok := trailers[strings.ToLower(trailer)]; !ok {
return reportError("trailer", trailers, trailer)
} else if len(values) != 1 || values[0] != value {
return reportError("trailer value", values, value)
}
}
} else {
for _, trailer := range []string{ServerMDTestKey1, ServerMDTestKey2} {
_, ok := trailers[trailer]
if ok {
return reportError("unexpected trailer", trailers[ServerMDTestKey1], "")
}
}
}
return nil
}
func testPingError(client TestClient, req *Request, getStatus func(error) (codes.Code, string)) error {
err := client.PingError(context.Background(), req)
if err == nil {
return errors.Errorf("Got nil error, expected non-nil")
}
code, message := getStatus(err)
if code != codes.Code(req.ErrorCodeReturned) {
fmt.Println(message)
return reportError("code", code, codes.Code(req.ErrorCodeReturned))
}
// Message differs when connection is severed - this is OK
if req.FailureType != DROP {
if message != req.Value {
return reportError("message", message, req.Value)
}
}
return nil
}
func TestPing(client TestClient, getStatus func(error) (codes.Code, string)) error {
err := testPing(client, &Request{
Value: "test",
ResponseCount: 1,
SendHeaders: true,
SendTrailers: true,
})
if err != nil {
return errors.WithMessage(err, "send headers and trailers")
}
err = testPing(client, &Request{
Value: "test",
ResponseCount: 1,
SendHeaders: true,
})
if err != nil {
return errors.WithMessage(err, "send headers only")
}
err = testPing(client, &Request{
Value: "test",
ResponseCount: 1,
SendTrailers: true,
})
if err != nil {
return errors.WithMessage(err, "send trailer only")
}
err = testPing(client, &Request{
Value: "test",
ResponseCount: 1,
})
if err != nil {
return errors.WithMessage(err, "send neither header or trailer")
}
req := &Request{
Value: "test",
ResponseCount: 1,
FailureType: CODE,
ErrorCodeReturned: uint32(codes.DataLoss),
}
err = testPingError(client, req, getStatus)
if err != nil {
return errors.WithMessage(err, "trigger return code")
}
req.FailureType = DROP
req.ErrorCodeReturned = uint32(codes.Unknown)
req.Value = ""
return errors.WithMessage(testPingError(client, req, getStatus), "trigger network error")
}