1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
package mapr
import (
"sync"
"testing"
)
// TestSafeAggregateSetConcurrency tests that SafeAggregateSet handles concurrent operations correctly.
func TestSafeAggregateSetConcurrency(t *testing.T) {
safeSet := NewSafeAggregateSet()
// Number of concurrent goroutines
numGoroutines := 100
// Number of operations per goroutine
opsPerGoroutine := 1000
var wg sync.WaitGroup
wg.Add(numGoroutines)
// Launch concurrent goroutines
for i := 0; i < numGoroutines; i++ {
go func(id int) {
defer wg.Done()
for j := 0; j < opsPerGoroutine; j++ {
// Test Count operation
err := safeSet.Aggregate("count", Count, "1", false)
if err != nil {
t.Errorf("Error in Count aggregation: %v", err)
}
// Test Sum operation
err = safeSet.Aggregate("sum", Sum, "10.5", false)
if err != nil {
t.Errorf("Error in Sum aggregation: %v", err)
}
// Test Last operation
err = safeSet.Aggregate("last", Last, "value", false)
if err != nil {
t.Errorf("Error in Last aggregation: %v", err)
}
// Test Min operation
err = safeSet.Aggregate("min", Min, "5.0", false)
if err != nil {
t.Errorf("Error in Min aggregation: %v", err)
}
// Test Max operation
err = safeSet.Aggregate("max", Max, "15.0", false)
if err != nil {
t.Errorf("Error in Max aggregation: %v", err)
}
// Increment samples
safeSet.IncrementSamples()
}
}(i)
}
// Wait for all goroutines to complete
wg.Wait()
// Verify results
clone := safeSet.Clone()
// Check Count
expectedCount := float64(numGoroutines * opsPerGoroutine)
if clone.FValues["count"] != expectedCount {
t.Errorf("Expected count %f, got %f", expectedCount, clone.FValues["count"])
}
// Check Sum
expectedSum := float64(numGoroutines * opsPerGoroutine) * 10.5
if clone.FValues["sum"] != expectedSum {
t.Errorf("Expected sum %f, got %f", expectedSum, clone.FValues["sum"])
}
// Check Min
if clone.FValues["min"] != 5.0 {
t.Errorf("Expected min 5.0, got %f", clone.FValues["min"])
}
// Check Max
if clone.FValues["max"] != 15.0 {
t.Errorf("Expected max 15.0, got %f", clone.FValues["max"])
}
// Check Samples
expectedSamples := numGoroutines * opsPerGoroutine
if clone.Samples != expectedSamples {
t.Errorf("Expected samples %d, got %d", expectedSamples, clone.Samples)
}
// Check Last (should be "value")
if clone.SValues["last"] != "value" {
t.Errorf("Expected last 'value', got '%s'", clone.SValues["last"])
}
}
// TestSafeAggregateSetClone tests that cloning creates an independent copy.
func TestSafeAggregateSetClone(t *testing.T) {
original := NewSafeAggregateSet()
// Add some data
original.Aggregate("count", Count, "1", false)
original.Aggregate("sum", Sum, "100", false)
original.Aggregate("last", Last, "original", false)
original.IncrementSamples()
// Clone the set
clone := original.Clone()
// Modify the original
original.Aggregate("count", Count, "1", false)
original.Aggregate("sum", Sum, "50", false)
original.Aggregate("last", Last, "modified", false)
original.IncrementSamples()
// Verify clone is unchanged
if clone.FValues["count"] != 1 {
t.Errorf("Clone count should be 1, got %f", clone.FValues["count"])
}
if clone.FValues["sum"] != 100 {
t.Errorf("Clone sum should be 100, got %f", clone.FValues["sum"])
}
if clone.SValues["last"] != "original" {
t.Errorf("Clone last should be 'original', got '%s'", clone.SValues["last"])
}
if clone.Samples != 1 {
t.Errorf("Clone samples should be 1, got %d", clone.Samples)
}
// Verify original has changed
originalClone := original.Clone()
if originalClone.FValues["count"] != 2 {
t.Errorf("Original count should be 2, got %f", originalClone.FValues["count"])
}
if originalClone.FValues["sum"] != 150 {
t.Errorf("Original sum should be 150, got %f", originalClone.FValues["sum"])
}
}
|