github.com/ydb-platform/ydb-go-sdk/v3@v3.89.2/internal/xsync/last_usage_guard_test.go (about) 1 package xsync 2 3 import ( 4 "testing" 5 "time" 6 7 "github.com/jonboulle/clockwork" 8 "github.com/stretchr/testify/require" 9 ) 10 11 func TestLastUsageGuardLock(t *testing.T) { 12 t.Run("NowFromLocked", func(t *testing.T) { 13 start := time.Unix(0, 0) 14 clock := clockwork.NewFakeClockAt(start) 15 lu := &lastUsage{ 16 clock: clock, 17 } 18 lu.t.Store(&start) 19 t1 := lu.Get() 20 require.Equal(t, start, t1) 21 f := lu.Start() 22 clock.Advance(time.Hour) 23 t2 := lu.Get() 24 require.Equal(t, start.Add(time.Hour), t2) 25 clock.Advance(time.Hour) 26 f() 27 t3 := lu.Get() 28 require.Equal(t, start.Add(2*time.Hour), t3) 29 clock.Advance(time.Hour) 30 t4 := lu.Get() 31 require.Equal(t, start.Add(2*time.Hour), t4) 32 }) 33 t.Run("UpdateAfterLastUnlock", func(t *testing.T) { 34 start := time.Unix(0, 0) 35 clock := clockwork.NewFakeClockAt(start) 36 lu := &lastUsage{ 37 clock: clock, 38 } 39 lu.t.Store(&start) 40 t1 := lu.Get() 41 require.Equal(t, start, t1) 42 f1 := lu.Start() 43 clock.Advance(time.Hour) 44 t2 := lu.Get() 45 require.Equal(t, start.Add(time.Hour), t2) 46 f2 := lu.Start() 47 clock.Advance(time.Hour) 48 f1() 49 f3 := lu.Start() 50 clock.Advance(time.Hour) 51 t3 := lu.Get() 52 require.Equal(t, start.Add(3*time.Hour), t3) 53 clock.Advance(time.Hour) 54 t4 := lu.Get() 55 require.Equal(t, start.Add(4*time.Hour), t4) 56 f3() 57 t5 := lu.Get() 58 require.Equal(t, start.Add(4*time.Hour), t5) 59 clock.Advance(time.Hour) 60 t6 := lu.Get() 61 require.Equal(t, start.Add(5*time.Hour), t6) 62 clock.Advance(time.Hour) 63 f2() 64 t7 := lu.Get() 65 require.Equal(t, start.Add(6*time.Hour), t7) 66 clock.Advance(time.Hour) 67 f2() 68 t8 := lu.Get() 69 require.Equal(t, start.Add(6*time.Hour), t8) 70 }) 71 t.Run("DeferRelease", func(t *testing.T) { 72 start := time.Unix(0, 0) 73 clock := clockwork.NewFakeClockAt(start) 74 lu := &lastUsage{ 75 clock: clock, 76 } 77 lu.t.Store(&start) 78 79 func() { 80 t1 := lu.Get() 81 require.Equal(t, start, t1) 82 clock.Advance(time.Hour) 83 t2 := lu.Get() 84 require.Equal(t, start, t2) 85 clock.Advance(time.Hour) 86 defer lu.Start()() 87 t3 := lu.Get() 88 require.Equal(t, start.Add(2*time.Hour), t3) 89 clock.Advance(time.Hour) 90 t4 := lu.Get() 91 require.Equal(t, start.Add(3*time.Hour), t4) 92 clock.Advance(time.Hour) 93 }() 94 clock.Advance(time.Hour) 95 t5 := lu.Get() 96 require.Equal(t, start.Add(4*time.Hour), t5) 97 }) 98 }