batch_image_worker_runtime_test.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. //go:build unit
  2. package service
  3. import (
  4. "context"
  5. "sync/atomic"
  6. "testing"
  7. "time"
  8. "github.com/Wei-Shaw/sub2api/internal/config"
  9. "github.com/stretchr/testify/require"
  10. )
  11. func TestBatchImageWorkerRuntime_QueueDisabledDoesNotStart(t *testing.T) {
  12. queue := &blockingBatchImageRuntimeQueue{}
  13. runtime := NewBatchImageWorkerRuntime(
  14. NewBatchImageWorker(queue, &fakeBatchImageProcessor{}, BatchImageWorkerOptions{}),
  15. &config.Config{BatchImage: config.BatchImageConfig{QueueEnabled: false}},
  16. )
  17. runtime.Start()
  18. require.False(t, runtime.Running())
  19. require.Zero(t, queue.reserveCalls.Load())
  20. require.NotPanics(t, runtime.Stop)
  21. }
  22. func TestBatchImageWorkerRuntime_QueueEnabledStartsAndStops(t *testing.T) {
  23. queue := &blockingBatchImageRuntimeQueue{}
  24. processor := &fakeBatchImageProcessor{}
  25. runtime := NewBatchImageWorkerRuntime(
  26. NewBatchImageWorker(queue, processor, BatchImageWorkerOptions{
  27. DelayedPollInterval: time.Hour,
  28. RecoveryInterval: time.Hour,
  29. }),
  30. &config.Config{BatchImage: config.BatchImageConfig{QueueEnabled: true}},
  31. )
  32. runtime.Start()
  33. require.Eventually(t, func() bool {
  34. return runtime.Running() && queue.reserveCalls.Load() > 0
  35. }, time.Second, 10*time.Millisecond)
  36. require.Empty(t, processor.processed)
  37. require.NotPanics(t, runtime.Stop)
  38. require.False(t, runtime.Running())
  39. require.NotPanics(t, runtime.Stop)
  40. }
  41. type blockingBatchImageRuntimeQueue struct {
  42. reserveCalls atomic.Int64
  43. }
  44. func (q *blockingBatchImageRuntimeQueue) Enqueue(context.Context, string) error {
  45. return nil
  46. }
  47. func (q *blockingBatchImageRuntimeQueue) Reserve(ctx context.Context, _ time.Duration) (ReservedBatchImageJob, error) {
  48. q.reserveCalls.Add(1)
  49. <-ctx.Done()
  50. return ReservedBatchImageJob{}, ctx.Err()
  51. }
  52. func (q *blockingBatchImageRuntimeQueue) RequeueAfter(context.Context, string, time.Duration) error {
  53. return nil
  54. }
  55. func (q *blockingBatchImageRuntimeQueue) Ack(context.Context, string) error {
  56. return nil
  57. }
  58. func (q *blockingBatchImageRuntimeQueue) Heartbeat(context.Context, string) error {
  59. return nil
  60. }
  61. func (q *blockingBatchImageRuntimeQueue) MoveDueDelayedToReady(context.Context, int) (int, error) {
  62. return 0, nil
  63. }
  64. func (q *blockingBatchImageRuntimeQueue) RecoverStaleActive(context.Context, time.Duration, int) (int, error) {
  65. return 0, nil
  66. }
  67. func (q *blockingBatchImageRuntimeQueue) TryAcquireJobLock(context.Context, string, time.Duration) (BatchImageJobLock, bool, error) {
  68. return nil, false, nil
  69. }