summaryrefslogtreecommitdiff
path: root/internal/streamrow/row_test.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-12 23:33:15 +0200
committerPaul Buetow <paul@buetow.org>2026-03-12 23:33:15 +0200
commit775d3e59c7a6c060d0a9ecf3536c0df383d241be (patch)
tree981a6550849039ef4c443dce38a05829b79a11df /internal/streamrow/row_test.go
parent2efe5330cb43f685f3159a28ce211392a0bbe3c3 (diff)
refactor: extract shared syscall stream row model
Diffstat (limited to 'internal/streamrow/row_test.go')
-rw-r--r--internal/streamrow/row_test.go48
1 files changed, 48 insertions, 0 deletions
diff --git a/internal/streamrow/row_test.go b/internal/streamrow/row_test.go
new file mode 100644
index 0000000..729ba94
--- /dev/null
+++ b/internal/streamrow/row_test.go
@@ -0,0 +1,48 @@
+package streamrow
+
+import (
+ "sync"
+ "testing"
+)
+
+func TestSequencerStartsAfterSeed(t *testing.T) {
+ seq := NewSequencer(41)
+ if got, want := seq.Next(), uint64(42); got != want {
+ t.Fatalf("first Next() = %d, want %d", got, want)
+ }
+ if got, want := seq.Next(), uint64(43); got != want {
+ t.Fatalf("second Next() = %d, want %d", got, want)
+ }
+}
+
+func TestSequencerIsMonotonicUnderConcurrency(t *testing.T) {
+ seq := NewSequencer(0)
+
+ const workers = 8
+ const perWorker = 64
+
+ got := make(chan uint64, workers*perWorker)
+ var wg sync.WaitGroup
+ for i := 0; i < workers; i++ {
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+ for j := 0; j < perWorker; j++ {
+ got <- seq.Next()
+ }
+ }()
+ }
+ wg.Wait()
+ close(got)
+
+ seen := make(map[uint64]struct{}, workers*perWorker)
+ for n := range got {
+ if _, ok := seen[n]; ok {
+ t.Fatalf("duplicate sequence number %d", n)
+ }
+ seen[n] = struct{}{}
+ }
+ if got, want := len(seen), workers*perWorker; got != want {
+ t.Fatalf("unique sequence count = %d, want %d", got, want)
+ }
+}