github.com/dannin/go@v0.0.0-20161031215817-d35dfd405eaa/src/net/http/httptest/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 httptest
     6  
     7  import (
     8  	"bufio"
     9  	"io/ioutil"
    10  	"net"
    11  	"net/http"
    12  	"testing"
    13  )
    14  
    15  func TestServer(t *testing.T) {
    16  	ts := NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    17  		w.Write([]byte("hello"))
    18  	}))
    19  	defer ts.Close()
    20  	res, err := http.Get(ts.URL)
    21  	if err != nil {
    22  		t.Fatal(err)
    23  	}
    24  	got, err := ioutil.ReadAll(res.Body)
    25  	if err != nil {
    26  		t.Fatal(err)
    27  	}
    28  	if string(got) != "hello" {
    29  		t.Errorf("got %q, want hello", string(got))
    30  	}
    31  }
    32  
    33  // Issue 12781
    34  func TestGetAfterClose(t *testing.T) {
    35  	ts := NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    36  		w.Write([]byte("hello"))
    37  	}))
    38  
    39  	res, err := http.Get(ts.URL)
    40  	if err != nil {
    41  		t.Fatal(err)
    42  	}
    43  	got, err := ioutil.ReadAll(res.Body)
    44  	if err != nil {
    45  		t.Fatal(err)
    46  	}
    47  	if string(got) != "hello" {
    48  		t.Fatalf("got %q, want hello", string(got))
    49  	}
    50  
    51  	ts.Close()
    52  
    53  	res, err = http.Get(ts.URL)
    54  	if err == nil {
    55  		body, _ := ioutil.ReadAll(res.Body)
    56  		t.Fatalf("Unexpected response after close: %v, %v, %s", res.Status, res.Header, body)
    57  	}
    58  }
    59  
    60  func TestServerCloseBlocking(t *testing.T) {
    61  	ts := NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    62  		w.Write([]byte("hello"))
    63  	}))
    64  	dial := func() net.Conn {
    65  		c, err := net.Dial("tcp", ts.Listener.Addr().String())
    66  		if err != nil {
    67  			t.Fatal(err)
    68  		}
    69  		return c
    70  	}
    71  
    72  	// Keep one connection in StateNew (connected, but not sending anything)
    73  	cnew := dial()
    74  	defer cnew.Close()
    75  
    76  	// Keep one connection in StateIdle (idle after a request)
    77  	cidle := dial()
    78  	defer cidle.Close()
    79  	cidle.Write([]byte("HEAD / HTTP/1.1\r\nHost: foo\r\n\r\n"))
    80  	_, err := http.ReadResponse(bufio.NewReader(cidle), nil)
    81  	if err != nil {
    82  		t.Fatal(err)
    83  	}
    84  
    85  	ts.Close() // test we don't hang here forever.
    86  }
    87  
    88  // Issue 14290
    89  func TestServerCloseClientConnections(t *testing.T) {
    90  	var s *Server
    91  	s = NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    92  		s.CloseClientConnections()
    93  	}))
    94  	defer s.Close()
    95  	res, err := http.Get(s.URL)
    96  	if err == nil {
    97  		res.Body.Close()
    98  		t.Fatalf("Unexpected response: %#v", res)
    99  	}
   100  }