summaryrefslogtreecommitdiff
path: root/internal/mapr/safe_aggregateset_test.go
blob: 327987aeb6d3ceb07dd8a64029bb7e68adbd9f32 (plain)
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"])
	}
}