package manners import ( "net/http" "strings" "testing" ) func TestStateTransitions(t *testing.T) { tests := []transitionTest{ transitionTest{[]http.ConnState{http.StateNew, http.StateActive}, 1}, transitionTest{[]http.ConnState{http.StateNew, http.StateClosed}, 0}, transitionTest{[]http.ConnState{http.StateNew, http.StateActive, http.StateClosed}, 0}, transitionTest{[]http.ConnState{http.StateNew, http.StateActive, http.StateHijacked}, 0}, transitionTest{[]http.ConnState{http.StateNew, http.StateActive, http.StateIdle}, 0}, transitionTest{[]http.ConnState{http.StateNew, http.StateActive, http.StateIdle, http.StateActive}, 1}, transitionTest{[]http.ConnState{http.StateNew, http.StateActive, http.StateIdle, http.StateActive, http.StateIdle}, 0}, transitionTest{[]http.ConnState{http.StateNew, http.StateActive, http.StateIdle, http.StateActive, http.StateClosed}, 0}, transitionTest{[]http.ConnState{http.StateNew, http.StateActive, http.StateIdle, http.StateActive, http.StateIdle, http.StateClosed}, 0}, } for _, test := range tests { testStateTransition(t, test) } } type transitionTest struct { states []http.ConnState expectedWgCount int } func testStateTransition(t *testing.T, test transitionTest) { server := newServer() wg := newTestWg() server.wg = wg startServer(t, server, nil) conn := &fakeConn{} for _, newState := range test.states { server.ConnState(conn, newState) } server.Close() waiting := <-wg.waitCalled if waiting != test.expectedWgCount { names := make([]string, len(test.states)) for i, s := range test.states { names[i] = s.String() } transitions := strings.Join(names, " -> ") t.Errorf("%s - Waitcount should be %d, got %d", transitions, test.expectedWgCount, waiting) } }