Source file src/net/http/httptest/httptest_test.go

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

View as plain text