lens @ master

  1//go:build unit
  2
  3package worker
  4
  5import (
  6	"context"
  7	"errors"
  8	"math/rand"
  9	"sync"
 10	"testing"
 11
 12	"golang.org/x/exp/slog"
 13
 14	"git.sr.ht/~gabrielgio/img/pkg/testkit"
 15)
 16
 17type (
 18	mockCounterListProcessor struct {
 19		done    bool
 20		countTo int
 21		counter int
 22	}
 23
 24	mockContextListProcessor struct {
 25	}
 26)
 27
 28func TestListProcessorLimit(t *testing.T) {
 29	var (
 30		log       = slog.Default()
 31		scheduler = NewScheduler(1)
 32		mock      = &mockCounterListProcessor{countTo: 10000}
 33	)
 34
 35	worker := NewTaskFromBatchProcessor[int](mock, scheduler, log.With("context", "testing"))
 36
 37	err := worker.Start(context.Background())
 38	testkit.TestFatalError(t, "Start", err)
 39
 40	testkit.TestValue(t, "Start", mock.countTo, mock.counter)
 41}
 42
 43func TestListProcessorContextCancelQuery(t *testing.T) {
 44	var (
 45		log       = slog.Default()
 46		scheduler = NewScheduler(1)
 47		mock      = &mockContextListProcessor{}
 48	)
 49
 50	worker := NewTaskFromBatchProcessor[int](mock, scheduler, log.With("context", "testing"))
 51
 52	ctx, cancel := context.WithCancel(context.Background())
 53	var wg sync.WaitGroup
 54
 55	wg.Add(1)
 56	go func() {
 57		defer wg.Done()
 58		err := worker.Start(ctx)
 59		if errors.Is(err, context.Canceled) {
 60			return
 61		}
 62		testkit.TestFatalError(t, "Start", err)
 63	}()
 64
 65	cancel()
 66	// this rely on timeout to test
 67	wg.Wait()
 68}
 69
 70func (m *mockCounterListProcessor) Query(_ context.Context) ([]int, error) {
 71	if m.done {
 72		return make([]int, 0), nil
 73	}
 74	values := make([]int, 0, m.countTo)
 75	for i := 0; i < m.countTo; i++ {
 76		values = append(values, rand.Int())
 77	}
 78
 79	m.done = true
 80	return values, nil
 81}
 82
 83func (m *mockCounterListProcessor) Process(_ context.Context, _ int) error {
 84	m.counter++
 85	return nil
 86}
 87
 88func (m *mockContextListProcessor) Query(_ context.Context) ([]int, error) {
 89	// keeps returning the query so it can run in infinity loop
 90	values := make([]int, 0, 10)
 91	for i := 0; i < 10; i++ {
 92		values = append(values, rand.Int())
 93	}
 94	return values, nil
 95}
 96
 97func (m *mockContextListProcessor) Process(_ context.Context, _ int) error {
 98	// do nothing
 99	return nil
100}