github.com/google/martian/v3@v3.3.3/header/header_verifier_test.go (about) 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 15 package header 16 17 import ( 18 "fmt" 19 "net/http" 20 "testing" 21 22 "github.com/google/martian/v3" 23 "github.com/google/martian/v3/parse" 24 "github.com/google/martian/v3/proxyutil" 25 "github.com/google/martian/v3/verify" 26 ) 27 28 func TestVerifyRequestsBlankValue(t *testing.T) { 29 v := NewVerifier("Martian-Test", "") 30 31 for i := 0; i < 4; i++ { 32 req, err := http.NewRequest("GET", fmt.Sprintf("http://www.example.com/%d", i), nil) 33 if err != nil { 34 t.Fatalf("http.NewRequest(): got %v, want no error", err) 35 } 36 37 // Request 1, 3 should fail verification. 38 if i%2 == 0 { 39 req.Header.Set("Martian-Test", "true") 40 } 41 42 if err := v.ModifyRequest(req); err != nil { 43 t.Fatalf("%d. ModifyRequest(): got %v, want no error", i, err) 44 } 45 } 46 47 merr, ok := v.VerifyRequests().(*martian.MultiError) 48 if !ok { 49 t.Fatal("VerifyRequests(): got no error, want *verify.MultiError") 50 } 51 if got, want := len(merr.Errors()), 2; got != want { 52 t.Fatalf("len(merr.Errors()): got %d, want %d", got, want) 53 } 54 55 wants := []string{ 56 `request(http://www.example.com/1) header verify failure: got no header, want Martian-Test header`, 57 `request(http://www.example.com/3) header verify failure: got no header, want Martian-Test header`, 58 } 59 for i, err := range merr.Errors() { 60 if got := err.Error(); got != wants[i] { 61 t.Errorf("Errors()[%d]: got %q, want %q", i, got, wants[i]) 62 } 63 } 64 65 v.ResetRequestVerifications() 66 if err := v.VerifyRequests(); err != nil { 67 t.Errorf("VerifyRequests(): got %v, want no error", err) 68 } 69 } 70 71 func TestVerifierFromJSON(t *testing.T) { 72 msg := []byte(`{ 73 "header.Verifier": { 74 "scope": ["request", "response"], 75 "name": "Martian-Test", 76 "value": "true" 77 } 78 }`) 79 80 r, err := parse.FromJSON(msg) 81 if err != nil { 82 t.Fatalf("parse.FromJSON(): got %v, want no error", err) 83 } 84 reqmod := r.RequestModifier() 85 if reqmod == nil { 86 t.Fatal("reqmod: got nil, want not nil") 87 } 88 reqv, ok := reqmod.(verify.RequestVerifier) 89 if !ok { 90 t.Fatal("reqmod.(verify.RequestVerifier): got !ok, want ok") 91 } 92 93 req, err := http.NewRequest("GET", "http://example.com", nil) 94 if err != nil { 95 t.Fatalf("http.NewRequest(): got %v, want no error", err) 96 } 97 if err := reqv.ModifyRequest(req); err != nil { 98 t.Fatalf("ModifyRequest(): got %v, want no error", err) 99 } 100 if err := reqv.VerifyRequests(); err == nil { 101 t.Error("VerifyRequests(): got nil, want not nil") 102 } 103 104 resmod := r.ResponseModifier() 105 if resmod == nil { 106 t.Fatal("resmod: got nil, want not nil") 107 } 108 resv, ok := resmod.(verify.ResponseVerifier) 109 if !ok { 110 t.Fatal("resmod.(verify.ResponseVerifier): got !ok, want ok") 111 } 112 113 res := proxyutil.NewResponse(200, nil, req) 114 if err := resv.ModifyResponse(res); err != nil { 115 t.Fatalf("ModifyResponse(): got %v, want no error", err) 116 } 117 if err := resv.VerifyResponses(); err == nil { 118 t.Error("VerifyResponses(): got nil, want not nil") 119 } 120 } 121 122 func TestVerifyRequests(t *testing.T) { 123 v := NewVerifier("Martian-Test", "testing-even") 124 125 for i := 0; i < 4; i++ { 126 req, err := http.NewRequest("GET", fmt.Sprintf("http://www.example.com/%d", i), nil) 127 if err != nil { 128 t.Fatalf("http.NewRequest(): got %v, want no error", err) 129 } 130 131 req.Header.Add("Martian-Test", fmt.Sprintf("test-%d", i)) 132 133 // Request 1, 3 should fail verification. 134 if i%2 == 0 { 135 req.Header.Add("Martian-Test", "testing-even") 136 } else { 137 req.Header.Add("Martian-Test", "testing-odd") 138 } 139 140 if err := v.ModifyRequest(req); err != nil { 141 t.Fatalf("%d. ModifyRequest(): got %v, want no error", i, err) 142 } 143 } 144 145 merr, ok := v.VerifyRequests().(*martian.MultiError) 146 if !ok { 147 t.Fatal("VerifyRequests(): got no error, want *verify.MultiError") 148 } 149 if got, want := len(merr.Errors()), 2; got != want { 150 t.Fatalf("len(merr.Errors()): got %d, want %d", got, want) 151 } 152 153 wants := []string{ 154 `request(http://www.example.com/1) header verify failure: got Martian-Test with value test-1, testing-odd, want value testing-even`, 155 `request(http://www.example.com/3) header verify failure: got Martian-Test with value test-3, testing-odd, want value testing-even`, 156 } 157 for i, err := range merr.Errors() { 158 if got := err.Error(); got != wants[i] { 159 t.Errorf("Errors()[%d]: got %q, want %q", i, got, wants[i]) 160 } 161 } 162 163 v.ResetRequestVerifications() 164 if err := v.VerifyRequests(); err != nil { 165 t.Errorf("VerifyRequests(): got %v, want no error", err) 166 } 167 } 168 169 func TestVerifyResponsesBlankValue(t *testing.T) { 170 v := NewVerifier("Martian-Test", "") 171 172 for i := 0; i < 4; i++ { 173 req, err := http.NewRequest("GET", fmt.Sprintf("http://www.example.com/%d", i), nil) 174 if err != nil { 175 t.Fatalf("http.NewRequest(): got %v, want no error", err) 176 } 177 res := proxyutil.NewResponse(200, nil, req) 178 179 // Response 1, 3 should fail verification. 180 if i%2 == 0 { 181 res.Header.Set("Martian-Test", "true") 182 } 183 184 if err := v.ModifyResponse(res); err != nil { 185 t.Fatalf("%d. ModifyResponse(): got %v, want no error", i, err) 186 } 187 } 188 189 merr, ok := v.VerifyResponses().(*martian.MultiError) 190 if !ok { 191 t.Fatal("VerifyResponses(): got no error, want *verify.MultiError") 192 } 193 if got, want := len(merr.Errors()), 2; got != want { 194 t.Fatalf("len(merr.Errors()): got %d, want %d", got, want) 195 } 196 197 wants := []string{ 198 `response(http://www.example.com/1) header verify failure: got no header, want Martian-Test header`, 199 `response(http://www.example.com/3) header verify failure: got no header, want Martian-Test header`, 200 } 201 for i, err := range merr.Errors() { 202 if got := err.Error(); got != wants[i] { 203 t.Errorf("Errors()[%d]: got %q, want %q", i, got, wants[i]) 204 } 205 } 206 207 v.ResetResponseVerifications() 208 if err := v.VerifyResponses(); err != nil { 209 t.Errorf("VerifyResponses(): got %v, want no error", err) 210 } 211 } 212 213 func TestVerifyResponses(t *testing.T) { 214 v := NewVerifier("Martian-Test", "testing-even") 215 216 for i := 0; i < 4; i++ { 217 req, err := http.NewRequest("GET", fmt.Sprintf("http://www.example.com/%d", i), nil) 218 if err != nil { 219 t.Fatalf("http.NewRequest(): got %v, want no error", err) 220 } 221 res := proxyutil.NewResponse(200, nil, req) 222 223 res.Header.Add("Martian-Test", fmt.Sprintf("test-%d", i)) 224 225 // Response 1, 3 should fail verification. 226 if i%2 == 0 { 227 res.Header.Add("Martian-Test", "testing-even") 228 } else { 229 res.Header.Add("Martian-Test", "testing-odd") 230 } 231 232 if err := v.ModifyResponse(res); err != nil { 233 t.Fatalf("%d. ModifyResponse(): got %v, want no error", i, err) 234 } 235 } 236 237 merr, ok := v.VerifyResponses().(*martian.MultiError) 238 if !ok { 239 t.Fatal("VerifyResponses(): got no error, want *verify.MultiError") 240 } 241 if got, want := len(merr.Errors()), 2; got != want { 242 t.Fatalf("len(merr.Errors()): got %d, want %d", got, want) 243 } 244 245 wants := []string{ 246 `response(http://www.example.com/1) header verify failure: got Martian-Test with value test-1, testing-odd, want value testing-even`, 247 `response(http://www.example.com/3) header verify failure: got Martian-Test with value test-3, testing-odd, want value testing-even`, 248 } 249 for i, err := range merr.Errors() { 250 if got := err.Error(); got != wants[i] { 251 t.Errorf("Errors()[%d]: got %q, want %q", i, got, wants[i]) 252 } 253 } 254 255 v.ResetResponseVerifications() 256 if err := v.VerifyResponses(); err != nil { 257 t.Errorf("VerifyResponses(): got %v, want no error", err) 258 } 259 }