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  }