mirror of
https://github.com/andwati/telecom-platform.git
synced 2026-10-24 21:52:16 +00:00
refactor: Fix race condition in chaos service and update Redis rate limiter test mocks
- Add copy method to Experiment struct to create deep copy with proper Finished pointer handling - Return experiment copy from RunExperiment to prevent race condition with JSON marshaling - Update mock Eval calls to use float64 for window parameter instead of int64 in redis_ratelimit_test.go - Update comments to reflect correct parameter types: now (int64), window (float64), limit (int64)
This commit is contained in:
@@ -64,8 +64,8 @@ func TestRedisRateLimiter_Allow(t *testing.T) {
|
||||
|
||||
cmd := redis.NewCmd(context.Background())
|
||||
cmd.SetVal(mockResult)
|
||||
// Match the actual call signature: script, key, now, window, limit
|
||||
mockClient.On("Eval", mock.AnythingOfType("string"), mock.AnythingOfType("string"), mock.AnythingOfType("int64"), mock.AnythingOfType("int64"), mock.AnythingOfType("int64")).Return(cmd)
|
||||
// Match the actual call signature: script, key, now (int64), window (float64), limit (int64)
|
||||
mockClient.On("Eval", mock.AnythingOfType("string"), mock.AnythingOfType("string"), mock.AnythingOfType("int64"), mock.AnythingOfType("float64"), mock.AnythingOfType("int64")).Return(cmd)
|
||||
|
||||
// Create rate limiter with mock client
|
||||
limiter := NewRedisRateLimiter(mockClient, "test", tt.limit, tt.window)
|
||||
@@ -116,7 +116,7 @@ func TestRedisRateLimitMiddleware(t *testing.T) {
|
||||
// Mock successful rate limit check
|
||||
cmd := redis.NewCmd(context.Background())
|
||||
cmd.SetVal([]any{int64(1), int64(4), int64(time.Now().Unix() + 60)})
|
||||
mockClient.On("Eval", mock.AnythingOfType("string"), mock.AnythingOfType("string"), mock.AnythingOfType("int64"), mock.AnythingOfType("int64"), mock.AnythingOfType("int64")).Return(cmd)
|
||||
mockClient.On("Eval", mock.AnythingOfType("string"), mock.AnythingOfType("string"), mock.AnythingOfType("int64"), mock.AnythingOfType("float64"), mock.AnythingOfType("int64")).Return(cmd)
|
||||
|
||||
// Create rate limiter with mock client
|
||||
limiter := NewRedisRateLimiter(mockClient, "test", 5, time.Minute)
|
||||
@@ -272,8 +272,8 @@ func TestMultiTierRateLimiter(t *testing.T) {
|
||||
premiumCmd := redis.NewCmd(context.Background())
|
||||
premiumCmd.SetVal([]any{int64(1), int64(99), int64(time.Now().Unix() + 60)})
|
||||
|
||||
mockClient.On("Eval", mock.AnythingOfType("string"), mock.AnythingOfType("string"), mock.AnythingOfType("int64"), mock.AnythingOfType("int64"), mock.AnythingOfType("int64")).Return(freeCmd).Once()
|
||||
mockClient.On("Eval", mock.AnythingOfType("string"), mock.AnythingOfType("string"), mock.AnythingOfType("int64"), mock.AnythingOfType("int64"), mock.AnythingOfType("int64")).Return(premiumCmd).Once()
|
||||
mockClient.On("Eval", mock.AnythingOfType("string"), mock.AnythingOfType("string"), mock.AnythingOfType("int64"), mock.AnythingOfType("float64"), mock.AnythingOfType("int64")).Return(freeCmd).Once()
|
||||
mockClient.On("Eval", mock.AnythingOfType("string"), mock.AnythingOfType("string"), mock.AnythingOfType("int64"), mock.AnythingOfType("float64"), mock.AnythingOfType("int64")).Return(premiumCmd).Once()
|
||||
|
||||
// Create multi-tier rate limiter with mock client
|
||||
tiers := map[string]struct {
|
||||
|
||||
@@ -30,6 +30,26 @@ type Experiment struct {
|
||||
Error string
|
||||
}
|
||||
|
||||
// copy creates a deep copy of the experiment to avoid race conditions
|
||||
func (e *Experiment) copy() *Experiment {
|
||||
var finished *time.Time
|
||||
if e.Finished != nil {
|
||||
fin := *e.Finished
|
||||
finished = &fin
|
||||
}
|
||||
return &Experiment{
|
||||
ID: e.ID,
|
||||
Name: e.Name,
|
||||
Target: e.Target,
|
||||
Type: e.Type,
|
||||
Config: e.Config,
|
||||
Status: e.Status,
|
||||
Started: e.Started,
|
||||
Finished: finished,
|
||||
Error: e.Error,
|
||||
}
|
||||
}
|
||||
|
||||
type ExperimentType string
|
||||
|
||||
const (
|
||||
@@ -90,7 +110,8 @@ func (cs *ChaosService) RunExperiment(ctx context.Context, expType ExperimentTyp
|
||||
// Run experiment in background
|
||||
go cs.executeExperiment(ctx, exp)
|
||||
|
||||
return exp, nil
|
||||
// Return a copy to avoid race condition with JSON marshaling
|
||||
return exp.copy(), nil
|
||||
}
|
||||
|
||||
func (cs *ChaosService) executeExperiment(ctx context.Context, exp *Experiment) {
|
||||
|
||||
Reference in New Issue
Block a user