diff --git a/cli/vm/cli_test.go b/cli/vm/cli_test.go index 7bfe9d54a..256625e1f 100644 --- a/cli/vm/cli_test.go +++ b/cli/vm/cli_test.go @@ -107,6 +107,8 @@ func newTestVMCLIWithLogoAndCustomConfig(t *testing.T, printLogo bool, cfg *conf return e } +// newTestVMClIWithState creates executor backed by level DB filled by simple chain. +// LevelDB-backed CLI must be exited on cleanup. func newTestVMClIWithState(t *testing.T) *executor { // Firstly create a DB with chain, save and close it. path := t.TempDir() @@ -776,7 +778,8 @@ func TestRunWithState(t *testing.T) { emit.AppCall(script.BinWriter, h, "put", callflag.All, 3, 3) e.runProg(t, "loadhex "+hex.EncodeToString(script.Bytes()), - "run") + "run", + "exit") e.checkNextLine(t, "READY: loaded 37 instructions") e.checkStack(t, 3) } @@ -797,6 +800,7 @@ func TestRunWithHistoricState(t *testing.T) { "run", "loadhex --historic 0 "+hex.EncodeToString(b), // historic invocation, contract is not deployed yet "run", + "exit", ) e.checkNextLine(t, "READY: loaded 36 instructions") e.checkStack(t, []byte{2}) @@ -816,7 +820,8 @@ func TestEvents(t *testing.T) { e.runProg(t, "loadhex "+hex.EncodeToString(script.Bytes()), "run", - "events") + "events", + "exit") expectedEvent := state.NotificationEvent{ ScriptHash: h, Name: "Event", @@ -844,7 +849,7 @@ func TestEnv(t *testing.T) { }) t.Run("setup with state", func(t *testing.T) { e := newTestVMClIWithState(t) - e.runProg(t, "env") + e.runProg(t, "env", "exit") e.checkNextLine(t, "Chain height: 5") e.checkNextLineExact(t, "VM height (may differ from chain height in case of historic call): 5\n") e.checkNextLine(t, "Network magic: 42") @@ -853,7 +858,7 @@ func TestEnv(t *testing.T) { t.Run("setup with historic state", func(t *testing.T) { e := newTestVMClIWithState(t) e.runProg(t, "loadbase64 --historic 3 "+base64.StdEncoding.EncodeToString([]byte{byte(opcode.PUSH1)}), - "env") + "env", "exit") e.checkNextLine(t, "READY: loaded 1 instructions") e.checkNextLine(t, "Chain height: 5") e.checkNextLineExact(t, "VM height (may differ from chain height in case of historic call): 3\n") @@ -862,7 +867,7 @@ func TestEnv(t *testing.T) { }) t.Run("verbose", func(t *testing.T) { e := newTestVMClIWithState(t) - e.runProg(t, "env -v") + e.runProg(t, "env -v", "exit") e.checkNextLine(t, "Chain height: 5") e.checkNextLineExact(t, "VM height (may differ from chain height in case of historic call): 5\n") e.checkNextLine(t, "Network magic: 42") @@ -887,6 +892,7 @@ func TestDumpStorage(t *testing.T) { "storage 1", "storage 1 "+hex.EncodeToString(expected[0].Key), "storage 1 --backwards", + "exit", ) e.checkStorage(t, expected...) e.checkStorage(t, expected...) @@ -916,6 +922,7 @@ func TestDumpStorageDiff(t *testing.T) { "run", "storage 1", "storage 1 --diff", + "exit", ) e.checkStorage(t, expected...) @@ -969,6 +976,7 @@ func TestDumpChanges(t *testing.T) { "changes 1 "+hex.EncodeToString([]byte{1}), "changes 1 "+hex.EncodeToString([]byte{2}), "changes 1 "+hex.EncodeToString([]byte{3}), + "exit", ) // no script is executed => no diff diff --git a/pkg/core/storage/boltdb_store.go b/pkg/core/storage/boltdb_store.go index a874dbd8c..535db8b8f 100644 --- a/pkg/core/storage/boltdb_store.go +++ b/pkg/core/storage/boltdb_store.go @@ -56,7 +56,12 @@ func NewBoltDBStore(cfg dbconfig.BoltDBOptions) (*BoltDBStore, error) { }) } if err != nil { - return nil, fmt.Errorf("failed to initialize BoltDB instance: %w", err) + closeErr := db.Close() + err = fmt.Errorf("failed to initialize BoltDB instance: %w", err) + if closeErr != nil { + err = fmt.Errorf("%w, failed to close BoltDB instance: %v", err, closeErr) + } + return nil, err } return &BoltDBStore{db: db}, nil diff --git a/pkg/core/storage/boltdb_store_test.go b/pkg/core/storage/boltdb_store_test.go index a877b4e38..99f0242b1 100644 --- a/pkg/core/storage/boltdb_store_test.go +++ b/pkg/core/storage/boltdb_store_test.go @@ -7,7 +7,6 @@ import ( "testing" "github.com/nspcc-dev/neo-go/pkg/core/storage/dbconfig" - "github.com/nspcc-dev/neo-go/pkg/io" "github.com/stretchr/testify/require" "go.etcd.io/bbolt" ) @@ -47,10 +46,9 @@ func TestROBoltDB(t *testing.T) { require.NoError(t, store.Close()) // Create the DB without buckets and try to open it in RO mode, an error is expected. - fileMode := os.FileMode(0600) - cfg.FilePath = filepath.Join(d, "clean_ro_bolt_db") - require.NoError(t, io.MakeDirForFile(cfg.FilePath, "BoltDB")) - db, err := bbolt.Open(cfg.FilePath, fileMode, nil) + tmp := t.TempDir() + cfg.FilePath = filepath.Join(tmp, "clean_ro_bolt") + db, err := bbolt.Open(cfg.FilePath, os.FileMode(0600), nil) require.NoError(t, err) require.NoError(t, db.Close())