1// Copyright 2023 The Gitea Authors. All rights reserved.
2// SPDX-License-Identifier: MIT
3
4package queue
5
6import (
7 "path/filepath"
8 "testing"
9
10 "forgejo.org/modules/setting"
11
12 "github.com/stretchr/testify/assert"
13 "github.com/stretchr/testify/require"
14)
15
16func TestManager(t *testing.T) {
17 oldAppDataPath := setting.AppDataPath
18 setting.AppDataPath = t.TempDir()
19 defer func() {
20 setting.AppDataPath = oldAppDataPath
21 }()
22
23 newQueueFromConfig := func(name, cfg string) (*WorkerPoolQueue[int], error) {
24 cfgProvider, err := setting.NewConfigProviderFromData(cfg)
25 if err != nil {
26 return nil, err
27 }
28 qs, err := setting.GetQueueSettings(cfgProvider, name)
29 if err != nil {
30 return nil, err
31 }
32 return newWorkerPoolQueueForTest(name, qs, func(s ...int) (unhandled []int) { return nil }, false)
33 }
34
35 // test invalid CONN_STR
36 _, err := newQueueFromConfig("default", `
37[queue]
38DATADIR = temp-dir
39CONN_STR = redis://
40`)
41 require.ErrorContains(t, err, "invalid leveldb connection string")
42
43 // test default config
44 q, err := newQueueFromConfig("default", "")
45 require.NoError(t, err)
46 assert.Equal(t, "default", q.GetName())
47 assert.Equal(t, "level", q.GetType())
48 assert.Equal(t, filepath.Join(setting.AppDataPath, "queues/common"), q.baseConfig.DataFullDir)
49 assert.Equal(t, 100000, q.baseConfig.Length)
50 assert.Equal(t, 20, q.batchLength)
51 assert.Empty(t, q.baseConfig.ConnStr)
52 assert.Equal(t, "default_queue", q.baseConfig.QueueFullName)
53 assert.Equal(t, "default_queue_unique", q.baseConfig.SetFullName)
54 assert.NotZero(t, q.GetWorkerMaxNumber())
55 assert.Equal(t, 0, q.GetWorkerNumber())
56 assert.Equal(t, 0, q.GetWorkerActiveNumber())
57 assert.Equal(t, 0, q.GetQueueItemNumber())
58 assert.Equal(t, "int", q.GetItemTypeName())
59
60 // test inherited config
61 cfgProvider, err := setting.NewConfigProviderFromData(`
62[queue]
63TYPE = channel
64DATADIR = queues/dir1
65LENGTH = 100
66BATCH_LENGTH = 20
67CONN_STR = "addrs=127.0.0.1:6379 db=0"
68QUEUE_NAME = _queue1
69
70[queue.sub]
71TYPE = level
72DATADIR = queues/dir2
73LENGTH = 102
74BATCH_LENGTH = 22
75CONN_STR =
76QUEUE_NAME = _q2
77SET_NAME = _u2
78MAX_WORKERS = 123
79`)
80
81 require.NoError(t, err)
82
83 q1 := createWorkerPoolQueue[string](t.Context(), "no-such", cfgProvider, nil, false)
84 assert.Equal(t, "no-such", q1.GetName())
85 assert.Equal(t, "dummy", q1.GetType()) // no handler, so it becomes dummy
86 assert.Equal(t, filepath.Join(setting.AppDataPath, "queues/dir1"), q1.baseConfig.DataFullDir)
87 assert.Equal(t, 100, q1.baseConfig.Length)
88 assert.Equal(t, 20, q1.batchLength)
89 assert.Equal(t, "addrs=127.0.0.1:6379 db=0", q1.baseConfig.ConnStr)
90 assert.Equal(t, "no-such_queue1", q1.baseConfig.QueueFullName)
91 assert.Equal(t, "no-such_queue1_unique", q1.baseConfig.SetFullName)
92 assert.NotZero(t, q1.GetWorkerMaxNumber())
93 assert.Equal(t, 0, q1.GetWorkerNumber())
94 assert.Equal(t, 0, q1.GetWorkerActiveNumber())
95 assert.Equal(t, 0, q1.GetQueueItemNumber())
96 assert.Equal(t, "string", q1.GetItemTypeName())
97 qid1 := GetManager().qidCounter
98
99 q2 := createWorkerPoolQueue(t.Context(), "sub", cfgProvider, func(s ...int) (unhandled []int) { return nil }, false)
100 assert.Equal(t, "sub", q2.GetName())
101 assert.Equal(t, "level", q2.GetType())
102 assert.Equal(t, filepath.Join(setting.AppDataPath, "queues/dir2"), q2.baseConfig.DataFullDir)
103 assert.Equal(t, 102, q2.baseConfig.Length)
104 assert.Equal(t, 22, q2.batchLength)
105 assert.Empty(t, q2.baseConfig.ConnStr)
106 assert.Equal(t, "sub_q2", q2.baseConfig.QueueFullName)
107 assert.Equal(t, "sub_q2_u2", q2.baseConfig.SetFullName)
108 assert.Equal(t, 123, q2.GetWorkerMaxNumber())
109 assert.Equal(t, 0, q2.GetWorkerNumber())
110 assert.Equal(t, 0, q2.GetWorkerActiveNumber())
111 assert.Equal(t, 0, q2.GetQueueItemNumber())
112 assert.Equal(t, "int", q2.GetItemTypeName())
113 qid2 := GetManager().qidCounter
114
115 assert.Equal(t, q1, GetManager().ManagedQueues()[qid1])
116
117 GetManager().GetManagedQueue(qid1).SetWorkerMaxNumber(120)
118 assert.Equal(t, 120, q1.workerMaxNum)
119
120 stop := runWorkerPoolQueue(q2)
121 require.NoError(t, GetManager().GetManagedQueue(qid2).FlushWithContext(t.Context(), 0))
122 require.NoError(t, GetManager().FlushAll(t.Context(), 0))
123 stop()
124}