code.gitea.io/gitea@v1.22.3/modules/queue/manager_test.go (about)

     1  // Copyright 2023 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package queue
     5  
     6  import (
     7  	"context"
     8  	"path/filepath"
     9  	"testing"
    10  
    11  	"code.gitea.io/gitea/modules/setting"
    12  
    13  	"github.com/stretchr/testify/assert"
    14  )
    15  
    16  func 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]
    38  DATADIR = temp-dir
    39  CONN_STR = redis://
    40  `)
    41  	assert.ErrorContains(t, err, "invalid leveldb connection string")
    42  
    43  	// test default config
    44  	q, err := newQueueFromConfig("default", "")
    45  	assert.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.Equal(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]
    63  TYPE = channel
    64  DATADIR = queues/dir1
    65  LENGTH = 100
    66  BATCH_LENGTH = 20
    67  CONN_STR = "addrs=127.0.0.1:6379 db=0"
    68  QUEUE_NAME = _queue1
    69  
    70  [queue.sub]
    71  TYPE = level
    72  DATADIR = queues/dir2
    73  LENGTH = 102
    74  BATCH_LENGTH = 22
    75  CONN_STR =
    76  QUEUE_NAME = _q2
    77  SET_NAME = _u2
    78  MAX_WORKERS = 123
    79  `)
    80  
    81  	assert.NoError(t, err)
    82  
    83  	q1 := createWorkerPoolQueue[string](context.Background(), "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(context.Background(), "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.Equal(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  	assert.NoError(t, GetManager().GetManagedQueue(qid2).FlushWithContext(context.Background(), 0))
   122  	assert.NoError(t, GetManager().FlushAll(context.Background(), 0))
   123  	stop()
   124  }