1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package b3
16
17 import (
18 "net/http"
19 "reflect"
20 "testing"
21
22 "go.opencensus.io/trace"
23 )
24
25 func TestHTTPFormat_FromRequest(t *testing.T) {
26 tests := []struct {
27 name string
28 makeReq func() *http.Request
29 wantSc trace.SpanContext
30 wantOk bool
31 }{
32 {
33 name: "128-bit trace ID + 64-bit span ID; sampled=1",
34 makeReq: func() *http.Request {
35 req, _ := http.NewRequest("GET", "http://example.com", nil)
36 req.Header.Set(TraceIDHeader, "463ac35c9f6413ad48485a3953bb6124")
37 req.Header.Set(SpanIDHeader, "0020000000000001")
38 req.Header.Set(SampledHeader, "1")
39 return req
40 },
41 wantSc: trace.SpanContext{
42 TraceID: trace.TraceID{70, 58, 195, 92, 159, 100, 19, 173, 72, 72, 90, 57, 83, 187, 97, 36},
43 SpanID: trace.SpanID{0, 32, 0, 0, 0, 0, 0, 1},
44 TraceOptions: trace.TraceOptions(1),
45 },
46 wantOk: true,
47 },
48 {
49 name: "short trace ID + short span ID; sampled=1",
50 makeReq: func() *http.Request {
51 req, _ := http.NewRequest("GET", "http://example.com", nil)
52 req.Header.Set(TraceIDHeader, "000102")
53 req.Header.Set(SpanIDHeader, "000102")
54 req.Header.Set(SampledHeader, "1")
55 return req
56 },
57 wantSc: trace.SpanContext{
58 TraceID: trace.TraceID{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2},
59 SpanID: trace.SpanID{0, 0, 0, 0, 0, 0, 1, 2},
60 TraceOptions: trace.TraceOptions(1),
61 },
62 wantOk: true,
63 },
64 {
65 name: "64-bit trace ID + 64-bit span ID; sampled=0",
66 makeReq: func() *http.Request {
67 req, _ := http.NewRequest("GET", "http://example.com", nil)
68 req.Header.Set(TraceIDHeader, "0020000000000001")
69 req.Header.Set(SpanIDHeader, "0020000000000001")
70 req.Header.Set(SampledHeader, "0")
71 return req
72 },
73 wantSc: trace.SpanContext{
74 TraceID: trace.TraceID{0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 1},
75 SpanID: trace.SpanID{0, 32, 0, 0, 0, 0, 0, 1},
76 TraceOptions: trace.TraceOptions(0),
77 },
78 wantOk: true,
79 },
80 {
81 name: "128-bit trace ID + 64-bit span ID; no sampling header",
82 makeReq: func() *http.Request {
83 req, _ := http.NewRequest("GET", "http://example.com", nil)
84 req.Header.Set(TraceIDHeader, "463ac35c9f6413ad48485a3953bb6124")
85 req.Header.Set(SpanIDHeader, "0020000000000001")
86 return req
87 },
88 wantSc: trace.SpanContext{
89 TraceID: trace.TraceID{70, 58, 195, 92, 159, 100, 19, 173, 72, 72, 90, 57, 83, 187, 97, 36},
90 SpanID: trace.SpanID{0, 32, 0, 0, 0, 0, 0, 1},
91 TraceOptions: trace.TraceOptions(0),
92 },
93 wantOk: true,
94 },
95 {
96 name: "invalid trace ID + 64-bit span ID; no sampling header",
97 makeReq: func() *http.Request {
98 req, _ := http.NewRequest("GET", "http://example.com", nil)
99 req.Header.Set(TraceIDHeader, "")
100 req.Header.Set(SpanIDHeader, "0020000000000001")
101 return req
102 },
103 wantSc: trace.SpanContext{},
104 wantOk: false,
105 },
106 {
107 name: "invalid >128-bit trace ID + 64-bit span ID; no sampling header",
108 makeReq: func() *http.Request {
109 req, _ := http.NewRequest("GET", "http://example.com", nil)
110 req.Header.Set(TraceIDHeader, "0020000000000001002000000000000111")
111 req.Header.Set(SpanIDHeader, "0020000000000001")
112 return req
113 },
114 wantSc: trace.SpanContext{},
115 wantOk: false,
116 },
117 {
118 name: "128-bit trace ID; invalid span ID; no sampling header",
119 makeReq: func() *http.Request {
120 req, _ := http.NewRequest("GET", "http://example.com", nil)
121 req.Header.Set(TraceIDHeader, "463ac35c9f6413ad48485a3953bb6124")
122 req.Header.Set(SpanIDHeader, "")
123 return req
124 },
125 wantSc: trace.SpanContext{},
126 wantOk: false,
127 },
128 {
129 name: "128-bit trace ID; invalid >64 bit span ID; no sampling header",
130 makeReq: func() *http.Request {
131 req, _ := http.NewRequest("GET", "http://example.com", nil)
132 req.Header.Set(TraceIDHeader, "463ac35c9f6413ad48485a3953bb6124")
133 req.Header.Set(SpanIDHeader, "002000000000000111")
134 return req
135 },
136 wantSc: trace.SpanContext{},
137 wantOk: false,
138 },
139 {
140 name: "128-bit trace ID + 64-bit span ID; sampled=true",
141 makeReq: func() *http.Request {
142 req, _ := http.NewRequest("GET", "http://example.com", nil)
143 req.Header.Set(TraceIDHeader, "463ac35c9f6413ad48485a3953bb6124")
144 req.Header.Set(SpanIDHeader, "0020000000000001")
145 req.Header.Set(SampledHeader, "true")
146 return req
147 },
148 wantSc: trace.SpanContext{
149 TraceID: trace.TraceID{70, 58, 195, 92, 159, 100, 19, 173, 72, 72, 90, 57, 83, 187, 97, 36},
150 SpanID: trace.SpanID{0, 32, 0, 0, 0, 0, 0, 1},
151 TraceOptions: trace.TraceOptions(1),
152 },
153 wantOk: true,
154 },
155 {
156 name: "128-bit trace ID + 64-bit span ID; sampled=false",
157 makeReq: func() *http.Request {
158 req, _ := http.NewRequest("GET", "http://example.com", nil)
159 req.Header.Set(TraceIDHeader, "463ac35c9f6413ad48485a3953bb6124")
160 req.Header.Set(SpanIDHeader, "0020000000000001")
161 req.Header.Set(SampledHeader, "false")
162 return req
163 },
164 wantSc: trace.SpanContext{
165 TraceID: trace.TraceID{70, 58, 195, 92, 159, 100, 19, 173, 72, 72, 90, 57, 83, 187, 97, 36},
166 SpanID: trace.SpanID{0, 32, 0, 0, 0, 0, 0, 1},
167 TraceOptions: trace.TraceOptions(0),
168 },
169 wantOk: true,
170 },
171 }
172 for _, tt := range tests {
173 t.Run(tt.name, func(t *testing.T) {
174 f := &HTTPFormat{}
175 sc, ok := f.SpanContextFromRequest(tt.makeReq())
176 if ok != tt.wantOk {
177 t.Errorf("HTTPFormat.SpanContextFromRequest() got ok = %v, want %v", ok, tt.wantOk)
178 }
179 if !reflect.DeepEqual(sc, tt.wantSc) {
180 t.Errorf("HTTPFormat.SpanContextFromRequest() got span context = %v, want %v", sc, tt.wantSc)
181 }
182 })
183 }
184 }
185
186 func TestHTTPFormat_ToRequest(t *testing.T) {
187 tests := []struct {
188 name string
189 sc trace.SpanContext
190 wantHeaders map[string]string
191 }{
192 {
193 name: "valid traceID, header ID, sampled=1",
194 sc: trace.SpanContext{
195 TraceID: trace.TraceID{70, 58, 195, 92, 159, 100, 19, 173, 72, 72, 90, 57, 83, 187, 97, 36},
196 SpanID: trace.SpanID{0, 32, 0, 0, 0, 0, 0, 1},
197 TraceOptions: trace.TraceOptions(1),
198 },
199 wantHeaders: map[string]string{
200 "X-B3-TraceId": "463ac35c9f6413ad48485a3953bb6124",
201 "X-B3-SpanId": "0020000000000001",
202 "X-B3-Sampled": "1",
203 },
204 },
205 {
206 name: "valid traceID, header ID, sampled=0",
207 sc: trace.SpanContext{
208 TraceID: trace.TraceID{70, 58, 195, 92, 159, 100, 19, 173, 72, 72, 90, 57, 83, 187, 97, 36},
209 SpanID: trace.SpanID{0, 32, 0, 0, 0, 0, 0, 1},
210 TraceOptions: trace.TraceOptions(0),
211 },
212 wantHeaders: map[string]string{
213 "X-B3-TraceId": "463ac35c9f6413ad48485a3953bb6124",
214 "X-B3-SpanId": "0020000000000001",
215 "X-B3-Sampled": "0",
216 },
217 },
218 }
219 for _, tt := range tests {
220 t.Run(tt.name, func(t *testing.T) {
221 f := &HTTPFormat{}
222 req, _ := http.NewRequest("GET", "http://example.com", nil)
223 f.SpanContextToRequest(tt.sc, req)
224
225 for k, v := range tt.wantHeaders {
226 if got, want := req.Header.Get(k), v; got != want {
227 t.Errorf("req.Header.Get(%q) = %q; want %q", k, got, want)
228 }
229 }
230 })
231 }
232 }
233
View as plain text