Prevent possible race condition on SetPingHandler

conn.ReadMessage and conn.SetPingHandler are executed
in different goroutines.
This commit is contained in:
Jannis Mattheis 2018-11-18 12:23:02 +01:00
parent 60141d398f
commit a992bc1506
1 changed files with 19 additions and 9 deletions

View File

@ -108,7 +108,7 @@ func TestPing(t *testing.T) {
wsURL := wsURL(server.URL) wsURL := wsURL(server.URL)
user := testClient(t, wsURL) user := createClient(t, wsURL)
defer user.conn.Close() defer user.conn.Close()
ping := make(chan bool) ping := make(chan bool)
@ -119,6 +119,8 @@ func TestPing(t *testing.T) {
return err return err
}) })
startReading(user)
expectNoMessage(user) expectNoMessage(user)
select { select {
@ -438,14 +440,15 @@ func clients(api *API, user uint) []*client {
} }
func testClient(t *testing.T, url string) *testingClient { func testClient(t *testing.T, url string) *testingClient {
ws, _, err := websocket.DefaultDialer.Dial(url, nil) client := createClient(t, url)
assert.Nil(t, err) startReading(client)
return client
readMessages := make(chan model.Message) }
func startReading(client *testingClient) {
go func() { go func() {
for { for {
_, payload, err := ws.ReadMessage() _, payload, err := client.conn.ReadMessage()
if err != nil { if err != nil {
return return
@ -453,16 +456,23 @@ func testClient(t *testing.T, url string) *testingClient {
actual := &model.Message{} actual := &model.Message{}
json.NewDecoder(bytes.NewBuffer(payload)).Decode(actual) json.NewDecoder(bytes.NewBuffer(payload)).Decode(actual)
readMessages <- *actual client.readMessage <- *actual
} }
}() }()
}
func createClient(t *testing.T, url string) *testingClient {
ws, _, err := websocket.DefaultDialer.Dial(url, nil)
assert.Nil(t, err)
readMessages := make(chan model.Message)
return &testingClient{conn: ws, readMessage: readMessages, t: t} return &testingClient{conn: ws, readMessage: readMessages, t: t}
} }
type testingClient struct { type testingClient struct {
conn *websocket.Conn conn *websocket.Conn
readMessage <-chan model.Message readMessage chan model.Message
t *testing.T t *testing.T
} }