kstore_kv_test.go 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. package kstore_kv
  2. import (
  3. "os"
  4. "testing"
  5. "time"
  6. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/stream_name"
  7. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
  8. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
  9. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
  10. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent"
  11. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/lsi/store_ent/rec_key"
  12. )
  13. type tester struct {
  14. t *testing.T
  15. me *mock_env.MockEnv
  16. ctx kspec.IKernelCtx
  17. wg kspec.IKernelWg
  18. }
  19. func TestKernelStore(t *testing.T) {
  20. kCtx := kctx.GetKernelCtx()
  21. sf := &tester{
  22. t: t,
  23. me: mock_env.MakeEnv(),
  24. ctx: kCtx,
  25. wg: kCtx.Wg(),
  26. }
  27. _ = os.Unsetenv("LOCAL_STORE_PATH")
  28. _ = os.Setenv("LOCAL_STORE_PATH", "/store/store_kernel")
  29. fnClear := func() {
  30. pwd := sf.me.Pwd() + "/store/store_kernel"
  31. _ = os.RemoveAll(pwd)
  32. }
  33. fnClear()
  34. sf.new()
  35. sf.set()
  36. sf.get()
  37. sf.byPrefix()
  38. sf.del()
  39. sf.close()
  40. sf.workBad1()
  41. time.Sleep(time.Second * 2)
  42. }
  43. // Установка ключа после закрытия хранилища.
  44. func (sf *tester) workBad1() {
  45. sf.t.Log("workBad1")
  46. key := store_ent.NewStoreKeyFix("test_key")
  47. recVal := store_ent.NewRecValFix([]byte("test_val"))
  48. rec := store_ent.NewRecKvFix(key, recVal)
  49. res := kernStore.Set(rec)
  50. if res.IsOk() {
  51. sf.t.Fatalf("workBad1(): set, err==nil")
  52. }
  53. strKey := store_ent.NewStoreKeyFix("test_key")
  54. opt := kernStore.Get(strKey)
  55. if opt.IsOk() {
  56. sf.t.Fatalf("workBad1(): get, val==nil")
  57. }
  58. res = kernStore.Delete(strKey)
  59. if res.IsOk() {
  60. sf.t.Fatalf("workBad1(): del, err==nil")
  61. }
  62. }
  63. // Удаляет значение.
  64. func (sf *tester) del() {
  65. sf.t.Log("del")
  66. key := store_ent.NewStoreKeyFix("test_key")
  67. res := kernStore.Delete(key)
  68. if res.IsErr() {
  69. sf.t.Fatalf("del(): err=%v", res.Err())
  70. }
  71. opt := kernStore.Get(key)
  72. if opt.IsOk() {
  73. sf.t.Fatalf("del(): val!=nil")
  74. }
  75. }
  76. // Поиск по префиксу.
  77. func (sf *tester) byPrefix() {
  78. sf.t.Log("byPrefix")
  79. key := rec_key.NewRecKey("test_key2")
  80. val := store_ent.NewRecValFix([]byte("test_val"))
  81. rec := store_ent.NewRecKvFix(key, val)
  82. res0 := kernStore.Set(rec)
  83. if res0.IsErr() {
  84. sf.t.Fatalf("byPrefix(): err=%v", res0.Err())
  85. }
  86. key = rec_key.NewRecKey("test")
  87. res := kernStore.ByPrefix(key)
  88. res.Hassert("byPrefix(): val == nil")
  89. lstKey := res.Ok()
  90. if len(lstKey) != 2 {
  91. sf.t.Fatalf("byPrefix(): len(%v)!=2", len(lstKey))
  92. }
  93. }
  94. // Получение значения по ключу.
  95. func (sf *tester) get() {
  96. sf.t.Log("get")
  97. key := rec_key.NewRecKey("test_key")
  98. res := kernStore.Get(key)
  99. res.Hassert("get(): val==nil")
  100. strVal := string(res.Ok())
  101. if strVal != "test_val" {
  102. sf.t.Fatalf("get(): strVal(%v)!='test_val'", strVal)
  103. }
  104. }
  105. // Добавление ключа в хранилище.
  106. func (sf *tester) set() {
  107. sf.t.Log("set")
  108. key := rec_key.NewRecKey("test_key")
  109. val := store_ent.NewRecValFix([]byte("test_val"))
  110. rec := store_ent.NewRecKvFix(key, val)
  111. res := kernStore.Set(rec)
  112. if res.IsErr() {
  113. sf.t.Fatalf("set(): err=%v", res.Err())
  114. }
  115. }
  116. var (
  117. qName = stream_name.NewAStreamName("123")
  118. )
  119. // Закрытие хранилища.
  120. func (sf *tester) close() {
  121. sf.t.Log("close")
  122. sf.wg.Add(qName)
  123. sf.ctx.Cancel()
  124. time.Sleep(time.Millisecond * 20)
  125. go sf.wg.Done(qName)
  126. sf.wg.Wait()
  127. kernStore.close()
  128. prefix := store_ent.NewStoreKeyFix("test")
  129. res1 := kernStore.ByPrefix(prefix)
  130. if res1.IsOk() {
  131. sf.t.Fatalf("close(): val!=nil")
  132. }
  133. }
  134. // Создаёт новое хранилище ядра.
  135. func (sf *tester) new() {
  136. sf.t.Log("new")
  137. sf.newGood1()
  138. }
  139. func (sf *tester) newGood1() {
  140. sf.t.Log("newGood1")
  141. defer func() {
  142. if _panic := recover(); _panic != nil {
  143. sf.t.Fatalf("newGood1(): panic=%v", _panic)
  144. }
  145. }()
  146. _ = GetKernelStore()
  147. store := GetKernelStore()
  148. if log := store.Log(); log == nil {
  149. sf.t.Fatalf("newGood1(): log==nil")
  150. }
  151. }