on main help sign in
test: use synctest
a9ea0d6Carlos Alexandro Becker
internal/csync/slices_test.go+46−39
@@ -5,6 +5,7 @@ import (
5 "sync"
5 "sync"
6 "sync/atomic"
6 "sync/atomic"
7 "testing"
7 "testing"
8+ "testing/synctest"
8 "time"
9 "time"
9
10
10 "github.com/stretchr/testify/require"
11 "github.com/stretchr/testify/require"
@@ -13,43 +14,47 @@ import (
13func TestLazySlice_Seq(t *testing.T) {
14func TestLazySlice_Seq(t *testing.T) {
14 t.Parallel()
15 t.Parallel()
15
16
17+ synctest.Test(t, func(t *testing.T) {
18+ t.Helper()
16− data := []string{"a", "b", "c"}
19+ data := []string{"a", "b", "c"}
17− s := NewLazySlice(func() []string {
20+ s := NewLazySlice(func() []string {
18− // TODO: use synctest when new Go is out.
19− time.Sleep(10 * time.Millisecond) // Small delay to ensure loading happens
21+ time.Sleep(10 * time.Millisecond) // Small delay to ensure loading happens
20− return data
22+ return data
21− })
23+ })
22
24
23− var result []string
25+ var result []string
24− for v := range s.Seq() {
26+ for v := range s.Seq() {
25− result = append(result, v)
27+ result = append(result, v)
26− }
28+ }
27
29
28− require.Equal(t, data, result)
30+ require.Equal(t, data, result)
31+ })
29}
32}
30
33
31func TestLazySlice_SeqWaitsForLoading(t *testing.T) {
34func TestLazySlice_SeqWaitsForLoading(t *testing.T) {
32 t.Parallel()
35 t.Parallel()
36+ synctest.Test(t, func(t *testing.T) {
37+ t.Helper()
33
38
34− var loaded atomic.Bool
39+ var loaded atomic.Bool
35− data := []string{"x", "y", "z"}
40+ data := []string{"x", "y", "z"}
36
41
37− s := NewLazySlice(func() []string {
42+ s := NewLazySlice(func() []string {
38− // TODO: use synctest when new Go is out.
39− time.Sleep(100 * time.Millisecond)
43+ time.Sleep(100 * time.Millisecond)
40− loaded.Store(true)
44+ loaded.Store(true)
41− return data
45+ return data
42− })
46+ })
43
47
44− require.False(t, loaded.Load(), "should not be loaded immediately")
48+ require.False(t, loaded.Load(), "should not be loaded immediately")
45
49
46− var result []string
50+ var result []string
47− for v := range s.Seq() {
51+ for v := range s.Seq() {
48− result = append(result, v)
52+ result = append(result, v)
49− }
53+ }
50
54
51− require.True(t, loaded.Load(), "should be loaded after Seq")
55+ require.True(t, loaded.Load(), "should be loaded after Seq")
52− require.Equal(t, data, result)
56+ require.Equal(t, data, result)
57+ })
53}
58}
54
59
55func TestLazySlice_EmptySlice(t *testing.T) {
60func TestLazySlice_EmptySlice(t *testing.T) {
@@ -70,22 +75,24 @@ func TestLazySlice_EmptySlice(t *testing.T) {
70func TestLazySlice_EarlyBreak(t *testing.T) {
75func TestLazySlice_EarlyBreak(t *testing.T) {
71 t.Parallel()
76 t.Parallel()
72
77
78+ synctest.Test(t, func(t *testing.T) {
79+ t.Helper()
73− data := []string{"a", "b", "c", "d", "e"}
80+ data := []string{"a", "b", "c", "d", "e"}
74− s := NewLazySlice(func() []string {
81+ s := NewLazySlice(func() []string {
75− // TODO: use synctest when new Go is out.
76− time.Sleep(10 * time.Millisecond) // Small delay to ensure loading happens
82+ time.Sleep(10 * time.Millisecond) // Small delay to ensure loading happens
77− return data
83+ return data
78− })
84+ })
79
85
80− var result []string
86+ var result []string
81− for v := range s.Seq() {
87+ for v := range s.Seq() {
82− result = append(result, v)
88+ result = append(result, v)
83− if len(result) == 2 {
89+ if len(result) == 2 {
84− break
90+ break
91+ }
85 }
92 }
86− }
87
93
88− require.Equal(t, []string{"a", "b"}, result)
94+ require.Equal(t, []string{"a", "b"}, result)
95+ })
89}
96}
90
97
91func TestSlice(t *testing.T) {
98func TestSlice(t *testing.T) {