package kstore_kv import ( "os" "testing" "time" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias" . "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes" "gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx" ) type tester struct { t *testing.T me *mock_env.MockEnv ctx IKernelCtx wg IKernelWg } func TestKernelStore(t *testing.T) { ctx := kctx.GetKernelCtx().Hassert("TestKernelStore()") sf := &tester{ t: t, me: mock_env.MakeEnv(), ctx: ctx, wg: ctx.Wg(), } _ = os.Unsetenv("LOCAL_STORE_PATH") _ = os.Setenv("LOCAL_STORE_PATH", "/store/store_kernel") fnClear := func() { pwd := sf.me.Pwd() + "/store/store_kernel" _ = os.RemoveAll(pwd) } fnClear() sf.new() sf.set() sf.get() sf.byPrefix() sf.del() sf.close() sf.workBad1() time.Sleep(time.Second * 2) } // Установка ключа после закрытия хранилища. func (sf *tester) workBad1() { sf.t.Log("workBad1") res := kernStore.Set("test_key", []byte("test_val")) if res.IsOk() { sf.t.Fatalf("workBad1(): set, err==nil") } opt := kernStore.Get("test_key") if opt.IsOk() { sf.t.Fatalf("workBad1(): get, val==nil") } res = kernStore.Delete("test_key") if res.IsOk() { sf.t.Fatalf("workBad1(): del, err==nil") } } // Удаляет значение. func (sf *tester) del() { sf.t.Log("del") res := kernStore.Delete("test_key") if res.IsErr() { sf.t.Fatalf("del(): err=%v", res.Err()) } opt := kernStore.Get("test_key") if opt.IsOk() { sf.t.Fatalf("del(): val!=nil") } } // Поиск по префиксу. func (sf *tester) byPrefix() { sf.t.Log("byPrefix") res0 := kernStore.Set("test_key2", []byte("test_key2")) if res0.IsErr() { sf.t.Fatalf("byPrefix(): err=%v", res0.Err()) } res := kernStore.ByPrefix("test") res.Hassert("byPrefix(): val == nil") lstKey := res.Val() if len(lstKey) != 2 { sf.t.Fatalf("byPrefix(): len(%v)!=2", len(lstKey)) } } // Получение значения по ключу. func (sf *tester) get() { sf.t.Log("get") opt := kernStore.Get("test_key") opt.Hassert("get(): val==nil") strVal := string(opt.Val()) if strVal != "test_val" { sf.t.Fatalf("get(): strVal(%v)!='test_val'", strVal) } } // Добавление ключа в хранилище. func (sf *tester) set() { sf.t.Log("set") res := kernStore.Set("test_key", []byte("test_val")) if res.IsErr() { sf.t.Fatalf("set(): err=%v", res.Err()) } } var ( qName = alias.NewAStreamName("123") ) // Закрытие хранилища. func (sf *tester) close() { sf.t.Log("close") res := sf.wg.Add(qName) if res.IsErr() { sf.t.Fatalf("close(): err=%v", res.Err()) } sf.ctx.Cancel() time.Sleep(time.Millisecond * 20) go sf.wg.Done(qName) sf.wg.Wait() kernStore.close() res1 := kernStore.ByPrefix("test") if res1.IsOk() { sf.t.Fatalf("close(): val!=nil") } } // Создаёт новое хранилище ядра. func (sf *tester) new() { sf.t.Log("new") sf.newGood1() } func (sf *tester) newGood1() { sf.t.Log("newGood1") defer func() { if _panic := recover(); _panic != nil { sf.t.Fatalf("newGood1(): panic=%v", _panic) } }() _ = GetKernelStore().Hassert("newGood1()") store := GetKernelStore().Hassert("newGood1()") if log := store.Log(); log == nil { sf.t.Fatalf("newGood1(): log==nil") } }