aboutsummaryrefslogtreecommitdiff
path: root/src/net/http/export_test.go
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@golang.org>2015-12-03 18:32:15 +0000
committerBrad Fitzpatrick <bradfitz@golang.org>2015-12-03 21:58:29 +0000
commit71d2fa8bae19ea2bbfb4a7968286b046214069e1 (patch)
treeba3cb849c885e7a3dde618eadc7d6c06779bb314 /src/net/http/export_test.go
parent7a4022ee36ec1b45233f6d9ae19e336f8a64a215 (diff)
downloadgo-71d2fa8bae19ea2bbfb4a7968286b046214069e1.tar.xz
net/http: deflake a non-short test, clean up export_test.go
This makes TestTransportResponseCloseRace much faster and no longer flaky. In the process it also cleans up test hooks in net/http which were inconsistent and scattered. Change-Id: Ifd0b11dbc7e8915c24eb5bdc36731ed6751dd7ec Reviewed-on: https://go-review.googlesource.com/17316 Reviewed-by: Ian Lance Taylor <iant@golang.org> Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/net/http/export_test.go')
-rw-r--r--src/net/http/export_test.go114
1 files changed, 57 insertions, 57 deletions
diff --git a/src/net/http/export_test.go b/src/net/http/export_test.go
index 0dc39a359f..e0ae49afa7 100644
--- a/src/net/http/export_test.go
+++ b/src/net/http/export_test.go
@@ -9,11 +9,23 @@ package http
import (
"net"
- "net/url"
"sync"
"time"
)
+var (
+ DefaultUserAgent = defaultUserAgent
+ NewLoggingConn = newLoggingConn
+ ExportAppendTime = appendTime
+ ExportRefererForURL = refererForURL
+ ExportServerNewConn = (*Server).newConn
+ ExportCloseWriteAndWait = (*conn).closeWriteAndWait
+ ExportErrRequestCanceled = errRequestCanceled
+ ExportServeFile = serveFile
+ ExportHttp2ConfigureTransport = http2ConfigureTransport
+ ExportHttp2ConfigureServer = http2ConfigureServer
+)
+
func init() {
// We only want to pay for this cost during testing.
// When not under test, these values are always nil
@@ -21,11 +33,42 @@ func init() {
testHookMu = new(sync.Mutex)
}
-func NewLoggingConn(baseName string, c net.Conn) net.Conn {
- return newLoggingConn(baseName, c)
+var (
+ SetInstallConnClosedHook = hookSetter(&testHookPersistConnClosedGotRes)
+ SetEnterRoundTripHook = hookSetter(&testHookEnterRoundTrip)
+ SetTestHookWaitResLoop = hookSetter(&testHookWaitResLoop)
+ SetRoundTripRetried = hookSetter(&testHookRoundTripRetried)
+)
+
+func SetReadLoopBeforeNextReadHook(f func()) {
+ testHookMu.Lock()
+ defer testHookMu.Unlock()
+ unnilTestHook(&f)
+ testHookReadLoopBeforeNextRead = f
+}
+
+// SetPendingDialHooks sets the hooks that run before and after handling
+// pending dials.
+func SetPendingDialHooks(before, after func()) {
+ unnilTestHook(&before)
+ unnilTestHook(&after)
+ testHookPrePendingDial, testHookPostPendingDial = before, after
+}
+
+func SetTestHookServerServe(fn func(*Server, net.Listener)) { testHookServerServe = fn }
+
+func NewTestTimeoutHandler(handler Handler, ch <-chan time.Time) Handler {
+ f := func() <-chan time.Time {
+ return ch
+ }
+ return &timeoutHandler{handler, f, ""}
}
-var ExportAppendTime = appendTime
+func ResetCachedEnvironment() {
+ httpProxyEnv.reset()
+ httpsProxyEnv.reset()
+ noProxyEnv.reset()
+}
func (t *Transport) NumPendingRequestsForTesting() int {
t.reqMu.Lock()
@@ -86,60 +129,17 @@ func (t *Transport) PutIdleTestConn() bool {
})
}
-func SetInstallConnClosedHook(f func()) {
- testHookPersistConnClosedGotRes = f
-}
-
-func SetEnterRoundTripHook(f func()) {
- testHookEnterRoundTrip = f
-}
-
-func SetReadLoopBeforeNextReadHook(f func()) {
- testHookMu.Lock()
- defer testHookMu.Unlock()
- testHookReadLoopBeforeNextRead = f
-}
-
-func NewTestTimeoutHandler(handler Handler, ch <-chan time.Time) Handler {
- f := func() <-chan time.Time {
- return ch
+// All test hooks must be non-nil so they can be called directly,
+// but the tests use nil to mean hook disabled.
+func unnilTestHook(f *func()) {
+ if *f == nil {
+ *f = nop
}
- return &timeoutHandler{handler, f, ""}
-}
-
-func ResetCachedEnvironment() {
- httpProxyEnv.reset()
- httpsProxyEnv.reset()
- noProxyEnv.reset()
-}
-
-var DefaultUserAgent = defaultUserAgent
-
-func ExportRefererForURL(lastReq, newReq *url.URL) string {
- return refererForURL(lastReq, newReq)
-}
-
-// SetPendingDialHooks sets the hooks that run before and after handling
-// pending dials.
-func SetPendingDialHooks(before, after func()) {
- prePendingDial, postPendingDial = before, after
}
-// SetRetriedHook sets the hook that runs when an idempotent retry occurs.
-func SetRetriedHook(hook func()) {
- retried = hook
+func hookSetter(dst *func()) func(func()) {
+ return func(fn func()) {
+ unnilTestHook(&fn)
+ *dst = fn
+ }
}
-
-var ExportServerNewConn = (*Server).newConn
-
-var ExportCloseWriteAndWait = (*conn).closeWriteAndWait
-
-var ExportErrRequestCanceled = errRequestCanceled
-
-var ExportServeFile = serveFile
-
-var ExportHttp2ConfigureTransport = http2ConfigureTransport
-
-var ExportHttp2ConfigureServer = http2ConfigureServer
-
-func SetTestHookServerServe(fn func(*Server, net.Listener)) { testHookServerServe = fn }