feat: backend service
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
package push
|
||||
|
||||
import (
|
||||
"sync"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestCursorGeneratorMonotonicAndConcurrent(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
var g cursorGenerator
|
||||
const goroutines = 64
|
||||
const perGoroutine = 1000
|
||||
results := make(chan uint64, goroutines*perGoroutine)
|
||||
var wg sync.WaitGroup
|
||||
wg.Add(goroutines)
|
||||
for range goroutines {
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
for range perGoroutine {
|
||||
results <- g.next()
|
||||
}
|
||||
}()
|
||||
}
|
||||
wg.Wait()
|
||||
close(results)
|
||||
|
||||
seen := make(map[uint64]struct{}, goroutines*perGoroutine)
|
||||
var max uint64
|
||||
for n := range results {
|
||||
_, dup := seen[n]
|
||||
require.Falsef(t, dup, "duplicate cursor %d", n)
|
||||
seen[n] = struct{}{}
|
||||
if n > max {
|
||||
max = n
|
||||
}
|
||||
}
|
||||
assert.EqualValues(t, goroutines*perGoroutine, max)
|
||||
}
|
||||
|
||||
func TestFormatAndParseCursor(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
cases := []struct {
|
||||
in uint64
|
||||
out string
|
||||
}{
|
||||
{0, "00000000000000000000"},
|
||||
{1, "00000000000000000001"},
|
||||
{1234567890, "00000000001234567890"},
|
||||
}
|
||||
for _, tc := range cases {
|
||||
s := formatCursor(tc.in)
|
||||
assert.Equal(t, tc.out, s)
|
||||
assert.Len(t, s, cursorWidth)
|
||||
n, ok := parseCursor(s)
|
||||
require.True(t, ok)
|
||||
assert.Equal(t, tc.in, n)
|
||||
}
|
||||
|
||||
n, ok := parseCursor("")
|
||||
assert.True(t, ok)
|
||||
assert.Zero(t, n)
|
||||
|
||||
n, ok = parseCursor("not-a-number")
|
||||
assert.False(t, ok)
|
||||
assert.Zero(t, n)
|
||||
}
|
||||
|
||||
func TestFormatCursorLexicographicOrder(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
a := formatCursor(9)
|
||||
b := formatCursor(10)
|
||||
assert.Less(t, a, b, "lexicographic order must match numeric order")
|
||||
}
|
||||
Reference in New Issue
Block a user