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