Merge pull request 'Add transactional vise db ability' (#11) from lash/dbtx into master

Reviewed-on: #11
This commit is contained in:
lash 2025-01-21 15:15:15 +01:00
commit 44846c5950
111 changed files with 297 additions and 357 deletions

View File

@ -36,8 +36,7 @@ var (
func main() { func main() {
config.LoadConfig() config.LoadConfig()
var connStr string var override config.Override
var resourceDir string
var size uint var size uint
var engineDebug bool var engineDebug bool
var host string var host string
@ -46,10 +45,11 @@ func main() {
var gettextDir string var gettextDir string
var langs args.LangVar var langs args.LangVar
flag.StringVar(&resourceDir, "resourcedir", path.Join("services", "registration"), "resource dir")
flag.StringVar(&connStr, "c", "", "connection string")
flag.BoolVar(&engineDebug, "d", false, "use engine debug output") flag.BoolVar(&engineDebug, "d", false, "use engine debug output")
flag.StringVar(override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
flag.StringVar(override.ResourceConn, "resource", "?", "resource connection string")
flag.StringVar(override.UserConn, "userdata", "?", "userdata store connection string")
flag.StringVar(override.StateConn, "state", "?", "state store connection string")
flag.UintVar(&size, "s", 160, "max size of output") flag.UintVar(&size, "s", 160, "max size of output")
flag.StringVar(&host, "h", config.Host(), "http host") flag.StringVar(&host, "h", config.Host(), "http host")
flag.UintVar(&port, "p", config.Port(), "http port") flag.UintVar(&port, "p", config.Port(), "http port")
@ -57,16 +57,14 @@ func main() {
flag.Var(&langs, "language", "add symbol resolution for language") flag.Var(&langs, "language", "add symbol resolution for language")
flag.Parse() flag.Parse()
if connStr == "" { config.Apply(&override)
connStr = config.DbConn() conns, err := config.GetConns()
}
connData, err := storage.ToConnData(connStr)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "connstr err: %v", err) fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err)
os.Exit(1) os.Exit(1)
} }
logg.Infof("start command", "build", build, "conn", connData, "resourcedir", resourceDir, "outputsize", size) logg.Infof("start command", "build", build, "conn", conns, "outputsize", size)
ctx := context.Background() ctx := context.Background()
ln, err := lang.LanguageFromCode(config.Language()) ln, err := lang.LanguageFromCode(config.Language())
@ -89,7 +87,7 @@ func main() {
cfg.EngineDebug = true cfg.EngineDebug = true
} }
menuStorageService := storage.NewMenuStorageService(connData, resourceDir) menuStorageService := storage.NewMenuStorageService(conns)
rs, err := menuStorageService.GetResource(ctx) rs, err := menuStorageService.GetResource(ctx)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "menustorageservice: %v\n", err) fmt.Fprintf(os.Stderr, "menustorageservice: %v\n", err)
@ -101,7 +99,6 @@ func main() {
fmt.Fprintf(os.Stderr, "userdatadb: %v\n", err) fmt.Fprintf(os.Stderr, "userdatadb: %v\n", err)
os.Exit(1) os.Exit(1)
} }
defer userdataStore.Close()
dbResource, ok := rs.(*resource.DbResource) dbResource, ok := rs.(*resource.DbResource)
if !ok { if !ok {
@ -120,7 +117,7 @@ func main() {
os.Exit(1) os.Exit(1)
} }
accountService := services.New(ctx, menuStorageService, connData) accountService := services.New(ctx, menuStorageService)
hl, err := lhs.GetHandler(accountService) hl, err := lhs.GetHandler(accountService)
if err != nil { if err != nil {
@ -133,7 +130,6 @@ func main() {
fmt.Fprintf(os.Stderr, "getstatestore: %v\n", err) fmt.Fprintf(os.Stderr, "getstatestore: %v\n", err)
os.Exit(1) os.Exit(1)
} }
defer stateStore.Close()
rp := &at.ATRequestParser{} rp := &at.ATRequestParser{}
bsh := request.NewBaseRequestHandler(cfg, rs, stateStore, userdataStore, rp, hl) bsh := request.NewBaseRequestHandler(cfg, rs, stateStore, userdataStore, rp, hl)
@ -146,7 +142,10 @@ func main() {
Addr: fmt.Sprintf("%s:%s", host, strconv.Itoa(int(port))), Addr: fmt.Sprintf("%s:%s", host, strconv.Itoa(int(port))),
Handler: mux, Handler: mux,
} }
s.RegisterOnShutdown(sh.Shutdown) shutdownFunc := func() {
sh.Shutdown(ctx)
}
s.RegisterOnShutdown(shutdownFunc)
cint := make(chan os.Signal) cint := make(chan os.Signal)
cterm := make(chan os.Signal) cterm := make(chan os.Signal)

View File

@ -44,9 +44,8 @@ func (p *asyncRequestParser) GetInput(r any) ([]byte, error) {
func main() { func main() {
config.LoadConfig() config.LoadConfig()
var connStr string var override config.Override
var sessionId string var sessionId string
var resourceDir string
var size uint var size uint
var engineDebug bool var engineDebug bool
var host string var host string
@ -56,8 +55,11 @@ func main() {
var langs args.LangVar var langs args.LangVar
flag.StringVar(&sessionId, "session-id", "075xx2123", "session id") flag.StringVar(&sessionId, "session-id", "075xx2123", "session id")
flag.StringVar(&resourceDir, "resourcedir", path.Join("services", "registration"), "resource dir") flag.StringVar(override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
flag.StringVar(&connStr, "c", "", "connection string") flag.StringVar(override.ResourceConn, "resource", "?", "resource connection string")
flag.StringVar(override.UserConn, "userdata", "?", "userdata store connection string")
flag.StringVar(override.StateConn, "state", "?", "state store connection string")
flag.BoolVar(&engineDebug, "d", false, "use engine debug output") flag.BoolVar(&engineDebug, "d", false, "use engine debug output")
flag.UintVar(&size, "s", 160, "max size of output") flag.UintVar(&size, "s", 160, "max size of output")
flag.StringVar(&host, "h", config.Host(), "http host") flag.StringVar(&host, "h", config.Host(), "http host")
@ -66,16 +68,14 @@ func main() {
flag.Var(&langs, "language", "add symbol resolution for language") flag.Var(&langs, "language", "add symbol resolution for language")
flag.Parse() flag.Parse()
if connStr == "" { config.Apply(&override)
connStr = config.DbConn() conns, err := config.GetConns()
}
connData, err := storage.ToConnData(connStr)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "connstr err: %v", err) fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err)
os.Exit(1) os.Exit(1)
} }
logg.Infof("start command", "conn", connData, "resourcedir", resourceDir, "outputsize", size, "sessionId", sessionId) logg.Infof("start command", "conn", conns, "outputsize", size, "sessionId", sessionId)
ctx := context.Background() ctx := context.Background()
@ -99,7 +99,7 @@ func main() {
cfg.EngineDebug = true cfg.EngineDebug = true
} }
menuStorageService := storage.NewMenuStorageService(connData, resourceDir) menuStorageService := storage.NewMenuStorageService(conns)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, err.Error()) fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1) os.Exit(1)
@ -116,7 +116,7 @@ func main() {
fmt.Fprintf(os.Stderr, err.Error()) fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1) os.Exit(1)
} }
defer userdataStore.Close() //defer userdataStore.Close(ctx)
dbResource, ok := rs.(*resource.DbResource) dbResource, ok := rs.(*resource.DbResource)
if !ok { if !ok {
@ -126,7 +126,7 @@ func main() {
lhs, err := handlers.NewLocalHandlerService(ctx, pfp, true, dbResource, cfg, rs) lhs, err := handlers.NewLocalHandlerService(ctx, pfp, true, dbResource, cfg, rs)
lhs.SetDataStore(&userdataStore) lhs.SetDataStore(&userdataStore)
accountService := services.New(ctx, menuStorageService, connData) accountService := services.New(ctx, menuStorageService)
hl, err := lhs.GetHandler(accountService) hl, err := lhs.GetHandler(accountService)
if err != nil { if err != nil {
@ -139,7 +139,7 @@ func main() {
fmt.Fprintf(os.Stderr, err.Error()) fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1) os.Exit(1)
} }
defer stateStore.Close() //defer stateStore.Close(ctx)
rp := &asyncRequestParser{ rp := &asyncRequestParser{
sessionId: sessionId, sessionId: sessionId,
@ -161,7 +161,7 @@ func main() {
case _ = <-cint: case _ = <-cint:
case _ = <-cterm: case _ = <-cterm:
} }
sh.Shutdown() sh.Shutdown(ctx)
}() }()
for true { for true {
@ -177,7 +177,7 @@ func main() {
fmt.Errorf("error in output: %v", err) fmt.Errorf("error in output: %v", err)
os.Exit(1) os.Exit(1)
} }
rqs, err = sh.Reset(rqs) rqs, err = sh.Reset(ctx, rqs)
if err != nil { if err != nil {
logg.ErrorCtxf(ctx, "error in reset: %v", "err", err) logg.ErrorCtxf(ctx, "error in reset: %v", "err", err)
fmt.Errorf("error in reset: %v", err) fmt.Errorf("error in reset: %v", err)

View File

@ -35,8 +35,7 @@ var (
func main() { func main() {
config.LoadConfig() config.LoadConfig()
var connStr string var override config.Override
var resourceDir string
var size uint var size uint
var engineDebug bool var engineDebug bool
var host string var host string
@ -45,8 +44,11 @@ func main() {
var gettextDir string var gettextDir string
var langs args.LangVar var langs args.LangVar
flag.StringVar(&resourceDir, "resourcedir", path.Join("services", "registration"), "resource dir") flag.StringVar(override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
flag.StringVar(&connStr, "c", "", "connection string") flag.StringVar(override.ResourceConn, "resource", "?", "resource connection string")
flag.StringVar(override.UserConn, "userdata", "?", "userdata store connection string")
flag.StringVar(override.StateConn, "state", "?", "state store connection string")
flag.BoolVar(&engineDebug, "d", false, "use engine debug output") flag.BoolVar(&engineDebug, "d", false, "use engine debug output")
flag.UintVar(&size, "s", 160, "max size of output") flag.UintVar(&size, "s", 160, "max size of output")
flag.StringVar(&host, "h", config.Host(), "http host") flag.StringVar(&host, "h", config.Host(), "http host")
@ -55,16 +57,14 @@ func main() {
flag.Var(&langs, "language", "add symbol resolution for language") flag.Var(&langs, "language", "add symbol resolution for language")
flag.Parse() flag.Parse()
if connStr == "" { config.Apply(&override)
connStr = config.DbConn() conns, err := config.GetConns()
}
connData, err := storage.ToConnData(connStr)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "connstr err: %v", err) fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err)
os.Exit(1) os.Exit(1)
} }
logg.Infof("start command", "conn", connData, "resourcedir", resourceDir, "outputsize", size) logg.Infof("start command", "conn", conns, "outputsize", size)
ctx := context.Background() ctx := context.Background()
@ -88,7 +88,7 @@ func main() {
cfg.EngineDebug = true cfg.EngineDebug = true
} }
menuStorageService := storage.NewMenuStorageService(connData, resourceDir) menuStorageService := storage.NewMenuStorageService(conns)
rs, err := menuStorageService.GetResource(ctx) rs, err := menuStorageService.GetResource(ctx)
if err != nil { if err != nil {
@ -101,7 +101,6 @@ func main() {
fmt.Fprintf(os.Stderr, err.Error()) fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1) os.Exit(1)
} }
defer userdataStore.Close()
dbResource, ok := rs.(*resource.DbResource) dbResource, ok := rs.(*resource.DbResource)
if !ok { if !ok {
@ -116,7 +115,7 @@ func main() {
os.Exit(1) os.Exit(1)
} }
accountService := services.New(ctx, menuStorageService, connData) accountService := services.New(ctx, menuStorageService)
hl, err := lhs.GetHandler(accountService) hl, err := lhs.GetHandler(accountService)
if err != nil { if err != nil {
@ -129,7 +128,6 @@ func main() {
fmt.Fprintf(os.Stderr, err.Error()) fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1) os.Exit(1)
} }
defer stateStore.Close()
//accountService := services.New(ctx, menuStorageService, connData) //accountService := services.New(ctx, menuStorageService, connData)
@ -140,7 +138,10 @@ func main() {
Addr: fmt.Sprintf("%s:%s", host, strconv.Itoa(int(port))), Addr: fmt.Sprintf("%s:%s", host, strconv.Itoa(int(port))),
Handler: sh, Handler: sh,
} }
s.RegisterOnShutdown(sh.Shutdown) shutdownFunc := func() {
sh.Shutdown(ctx)
}
s.RegisterOnShutdown(shutdownFunc)
cint := make(chan os.Signal) cint := make(chan os.Signal)
cterm := make(chan os.Signal) cterm := make(chan os.Signal)

View File

@ -5,7 +5,9 @@ import (
"flag" "flag"
"fmt" "fmt"
"os" "os"
"os/signal"
"path" "path"
"syscall"
"git.defalsify.org/vise.git/engine" "git.defalsify.org/vise.git/engine"
"git.defalsify.org/vise.git/logging" "git.defalsify.org/vise.git/logging"
@ -27,34 +29,33 @@ var (
func main() { func main() {
config.LoadConfig() config.LoadConfig()
var connStr string var override config.Override
var size uint var size uint
var sessionId string var sessionId string
var engineDebug bool var engineDebug bool
var resourceDir string
var err error var err error
var gettextDir string var gettextDir string
var langs args.LangVar var langs args.LangVar
flag.StringVar(&resourceDir, "resourcedir", scriptDir, "resource dir")
flag.StringVar(&sessionId, "session-id", "075xx2123", "session id") flag.StringVar(&sessionId, "session-id", "075xx2123", "session id")
flag.StringVar(&connStr, "c", "", "connection string") flag.StringVar(override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
flag.StringVar(override.ResourceConn, "resource", "?", "resource connection string")
flag.StringVar(override.UserConn, "userdata", "?", "userdata store connection string")
flag.StringVar(override.StateConn, "state", "?", "state store connection string")
flag.BoolVar(&engineDebug, "d", false, "use engine debug output") flag.BoolVar(&engineDebug, "d", false, "use engine debug output")
flag.UintVar(&size, "s", 160, "max size of output") flag.UintVar(&size, "s", 160, "max size of output")
flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory") flag.StringVar(&gettextDir, "gettext", "", "use gettext translations from given directory")
flag.Var(&langs, "language", "add symbol resolution for language") flag.Var(&langs, "language", "add symbol resolution for language")
flag.Parse() flag.Parse()
if connStr == "" { config.Apply(&override)
connStr = config.DbConn() conns, err := config.GetConns()
}
connData, err := storage.ToConnData(connStr)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "connstr err: %v\n", err) fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err)
os.Exit(1) os.Exit(1)
} }
logg.Infof("start command", "conn", connData, "outputsize", size) logg.Infof("start command", "conn", conns, "outputsize", size)
if len(langs.Langs()) == 0 { if len(langs.Langs()) == 0 {
langs.Set(config.Language()) langs.Set(config.Language())
@ -80,7 +81,7 @@ func main() {
MenuSeparator: menuSeparator, MenuSeparator: menuSeparator,
} }
menuStorageService := storage.NewMenuStorageService(connData, resourceDir) menuStorageService := storage.NewMenuStorageService(conns)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "menu storage service error: %v\n", err) fmt.Fprintf(os.Stderr, "menu storage service error: %v\n", err)
os.Exit(1) os.Exit(1)
@ -122,7 +123,7 @@ func main() {
os.Exit(1) os.Exit(1)
} }
accountService := services.New(ctx, menuStorageService, connData) accountService := services.New(ctx, menuStorageService)
hl, err := lhs.GetHandler(accountService) hl, err := lhs.GetHandler(accountService)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "get accounts service handler: %v\n", err) fmt.Fprintf(os.Stderr, "get accounts service handler: %v\n", err)
@ -135,6 +136,18 @@ func main() {
en = en.WithDebug(nil) en = en.WithDebug(nil)
} }
cint := make(chan os.Signal)
cterm := make(chan os.Signal)
signal.Notify(cint, os.Interrupt, syscall.SIGINT)
signal.Notify(cterm, os.Interrupt, syscall.SIGTERM)
go func() {
select {
case _ = <-cint:
case _ = <-cterm:
}
menuStorageService.Close(ctx)
}()
err = engine.Loop(ctx, en, os.Stdin, os.Stdout, nil) err = engine.Loop(ctx, en, os.Stdin, os.Stdout, nil)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "loop exited with error: %v\n", err) fmt.Fprintf(os.Stderr, "loop exited with error: %v\n", err)

View File

@ -31,34 +31,31 @@ var (
func main() { func main() {
config.LoadConfig() config.LoadConfig()
var connStr string var override config.Override
var authConnStr string var authConnStr string
var resourceDir string
var size uint var size uint
var engineDebug bool var engineDebug bool
var stateDebug bool var stateDebug bool
var host string var host string
var port uint var port uint
flag.StringVar(&connStr, "c", "", "connection string") //flag.StringVar(&authConnStr, "authdb", "", "auth connection string")
flag.StringVar(&authConnStr, "authdb", "", "auth connection string") flag.StringVar(override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
flag.StringVar(&resourceDir, "resourcedir", path.Join("services", "registration"), "resource dir") flag.StringVar(override.ResourceConn, "resource", "?", "resource connection string")
flag.StringVar(override.UserConn, "userdata", "?", "userdata store connection string")
flag.StringVar(override.StateConn, "state", "?", "state store connection string")
flag.BoolVar(&engineDebug, "d", false, "use engine debug output") flag.BoolVar(&engineDebug, "d", false, "use engine debug output")
flag.UintVar(&size, "s", 160, "max size of output") flag.UintVar(&size, "s", 160, "max size of output")
flag.StringVar(&host, "h", config.HostSSH(), "socket host") flag.StringVar(&host, "h", config.HostSSH(), "socket host")
flag.UintVar(&port, "p", config.PortSSH(), "socket port") flag.UintVar(&port, "p", config.PortSSH(), "socket port")
flag.Parse() flag.Parse()
if connStr == "" { config.Apply(&override)
connStr = config.DbConn() conns, err := config.GetConns()
}
if authConnStr == "" {
authConnStr = connStr
}
connData, err := storage.ToConnData(connStr)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "connstr err: %v", err) fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err)
os.Exit(1) os.Exit(1)
} }
authConnData, err := storage.ToConnData(authConnStr) authConnData, err := storage.ToConnData(authConnStr)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "auth connstr err: %v", err) fmt.Fprintf(os.Stderr, "auth connstr err: %v", err)
@ -79,7 +76,7 @@ func main() {
logg.WarnCtxf(ctx, "!!!!! Do not expose to internet and only use with tunnel!") logg.WarnCtxf(ctx, "!!!!! Do not expose to internet and only use with tunnel!")
logg.WarnCtxf(ctx, "!!!!! (See ssh -L <...>)") logg.WarnCtxf(ctx, "!!!!! (See ssh -L <...>)")
logg.Infof("start command", "conn", connData, "authconn", authConnData, "resourcedir", resourceDir, "outputsize", size, "keyfile", sshKeyFile, "host", host, "port", port) logg.Infof("start command", "conn", conns, "authconn", authConnData, "outputsize", size, "keyfile", sshKeyFile, "host", host, "port", port)
pfp := path.Join(scriptDir, "pp.csv") pfp := path.Join(scriptDir, "pp.csv")
@ -102,7 +99,7 @@ func main() {
} }
defer func() { defer func() {
logg.TraceCtxf(ctx, "shutdown auth key store reached") logg.TraceCtxf(ctx, "shutdown auth key store reached")
err = authKeyStore.Close() err = authKeyStore.Close(ctx)
if err != nil { if err != nil {
logg.ErrorCtxf(ctx, "keystore close error", "err", err) logg.ErrorCtxf(ctx, "keystore close error", "err", err)
} }
@ -117,8 +114,7 @@ func main() {
Cfg: cfg, Cfg: cfg,
Debug: engineDebug, Debug: engineDebug,
FlagFile: pfp, FlagFile: pfp,
Conn: connData, Conn: conns,
ResourceDir: resourceDir,
SrvKeyFile: sshKeyFile, SrvKeyFile: sshKeyFile,
Host: host, Host: host,
Port: port, Port: port,

View File

@ -34,7 +34,7 @@ func main() {
fmt.Fprintf(os.Stderr, "%v\n", err) fmt.Fprintf(os.Stderr, "%v\n", err)
os.Exit(1) os.Exit(1)
} }
defer store.Close() defer store.Close(ctx)
err = store.AddFromFile(ctx, sshKeyFile, sessionId) err = store.AddFromFile(ctx, sshKeyFile, sessionId)
if err != nil { if err != nil {

17
config/args.go Normal file
View File

@ -0,0 +1,17 @@
package config
import (
viseconfig "git.grassecon.net/grassrootseconomics/visedriver/config"
)
type Override struct {
DbConn *string
StateConn *string
ResourceConn *string
UserConn *string
}
func Apply(o *Override) error {
viseconfig.ApplyConn(o.DbConn, o.StateConn, o.ResourceConn, o.UserConn)
return nil
}

View File

@ -6,8 +6,17 @@ import (
apiconfig "git.grassecon.net/grassrootseconomics/sarafu-api/config" apiconfig "git.grassecon.net/grassrootseconomics/sarafu-api/config"
) )
func init() { var (
env.LoadEnvVariables() GetConns = viseconfig.GetConns
EnvPath string
)
func loadEnv() {
if EnvPath == "" {
env.LoadEnvVariables()
} else {
env.LoadEnvVariablesPath(EnvPath)
}
} }
const ( const (
@ -17,8 +26,8 @@ const (
defaultHTTPPort uint = 7123 defaultHTTPPort uint = 7123
) )
func LoadConfig() error { func LoadConfig() error {
loadEnv()
err := viseconfig.LoadConfig() err := viseconfig.LoadConfig()
if err != nil { if err != nil {
return err return err
@ -30,10 +39,6 @@ func LoadConfig() error {
return nil return nil
} }
func DbConn() string {
return viseconfig.DbConn
}
func Language() string { func Language() string {
return viseconfig.DefaultLanguage return viseconfig.DefaultLanguage
} }

View File

@ -32,18 +32,10 @@ func (k KeyInfo) String() string {
func ToKeyInfo(k []byte, sessionId string) (KeyInfo, error) { func ToKeyInfo(k []byte, sessionId string) (KeyInfo, error) {
o := KeyInfo{} o := KeyInfo{}
b := []byte(sessionId)
if len(k) <= len(b) {
return o, fmt.Errorf("storage key missing")
}
o.SessionId = sessionId o.SessionId = sessionId
o.Typ = uint8(k[0]) o.Typ = uint8(k[0])
k = k[1:] k = k[1:]
o.SessionId = string(k[:len(b)])
k = k[len(b):]
if o.Typ == visedb.DATATYPE_USERDATA { if o.Typ == visedb.DATATYPE_USERDATA {
if len(k) == 0 { if len(k) == 0 {
@ -53,28 +45,18 @@ func ToKeyInfo(k []byte, sessionId string) (KeyInfo, error) {
o.SubTyp = storedb.DataTyp(v) o.SubTyp = storedb.DataTyp(v)
o.Label = subTypToString(o.SubTyp) o.Label = subTypToString(o.SubTyp)
k = k[2:] k = k[2:]
if len(k) != 0 {
return o, fmt.Errorf("excess key information: %x", k)
}
} else { } else {
o.Label = typToString(o.Typ) o.Label = typToString(o.Typ)
k = k[2:]
} }
if len(k) != 0 {
return o, fmt.Errorf("excess key information")
}
return o, nil return o, nil
} }
func FromKey(k []byte) (KeyInfo, error) {
o := KeyInfo{}
if len(k) < 4 {
return o, fmt.Errorf("insufficient key length")
}
sessionIdBytes := k[1:len(k)-2]
return ToKeyInfo(k, string(sessionIdBytes))
}
func subTypToString(v storedb.DataTyp) string { func subTypToString(v storedb.DataTyp) string {
return dbTypStr[v + visedb.DATATYPE_USERDATA + 1] return dbTypStr[v + visedb.DATATYPE_USERDATA + 1]
} }

View File

@ -29,6 +29,9 @@ func init() {
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_PUBLIC_KEY_REVERSE] = "public_key_reverse" dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_PUBLIC_KEY_REVERSE] = "public_key_reverse"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_ACTIVE_DECIMAL] = "active decimal" dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_ACTIVE_DECIMAL] = "active decimal"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_ACTIVE_ADDRESS] = "active address" dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_ACTIVE_ADDRESS] = "active address"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_INCORRECT_PIN_ATTEMPTS] = "incorrect pin attempts"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_SELECTED_LANGUAGE_CODE] = "selected language"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_INITIAL_LANGUAGE_CODE] = "initial language"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_VOUCHER_SYMBOLS] = "voucher symbols" dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_VOUCHER_SYMBOLS] = "voucher symbols"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_VOUCHER_BALANCES] = "voucher balances" dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_VOUCHER_BALANCES] = "voucher balances"
dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_VOUCHER_DECIMALS] = "voucher decimals" dbTypStr[db.DATATYPE_USERDATA + 1 + storedb.DATA_VOUCHER_DECIMALS] = "voucher decimals"

View File

@ -10,7 +10,6 @@ import (
func TestDebugDbSubKeyInfo(t *testing.T) { func TestDebugDbSubKeyInfo(t *testing.T) {
s := "foo" s := "foo"
b := []byte{0x20} b := []byte{0x20}
b = append(b, []byte(s)...)
b = append(b, []byte{0x00, 0x02}...) b = append(b, []byte{0x00, 0x02}...)
r, err := ToKeyInfo(b, s) r, err := ToKeyInfo(b, s)
if err != nil { if err != nil {
@ -56,7 +55,6 @@ func TestDebugDbKeyInfo(t *testing.T) {
func TestDebugDbKeyInfoRestore(t *testing.T) { func TestDebugDbKeyInfoRestore(t *testing.T) {
s := "bar" s := "bar"
b := []byte{visedb.DATATYPE_USERDATA} b := []byte{visedb.DATATYPE_USERDATA}
b = append(b, []byte(s)...)
k := storedb.ToBytes(storedb.DATA_ACTIVE_SYM) k := storedb.ToBytes(storedb.DATA_ACTIVE_SYM)
b = append(b, k...) b = append(b, k...)

View File

@ -24,21 +24,22 @@ func main() {
config.LoadConfig() config.LoadConfig()
var sessionId string var sessionId string
var connStr string var override config.Override
flag.StringVar(&sessionId, "session-id", "075xx2123", "session id") flag.StringVar(&sessionId, "session-id", "075xx2123", "session id")
flag.StringVar(&connStr, "c", "", "connection string") flag.StringVar(override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
flag.StringVar(override.ResourceConn, "resource", "?", "resource connection string")
flag.StringVar(override.UserConn, "userdata", "?", "userdata store connection string")
flag.StringVar(override.StateConn, "state", "?", "state store connection string")
flag.Parse() flag.Parse()
config.Apply(&override)
if connStr == "" { conns, err := config.GetConns()
connStr = config.DbConn()
}
connData, err := storage.ToConnData(connStr)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "connstr err: %v\n", err) fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err)
os.Exit(1) os.Exit(1)
} }
ctx := context.Background() ctx := context.Background()
ctx = context.WithValue(ctx, "SessionId", sessionId) ctx = context.WithValue(ctx, "SessionId", sessionId)
@ -49,16 +50,16 @@ func main() {
os.Exit(1) os.Exit(1)
} }
x := cmd.NewCmd(connData, sessionId, flagParser) x := cmd.NewCmd(sessionId, flagParser)
err = x.Parse(flag.Args()) err = x.Parse(flag.Args())
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "cmd parse fail: %v\n", err) fmt.Fprintf(os.Stderr, "cmd parse fail: %v\n", err)
os.Exit(1) os.Exit(1)
} }
logg.Infof("start command", "conn", connData, "subcmd", x) logg.Infof("start command", "conn", conns, "subcmd", x)
menuStorageService := storage.NewMenuStorageService(connData, "") menuStorageService := storage.NewMenuStorageService(conns)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "menu storage service error: %v\n", err) fmt.Fprintf(os.Stderr, "menu storage service error: %v\n", err)
os.Exit(1) os.Exit(1)

View File

@ -19,55 +19,58 @@ var (
scriptDir = path.Join("services", "registration") scriptDir = path.Join("services", "registration")
) )
func formatItem(k []byte, v []byte) (string, error) { func formatItem(k []byte, v []byte, sessionId string) (string, error) {
o, err := debug.FromKey(k) o, err := debug.ToKeyInfo(k, sessionId)
if err != nil { if err != nil {
return "", err return "", err
} }
s := fmt.Sprintf("%vValue: %v\n\n", o, string(v)) s := fmt.Sprintf("%v\t%v\n", o.Label, string(v))
return s, nil return s, nil
} }
func main() { func main() {
config.LoadConfig() config.LoadConfig()
var connStr string var override config.Override
var sessionId string var sessionId string
var database string var database string
var engineDebug bool var engineDebug bool
var err error var err error
var first bool
flag.StringVar(&sessionId, "session-id", "075xx2123", "session id") flag.StringVar(&sessionId, "session-id", "075xx2123", "session id")
flag.StringVar(&connStr, "c", ".state", "connection string") flag.StringVar(override.DbConn, "c", "?", "default connection string (replaces all unspecified strings)")
flag.StringVar(override.ResourceConn, "resource", "?", "resource connection string")
flag.StringVar(override.UserConn, "userdata", "?", "userdata store connection string")
flag.StringVar(override.StateConn, "state", "?", "state store connection string")
flag.BoolVar(&engineDebug, "d", false, "use engine debug output") flag.BoolVar(&engineDebug, "d", false, "use engine debug output")
flag.Parse() flag.Parse()
if connStr != "" { config.Apply(&override)
connStr = config.DbConn() conns, err := config.GetConns()
}
connData, err := storage.ToConnData(connStr)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "connstr err: %v", err) fmt.Fprintf(os.Stderr, "conn specification error: %v\n", err)
os.Exit(1) os.Exit(1)
} }
logg.Infof("start command", "conn", connData) logg.Infof("start command", "conn", conns)
ctx := context.Background() ctx := context.Background()
ctx = context.WithValue(ctx, "SessionId", sessionId) ctx = context.WithValue(ctx, "SessionId", sessionId)
ctx = context.WithValue(ctx, "Database", database) ctx = context.WithValue(ctx, "Database", database)
resourceDir := scriptDir menuStorageService := storage.NewMenuStorageService(conns)
menuStorageService := storage.NewMenuStorageService(connData, resourceDir)
store, err := menuStorageService.GetUserdataDb(ctx) store, err := menuStorageService.GetUserdataDb(ctx)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "get userdata db: %v\n", err.Error()) fmt.Fprintf(os.Stderr, "get userdata db: %v\n", err.Error())
os.Exit(1) os.Exit(1)
} }
store.SetSession(sessionId)
store.SetPrefix(db.DATATYPE_USERDATA) store.SetPrefix(db.DATATYPE_USERDATA)
d, err := store.Dump(ctx, []byte(sessionId)) d, err := store.Dump(ctx, []byte(""))
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "store dump fail: %v\n", err.Error()) fmt.Fprintf(os.Stderr, "store dump fail: %v\n", err.Error())
os.Exit(1) os.Exit(1)
@ -78,15 +81,19 @@ func main() {
if k == nil { if k == nil {
break break
} }
r, err := formatItem(k, v) if !first {
fmt.Printf("Session ID: %s\n---\n", sessionId)
first = true
}
r, err := formatItem(append([]byte{db.DATATYPE_USERDATA}, k...), v, sessionId)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "format db item error: %v", err) fmt.Fprintf(os.Stderr, "format db item error: %v\n", err)
os.Exit(1) os.Exit(1)
} }
fmt.Printf(r) fmt.Printf(r)
} }
err = store.Close() err = store.Close(ctx)
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, err.Error()) fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1) os.Exit(1)

View File

@ -1,86 +0,0 @@
package main
import (
"context"
"crypto/sha1"
"flag"
"fmt"
"os"
"path"
testdataloader "github.com/peteole/testdata-loader"
"git.defalsify.org/vise.git/logging"
"git.grassecon.net/grassrootseconomics/sarafu-vise/config"
"git.grassecon.net/grassrootseconomics/visedriver/storage"
"git.grassecon.net/grassrootseconomics/sarafu-vise/store"
storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db"
)
var (
logg = logging.NewVanilla()
baseDir = testdataloader.GetBasePath()
scriptDir = path.Join("services", "registration")
)
func main() {
config.LoadConfig()
var connStr string
var sessionId string
var database string
var engineDebug bool
var err error
flag.StringVar(&sessionId, "session-id", "075xx2123", "session id")
flag.StringVar(&connStr, "c", "", "connection string")
flag.BoolVar(&engineDebug, "d", false, "use engine debug output")
flag.Parse()
if connStr != "" {
connStr = config.DbConn()
}
connData, err := storage.ToConnData(connStr)
if err != nil {
fmt.Fprintf(os.Stderr, "connstr err: %v", err)
os.Exit(1)
}
logg.Infof("start command", "conn", connData)
ctx := context.Background()
ctx = context.WithValue(ctx, "SessionId", sessionId)
ctx = context.WithValue(ctx, "Database", database)
resourceDir := scriptDir
menuStorageService := storage.NewMenuStorageService(connData, resourceDir)
userDb, err := menuStorageService.GetUserdataDb(ctx)
if err != nil {
fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1)
}
userStore := store.UserDataStore{userDb}
h := sha1.New()
h.Write([]byte(sessionId))
address := h.Sum(nil)
addressString := fmt.Sprintf("%x", address)
err = userStore.WriteEntry(ctx, sessionId, storedb.DATA_PUBLIC_KEY, []byte(addressString))
if err != nil {
fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1)
}
err = userStore.WriteEntry(ctx, addressString, storedb.DATA_PUBLIC_KEY_REVERSE, []byte(sessionId))
if err != nil {
fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1)
}
err = userDb.Close()
if err != nil {
fmt.Fprintf(os.Stderr, err.Error())
os.Exit(1)
}
}

10
go.mod
View File

@ -3,11 +3,11 @@ module git.grassecon.net/grassrootseconomics/sarafu-vise
go 1.23.4 go 1.23.4
require ( require (
git.defalsify.org/vise.git v0.2.3-0.20250115000535-e2d329b3f739 git.defalsify.org/vise.git v0.2.3-0.20250120121301-10739fb4a8c9
git.grassecon.net/grassrootseconomics/common v0.0.0-20250113174703-6afccefd1f05 git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d
git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250115072214-bca7c5de969f git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250121135150-e0b539809805
git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250115003256-c0534ede1b63 git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250121134912-f7d31e4e8162
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250113103030-f0b2056fd87d git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250121135340-ca97e23e8c84
github.com/alecthomas/assert/v2 v2.2.2 github.com/alecthomas/assert/v2 v2.2.2
github.com/gofrs/uuid v4.4.0+incompatible github.com/gofrs/uuid v4.4.0+incompatible
github.com/grassrootseconomics/ussd-data-service v1.2.0-beta github.com/grassrootseconomics/ussd-data-service v1.2.0-beta

20
go.sum
View File

@ -1,13 +1,13 @@
git.defalsify.org/vise.git v0.2.3-0.20250115000535-e2d329b3f739 h1:w7pj1oh7jXrfajahVYU7m7AfHst4C6jNVzDVoaqJ7e8= git.defalsify.org/vise.git v0.2.3-0.20250120121301-10739fb4a8c9 h1:sPcqXQcywxA8W3W+9qQncLPmsrgqTIlec7vmD4/7vyA=
git.defalsify.org/vise.git v0.2.3-0.20250115000535-e2d329b3f739/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck= git.defalsify.org/vise.git v0.2.3-0.20250120121301-10739fb4a8c9/go.mod h1:jyBMe1qTYUz3mmuoC9JQ/TvFeW0vTanCUcPu3H8p4Ck=
git.grassecon.net/grassrootseconomics/common v0.0.0-20250113174703-6afccefd1f05 h1:BenzGx6aDHKDwE23/mWIFD2InYIXyzHroZWV3MF5WUk= git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d h1:5mzLas+jxTUtusOKx4XvU+n2QvrV/mH17MnJRy46siQ=
git.grassecon.net/grassrootseconomics/common v0.0.0-20250113174703-6afccefd1f05/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60= git.grassecon.net/grassrootseconomics/common v0.0.0-20250121134736-ba8cbbccea7d/go.mod h1:wgQJZGIS6QuNLHqDhcsvehsbn5PvgV7aziRebMnJi60=
git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250115072214-bca7c5de969f h1:FgccQi8vipX6dUt+GRiRDYHMR3UqC+plz73vw7y3fyU= git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250121135150-e0b539809805 h1:deGnqf4YCsbxhXgjFEjYjTUCvciLEmI26T9IysRsQXY=
git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250115072214-bca7c5de969f/go.mod h1:tbA4whUGMUIDgQVdIW0sxWPuuXOvZRSny5zeku5hX4k= git.grassecon.net/grassrootseconomics/sarafu-api v0.0.0-20250121135150-e0b539809805/go.mod h1:9bc3d//Qqm11hz7GYRdQc1Uan+0GJIOpvRBbv8cHMu8=
git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250115003256-c0534ede1b63 h1:bX7klKZpX+ZZu1LKbtOXDAhV/KK0YwExehiIi0jusAM= git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250121134912-f7d31e4e8162 h1:NaPbgGQ1Nb+yYF+Qj1LSagpjYeDcSXST8iZwONg4afY=
git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250115003256-c0534ede1b63/go.mod h1:Syw9TZyigPAM7t9FvicOm36iUnidt45f0SxzT2JniQ8= git.grassecon.net/grassrootseconomics/visedriver v0.8.0-beta.10.0.20250121134912-f7d31e4e8162/go.mod h1:pjKp9L/ZsWW3kMB0UoIl1yv9TBIuU33mn9Aghxp7vGk=
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250113103030-f0b2056fd87d h1:q/NO1rEgK3pia32D/tCq5hXfEuJp84COZRwceFvy/MM= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250121135340-ca97e23e8c84 h1:VoBmqsjlRdz+IPbtKsAkc1IrMepjR+QlesZT31Jokrk=
git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250113103030-f0b2056fd87d/go.mod h1:AH15xABcvaJr1TCGlih3oGSuwWC0E5IdbHQwuu+E1KI= git.grassecon.net/grassrootseconomics/visedriver-africastalking v0.0.0-20250121135340-ca97e23e8c84/go.mod h1:DpibtYpnT3nG4Kn556hRAkdu4+CtiI/6MbnQHal51mQ=
github.com/alecthomas/assert/v2 v2.2.2 h1:Z/iVC0xZfWTaFNE6bA3z07T86hd45Xe2eLt6WVy2bbk= github.com/alecthomas/assert/v2 v2.2.2 h1:Z/iVC0xZfWTaFNE6bA3z07T86hd45Xe2eLt6WVy2bbk=
github.com/alecthomas/assert/v2 v2.2.2/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ= github.com/alecthomas/assert/v2 v2.2.2/go.mod h1:pXcQ2Asjp247dahGEmsZ6ru0UVwnkhktn7S0bBDLxvQ=
github.com/alecthomas/participle/v2 v2.0.0 h1:Fgrq+MbuSsJwIkw3fEj9h75vDP0Er5JzepJ0/HNHv0g= github.com/alecthomas/participle/v2 v2.0.0 h1:Fgrq+MbuSsJwIkw3fEj9h75vDP0Er5JzepJ0/HNHv0g=

View File

@ -54,7 +54,7 @@ func InitializeTestStore(t *testing.T) (context.Context, *store.UserDataStore) {
store := &store.UserDataStore{Db: db} store := &store.UserDataStore{Db: db}
t.Cleanup(func() { t.Cleanup(func() {
db.Close() // Ensure the DB is closed after each test db.Close(ctx) // Ensure the DB is closed after each test
}) })
return ctx, store return ctx, store

View File

@ -22,9 +22,8 @@ type Cmd struct {
exec func(ctx context.Context, ss storage.StorageService) error exec func(ctx context.Context, ss storage.StorageService) error
} }
func NewCmd(conn storage.ConnData, sessionId string, flagParser *application.FlagManager) *Cmd { func NewCmd(sessionId string, flagParser *application.FlagManager) *Cmd {
return &Cmd{ return &Cmd{
conn: conn,
sessionId: sessionId, sessionId: sessionId,
flagParser: flagParser, flagParser: flagParser,
} }

View File

@ -10,11 +10,13 @@ import (
"testing" "testing"
"github.com/gofrs/uuid" "github.com/gofrs/uuid"
"git.defalsify.org/vise.git/logging"
"git.grassecon.net/grassrootseconomics/visedriver/testutil/driver" "git.grassecon.net/grassrootseconomics/visedriver/testutil/driver"
"git.grassecon.net/grassrootseconomics/sarafu-vise/testutil" "git.grassecon.net/grassrootseconomics/sarafu-vise/testutil"
) )
var ( var (
logg = logging.NewVanilla().WithDomain("menutraversaltest")
testData = driver.ReadData() testData = driver.ReadData()
sessionID string sessionID string
src = rand.NewSource(42) src = rand.NewSource(42)
@ -22,9 +24,6 @@ var (
) )
var groupTestFile = flag.String("test-file", "group_test.json", "The test file to use for running the group tests") var groupTestFile = flag.String("test-file", "group_test.json", "The test file to use for running the group tests")
var database = flag.String("db", "gdbm", "Specify the database (gdbm or postgres)")
var connStr = flag.String("conn", ".test_state", "connection string")
var dbSchema = flag.String("schema", "test", "Specify the database schema (default test)")
func GenerateSessionId() string { func GenerateSessionId() string {
uu := uuid.NewGenWithOptions(uuid.WithRandomReader(g)) uu := uuid.NewGenWithOptions(uuid.WithRandomReader(g))
@ -80,12 +79,7 @@ func extractSendAmount(response []byte) string {
} }
func TestMain(m *testing.M) { func TestMain(m *testing.M) {
// Parse the flags
flag.Parse()
sessionID = GenerateSessionId() sessionID = GenerateSessionId()
// set the db
testutil.SetDatabase(*database, *connStr, *dbSchema)
// Cleanup the db after tests // Cleanup the db after tests
defer testutil.CleanDatabase() defer testutil.CleanDatabase()
@ -100,7 +94,8 @@ func TestAccountCreationSuccessful(t *testing.T) {
for _, session := range sessions { for _, session := range sessions {
groups := driver.FilterGroupsByName(session.Groups, "account_creation_successful") groups := driver.FilterGroupsByName(session.Groups, "account_creation_successful")
for _, group := range groups { for _, group := range groups {
for _, step := range group.Steps { for i, step := range group.Steps {
logg.TraceCtxf(ctx, "executing step", "i", i, "step", step)
cont, err := en.Exec(ctx, []byte(step.Input)) cont, err := en.Exec(ctx, []byte(step.Input))
if err != nil { if err != nil {
t.Fatalf("Test case '%s' failed at input '%s': %v", group.Name, step.Input, err) t.Fatalf("Test case '%s' failed at input '%s': %v", group.Name, step.Input, err)
@ -142,7 +137,8 @@ func TestAccountRegistrationRejectTerms(t *testing.T) {
for _, session := range sessions { for _, session := range sessions {
groups := driver.FilterGroupsByName(session.Groups, "account_creation_reject_terms") groups := driver.FilterGroupsByName(session.Groups, "account_creation_reject_terms")
for _, group := range groups { for _, group := range groups {
for _, step := range group.Steps { for i, step := range group.Steps {
logg.TraceCtxf(ctx, "executing step", "i", i, "step", step)
cont, err := en.Exec(ctx, []byte(step.Input)) cont, err := en.Exec(ctx, []byte(step.Input))
if err != nil { if err != nil {
t.Fatalf("Test case '%s' failed at input '%s': %v", group.Name, step.Input, err) t.Fatalf("Test case '%s' failed at input '%s': %v", group.Name, step.Input, err)
@ -177,7 +173,8 @@ func TestMainMenuHelp(t *testing.T) {
for _, session := range sessions { for _, session := range sessions {
groups := driver.FilterGroupsByName(session.Groups, "main_menu_help") groups := driver.FilterGroupsByName(session.Groups, "main_menu_help")
for _, group := range groups { for _, group := range groups {
for _, step := range group.Steps { for i, step := range group.Steps {
logg.TraceCtxf(ctx, "executing step", "i", i, "step", step)
cont, err := en.Exec(ctx, []byte(step.Input)) cont, err := en.Exec(ctx, []byte(step.Input))
if err != nil { if err != nil {
t.Fatalf("Test case '%s' failed at input '%s': %v", group.Name, step.Input, err) t.Fatalf("Test case '%s' failed at input '%s': %v", group.Name, step.Input, err)

View File

@ -37,7 +37,7 @@ func (d *localEmitter) emit(ctx context.Context, msg apievent.Msg) error {
return err return err
} }
func New(ctx context.Context, storageService storage.StorageService, conn storage.ConnData) remote.AccountService { func New(ctx context.Context, storageService storage.StorageService) remote.AccountService {
svc := devremote.NewDevAccountService(ctx, storageService) svc := devremote.NewDevAccountService(ctx, storageService)
svc = svc.WithAutoVoucher(ctx, "FOO", 42) svc = svc.WithAutoVoucher(ctx, "FOO", 42)
eu := event.NewEventsUpdater(svc, storageService) eu := event.NewEventsUpdater(svc, storageService)

View File

@ -4,8 +4,8 @@ TXTS = $(wildcard ./*.txt.orig)
VISE_PATH := ../../go-vise VISE_PATH := ../../go-vise
# Rule to build .bin files from .vis files # Rule to build .bin files from .vis files
%.vis: %.vis: buildasm
go run $(VISE_PATH)/dev/asm/main.go -f pp.csv $(basename $@).vis > $(basename $@).bin ./vise-asm -f pp.csv $(basename $@).vis > $(basename $@).bin
@echo "Built $(basename $@).bin from $(basename $@).vis" @echo "Built $(basename $@).bin from $(basename $@).vis"
# Rule to copy .orig files to .txt # Rule to copy .orig files to .txt
@ -19,5 +19,10 @@ all: $(INPUTS) $(TXTS)
clean: clean:
rm -vf *.bin rm -vf *.bin
rm -vf ./vise-asm
buildasm:
go build -v -o ./vise-asm $(VISE_PATH)/dev/asm/main.go
.PHONY: clean .PHONY: clean

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More