lens @ c3ea735c0f03a0827a8e753a5b5adf6e31f4c925

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