Fix some iffy tests with waitFor function
This commit is contained in:
parent
cd3429842b
commit
983afb2b45
4 changed files with 59 additions and 18 deletions
2
go.mod
2
go.mod
|
@ -19,7 +19,7 @@ require (
|
||||||
golang.org/x/sync v0.1.0
|
golang.org/x/sync v0.1.0
|
||||||
golang.org/x/term v0.5.0
|
golang.org/x/term v0.5.0
|
||||||
golang.org/x/time v0.3.0
|
golang.org/x/time v0.3.0
|
||||||
google.golang.org/api v0.110.0
|
google.golang.org/api v0.111.0
|
||||||
gopkg.in/yaml.v2 v2.4.0
|
gopkg.in/yaml.v2 v2.4.0
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
2
go.sum
2
go.sum
|
@ -167,6 +167,8 @@ golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3j
|
||||||
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
|
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
|
||||||
google.golang.org/api v0.110.0 h1:l+rh0KYUooe9JGbGVx71tbFo4SMbMTXK3I3ia2QSEeU=
|
google.golang.org/api v0.110.0 h1:l+rh0KYUooe9JGbGVx71tbFo4SMbMTXK3I3ia2QSEeU=
|
||||||
google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI=
|
google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI=
|
||||||
|
google.golang.org/api v0.111.0 h1:bwKi+z2BsdwYFRKrqwutM+axAlYLz83gt5pDSXCJT+0=
|
||||||
|
google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0=
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
|
google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
|
||||||
|
|
|
@ -657,6 +657,17 @@ func TestAccount_Reservation_Delete_Messages_And_Attachments(t *testing.T) {
|
||||||
m2 := toMessage(t, rr.Body.String())
|
m2 := toMessage(t, rr.Body.String())
|
||||||
require.FileExists(t, filepath.Join(s.config.AttachmentCacheDir, m2.ID))
|
require.FileExists(t, filepath.Join(s.config.AttachmentCacheDir, m2.ID))
|
||||||
|
|
||||||
|
// Pre-verify message count and file
|
||||||
|
ms, err := s.messageCache.Messages("mytopic1", sinceAllMessages, false)
|
||||||
|
require.Nil(t, err)
|
||||||
|
require.Equal(t, 1, len(ms))
|
||||||
|
require.FileExists(t, filepath.Join(s.config.AttachmentCacheDir, m1.ID))
|
||||||
|
|
||||||
|
ms, err = s.messageCache.Messages("mytopic2", sinceAllMessages, false)
|
||||||
|
require.Nil(t, err)
|
||||||
|
require.Equal(t, 1, len(ms))
|
||||||
|
require.FileExists(t, filepath.Join(s.config.AttachmentCacheDir, m2.ID))
|
||||||
|
|
||||||
// Delete reservation
|
// Delete reservation
|
||||||
rr = request(t, s, "DELETE", "/v1/account/reservation/mytopic1", ``, map[string]string{
|
rr = request(t, s, "DELETE", "/v1/account/reservation/mytopic1", ``, map[string]string{
|
||||||
"X-Delete-Messages": "true",
|
"X-Delete-Messages": "true",
|
||||||
|
@ -672,9 +683,13 @@ func TestAccount_Reservation_Delete_Messages_And_Attachments(t *testing.T) {
|
||||||
|
|
||||||
// Verify that messages and attachments were deleted
|
// Verify that messages and attachments were deleted
|
||||||
// This does not explicitly call the manager!
|
// This does not explicitly call the manager!
|
||||||
time.Sleep(time.Second)
|
waitFor(t, func() bool {
|
||||||
|
ms, err := s.messageCache.Messages("mytopic1", sinceAllMessages, false)
|
||||||
|
require.Nil(t, err)
|
||||||
|
return len(ms) == 0 && !util.FileExists(filepath.Join(s.config.AttachmentCacheDir, m1.ID))
|
||||||
|
})
|
||||||
|
|
||||||
ms, err := s.messageCache.Messages("mytopic1", sinceAllMessages, false)
|
ms, err = s.messageCache.Messages("mytopic1", sinceAllMessages, false)
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
require.Equal(t, 0, len(ms))
|
require.Equal(t, 0, len(ms))
|
||||||
require.NoFileExists(t, filepath.Join(s.config.AttachmentCacheDir, m1.ID))
|
require.NoFileExists(t, filepath.Join(s.config.AttachmentCacheDir, m1.ID))
|
||||||
|
@ -712,13 +727,12 @@ func TestAccount_Persist_UserStats_After_Tier_Change(t *testing.T) {
|
||||||
})
|
})
|
||||||
require.Equal(t, 200, rr.Code)
|
require.Equal(t, 200, rr.Code)
|
||||||
|
|
||||||
// Wait for stats queue writer
|
// Wait for stats queue writer, verify that message stats were persisted
|
||||||
time.Sleep(600 * time.Millisecond)
|
waitFor(t, func() bool {
|
||||||
|
u, err := s.userManager.User("phil")
|
||||||
// Verify that message stats were persisted
|
require.Nil(t, err)
|
||||||
u, err := s.userManager.User("phil")
|
return int64(1) == u.Stats.Messages
|
||||||
require.Nil(t, err)
|
})
|
||||||
require.Equal(t, int64(1), u.Stats.Messages)
|
|
||||||
|
|
||||||
// Change tier, make a request (to reset limiters)
|
// Change tier, make a request (to reset limiters)
|
||||||
require.Nil(t, s.userManager.ChangeTier("phil", "pro"))
|
require.Nil(t, s.userManager.ChangeTier("phil", "pro"))
|
||||||
|
@ -736,10 +750,11 @@ func TestAccount_Persist_UserStats_After_Tier_Change(t *testing.T) {
|
||||||
require.Equal(t, 200, rr.Code)
|
require.Equal(t, 200, rr.Code)
|
||||||
|
|
||||||
// Verify that message stats were persisted
|
// Verify that message stats were persisted
|
||||||
time.Sleep(600 * time.Millisecond)
|
waitFor(t, func() bool {
|
||||||
u, err = s.userManager.User("phil")
|
u, err := s.userManager.User("phil")
|
||||||
require.Nil(t, err)
|
require.Nil(t, err)
|
||||||
require.Equal(t, int64(2), u.Stats.Messages) // v.EnqueueUserStats had run!
|
return int64(2) == u.Stats.Messages // v.EnqueueUserStats had run!
|
||||||
|
})
|
||||||
|
|
||||||
// Stats keep counting
|
// Stats keep counting
|
||||||
rr = request(t, s, "GET", "/v1/account", "", map[string]string{
|
rr = request(t, s, "GET", "/v1/account", "", map[string]string{
|
||||||
|
|
|
@ -914,7 +914,15 @@ func TestServer_StatsResetter(t *testing.T) {
|
||||||
require.Equal(t, int64(2), account.Stats.Messages)
|
require.Equal(t, int64(2), account.Stats.Messages)
|
||||||
|
|
||||||
// Wait for stats resetter to run
|
// Wait for stats resetter to run
|
||||||
time.Sleep(2200 * time.Millisecond)
|
waitFor(t, func() bool {
|
||||||
|
response = request(t, s, "GET", "/v1/account", "", map[string]string{
|
||||||
|
"Authorization": util.BasicAuth("phil", "phil"),
|
||||||
|
})
|
||||||
|
require.Equal(t, 200, response.Code)
|
||||||
|
account, err = util.UnmarshalJSON[apiAccountResponse](io.NopCloser(response.Body))
|
||||||
|
require.Nil(t, err)
|
||||||
|
return account.Stats.Messages == 0
|
||||||
|
})
|
||||||
|
|
||||||
// User stats show 0 messages now!
|
// User stats show 0 messages now!
|
||||||
response = request(t, s, "GET", "/v1/account", "", map[string]string{
|
response = request(t, s, "GET", "/v1/account", "", map[string]string{
|
||||||
|
@ -1661,9 +1669,10 @@ func TestServer_PublishAttachmentAndExpire(t *testing.T) {
|
||||||
require.Equal(t, content, response.Body.String())
|
require.Equal(t, content, response.Body.String())
|
||||||
|
|
||||||
// Prune and makes sure it's gone
|
// Prune and makes sure it's gone
|
||||||
time.Sleep(time.Second) // Sigh ...
|
waitFor(t, func() bool {
|
||||||
s.execManager()
|
s.execManager() // May run many times
|
||||||
require.NoFileExists(t, file)
|
return !util.FileExists(file)
|
||||||
|
})
|
||||||
response = request(t, s, "GET", path, "", nil)
|
response = request(t, s, "GET", path, "", nil)
|
||||||
require.Equal(t, 404, response.Code)
|
require.Equal(t, 404, response.Code)
|
||||||
}
|
}
|
||||||
|
@ -2311,3 +2320,18 @@ func readAll(t *testing.T, rc io.ReadCloser) string {
|
||||||
}
|
}
|
||||||
return string(b)
|
return string(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func waitFor(t *testing.T, f func() bool) {
|
||||||
|
waitForWithMaxWait(t, 5*time.Second, f)
|
||||||
|
}
|
||||||
|
|
||||||
|
func waitForWithMaxWait(t *testing.T, maxWait time.Duration, f func() bool) {
|
||||||
|
start := time.Now()
|
||||||
|
for time.Since(start) < maxWait {
|
||||||
|
if f() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
time.Sleep(100 * time.Millisecond)
|
||||||
|
}
|
||||||
|
t.Fatalf("Function f did not succeed after %v", maxWait)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue