github.com/gocuntian/go@v0.0.0-20160610041250-fee02d270bf8/src/net/http/transport_internal_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 // White-box tests for transport.go (in package http instead of http_test). 6 7 package http 8 9 import ( 10 "errors" 11 "net" 12 "testing" 13 ) 14 15 // Issue 15446: incorrect wrapping of errors when server closes an idle connection. 16 func TestTransportPersistConnReadLoopEOF(t *testing.T) { 17 ln := newLocalListener(t) 18 defer ln.Close() 19 20 connc := make(chan net.Conn, 1) 21 go func() { 22 defer close(connc) 23 c, err := ln.Accept() 24 if err != nil { 25 t.Error(err) 26 return 27 } 28 connc <- c 29 }() 30 31 tr := new(Transport) 32 req, _ := NewRequest("GET", "http://"+ln.Addr().String(), nil) 33 treq := &transportRequest{Request: req} 34 cm := connectMethod{targetScheme: "http", targetAddr: ln.Addr().String()} 35 pc, err := tr.getConn(treq, cm) 36 if err != nil { 37 t.Fatal(err) 38 } 39 defer pc.close(errors.New("test over")) 40 41 conn := <-connc 42 if conn == nil { 43 // Already called t.Error in the accept goroutine. 44 return 45 } 46 conn.Close() // simulate the server hanging up on the client 47 48 _, err = pc.roundTrip(treq) 49 if err != errServerClosedConn && err != errServerClosedIdle { 50 t.Fatalf("roundTrip = %#v, %v; want errServerClosedConn or errServerClosedIdle", err, err) 51 } 52 53 <-pc.closech 54 err = pc.closed 55 if err != errServerClosedConn && err != errServerClosedIdle { 56 t.Fatalf("pc.closed = %#v, %v; want errServerClosedConn or errServerClosedIdle", err, err) 57 } 58 } 59 60 func newLocalListener(t *testing.T) net.Listener { 61 ln, err := net.Listen("tcp", "127.0.0.1:0") 62 if err != nil { 63 ln, err = net.Listen("tcp6", "[::1]:0") 64 } 65 if err != nil { 66 t.Fatal(err) 67 } 68 return ln 69 }