Compare commits
No commits in common. "60ff1b0ab3c633ba52f214f9e73a1bde2b064215" and "c5bb1c80a55d458efd9d1095222200b5b57948ef" have entirely different histories.
60ff1b0ab3
...
c5bb1c80a5
@ -3,21 +3,17 @@ package config
|
|||||||
import (
|
import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"git.defalsify.org/vise.git/logging"
|
|
||||||
"git.grassecon.net/grassrootseconomics/visedriver/env"
|
"git.grassecon.net/grassrootseconomics/visedriver/env"
|
||||||
"git.grassecon.net/grassrootseconomics/visedriver/storage"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
logg = logging.NewVanilla().WithDomain("visedriver-config")
|
|
||||||
defaultLanguage = "eng"
|
defaultLanguage = "eng"
|
||||||
languages []string
|
languages []string
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
DbConn string
|
||||||
DefaultLanguage string
|
DefaultLanguage string
|
||||||
dbConn string
|
|
||||||
dbConnMissing bool
|
|
||||||
stateDbConn string
|
|
||||||
resourceDbConn string
|
|
||||||
userDbConn string
|
|
||||||
Languages []string
|
Languages []string
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -39,64 +35,13 @@ func setLanguage() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
func setConn() error {
|
func setConn() error {
|
||||||
dbConn = env.GetEnv("DB_CONN", "?")
|
DbConn = env.GetEnv("DB_CONN", "")
|
||||||
stateDbConn = env.GetEnv("DB_CONN_STATE", dbConn)
|
|
||||||
resourceDbConn = env.GetEnv("DB_CONN_RESOURCE", dbConn)
|
|
||||||
userDbConn = env.GetEnv("DB_CONN_USER", dbConn)
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func ApplyConn(connStr *string, stateConnStr *string, resourceConnStr *string, userConnStr *string) {
|
|
||||||
if connStr != nil {
|
|
||||||
dbConn = *connStr
|
|
||||||
}
|
|
||||||
if stateConnStr != nil {
|
|
||||||
stateDbConn = *stateConnStr
|
|
||||||
}
|
|
||||||
if resourceConnStr != nil {
|
|
||||||
resourceDbConn = *resourceConnStr
|
|
||||||
}
|
|
||||||
if userConnStr != nil {
|
|
||||||
userDbConn = *userConnStr
|
|
||||||
}
|
|
||||||
|
|
||||||
if dbConn == "?" {
|
|
||||||
logg.Warnf("no db connection found, using memdb for everything")
|
|
||||||
dbConn = ""
|
|
||||||
}
|
|
||||||
|
|
||||||
if stateDbConn == "?" {
|
|
||||||
stateDbConn = dbConn
|
|
||||||
}
|
|
||||||
if resourceDbConn == "?" {
|
|
||||||
resourceDbConn = dbConn
|
|
||||||
}
|
|
||||||
if userDbConn == "?" {
|
|
||||||
userDbConn = dbConn
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetConns() (storage.Conns, error) {
|
|
||||||
o := storage.NewConns()
|
|
||||||
c, err := storage.ToConnData(stateDbConn)
|
|
||||||
if err != nil {
|
|
||||||
return o, err
|
|
||||||
}
|
|
||||||
o.Set(c, storage.STORETYPE_STATE)
|
|
||||||
c, err = storage.ToConnData(resourceDbConn)
|
|
||||||
if err != nil {
|
|
||||||
return o, err
|
|
||||||
}
|
|
||||||
o.Set(c, storage.STORETYPE_RESOURCE)
|
|
||||||
c, err = storage.ToConnData(userDbConn)
|
|
||||||
if err != nil {
|
|
||||||
return o, err
|
|
||||||
}
|
|
||||||
o.Set(c, storage.STORETYPE_USER)
|
|
||||||
return o, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// LoadConfig initializes the configuration values after environment variables are loaded.
|
// LoadConfig initializes the configuration values after environment variables are loaded.
|
||||||
func LoadConfig() error {
|
func LoadConfig() error {
|
||||||
err := setConn()
|
err := setConn()
|
||||||
|
|||||||
@ -1,73 +0,0 @@
|
|||||||
package storage
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"net/url"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
DBTYPE_NONE = iota
|
|
||||||
DBTYPE_MEM
|
|
||||||
DBTYPE_FS
|
|
||||||
DBTYPE_GDBM
|
|
||||||
DBTYPE_POSTGRES
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
STORETYPE_STATE = iota
|
|
||||||
STORETYPE_RESOURCE
|
|
||||||
STORETYPE_USER
|
|
||||||
_STORETYPE_MAX
|
|
||||||
)
|
|
||||||
|
|
||||||
type Conns map[int8]ConnData
|
|
||||||
|
|
||||||
func NewConns() Conns {
|
|
||||||
c := make(Conns)
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c Conns) Set(conn ConnData, typ int8) {
|
|
||||||
if typ < 0 || typ >= _STORETYPE_MAX {
|
|
||||||
panic(fmt.Errorf("invalid store type: %d", typ))
|
|
||||||
}
|
|
||||||
c[typ] = conn
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c Conns) Have(conn *ConnData) int8 {
|
|
||||||
for i := range(_STORETYPE_MAX) {
|
|
||||||
ii := int8(i)
|
|
||||||
v, ok := c[ii]
|
|
||||||
if !ok {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if v.String() == conn.String() {
|
|
||||||
return ii
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1
|
|
||||||
}
|
|
||||||
|
|
||||||
type ConnData struct {
|
|
||||||
typ int
|
|
||||||
str string
|
|
||||||
domain string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cd *ConnData) DbType() int {
|
|
||||||
return cd.typ
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cd *ConnData) String() string {
|
|
||||||
return cd.str
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cd *ConnData) Domain() string {
|
|
||||||
return cd.domain
|
|
||||||
}
|
|
||||||
|
|
||||||
func (cd *ConnData) Path() string {
|
|
||||||
v, _ := url.Parse(cd.str)
|
|
||||||
v.RawQuery = ""
|
|
||||||
return v.String()
|
|
||||||
}
|
|
||||||
@ -141,7 +141,3 @@ func(tdb *ThreadGdbmDb) Start(ctx context.Context) error {
|
|||||||
func(tdb *ThreadGdbmDb) Stop(ctx context.Context) error {
|
func(tdb *ThreadGdbmDb) Stop(ctx context.Context) error {
|
||||||
return tdb.db.Stop(ctx)
|
return tdb.db.Stop(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
func(tdb *ThreadGdbmDb) Connection() string {
|
|
||||||
return tdb.db.Connection()
|
|
||||||
}
|
|
||||||
|
|||||||
@ -7,6 +7,38 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
DBTYPE_NONE = iota
|
||||||
|
DBTYPE_MEM
|
||||||
|
DBTYPE_FS
|
||||||
|
DBTYPE_GDBM
|
||||||
|
DBTYPE_POSTGRES
|
||||||
|
)
|
||||||
|
|
||||||
|
type ConnData struct {
|
||||||
|
typ int
|
||||||
|
str string
|
||||||
|
domain string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cd *ConnData) DbType() int {
|
||||||
|
return cd.typ
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cd *ConnData) String() string {
|
||||||
|
return cd.str
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cd *ConnData) Domain() string {
|
||||||
|
return cd.domain
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cd *ConnData) Path() string {
|
||||||
|
v, _ := url.Parse(cd.str)
|
||||||
|
v.RawQuery = ""
|
||||||
|
return v.String()
|
||||||
|
}
|
||||||
|
|
||||||
func probePostgres(s string) (string, string, bool) {
|
func probePostgres(s string) (string, string, bool) {
|
||||||
domain := "public"
|
domain := "public"
|
||||||
v, err := url.Parse(s)
|
v, err := url.Parse(s)
|
||||||
|
|||||||
@ -2,7 +2,6 @@ package storage
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
@ -30,77 +29,53 @@ type StorageService interface {
|
|||||||
|
|
||||||
// TODO: Support individual backend for each store (conndata)
|
// TODO: Support individual backend for each store (conndata)
|
||||||
type MenuStorageService struct {
|
type MenuStorageService struct {
|
||||||
conns Conns
|
conn ConnData
|
||||||
|
resourceDir string
|
||||||
poResource resource.Resource
|
poResource resource.Resource
|
||||||
store map[int8]db.Db
|
resourceStore db.Db
|
||||||
|
stateStore db.Db
|
||||||
|
userDataStore db.Db
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewMenuStorageService(conn Conns) *MenuStorageService {
|
func NewMenuStorageService(conn ConnData, resourceDir string) *MenuStorageService {
|
||||||
return &MenuStorageService{
|
return &MenuStorageService{
|
||||||
conns: conn,
|
conn: conn,
|
||||||
store: make(map[int8]db.Db),
|
resourceDir: resourceDir,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ms *MenuStorageService) WithDb(store db.Db, typ int8) *MenuStorageService {
|
func (ms *MenuStorageService) WithResourceDir(resourceDir string) *MenuStorageService {
|
||||||
var err error
|
ms.resourceDir = resourceDir
|
||||||
if ms.store[typ] != nil {
|
|
||||||
panic(fmt.Errorf("db already set for typ: %d", typ))
|
|
||||||
}
|
|
||||||
ms.store[typ] = store
|
|
||||||
ms.conns[typ], err = ToConnData(store.Connection())
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
return ms
|
return ms
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ms *MenuStorageService) checkDb(ctx context.Context,typ int8) db.Db {
|
// TODO: allow fsdb, memdb
|
||||||
store := ms.store[typ]
|
func (ms *MenuStorageService) getOrCreateDb(ctx context.Context, existingDb db.Db, section string, typ string) (db.Db, error) {
|
||||||
if store != nil {
|
var newDb db.Db
|
||||||
return store
|
|
||||||
}
|
|
||||||
connData := ms.conns[typ]
|
|
||||||
v := ms.conns.Have(&connData)
|
|
||||||
if v == -1 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
src := ms.store[v]
|
|
||||||
if src == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
ms.store[typ] = ms.store[v]
|
|
||||||
logg.InfoCtxf(ctx, "found existing db", "typ", typ, "srctyp", v, "store", ms.store[typ], "srcstore", ms.store[v])
|
|
||||||
return ms.store[typ]
|
|
||||||
}
|
|
||||||
|
|
||||||
func (ms *MenuStorageService) getOrCreateDb(ctx context.Context, section string, typ int8) (db.Db, error) {
|
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
newDb := ms.checkDb(ctx, typ)
|
if existingDb != nil {
|
||||||
if newDb != nil {
|
return existingDb, nil
|
||||||
return newDb, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
connData := ms.conns[typ]
|
connStr := ms.conn.String()
|
||||||
connStr := connData.String()
|
dbTyp := ms.conn.DbType()
|
||||||
dbTyp := connData.DbType()
|
|
||||||
if dbTyp == DBTYPE_POSTGRES {
|
if dbTyp == DBTYPE_POSTGRES {
|
||||||
// TODO: move to vise
|
// TODO: move to vise
|
||||||
err = ensureSchemaExists(ctx, connData)
|
err = ensureSchemaExists(ctx, ms.conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
newDb = postgres.NewPgDb().WithSchema(connData.Domain())
|
newDb = postgres.NewPgDb().WithSchema(ms.conn.Domain())
|
||||||
} else if dbTyp == DBTYPE_GDBM {
|
} else if dbTyp == DBTYPE_GDBM {
|
||||||
err = ms.ensureDbDir(connStr)
|
err = ms.ensureDbDir()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
connStr = path.Join(connStr, section)
|
connStr = path.Join(connStr, section)
|
||||||
newDb = gdbmstorage.NewThreadGdbmDb()
|
newDb = gdbmstorage.NewThreadGdbmDb()
|
||||||
} else if dbTyp == DBTYPE_FS {
|
} else if dbTyp == DBTYPE_FS {
|
||||||
err = ms.ensureDbDir(connStr)
|
err = ms.ensureDbDir()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -108,14 +83,13 @@ func (ms *MenuStorageService) getOrCreateDb(ctx context.Context, section string,
|
|||||||
} else if dbTyp == DBTYPE_MEM {
|
} else if dbTyp == DBTYPE_MEM {
|
||||||
logg.WarnCtxf(ctx, "using volatile storage (memdb)")
|
logg.WarnCtxf(ctx, "using volatile storage (memdb)")
|
||||||
} else {
|
} else {
|
||||||
return nil, fmt.Errorf("unsupported connection string: '%s'\n", connData.String())
|
return nil, fmt.Errorf("unsupported connection string: '%s'\n", ms.conn.String())
|
||||||
}
|
}
|
||||||
logg.DebugCtxf(ctx, "connecting to db", "conn", connData, "typ", typ)
|
logg.DebugCtxf(ctx, "connecting to db", "conn", connStr, "conndata", ms.conn, "typ", typ)
|
||||||
err = newDb.Connect(ctx, connStr)
|
err = newDb.Connect(ctx, connStr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
ms.store[typ] = newDb
|
|
||||||
|
|
||||||
return newDb, nil
|
return newDb, nil
|
||||||
}
|
}
|
||||||
@ -171,15 +145,26 @@ func (ms *MenuStorageService) GetPersister(ctx context.Context) (*persist.Persis
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (ms *MenuStorageService) GetUserdataDb(ctx context.Context) (db.Db, error) {
|
func (ms *MenuStorageService) GetUserdataDb(ctx context.Context) (db.Db, error) {
|
||||||
return ms.getOrCreateDb(ctx, "userdata.gdbm", STORETYPE_USER)
|
if ms.userDataStore != nil {
|
||||||
|
return ms.userDataStore, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ms *MenuStorageService) GetResource(ctx context.Context) (resource.Resource, error) {
|
userDataStore, err := ms.getOrCreateDb(ctx, ms.userDataStore, "userdata.gdbm", "userdata")
|
||||||
store, err := ms.getOrCreateDb(ctx, "resource.gdbm", STORETYPE_RESOURCE)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
rfs := resource.NewDbResource(store)
|
|
||||||
|
ms.userDataStore = userDataStore
|
||||||
|
return ms.userDataStore, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ms *MenuStorageService) GetResource(ctx context.Context) (resource.Resource, error) {
|
||||||
|
ms.resourceStore = fsdb.NewFsDb()
|
||||||
|
err := ms.resourceStore.Connect(ctx, ms.resourceDir)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
rfs := resource.NewDbResource(ms.resourceStore)
|
||||||
if ms.poResource != nil {
|
if ms.poResource != nil {
|
||||||
logg.InfoCtxf(ctx, "using poresource for menu and template")
|
logg.InfoCtxf(ctx, "using poresource for menu and template")
|
||||||
rfs.WithMenuGetter(ms.poResource.GetMenu)
|
rfs.WithMenuGetter(ms.poResource.GetMenu)
|
||||||
@ -189,34 +174,34 @@ func (ms *MenuStorageService) GetResource(ctx context.Context) (resource.Resourc
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (ms *MenuStorageService) GetStateStore(ctx context.Context) (db.Db, error) {
|
func (ms *MenuStorageService) GetStateStore(ctx context.Context) (db.Db, error) {
|
||||||
return ms.getOrCreateDb(ctx, "state.gdbm", STORETYPE_STATE)
|
if ms.stateStore != nil {
|
||||||
|
return ms.stateStore, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ms *MenuStorageService) ensureDbDir(path string) error {
|
stateStore, err := ms.getOrCreateDb(ctx, ms.stateStore, "state.gdbm", "state")
|
||||||
err := os.MkdirAll(path, 0700)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("store dir create exited with error: %v\n", err)
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
ms.stateStore = stateStore
|
||||||
|
return ms.stateStore, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ms *MenuStorageService) ensureDbDir() error {
|
||||||
|
err := os.MkdirAll(ms.conn.String(), 0700)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("state dir create exited with error: %v\n", err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: how to handle persister here?
|
// TODO: how to handle persister here?
|
||||||
func (ms *MenuStorageService) Close(ctx context.Context) error {
|
func (ms *MenuStorageService) Close(ctx context.Context) error {
|
||||||
var errs []error
|
errA := ms.stateStore.Close(ctx)
|
||||||
var haveErr bool
|
errB := ms.userDataStore.Close(ctx)
|
||||||
for i := range(_STORETYPE_MAX) {
|
errC := ms.resourceStore.Close(ctx)
|
||||||
err := ms.store[int8(i)].Close(ctx)
|
if errA != nil || errB != nil || errC != nil {
|
||||||
if err != nil {
|
return fmt.Errorf("%v %v %v", errA, errB, errC)
|
||||||
haveErr = true
|
|
||||||
}
|
|
||||||
errs = append(errs, err)
|
|
||||||
}
|
|
||||||
if haveErr {
|
|
||||||
errStr := ""
|
|
||||||
for i, err := range(errs) {
|
|
||||||
errStr += fmt.Sprintf("(%d: %v)", i, err)
|
|
||||||
}
|
|
||||||
return errors.New(errStr)
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,113 +0,0 @@
|
|||||||
package storage
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
"os"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
fsdb "git.defalsify.org/vise.git/db/fs"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestMenuStorageServiceOneSet(t *testing.T) {
|
|
||||||
d, err := os.MkdirTemp("", "visedriver-menustorageservice")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
defer os.RemoveAll(d)
|
|
||||||
conns := NewConns()
|
|
||||||
connData, err := ToConnData(d)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
conns.Set(STORETYPE_STATE, connData)
|
|
||||||
|
|
||||||
ctx := context.Background()
|
|
||||||
ms := NewMenuStorageService(conns)
|
|
||||||
_, err = ms.GetStateStore(ctx)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
_, err = ms.GetResource(ctx)
|
|
||||||
if err == nil {
|
|
||||||
t.Fatalf("expected error getting resource")
|
|
||||||
}
|
|
||||||
_, err = ms.GetUserdataDb(ctx)
|
|
||||||
if err == nil {
|
|
||||||
t.Fatalf("expected error getting userdata")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestMenuStorageServiceExplicit(t *testing.T) {
|
|
||||||
d, err := os.MkdirTemp("", "visedriver-menustorageservice")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
defer os.RemoveAll(d)
|
|
||||||
conns := NewConns()
|
|
||||||
connData, err := ToConnData(d)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
conns.Set(STORETYPE_STATE, connData)
|
|
||||||
|
|
||||||
ctx := context.Background()
|
|
||||||
d, err = os.MkdirTemp("", "visedriver-menustorageservice")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
defer os.RemoveAll(d)
|
|
||||||
store := fsdb.NewFsDb()
|
|
||||||
err = store.Connect(ctx, d)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
ms := NewMenuStorageService(conns)
|
|
||||||
ms = ms.WithDb(store, STORETYPE_RESOURCE)
|
|
||||||
_, err = ms.GetStateStore(ctx)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
_, err = ms.GetResource(ctx)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
_, err = ms.GetUserdataDb(ctx)
|
|
||||||
if err == nil {
|
|
||||||
t.Fatalf("expected error getting userdata")
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestMenuStorageServiceReuse(t *testing.T) {
|
|
||||||
d, err := os.MkdirTemp("", "visedriver-menustorageservice")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
defer os.RemoveAll(d)
|
|
||||||
conns := NewConns()
|
|
||||||
connData, err := ToConnData(d)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
conns.Set(STORETYPE_STATE, connData)
|
|
||||||
conns.Set(STORETYPE_USER, connData)
|
|
||||||
|
|
||||||
ctx := context.Background()
|
|
||||||
ms := NewMenuStorageService(conns)
|
|
||||||
stateStore, err := ms.GetStateStore(ctx)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
_, err = ms.GetResource(ctx)
|
|
||||||
if err == nil {
|
|
||||||
t.Fatalf("expected error getting resource")
|
|
||||||
}
|
|
||||||
userStore, err := ms.GetUserdataDb(ctx)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
if userStore != stateStore {
|
|
||||||
t.Fatalf("expected same store, but they are %p and %p", userStore, stateStore)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue
Block a user