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.
 
 
 

174 lines
4.8 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 martianurl
  15. import (
  16. "net/http"
  17. "net/url"
  18. "testing"
  19. "github.com/google/martian"
  20. "github.com/google/martian/parse"
  21. "github.com/google/martian/verify"
  22. )
  23. func TestVerifyRequests(t *testing.T) {
  24. u := &url.URL{
  25. Scheme: "https",
  26. Host: "*.example.com",
  27. Path: "/test",
  28. RawQuery: "testing=true",
  29. Fragment: "test",
  30. }
  31. v := NewVerifier(u)
  32. tt := []struct {
  33. got, want string
  34. }{
  35. {
  36. got: "http://www.example.com/test?testing=true#test",
  37. want: `request(http://www.example.com/test?testing=true#test) url verify failure:
  38. Scheme: got "http", want "https"`,
  39. },
  40. {
  41. got: "http://www.martian.test/test?testing=true#test",
  42. want: `request(http://www.martian.test/test?testing=true#test) url verify failure:
  43. Scheme: got "http", want "https"
  44. Host: got "www.martian.test", want "*.example.com"`,
  45. },
  46. {
  47. got: "http://www.martian.test/prod?testing=true#test",
  48. want: `request(http://www.martian.test/prod?testing=true#test) url verify failure:
  49. Scheme: got "http", want "https"
  50. Host: got "www.martian.test", want "*.example.com"
  51. Path: got "/prod", want "/test"`,
  52. },
  53. {
  54. got: "http://www.martian.test/prod#test",
  55. want: `request(http://www.martian.test/prod#test) url verify failure:
  56. Scheme: got "http", want "https"
  57. Host: got "www.martian.test", want "*.example.com"
  58. Path: got "/prod", want "/test"
  59. Query: got "", want "testing=true"`,
  60. },
  61. {
  62. got: "http://www.martian.test/prod#fake",
  63. want: `request(http://www.martian.test/prod#fake) url verify failure:
  64. Scheme: got "http", want "https"
  65. Host: got "www.martian.test", want "*.example.com"
  66. Path: got "/prod", want "/test"
  67. Query: got "", want "testing=true"
  68. Fragment: got "fake", want "test"`,
  69. },
  70. }
  71. for i, tc := range tt {
  72. req, err := http.NewRequest("GET", tc.got, nil)
  73. if err != nil {
  74. t.Fatalf("%d. http.NewRequest(..., %s, ...): got %v, want no error", i, tc.got, err)
  75. }
  76. _, remove, err := martian.TestContext(req, nil, nil)
  77. if err != nil {
  78. t.Fatalf("TestContext(): got %v, want no error", err)
  79. }
  80. defer remove()
  81. if err := v.ModifyRequest(req); err != nil {
  82. t.Fatalf("%d. ModifyRequest(): got %v, want no error", i, err)
  83. }
  84. }
  85. merr, ok := v.VerifyRequests().(*martian.MultiError)
  86. if !ok {
  87. t.Fatal("VerifyRequests(): got nil, want *verify.MultiError")
  88. }
  89. errs := merr.Errors()
  90. if got, want := len(errs), len(tt); got != want {
  91. t.Fatalf("len(merr.Errors()): got %d, want %d", got, want)
  92. }
  93. for i, tc := range tt {
  94. if got, want := errs[i].Error(), tc.want; got != want {
  95. t.Errorf("%d. err.Error(): mismatched error output\ngot: %s\nwant: %s", i, got, want)
  96. }
  97. }
  98. v.ResetRequestVerifications()
  99. // A valid request.
  100. req, err := http.NewRequest("GET", "https://www.example.com/test?testing=true#test", nil)
  101. if err != nil {
  102. t.Fatalf("http.NewRequest(): got %v, want no error", err)
  103. }
  104. _, remove, err := martian.TestContext(req, nil, nil)
  105. if err != nil {
  106. t.Fatalf("TestContext(): got %v, want no error", err)
  107. }
  108. defer remove()
  109. if err := v.ModifyRequest(req); err != nil {
  110. t.Fatalf("ModifyRequest(): got %v, want no error", err)
  111. }
  112. if err := v.VerifyRequests(); err != nil {
  113. t.Errorf("VerifyRequests(): got %v, want no error", err)
  114. }
  115. }
  116. func TestVerifierFromJSON(t *testing.T) {
  117. msg := []byte(`{
  118. "url.Verifier": {
  119. "scope": ["request"],
  120. "scheme": "https",
  121. "host": "www.martian.proxy",
  122. "path": "/testing",
  123. "query": "test=true"
  124. }
  125. }`)
  126. r, err := parse.FromJSON(msg)
  127. if err != nil {
  128. t.Fatalf("parse.FromJSON(): got %v, want no error", err)
  129. }
  130. reqmod := r.RequestModifier()
  131. if reqmod == nil {
  132. t.Fatal("reqmod: got nil, want not nil")
  133. }
  134. reqv, ok := reqmod.(verify.RequestVerifier)
  135. if !ok {
  136. t.Fatal("reqmod.(verify.RequestVerifier): got !ok, want ok")
  137. }
  138. req, err := http.NewRequest("GET", "https://www.martian.proxy/testing?test=false", nil)
  139. if err != nil {
  140. t.Fatalf("http.NewRequest(): got %v, want no error", err)
  141. }
  142. _, remove, err := martian.TestContext(req, nil, nil)
  143. if err != nil {
  144. t.Fatalf("TestContext(): got %v, want no error", err)
  145. }
  146. defer remove()
  147. if err := reqv.ModifyRequest(req); err != nil {
  148. t.Fatalf("ModifyRequest(): got %v, want no error", err)
  149. }
  150. if err := reqv.VerifyRequests(); err == nil {
  151. t.Error("VerifyRequests(): got nil, want not nil")
  152. }
  153. }