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