Prevent possible race condition on SetPingHandler
conn.ReadMessage and conn.SetPingHandler are executed in different goroutines.
This commit is contained in:
parent
60141d398f
commit
a992bc1506
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue