1package csync
2
3import (
4 "testing"
5
6 "github.com/stretchr/testify/require"
7)
8
9func TestVersionedMap_Set(t *testing.T) {
10 t.Parallel()
11
12 vm := NewVersionedMap[string, int]()
13 require.Equal(t, uint64(0), vm.Version())
14
15 vm.Set("key1", 42)
16 require.Equal(t, uint64(1), vm.Version())
17
18 value, ok := vm.Get("key1")
19 require.True(t, ok)
20 require.Equal(t, 42, value)
21}
22
23func TestVersionedMap_Del(t *testing.T) {
24 t.Parallel()
25
26 vm := NewVersionedMap[string, int]()
27 vm.Set("key1", 42)
28 initialVersion := vm.Version()
29
30 vm.Del("key1")
31 require.Equal(t, initialVersion+1, vm.Version())
32
33 _, ok := vm.Get("key1")
34 require.False(t, ok)
35}
36
37func TestVersionedMap_VersionIncrement(t *testing.T) {
38 t.Parallel()
39
40 vm := NewVersionedMap[string, int]()
41 initialVersion := vm.Version()
42
43 // Setting a value should increment the version
44 vm.Set("key1", 42)
45 require.Equal(t, initialVersion+1, vm.Version())
46
47 // Deleting a value should increment the version
48 vm.Del("key1")
49 require.Equal(t, initialVersion+2, vm.Version())
50
51 // Deleting a non-existent key should still increment the version
52 vm.Del("nonexistent")
53 require.Equal(t, initialVersion+3, vm.Version())
54}
55
56func TestVersionedMap_ConcurrentAccess(t *testing.T) {
57 t.Parallel()
58
59 vm := NewVersionedMap[int, int]()
60 const numGoroutines = 100
61 const numOperations = 100
62
63 // Initial version
64 initialVersion := vm.Version()
65
66 // Perform concurrent Set and Del operations
67 for i := range numGoroutines {
68 go func(id int) {
69 for j := range numOperations {
70 key := id*numOperations + j
71 vm.Set(key, key*2)
72 vm.Del(key)
73 }
74 }(i)
75 }
76
77 // Wait for operations to complete by checking the version
78 // This is a simplified check - in a real test you might want to use sync.WaitGroup
79 expectedMinVersion := initialVersion + uint64(numGoroutines*numOperations*2)
80
81 // Allow some time for operations to complete
82 for vm.Version() < expectedMinVersion {
83 // Busy wait - in a real test you'd use proper synchronization
84 }
85
86 // Final version should be at least the expected minimum
87 require.GreaterOrEqual(t, vm.Version(), expectedMinVersion)
88 require.Equal(t, 0, vm.Len())
89}