You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

base_levelqueue_test.go 2.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // Copyright 2023 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package queue
  4. import (
  5. "testing"
  6. "code.gitea.io/gitea/modules/queue/lqinternal"
  7. "code.gitea.io/gitea/modules/setting"
  8. "gitea.com/lunny/levelqueue"
  9. "github.com/stretchr/testify/assert"
  10. "github.com/syndtr/goleveldb/leveldb"
  11. )
  12. func TestBaseLevelDB(t *testing.T) {
  13. _, err := newBaseLevelQueueGeneric(&BaseConfig{ConnStr: "redis://"}, false)
  14. assert.ErrorContains(t, err, "invalid leveldb connection string")
  15. _, err = newBaseLevelQueueGeneric(&BaseConfig{DataFullDir: "relative"}, false)
  16. assert.ErrorContains(t, err, "invalid leveldb data dir")
  17. testQueueBasic(t, newBaseLevelQueueSimple, toBaseConfig("baseLevelQueue", setting.QueueSettings{Datadir: t.TempDir() + "/queue-test", Length: 10}), false)
  18. testQueueBasic(t, newBaseLevelQueueUnique, toBaseConfig("baseLevelQueueUnique", setting.QueueSettings{ConnStr: "leveldb://" + t.TempDir() + "/queue-test", Length: 10}), true)
  19. }
  20. func TestCorruptedLevelQueue(t *testing.T) {
  21. // sometimes the levelqueue could be in a corrupted state, this test is to make sure it can recover from it
  22. dbDir := t.TempDir() + "/levelqueue-test"
  23. db, err := leveldb.OpenFile(dbDir, nil)
  24. if !assert.NoError(t, err) {
  25. return
  26. }
  27. defer db.Close()
  28. assert.NoError(t, db.Put([]byte("other-key"), []byte("other-value"), nil))
  29. nameQueuePrefix := []byte("queue_name")
  30. nameSetPrefix := []byte("set_name")
  31. lq, err := levelqueue.NewUniqueQueue(db, nameQueuePrefix, nameSetPrefix, false)
  32. assert.NoError(t, err)
  33. assert.NoError(t, lq.RPush([]byte("item-1")))
  34. itemKey := lqinternal.QueueItemKeyBytes(nameQueuePrefix, 1)
  35. itemValue, err := db.Get(itemKey, nil)
  36. assert.NoError(t, err)
  37. assert.Equal(t, []byte("item-1"), itemValue)
  38. // there should be 5 keys in db: queue low, queue high, 1 queue item, 1 set item, and "other-key"
  39. keys := lqinternal.ListLevelQueueKeys(db)
  40. assert.Len(t, keys, 5)
  41. // delete the queue item key, to corrupt the queue
  42. assert.NoError(t, db.Delete(itemKey, nil))
  43. // now the queue is corrupted, it never works again
  44. _, err = lq.LPop()
  45. assert.ErrorIs(t, err, levelqueue.ErrNotFound)
  46. assert.NoError(t, lq.Close())
  47. // remove all the queue related keys to reset the queue
  48. lqinternal.RemoveLevelQueueKeys(db, nameQueuePrefix)
  49. lqinternal.RemoveLevelQueueKeys(db, nameSetPrefix)
  50. // now there should be only 1 key in db: "other-key"
  51. keys = lqinternal.ListLevelQueueKeys(db)
  52. assert.Len(t, keys, 1)
  53. assert.Equal(t, []byte("other-key"), keys[0])
  54. // re-create a queue from db
  55. lq, err = levelqueue.NewUniqueQueue(db, nameQueuePrefix, nameSetPrefix, false)
  56. assert.NoError(t, err)
  57. assert.NoError(t, lq.RPush([]byte("item-new-1")))
  58. // now the queue works again
  59. itemValue, err = lq.LPop()
  60. assert.NoError(t, err)
  61. assert.Equal(t, []byte("item-new-1"), itemValue)
  62. assert.NoError(t, lq.Close())
  63. }