You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

211 lines
6.7 KiB

  1. // Copyright 2018, OpenCensus Authors
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package b3
  15. import (
  16. "net/http"
  17. "reflect"
  18. "testing"
  19. "go.opencensus.io/trace"
  20. )
  21. func TestHTTPFormat_FromRequest(t *testing.T) {
  22. tests := []struct {
  23. name string
  24. makeReq func() *http.Request
  25. wantSc trace.SpanContext
  26. wantOk bool
  27. }{
  28. {
  29. name: "128-bit trace ID + 64-bit span ID; sampled=1",
  30. makeReq: func() *http.Request {
  31. req, _ := http.NewRequest("GET", "http://example.com", nil)
  32. req.Header.Set(TraceIDHeader, "463ac35c9f6413ad48485a3953bb6124")
  33. req.Header.Set(SpanIDHeader, "0020000000000001")
  34. req.Header.Set(SampledHeader, "1")
  35. return req
  36. },
  37. wantSc: trace.SpanContext{
  38. TraceID: trace.TraceID{70, 58, 195, 92, 159, 100, 19, 173, 72, 72, 90, 57, 83, 187, 97, 36},
  39. SpanID: trace.SpanID{0, 32, 0, 0, 0, 0, 0, 1},
  40. TraceOptions: trace.TraceOptions(1),
  41. },
  42. wantOk: true,
  43. },
  44. {
  45. name: "short trace ID + short span ID; sampled=1",
  46. makeReq: func() *http.Request {
  47. req, _ := http.NewRequest("GET", "http://example.com", nil)
  48. req.Header.Set(TraceIDHeader, "000102")
  49. req.Header.Set(SpanIDHeader, "000102")
  50. req.Header.Set(SampledHeader, "1")
  51. return req
  52. },
  53. wantSc: trace.SpanContext{
  54. TraceID: trace.TraceID{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2},
  55. SpanID: trace.SpanID{0, 0, 0, 0, 0, 0, 1, 2},
  56. TraceOptions: trace.TraceOptions(1),
  57. },
  58. wantOk: true,
  59. },
  60. {
  61. name: "64-bit trace ID + 64-bit span ID; sampled=0",
  62. makeReq: func() *http.Request {
  63. req, _ := http.NewRequest("GET", "http://example.com", nil)
  64. req.Header.Set(TraceIDHeader, "0020000000000001")
  65. req.Header.Set(SpanIDHeader, "0020000000000001")
  66. req.Header.Set(SampledHeader, "0")
  67. return req
  68. },
  69. wantSc: trace.SpanContext{
  70. TraceID: trace.TraceID{0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 1},
  71. SpanID: trace.SpanID{0, 32, 0, 0, 0, 0, 0, 1},
  72. TraceOptions: trace.TraceOptions(0),
  73. },
  74. wantOk: true,
  75. },
  76. {
  77. name: "128-bit trace ID + 64-bit span ID; no sampling header",
  78. makeReq: func() *http.Request {
  79. req, _ := http.NewRequest("GET", "http://example.com", nil)
  80. req.Header.Set(TraceIDHeader, "463ac35c9f6413ad48485a3953bb6124")
  81. req.Header.Set(SpanIDHeader, "0020000000000001")
  82. return req
  83. },
  84. wantSc: trace.SpanContext{
  85. TraceID: trace.TraceID{70, 58, 195, 92, 159, 100, 19, 173, 72, 72, 90, 57, 83, 187, 97, 36},
  86. SpanID: trace.SpanID{0, 32, 0, 0, 0, 0, 0, 1},
  87. TraceOptions: trace.TraceOptions(0),
  88. },
  89. wantOk: true,
  90. },
  91. {
  92. name: "invalid trace ID + 64-bit span ID; no sampling header",
  93. makeReq: func() *http.Request {
  94. req, _ := http.NewRequest("GET", "http://example.com", nil)
  95. req.Header.Set(TraceIDHeader, "")
  96. req.Header.Set(SpanIDHeader, "0020000000000001")
  97. return req
  98. },
  99. wantSc: trace.SpanContext{},
  100. wantOk: false,
  101. },
  102. {
  103. name: "128-bit trace ID; invalid span ID; no sampling header",
  104. makeReq: func() *http.Request {
  105. req, _ := http.NewRequest("GET", "http://example.com", nil)
  106. req.Header.Set(TraceIDHeader, "463ac35c9f6413ad48485a3953bb6124")
  107. req.Header.Set(SpanIDHeader, "")
  108. return req
  109. },
  110. wantSc: trace.SpanContext{},
  111. wantOk: false,
  112. },
  113. {
  114. name: "128-bit trace ID + 64-bit span ID; sampled=true",
  115. makeReq: func() *http.Request {
  116. req, _ := http.NewRequest("GET", "http://example.com", nil)
  117. req.Header.Set(TraceIDHeader, "463ac35c9f6413ad48485a3953bb6124")
  118. req.Header.Set(SpanIDHeader, "0020000000000001")
  119. req.Header.Set(SampledHeader, "true")
  120. return req
  121. },
  122. wantSc: trace.SpanContext{
  123. TraceID: trace.TraceID{70, 58, 195, 92, 159, 100, 19, 173, 72, 72, 90, 57, 83, 187, 97, 36},
  124. SpanID: trace.SpanID{0, 32, 0, 0, 0, 0, 0, 1},
  125. TraceOptions: trace.TraceOptions(1),
  126. },
  127. wantOk: true,
  128. },
  129. {
  130. name: "128-bit trace ID + 64-bit span ID; sampled=false",
  131. makeReq: func() *http.Request {
  132. req, _ := http.NewRequest("GET", "http://example.com", nil)
  133. req.Header.Set(TraceIDHeader, "463ac35c9f6413ad48485a3953bb6124")
  134. req.Header.Set(SpanIDHeader, "0020000000000001")
  135. req.Header.Set(SampledHeader, "false")
  136. return req
  137. },
  138. wantSc: trace.SpanContext{
  139. TraceID: trace.TraceID{70, 58, 195, 92, 159, 100, 19, 173, 72, 72, 90, 57, 83, 187, 97, 36},
  140. SpanID: trace.SpanID{0, 32, 0, 0, 0, 0, 0, 1},
  141. TraceOptions: trace.TraceOptions(0),
  142. },
  143. wantOk: true,
  144. },
  145. }
  146. for _, tt := range tests {
  147. t.Run(tt.name, func(t *testing.T) {
  148. f := &HTTPFormat{}
  149. sc, ok := f.SpanContextFromRequest(tt.makeReq())
  150. if ok != tt.wantOk {
  151. t.Errorf("HTTPFormat.SpanContextFromRequest() got ok = %v, want %v", ok, tt.wantOk)
  152. }
  153. if !reflect.DeepEqual(sc, tt.wantSc) {
  154. t.Errorf("HTTPFormat.SpanContextFromRequest() got span context = %v, want %v", sc, tt.wantSc)
  155. }
  156. })
  157. }
  158. }
  159. func TestHTTPFormat_ToRequest(t *testing.T) {
  160. tests := []struct {
  161. name string
  162. sc trace.SpanContext
  163. wantHeaders map[string]string
  164. }{
  165. {
  166. name: "valid traceID, header ID, sampled=1",
  167. sc: trace.SpanContext{
  168. TraceID: trace.TraceID{70, 58, 195, 92, 159, 100, 19, 173, 72, 72, 90, 57, 83, 187, 97, 36},
  169. SpanID: trace.SpanID{0, 32, 0, 0, 0, 0, 0, 1},
  170. TraceOptions: trace.TraceOptions(1),
  171. },
  172. wantHeaders: map[string]string{
  173. "X-B3-TraceId": "463ac35c9f6413ad48485a3953bb6124",
  174. "X-B3-SpanId": "0020000000000001",
  175. "X-B3-Sampled": "1",
  176. },
  177. },
  178. {
  179. name: "valid traceID, header ID, sampled=0",
  180. sc: trace.SpanContext{
  181. TraceID: trace.TraceID{70, 58, 195, 92, 159, 100, 19, 173, 72, 72, 90, 57, 83, 187, 97, 36},
  182. SpanID: trace.SpanID{0, 32, 0, 0, 0, 0, 0, 1},
  183. TraceOptions: trace.TraceOptions(0),
  184. },
  185. wantHeaders: map[string]string{
  186. "X-B3-TraceId": "463ac35c9f6413ad48485a3953bb6124",
  187. "X-B3-SpanId": "0020000000000001",
  188. "X-B3-Sampled": "0",
  189. },
  190. },
  191. }
  192. for _, tt := range tests {
  193. t.Run(tt.name, func(t *testing.T) {
  194. f := &HTTPFormat{}
  195. req, _ := http.NewRequest("GET", "http://example.com", nil)
  196. f.SpanContextToRequest(tt.sc, req)
  197. for k, v := range tt.wantHeaders {
  198. if got, want := req.Header.Get(k), v; got != want {
  199. t.Errorf("req.Header.Get(%q) = %q; want %q", k, got, want)
  200. }
  201. }
  202. })
  203. }
  204. }