pomerium/pkg/grpc/databroker/fast_forward_test.go
Caleb Doxsey bbed421cd8
config: remove source, remove deadcode, fix linting issues (#4118)
* remove source, remove deadcode, fix linting issues

* use github action for lint

* fix missing envoy
2023-04-21 17:25:11 -06:00

74 lines
1.4 KiB
Go

package databroker
import (
"context"
"math/rand"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
type mockFF struct {
clear chan struct{}
update chan uint64
}
func (ff *mockFF) ClearRecords(_ context.Context) {
ff.clear <- struct{}{}
}
func (ff *mockFF) UpdateRecords(_ context.Context, sv uint64, _ []*Record) {
time.Sleep(time.Millisecond * time.Duration(rand.Intn(5)))
ff.update <- sv
}
func (ff *mockFF) GetDataBrokerServiceClient() DataBrokerServiceClient {
return nil
}
func (ff *mockFF) getUpdate(ctx context.Context) (uint64, error) {
select {
case <-ctx.Done():
return 0, ctx.Err()
case sv := <-ff.update:
return sv, nil
}
}
func TestFastForward(t *testing.T) {
ctx, cancel := context.WithTimeout(context.Background(), time.Second*15)
defer cancel()
m := &mockFF{
clear: make(chan struct{}),
update: make(chan uint64),
}
f := newFastForwardHandler(ctx, m)
for x := 0; x < 100; x++ {
n := rand.Intn(100) + 1
for i := 1; i <= n; i++ {
f.UpdateRecords(ctx, uint64(i), nil)
}
var prev uint64
assert.Eventually(t, func() bool {
sv, err := m.getUpdate(ctx)
require.NoError(t, err)
assert.Less(t, prev, sv)
prev = sv
t.Log(x, sv)
return int(sv) == n
}, time.Second, time.Millisecond*10)
f.ClearRecords(ctx)
select {
case <-ctx.Done():
t.Error("timed out")
case <-m.clear:
}
}
}