github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/src/pkg/net/http/server_test.go (about)

     1  // Copyright 2012 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 http_test
     6  
     7  import (
     8  	. "net/http"
     9  	"net/http/httptest"
    10  	"net/url"
    11  	"testing"
    12  )
    13  
    14  var serveMuxRegister = []struct {
    15  	pattern string
    16  	h       Handler
    17  }{
    18  	{"/dir/", serve(200)},
    19  	{"/search", serve(201)},
    20  	{"codesearch.google.com/search", serve(202)},
    21  	{"codesearch.google.com/", serve(203)},
    22  }
    23  
    24  // serve returns a handler that sends a response with the given code.
    25  func serve(code int) HandlerFunc {
    26  	return func(w ResponseWriter, r *Request) {
    27  		w.WriteHeader(code)
    28  	}
    29  }
    30  
    31  var serveMuxTests = []struct {
    32  	method  string
    33  	host    string
    34  	path    string
    35  	code    int
    36  	pattern string
    37  }{
    38  	{"GET", "google.com", "/", 404, ""},
    39  	{"GET", "google.com", "/dir", 301, "/dir/"},
    40  	{"GET", "google.com", "/dir/", 200, "/dir/"},
    41  	{"GET", "google.com", "/dir/file", 200, "/dir/"},
    42  	{"GET", "google.com", "/search", 201, "/search"},
    43  	{"GET", "google.com", "/search/", 404, ""},
    44  	{"GET", "google.com", "/search/foo", 404, ""},
    45  	{"GET", "codesearch.google.com", "/search", 202, "codesearch.google.com/search"},
    46  	{"GET", "codesearch.google.com", "/search/", 203, "codesearch.google.com/"},
    47  	{"GET", "codesearch.google.com", "/search/foo", 203, "codesearch.google.com/"},
    48  	{"GET", "codesearch.google.com", "/", 203, "codesearch.google.com/"},
    49  	{"GET", "images.google.com", "/search", 201, "/search"},
    50  	{"GET", "images.google.com", "/search/", 404, ""},
    51  	{"GET", "images.google.com", "/search/foo", 404, ""},
    52  	{"GET", "google.com", "/../search", 301, "/search"},
    53  	{"GET", "google.com", "/dir/..", 301, ""},
    54  	{"GET", "google.com", "/dir/..", 301, ""},
    55  	{"GET", "google.com", "/dir/./file", 301, "/dir/"},
    56  
    57  	// The /foo -> /foo/ redirect applies to CONNECT requests
    58  	// but the path canonicalization does not.
    59  	{"CONNECT", "google.com", "/dir", 301, "/dir/"},
    60  	{"CONNECT", "google.com", "/../search", 404, ""},
    61  	{"CONNECT", "google.com", "/dir/..", 200, "/dir/"},
    62  	{"CONNECT", "google.com", "/dir/..", 200, "/dir/"},
    63  	{"CONNECT", "google.com", "/dir/./file", 200, "/dir/"},
    64  }
    65  
    66  func TestServeMuxHandler(t *testing.T) {
    67  	mux := NewServeMux()
    68  	for _, e := range serveMuxRegister {
    69  		mux.Handle(e.pattern, e.h)
    70  	}
    71  
    72  	for _, tt := range serveMuxTests {
    73  		r := &Request{
    74  			Method: tt.method,
    75  			Host:   tt.host,
    76  			URL: &url.URL{
    77  				Path: tt.path,
    78  			},
    79  		}
    80  		h, pattern := mux.Handler(r)
    81  		rr := httptest.NewRecorder()
    82  		h.ServeHTTP(rr, r)
    83  		if pattern != tt.pattern || rr.Code != tt.code {
    84  			t.Errorf("%s %s %s = %d, %q, want %d, %q", tt.method, tt.host, tt.path, rr.Code, pattern, tt.code, tt.pattern)
    85  		}
    86  	}
    87  }
    88  
    89  func TestServerRedirect(t *testing.T) {
    90  	// This used to crash. It's not valid input (bad path), but it
    91  	// shouldn't crash.
    92  	rr := httptest.NewRecorder()
    93  	req := &Request{
    94  		Method: "GET",
    95  		URL: &url.URL{
    96  			Scheme: "http",
    97  			Path:   "not-empty-but-no-leading-slash", // bogus
    98  		},
    99  	}
   100  	Redirect(rr, req, "", 304)
   101  	if rr.Code != 304 {
   102  		t.Errorf("Code = %d; want 304", rr.Code)
   103  	}
   104  }