From 746c287b262034e10ec65d9f99b232519a90546d Mon Sep 17 00:00:00 2001 From: Ben Johnson Date: Sun, 12 Jan 2014 14:59:03 -0700 Subject: [PATCH] Add mock OS. --- db.go | 25 +++++++++++++++---------- os.go | 22 +++++++++++++++++++++- os_test.go | 26 ++++++++++++++++++++++++++ stat.go | 2 +- transaction.go | 2 +- 5 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 os_test.go diff --git a/db.go b/db.go index bf9b39f..8176dd6 100644 --- a/db.go +++ b/db.go @@ -1,7 +1,7 @@ package bolt import ( - "os" + . "os" "sync" "syscall" "unsafe" @@ -26,8 +26,9 @@ type DB struct { sync.Mutex opened bool - file *os.File - metafile *os.File + os OS + file *File + metafile *File data []byte buf []byte meta0 *meta @@ -55,18 +56,22 @@ type DB struct { } func NewDB() *DB { - return &DB{} + return &DB{os: &sysos{}} } func (db *DB) Path() string { return db.path } -func (db *DB) Open(path string, mode os.FileMode) error { +func (db *DB) Open(path string, mode FileMode) error { var err error db.Lock() defer db.Unlock() + if db.os == nil { + db.os = &sysos{} + } + // Exit if the database is currently open. if db.opened { return DatabaseAlreadyOpenedError @@ -74,11 +79,11 @@ func (db *DB) Open(path string, mode os.FileMode) error { // Open data file and separate sync handler for metadata writes. db.path = path - if db.file, err = os.OpenFile(db.path, os.O_RDWR|os.O_CREATE, mode); err != nil { + if db.file, err = db.os.OpenFile(db.path, O_RDWR|O_CREATE, mode); err != nil { db.close() return err } - if db.metafile, err = os.OpenFile(db.path, os.O_RDWR|os.O_SYNC, mode); err != nil { + if db.metafile, err = db.os.OpenFile(db.path, O_RDWR|O_SYNC, mode); err != nil { db.close() return err } @@ -140,7 +145,7 @@ func (db *DB) mmap() error { // Determine the map size based on the file size. var size int - if info, err := os.Stat(db.file.Name()); err != nil { + if info, err := db.os.Stat(db.file.Name()); err != nil { return err } else if info.Size() < int64(db.pageSize*2) { return &Error{"file size too small", nil} @@ -169,7 +174,7 @@ func (db *DB) mmap() error { // init creates a new database file and initializes its meta pages. func (db *DB) init() error { // Set the page size to the OS page size unless that is larger than max page size. - db.pageSize = os.Getpagesize() + db.pageSize = db.os.Getpagesize() if db.pageSize > maxPageSize { db.pageSize = maxPageSize } @@ -765,7 +770,7 @@ func (db *DB) SetFlags(flag int, onoff bool) error { return nil } -func (db *DB) Stat() *Stat { +func (db *DB) Stat() *stat { /* int toggle; diff --git a/os.go b/os.go index 266091b..f1de723 100644 --- a/os.go +++ b/os.go @@ -1,5 +1,25 @@ package bolt import ( - _ "os" + "os" ) + +type OS interface { + OpenFile(name string, flag int, perm os.FileMode) (file *os.File, err error) + Stat(name string) (fi os.FileInfo, err error) + Getpagesize() int +} + +type sysos struct{} + +func (o *sysos) OpenFile(name string, flag int, perm os.FileMode) (file *os.File, err error) { + return os.OpenFile(name, flag, perm) +} + +func (o *sysos) Stat(name string) (fi os.FileInfo, err error) { + return os.Stat(name) +} + +func (o *sysos) Getpagesize() int { + return os.Getpagesize() +} diff --git a/os_test.go b/os_test.go new file mode 100644 index 0000000..17ab09f --- /dev/null +++ b/os_test.go @@ -0,0 +1,26 @@ +package bolt + +import ( + "os" + + "github.com/stretchr/testify/mock" +) + +type mockos struct { + mock.Mock +} + +func (m *mockos) OpenFile(name string, flag int, perm os.FileMode) (file *os.File, err error) { + args := m.Called(name, flag, perm) + return args.Get(0).(*os.File), args.Error(1) +} + +func (m *mockos) Stat(name string) (fi os.FileInfo, err error) { + args := m.Called(name) + return args.Get(0).(os.FileInfo), args.Error(1) +} + +func (m *mockos) Getpagesize() int { + args := m.Called() + return args.Int(0) +} diff --git a/stat.go b/stat.go index b01fa99..2020d9a 100644 --- a/stat.go +++ b/stat.go @@ -1,6 +1,6 @@ package bolt -type Stat struct { +type stat struct { PageSize int Depth int BranchPageCount int diff --git a/transaction.go b/transaction.go index de3bd0d..4ca2d35 100644 --- a/transaction.go +++ b/transaction.go @@ -1467,7 +1467,7 @@ func (t *transaction) Bucket(name string, flags int) (*Bucket, error) { return nil, nil } -func (t *transaction) Stat(b Bucket) *Stat { +func (t *transaction) Stat(b Bucket) *stat { /* if (txn == NULL || arg == NULL || dbi >= txn->mt_numdbs) return EINVAL;