Add known-failing test. Panic stack trace reported by Mathieu from Camlistore.
diff --git a/http2_test.go b/http2_test.go
index 9764e54..ca13018 100644
--- a/http2_test.go
+++ b/http2_test.go
@@ -21,6 +21,14 @@
"github.com/bradfitz/http2/hpack"
)
+var knownFailing = flag.Bool("known_failing", false, "Run known-failing tests.")
+
+func condSkipFailingTest(t *testing.T) {
+ if !*knownFailing {
+ t.Skip("Skipping known-failing test without --known_failing")
+ }
+}
+
func init() {
DebugGoroutines = true
flag.BoolVar(&VerboseLogs, "verboseh2", false, "Verbose HTTP/2 debug logging")
diff --git a/server_test.go b/server_test.go
index e293e75..0eea7cf 100644
--- a/server_test.go
+++ b/server_test.go
@@ -1804,6 +1804,38 @@
})
}
+func TestServer_NoCrash_HandlerClose_Then_ClientClose(t *testing.T) {
+ condSkipFailingTest(t)
+ testServerResponse(t, func(w http.ResponseWriter, r *http.Request) error {
+ // nothing
+ return nil
+ }, func(st *serverTester) {
+ st.writeHeaders(HeadersFrameParam{
+ StreamID: 1,
+ BlockFragment: encodeHeader(st.t),
+ EndStream: false, // DATA is coming
+ EndHeaders: true,
+ })
+ hf := st.wantHeaders()
+ if !hf.HeadersEnded() || !hf.StreamEnded() {
+ t.Fatalf("want END_HEADERS+END_STREAM, got %v", hf)
+ }
+ // Now the handler has ended, so it's ended its
+ // stream, but the client hasn't closed its side
+ // (stateClosedLocal). So send more data and verify
+ // it doesn't crash with an internal invariant panic, like
+ // it did before.
+ st.writeData(1, true, []byte("foo"))
+ st.cc.Close()
+ select {
+ case <-st.sc.doneServing:
+ // Loop has exited.
+ case <-time.After(5 * time.Second):
+ t.Error("timeout")
+ }
+ })
+}
+
func decodeHeader(t *testing.T, headerBlock []byte) (pairs [][2]string) {
d := hpack.NewDecoder(initialHeaderTableSize, func(f hpack.HeaderField) {
pairs = append(pairs, [2]string{f.Name, f.Value})