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  }