From eb61c783ed22f6bf3133487b39bd967b858e0998 Mon Sep 17 00:00:00 2001 From: kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com> Date: Wed, 1 May 2024 12:29:42 +0100 Subject: [PATCH] [bugfix] flaky paging test (#2888) --- internal/paging/page_test.go | 73 ++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 41 deletions(-) diff --git a/internal/paging/page_test.go b/internal/paging/page_test.go index 3046dfcdd..dcf727aec 100644 --- a/internal/paging/page_test.go +++ b/internal/paging/page_test.go @@ -20,16 +20,14 @@ package paging_test import ( "math/rand" "slices" + "strconv" "testing" "time" - "github.com/oklog/ulid" + "github.com/stretchr/testify/assert" "github.com/superseriousbusiness/gotosocial/internal/paging" ) -// random reader according to current-time source seed. -var randRd = rand.New(rand.NewSource(time.Now().Unix())) - type Case struct { // Name is the test case name. Name string @@ -63,13 +61,9 @@ func TestPage(t *testing.T) { // Page the input slice. out := c.Page.Page(c.Input) - // Log the results for case of error returns. - t.Logf("%s\npage=%+v input=%v expect=%v output=%v", c.Name, c.Page, c.Input, c.Expect, out) - - // Check paged output is as expected. - if !slices.Equal(out, c.Expect) { - t.Error("unexpected paged output") - } + // Check paged output is expected. + assert.Equal(t, c.Expect, out, + "input=%#v page=%v", c.Input, c.Page) }) } } @@ -80,8 +74,7 @@ var cases = []Case{ slices.SortFunc(ids, ascending) // Select random indices in slice. - minIdx := randRd.Intn(len(ids)) - maxIdx := randRd.Intn(len(ids)) + minIdx, maxIdx, _ := generateParams(len(ids)) // Select the boundaries. minID := ids[minIdx] @@ -104,9 +97,7 @@ var cases = []Case{ slices.SortFunc(ids, ascending) // Select random parameters in slice. - minIdx := randRd.Intn(len(ids)) - maxIdx := randRd.Intn(len(ids)) - limit := randRd.Intn(len(ids)) + 1 + minIdx, maxIdx, limit := generateParams(len(ids)) // Select the boundaries. minID := ids[minIdx] @@ -116,12 +107,10 @@ var cases = []Case{ expect := slices.Clone(ids) expect = cutLower(expect, minID) expect = cutUpper(expect, maxID) - slices.Reverse(expect) - - // Now limit the slice. if limit < len(expect) { expect = expect[:limit] } + slices.Reverse(expect) // Return page and expected IDs. return ids, &paging.Page{ @@ -135,8 +124,7 @@ var cases = []Case{ slices.SortFunc(ids, ascending) // Select random parameters in slice. - minIdx := randRd.Intn(len(ids)) - maxIdx := randRd.Intn(len(ids)) + minIdx, maxIdx, _ := generateParams(len(ids)) // Select the boundaries. minID := ids[minIdx] @@ -160,8 +148,7 @@ var cases = []Case{ slices.SortFunc(ids, descending) // Select random indices in slice. - sinceIdx := randRd.Intn(len(ids)) - maxIdx := randRd.Intn(len(ids)) + sinceIdx, maxIdx, _ := generateParams(len(ids)) // Select the boundaries. sinceID := ids[sinceIdx] @@ -183,7 +170,7 @@ var cases = []Case{ slices.SortFunc(ids, descending) // Select random indices in slice. - maxIdx := randRd.Intn(len(ids)) + _, maxIdx, _ := generateParams(len(ids)) // Select the boundaries. maxID := ids[maxIdx] @@ -202,7 +189,7 @@ var cases = []Case{ slices.SortFunc(ids, descending) // Select random indices in slice. - sinceIdx := randRd.Intn(len(ids)) + sinceIdx, _, _ := generateParams(len(ids)) // Select the boundaries. sinceID := ids[sinceIdx] @@ -221,7 +208,7 @@ var cases = []Case{ slices.SortFunc(ids, ascending) // Select random indices in slice. - minIdx := randRd.Intn(len(ids)) + minIdx, _, _ := generateParams(len(ids)) // Select the boundaries. minID := ids[minIdx] @@ -258,32 +245,34 @@ func cutUpper(in []string, bound string) []string { return in } +// random reader according to current-time source seed. +var randRd = rand.New(rand.NewSource(time.Now().Unix())) + +// generateParams ... +func generateParams(n int) (minIdx int, maxIdx int, limit int) { + maxIdx = max(1, randRd.Intn(n)) + minIdx = randRd.Intn(maxIdx) + limit = randRd.Intn(max(1, maxIdx-minIdx)) + 1 + return +} + // generateSlice generates a new slice of len containing ascending sorted slice. func generateSlice(len int) []string { - if len <= 0 { + if len <= 1 { // minimum testable // pageable amount len = 2 } - now := time.Now() in := make([]string, len) for i := 0; i < len; i++ { - // Convert now to timestamp. - t := ulid.Timestamp(now) - - // Create anew ulid for now. - u := ulid.MustNew(t, randRd) - - // Add to slice. - in[i] = u.String() - - // Bump now by 1 second. - now = now.Add(time.Second) + in[i] = strconv.Itoa(i) } return in } -func ascending(a, b string) int { +func ascending(sa, sb string) int { + a, _ := strconv.Atoi(sa) + b, _ := strconv.Atoi(sb) if a > b { return 1 } else if a < b { @@ -292,7 +281,9 @@ func ascending(a, b string) int { return 0 } -func descending(a, b string) int { +func descending(sa, sb string) int { + a, _ := strconv.Atoi(sa) + b, _ := strconv.Atoi(sb) if a < b { return 1 } else if a > b {