From c58edbf62275c9edd0b624a38d55094a4fe30f29 Mon Sep 17 00:00:00 2001 From: Agniva De Sarker Date: Tue, 16 Jun 2020 17:30:58 +0530 Subject: [PATCH] MM-26167: improve CreatePostCheckOnlineStatus (#14827) * Improve CreatePostCheckOnlineStatus We improve the flakyness of the test by making the websocket status checks synchronous after making each request. This makes the status responses more reliable because in very busy CI environments the goroutine scheduler can indeed send the response which is made by a later HTTP request before the first one. * Update api4/post_test.go Co-authored-by: Ibrahim Serdar Acikgoz Co-authored-by: Ibrahim Serdar Acikgoz --- api4/post_test.go | 33 ++++++++++----------------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/api4/post_test.go b/api4/post_test.go index cb8f4f1c0d..1e2744a118 100644 --- a/api4/post_test.go +++ b/api4/post_test.go @@ -12,7 +12,6 @@ import ( "reflect" "sort" "strings" - "sync" "testing" "time" @@ -598,40 +597,26 @@ func TestCreatePostCheckOnlineStatus(t *testing.T) { _, loginResp := cli.Login(th.BasicUser2.Username, th.BasicUser2.Password) require.Nil(t, loginResp.Error) - var wg sync.WaitGroup wsClient, err := th.CreateWebSocketClientWithClient(cli) require.Nil(t, err) - defer func() { - wg.Wait() - wsClient.Close() - }() + defer wsClient.Close() wsClient.Listen() - wg.Add(1) - go func() { - defer wg.Done() - timeout := time.After(2 * time.Second) - cnt := true - i := 0 - for cnt { + waitForEvent := func(isSetOnline bool) { + timeout := time.After(5 * time.Second) + for { select { case ev := <-wsClient.EventChannel: if ev.EventType() == model.WEBSOCKET_EVENT_POSTED { - if i == 0 { - assert.False(t, ev.GetData()["set_online"].(bool)) - } else { - assert.True(t, ev.GetData()["set_online"].(bool)) - } - i++ + assert.True(t, ev.GetData()["set_online"].(bool) == isSetOnline) + return } - cnt = i != 2 case <-timeout: - cnt = false + require.Fail(t, "timed out waiting for event") } } - assert.Equal(t, 2, i, "unexpected number of posted events") - }() + } handler := api.ApiHandler(createPost) resp := httptest.NewRecorder() @@ -645,6 +630,7 @@ func TestCreatePostCheckOnlineStatus(t *testing.T) { handler.ServeHTTP(resp, req) assert.Equal(t, http.StatusCreated, resp.Code) + waitForEvent(false) _, err = th.App.GetStatus(th.BasicUser.Id) require.NotNil(t, err) @@ -655,6 +641,7 @@ func TestCreatePostCheckOnlineStatus(t *testing.T) { handler.ServeHTTP(resp, req) assert.Equal(t, http.StatusCreated, resp.Code) + waitForEvent(true) st, err := th.App.GetStatus(th.BasicUser.Id) require.Nil(t, err)