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.
 
 
 

335 lines
8.6 KiB

  1. // Copyright 2015 Google Inc. All rights reserved.
  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 fifo
  15. import (
  16. "errors"
  17. "fmt"
  18. "net/http"
  19. "reflect"
  20. "testing"
  21. "github.com/google/martian"
  22. "github.com/google/martian/martiantest"
  23. "github.com/google/martian/parse"
  24. "github.com/google/martian/proxyutil"
  25. "github.com/google/martian/verify"
  26. _ "github.com/google/martian/header"
  27. )
  28. func TestGroupFromJSON(t *testing.T) {
  29. msg := []byte(`{
  30. "fifo.Group": {
  31. "scope": ["request", "response"],
  32. "aggregateErrors": true,
  33. "modifiers": [
  34. {
  35. "header.Modifier": {
  36. "scope": ["request", "response"],
  37. "name": "X-Testing",
  38. "value": "true"
  39. }
  40. },
  41. {
  42. "header.Modifier": {
  43. "scope": ["request", "response"],
  44. "name": "Y-Testing",
  45. "value": "true"
  46. }
  47. }
  48. ]
  49. }
  50. }`)
  51. r, err := parse.FromJSON(msg)
  52. if err != nil {
  53. t.Fatalf("parse.FromJSON(): got %v, want no error", err)
  54. }
  55. reqmod := r.RequestModifier()
  56. if reqmod == nil {
  57. t.Fatal("reqmod: got nil, want not nil")
  58. }
  59. req, err := http.NewRequest("GET", "http://example.com", nil)
  60. if err != nil {
  61. t.Fatalf("http.NewRequest(): got %v, want no error", err)
  62. }
  63. if err := reqmod.ModifyRequest(req); err != nil {
  64. t.Fatalf("ModifyRequest(): got %v, want no error", err)
  65. }
  66. if got, want := req.Header.Get("X-Testing"), "true"; got != want {
  67. t.Errorf("req.Header.Get(%q): got %q, want %q", "X-Testing", got, want)
  68. }
  69. if got, want := req.Header.Get("Y-Testing"), "true"; got != want {
  70. t.Errorf("req.Header.Get(%q): got %q, want %q", "Y-Testing", got, want)
  71. }
  72. resmod := r.ResponseModifier()
  73. if resmod == nil {
  74. t.Fatal("resmod: got nil, want not nil")
  75. }
  76. res := proxyutil.NewResponse(200, nil, req)
  77. if err := resmod.ModifyResponse(res); err != nil {
  78. t.Fatalf("ModifyResponse(): got %v, want no error", err)
  79. }
  80. if got, want := res.Header.Get("X-Testing"), "true"; got != want {
  81. t.Errorf("res.Header.Get(%q): got %q, want %q", "X-Testing", got, want)
  82. }
  83. if got, want := res.Header.Get("Y-Testing"), "true"; got != want {
  84. t.Errorf("res.Header.Get(%q): got %q, want %q", "Y-Testing", got, want)
  85. }
  86. }
  87. func TestModifyRequest(t *testing.T) {
  88. fg := NewGroup()
  89. tm := martiantest.NewModifier()
  90. fg.AddRequestModifier(tm)
  91. req, err := http.NewRequest("GET", "/", nil)
  92. if err != nil {
  93. t.Fatalf("http.NewRequest(): got %v, want no error", err)
  94. }
  95. if err := fg.ModifyRequest(req); err != nil {
  96. t.Fatalf("fg.ModifyRequest(): got %v, want no error", err)
  97. }
  98. if !tm.RequestModified() {
  99. t.Error("tm.RequestModified(): got false, want true")
  100. }
  101. }
  102. func TestModifyRequestHaltsOnError(t *testing.T) {
  103. fg := NewGroup()
  104. reqerr := errors.New("request error")
  105. tm := martiantest.NewModifier()
  106. tm.RequestError(reqerr)
  107. fg.AddRequestModifier(tm)
  108. tm2 := martiantest.NewModifier()
  109. fg.AddRequestModifier(tm2)
  110. req, err := http.NewRequest("GET", "http://example.com/", nil)
  111. if err != nil {
  112. t.Fatalf("http.NewRequest(): got %v, want no error", err)
  113. }
  114. if err := fg.ModifyRequest(req); err != reqerr {
  115. t.Fatalf("fg.ModifyRequest(): got %v, want %v", err, reqerr)
  116. }
  117. if tm2.RequestModified() {
  118. t.Error("tm2.RequestModified(): got true, want false")
  119. }
  120. }
  121. func TestModifyRequestAggregatesErrors(t *testing.T) {
  122. fg := NewGroup()
  123. fg.SetAggregateErrors(true)
  124. reqerr1 := errors.New("1. request error")
  125. tm := martiantest.NewModifier()
  126. tm.RequestError(reqerr1)
  127. fg.AddRequestModifier(tm)
  128. tm2 := martiantest.NewModifier()
  129. reqerr2 := errors.New("2. request error")
  130. tm2.RequestError(reqerr2)
  131. fg.AddRequestModifier(tm2)
  132. req, err := http.NewRequest("GET", "http://example.com/", nil)
  133. if err != nil {
  134. t.Fatalf("http.NewRequest(): got %v, want no error", err)
  135. }
  136. merr := martian.NewMultiError()
  137. merr.Add(reqerr1)
  138. merr.Add(reqerr2)
  139. if err := fg.ModifyRequest(req); err == nil {
  140. t.Fatalf("fg.ModifyRequest(): got %v, want not nil", err)
  141. }
  142. if err := fg.ModifyRequest(req); err.Error() != merr.Error() {
  143. t.Fatalf("fg.ModifyRequest(): got %v, want %v", err, merr)
  144. }
  145. if err, want := fg.ModifyRequest(req), "1. request error\n2. request error"; err.Error() != want {
  146. t.Fatalf("fg.ModifyRequest(): got %v, want %v", err, want)
  147. }
  148. }
  149. func TestModifyResponse(t *testing.T) {
  150. fg := NewGroup()
  151. tm := martiantest.NewModifier()
  152. fg.AddResponseModifier(tm)
  153. res := proxyutil.NewResponse(200, nil, nil)
  154. if err := fg.ModifyResponse(res); err != nil {
  155. t.Fatalf("fg.ModifyResponse(): got %v, want no error", err)
  156. }
  157. if !tm.ResponseModified() {
  158. t.Error("tm.ResponseModified(): got false, want true")
  159. }
  160. }
  161. func TestModifyResponseHaltsOnError(t *testing.T) {
  162. fg := NewGroup()
  163. reserr := errors.New("request error")
  164. tm := martiantest.NewModifier()
  165. tm.ResponseError(reserr)
  166. fg.AddResponseModifier(tm)
  167. tm2 := martiantest.NewModifier()
  168. fg.AddResponseModifier(tm2)
  169. res := proxyutil.NewResponse(200, nil, nil)
  170. if err := fg.ModifyResponse(res); err != reserr {
  171. t.Fatalf("fg.ModifyResponse(): got %v, want %v", err, reserr)
  172. }
  173. if tm2.ResponseModified() {
  174. t.Error("tm2.ResponseModified(): got true, want false")
  175. }
  176. }
  177. func TestModifyResponseAggregatesErrors(t *testing.T) {
  178. fg := NewGroup()
  179. fg.SetAggregateErrors(true)
  180. reserr1 := errors.New("1. response error")
  181. tm := martiantest.NewModifier()
  182. tm.ResponseError(reserr1)
  183. fg.AddResponseModifier(tm)
  184. tm2 := martiantest.NewModifier()
  185. reserr2 := errors.New("2. response error")
  186. tm2.ResponseError(reserr2)
  187. fg.AddResponseModifier(tm2)
  188. req, err := http.NewRequest("GET", "http://example.com/", nil)
  189. if err != nil {
  190. t.Fatalf("http.NewRequest(): got %v, want no error", err)
  191. }
  192. _, remove, err := martian.TestContext(req, nil, nil)
  193. if err != nil {
  194. t.Fatalf("TestContext(): got %v, want no error", err)
  195. }
  196. defer remove()
  197. res := proxyutil.NewResponse(200, nil, req)
  198. merr := martian.NewMultiError()
  199. merr.Add(reserr1)
  200. merr.Add(reserr2)
  201. if err := fg.ModifyResponse(res); err == nil {
  202. t.Fatalf("fg.ModifyResponse(): got %v, want %v", err, merr)
  203. }
  204. if err := fg.ModifyResponse(res); err.Error() != merr.Error() {
  205. t.Fatalf("fg.ModifyResponse(): got %v, want %v", err, merr)
  206. }
  207. }
  208. func TestVerifyRequests(t *testing.T) {
  209. fg := NewGroup()
  210. if err := fg.VerifyRequests(); err != nil {
  211. t.Fatalf("VerifyRequest(): got %v, want no error", err)
  212. }
  213. errs := []error{}
  214. for i := 0; i < 3; i++ {
  215. err := fmt.Errorf("%d. verify request failure", i)
  216. tv := &verify.TestVerifier{
  217. RequestError: err,
  218. }
  219. fg.AddRequestModifier(tv)
  220. errs = append(errs, err)
  221. }
  222. merr, ok := fg.VerifyRequests().(*martian.MultiError)
  223. if !ok {
  224. t.Fatal("VerifyRequests(): got nil, want *verify.MultiError")
  225. }
  226. if !reflect.DeepEqual(merr.Errors(), errs) {
  227. t.Errorf("merr.Errors(): got %v, want %v", merr.Errors(), errs)
  228. }
  229. }
  230. func TestVerifyResponses(t *testing.T) {
  231. fg := NewGroup()
  232. if err := fg.VerifyResponses(); err != nil {
  233. t.Fatalf("VerifyResponses(): got %v, want no error", err)
  234. }
  235. errs := []error{}
  236. for i := 0; i < 3; i++ {
  237. err := fmt.Errorf("%d. verify responses failure", i)
  238. tv := &verify.TestVerifier{
  239. ResponseError: err,
  240. }
  241. fg.AddResponseModifier(tv)
  242. errs = append(errs, err)
  243. }
  244. merr, ok := fg.VerifyResponses().(*martian.MultiError)
  245. if !ok {
  246. t.Fatal("VerifyResponses(): got nil, want *verify.MultiError")
  247. }
  248. if !reflect.DeepEqual(merr.Errors(), errs) {
  249. t.Errorf("merr.Errors(): got %v, want %v", merr.Errors(), errs)
  250. }
  251. }
  252. func TestResets(t *testing.T) {
  253. fg := NewGroup()
  254. for i := 0; i < 3; i++ {
  255. tv := &verify.TestVerifier{
  256. RequestError: fmt.Errorf("%d. verify request error", i),
  257. ResponseError: fmt.Errorf("%d. verify response error", i),
  258. }
  259. fg.AddRequestModifier(tv)
  260. fg.AddResponseModifier(tv)
  261. }
  262. if err := fg.VerifyRequests(); err == nil {
  263. t.Fatal("VerifyRequests(): got nil, want error")
  264. }
  265. if err := fg.VerifyResponses(); err == nil {
  266. t.Fatal("VerifyResponses(): got nil, want error")
  267. }
  268. fg.ResetRequestVerifications()
  269. fg.ResetResponseVerifications()
  270. if err := fg.VerifyRequests(); err != nil {
  271. t.Errorf("VerifyRequests(): got %v, want no error", err)
  272. }
  273. if err := fg.VerifyResponses(); err != nil {
  274. t.Errorf("VerifyResponses(): got %v, want no error", err)
  275. }
  276. }