mirror of
https://github.com/golang/go
synced 2024-10-04 17:21:20 -06:00
29d1f3b85c
This change adds socket system call hooks to existing test cases for simulating a bit complicated network conditions to help making timeout and dual IP stack test cases work more properly in followup changes. Also test cases print debugging information in non-short mode like the following: Leaked goroutines: net.TestWriteTimeout.func2(0xc20802a5a0, 0xc20801d000, 0x1000, 0x1000, 0xc2081d2ae0) /go/src/net/timeout_test.go:170 +0x98 created by net.TestWriteTimeout /go/src/net/timeout_test.go:173 +0x745 net.runDatagramPacketConnServer(0xc2080730e0, 0x2bd270, 0x3, 0x2c1770, 0xb, 0xc2081d2ba0, 0xc2081d2c00) /go/src/net/server_test.go:398 +0x667 created by net.TestTimeoutUDP /go/src/net/timeout_test.go:247 +0xc9 (snip) Leaked sockets: 3: {Cookie:615726511685632 Err:<nil> SocketErr:0} 5: {Cookie:7934075906097152 Err:<nil> SocketErr:0} Socket statistical information: {Family:1 Type:805306370 Protocol:0 Opened:17 Accepted:0 Connected:5 Closed:17} {Family:2 Type:805306369 Protocol:0 Opened:450 Accepted:234 Connected:279 Closed:636} {Family:1 Type:805306369 Protocol:0 Opened:11 Accepted:5 Connected:5 Closed:16} {Family:28 Type:805306369 Protocol:0 Opened:95 Accepted:22 Connected:16 Closed:116} {Family:2 Type:805306370 Protocol:0 Opened:84 Accepted:0 Connected:34 Closed:83} {Family:28 Type:805306370 Protocol:0 Opened:52 Accepted:0 Connected:4 Closed:52} Change-Id: I0e84be59a0699bc31245c78e2249423459b8cdda Reviewed-on: https://go-review.googlesource.com/6390 Reviewed-by: Ian Lance Taylor <iant@golang.org>
90 lines
1.7 KiB
Go
90 lines
1.7 KiB
Go
// Copyright 2015 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package net
|
|
|
|
import (
|
|
"fmt"
|
|
"net/internal/socktest"
|
|
"os"
|
|
"runtime"
|
|
"sort"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
var sw socktest.Switch
|
|
|
|
func TestMain(m *testing.M) {
|
|
installTestHooks()
|
|
|
|
st := m.Run()
|
|
|
|
if !testing.Short() {
|
|
printLeakedGoroutines()
|
|
printLeakedSockets()
|
|
printSocketStats()
|
|
}
|
|
forceCloseSockets()
|
|
uninstallTestHooks()
|
|
os.Exit(st)
|
|
}
|
|
|
|
func printLeakedGoroutines() {
|
|
gss := leakedGoroutines()
|
|
if len(gss) == 0 {
|
|
return
|
|
}
|
|
fmt.Fprintf(os.Stderr, "Leaked goroutines:\n")
|
|
for _, gs := range gss {
|
|
fmt.Fprintf(os.Stderr, "%v\n", gs)
|
|
}
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
}
|
|
|
|
// leakedGoroutines returns a list of remaining goroutins used in test
|
|
// cases.
|
|
func leakedGoroutines() []string {
|
|
var gss []string
|
|
b := make([]byte, 2<<20)
|
|
b = b[:runtime.Stack(b, true)]
|
|
for _, s := range strings.Split(string(b), "\n\n") {
|
|
ss := strings.SplitN(s, "\n", 2)
|
|
if len(ss) != 2 {
|
|
continue
|
|
}
|
|
stack := strings.TrimSpace(ss[1])
|
|
if !strings.Contains(stack, "created by net") {
|
|
continue
|
|
}
|
|
gss = append(gss, stack)
|
|
}
|
|
sort.Strings(gss)
|
|
return gss
|
|
}
|
|
|
|
func printLeakedSockets() {
|
|
sos := sw.Sockets()
|
|
if len(sos) == 0 {
|
|
return
|
|
}
|
|
fmt.Fprintf(os.Stderr, "Leaked sockets:\n")
|
|
for s, so := range sos {
|
|
fmt.Fprintf(os.Stderr, "%v: %+v\n", s, so)
|
|
}
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
}
|
|
|
|
func printSocketStats() {
|
|
sts := sw.Stats()
|
|
if len(sts) == 0 {
|
|
return
|
|
}
|
|
fmt.Fprintf(os.Stderr, "Socket statistical information:\n")
|
|
for _, st := range sts {
|
|
fmt.Fprintf(os.Stderr, "%+v\n", st)
|
|
}
|
|
fmt.Fprintf(os.Stderr, "\n")
|
|
}
|