github.com/markusbkk/elvish@v0.0.0-20231204143114-91dc52438621/pkg/store/temp_store.go (about)

     1  package store
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"time"
     7  
     8  	bolt "go.etcd.io/bbolt"
     9  	"github.com/markusbkk/elvish/pkg/testutil"
    10  )
    11  
    12  // MustTempStore returns a Store backed by a temporary file for testing. The
    13  // Store and its underlying file will be cleaned up properly after the test is
    14  // finished.
    15  func MustTempStore(c testutil.Cleanuper) DBStore {
    16  	f, err := os.CreateTemp("", "elvish.test")
    17  	if err != nil {
    18  		panic(fmt.Sprintf("open temp file: %v", err))
    19  	}
    20  	db, err := bolt.Open(f.Name(), 0644, &bolt.Options{
    21  		Timeout: time.Second, NoSync: true, NoFreelistSync: true})
    22  	if err != nil {
    23  		panic(fmt.Sprintf("open boltdb: %v", err))
    24  	}
    25  
    26  	st, err := NewStoreFromDB(db)
    27  	if err != nil {
    28  		panic(fmt.Sprintf("create Store instance: %v", err))
    29  	}
    30  	c.Cleanup(func() {
    31  		st.Close()
    32  		f.Close()
    33  		err = os.Remove(f.Name())
    34  		if err != nil {
    35  			fmt.Fprintln(os.Stderr, "failed to remove temp file:", err)
    36  		}
    37  	})
    38  	return st
    39  }