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  }