github.com/slayercat/go@v0.0.0-20170428012452-c51559813f61/src/net/http/httptest/httptest_test.go (about)

     1  // Copyright 2016 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package httptest
     6  
     7  import (
     8  	"crypto/tls"
     9  	"io"
    10  	"io/ioutil"
    11  	"net/http"
    12  	"net/url"
    13  	"reflect"
    14  	"strings"
    15  	"testing"
    16  )
    17  
    18  func TestNewRequest(t *testing.T) {
    19  	tests := [...]struct {
    20  		method, uri string
    21  		body        io.Reader
    22  
    23  		want     *http.Request
    24  		wantBody string
    25  	}{
    26  		// Empty method means GET:
    27  		0: {
    28  			method: "",
    29  			uri:    "/",
    30  			body:   nil,
    31  			want: &http.Request{
    32  				Method:     "GET",
    33  				Host:       "example.com",
    34  				URL:        &url.URL{Path: "/"},
    35  				Header:     http.Header{},
    36  				Proto:      "HTTP/1.1",
    37  				ProtoMajor: 1,
    38  				ProtoMinor: 1,
    39  				RemoteAddr: "192.0.2.1:1234",
    40  				RequestURI: "/",
    41  			},
    42  			wantBody: "",
    43  		},
    44  
    45  		// GET with full URL:
    46  		1: {
    47  			method: "GET",
    48  			uri:    "http://foo.com/path/%2f/bar/",
    49  			body:   nil,
    50  			want: &http.Request{
    51  				Method: "GET",
    52  				Host:   "foo.com",
    53  				URL: &url.URL{
    54  					Scheme:  "http",
    55  					Path:    "/path///bar/",
    56  					RawPath: "/path/%2f/bar/",
    57  					Host:    "foo.com",
    58  				},
    59  				Header:     http.Header{},
    60  				Proto:      "HTTP/1.1",
    61  				ProtoMajor: 1,
    62  				ProtoMinor: 1,
    63  				RemoteAddr: "192.0.2.1:1234",
    64  				RequestURI: "http://foo.com/path/%2f/bar/",
    65  			},
    66  			wantBody: "",
    67  		},
    68  
    69  		// GET with full https URL:
    70  		2: {
    71  			method: "GET",
    72  			uri:    "https://foo.com/path/",
    73  			body:   nil,
    74  			want: &http.Request{
    75  				Method: "GET",
    76  				Host:   "foo.com",
    77  				URL: &url.URL{
    78  					Scheme: "https",
    79  					Path:   "/path/",
    80  					Host:   "foo.com",
    81  				},
    82  				Header:     http.Header{},
    83  				Proto:      "HTTP/1.1",
    84  				ProtoMajor: 1,
    85  				ProtoMinor: 1,
    86  				RemoteAddr: "192.0.2.1:1234",
    87  				RequestURI: "https://foo.com/path/",
    88  				TLS: &tls.ConnectionState{
    89  					Version:           tls.VersionTLS12,
    90  					HandshakeComplete: true,
    91  					ServerName:        "foo.com",
    92  				},
    93  			},
    94  			wantBody: "",
    95  		},
    96  
    97  		// Post with known length
    98  		3: {
    99  			method: "POST",
   100  			uri:    "/",
   101  			body:   strings.NewReader("foo"),
   102  			want: &http.Request{
   103  				Method:        "POST",
   104  				Host:          "example.com",
   105  				URL:           &url.URL{Path: "/"},
   106  				Header:        http.Header{},
   107  				Proto:         "HTTP/1.1",
   108  				ContentLength: 3,
   109  				ProtoMajor:    1,
   110  				ProtoMinor:    1,
   111  				RemoteAddr:    "192.0.2.1:1234",
   112  				RequestURI:    "/",
   113  			},
   114  			wantBody: "foo",
   115  		},
   116  
   117  		// Post with unknown length
   118  		4: {
   119  			method: "POST",
   120  			uri:    "/",
   121  			body:   struct{ io.Reader }{strings.NewReader("foo")},
   122  			want: &http.Request{
   123  				Method:        "POST",
   124  				Host:          "example.com",
   125  				URL:           &url.URL{Path: "/"},
   126  				Header:        http.Header{},
   127  				Proto:         "HTTP/1.1",
   128  				ContentLength: -1,
   129  				ProtoMajor:    1,
   130  				ProtoMinor:    1,
   131  				RemoteAddr:    "192.0.2.1:1234",
   132  				RequestURI:    "/",
   133  			},
   134  			wantBody: "foo",
   135  		},
   136  
   137  		// OPTIONS *
   138  		5: {
   139  			method: "OPTIONS",
   140  			uri:    "*",
   141  			want: &http.Request{
   142  				Method:     "OPTIONS",
   143  				Host:       "example.com",
   144  				URL:        &url.URL{Path: "*"},
   145  				Header:     http.Header{},
   146  				Proto:      "HTTP/1.1",
   147  				ProtoMajor: 1,
   148  				ProtoMinor: 1,
   149  				RemoteAddr: "192.0.2.1:1234",
   150  				RequestURI: "*",
   151  			},
   152  		},
   153  	}
   154  	for i, tt := range tests {
   155  		got := NewRequest(tt.method, tt.uri, tt.body)
   156  		slurp, err := ioutil.ReadAll(got.Body)
   157  		if err != nil {
   158  			t.Errorf("%d. ReadAll: %v", i, err)
   159  		}
   160  		if string(slurp) != tt.wantBody {
   161  			t.Errorf("%d. Body = %q; want %q", i, slurp, tt.wantBody)
   162  		}
   163  		got.Body = nil // before DeepEqual
   164  		if !reflect.DeepEqual(got.URL, tt.want.URL) {
   165  			t.Errorf("%d. Request.URL mismatch:\n got: %#v\nwant: %#v", i, got.URL, tt.want.URL)
   166  		}
   167  		if !reflect.DeepEqual(got.Header, tt.want.Header) {
   168  			t.Errorf("%d. Request.Header mismatch:\n got: %#v\nwant: %#v", i, got.Header, tt.want.Header)
   169  		}
   170  		if !reflect.DeepEqual(got.TLS, tt.want.TLS) {
   171  			t.Errorf("%d. Request.TLS mismatch:\n got: %#v\nwant: %#v", i, got.TLS, tt.want.TLS)
   172  		}
   173  		if !reflect.DeepEqual(got, tt.want) {
   174  			t.Errorf("%d. Request mismatch:\n got: %#v\nwant: %#v", i, got, tt.want)
   175  		}
   176  	}
   177  }