mirror of
https://github.com/jcreek/CosmicClash.git
synced 2026-09-11 00:14:00 +00:00
fix: fence concurrent queue mutations
This commit is contained in:
@@ -3,6 +3,7 @@ package domain
|
||||
import (
|
||||
"errors"
|
||||
"reflect"
|
||||
"sync"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
@@ -77,3 +78,32 @@ func TestQueueCreateIdempotencyIncludesCandidatePayload(t *testing.T) {
|
||||
t.Fatalf("changed create payload error = %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestQueueConcurrentCreateKeepsOneActiveTicketPerPlayer(t *testing.T) {
|
||||
q := NewQueue()
|
||||
now := time.Unix(1000, 0)
|
||||
var wg sync.WaitGroup
|
||||
results := make(chan error, 2)
|
||||
for i := 0; i < 2; i++ {
|
||||
wg.Add(1)
|
||||
go func(i int) {
|
||||
defer wg.Done()
|
||||
id := string(rune('a' + i))
|
||||
_, err := q.Create("same-player", "ticket-"+id, "create-"+id+"-123456", Candidate{TicketID: "ticket-" + id, PlayerID: "same-player", EnqueuedAt: now}, now)
|
||||
results <- err
|
||||
}(i)
|
||||
}
|
||||
wg.Wait()
|
||||
close(results)
|
||||
succeeded := 0
|
||||
for err := range results {
|
||||
if err == nil {
|
||||
succeeded++
|
||||
} else if !errors.Is(err, ErrPlayerQueued) {
|
||||
t.Fatalf("unexpected concurrent create error: %v", err)
|
||||
}
|
||||
}
|
||||
if succeeded != 1 {
|
||||
t.Fatalf("concurrent creates succeeded %d times", succeeded)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user