kstore_kv_test.go 3.9 KB

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