diff options
author | Ben Johnson <benbjohnson@yahoo.com> | 2014-01-12 15:50:35 -0700 |
---|---|---|
committer | Ben Johnson <benbjohnson@yahoo.com> | 2014-01-12 15:50:35 -0700 |
commit | 47224c438732d021e5aef74af30c7fd5801621d2 (patch) | |
tree | 86c3ed57636dc0794b61e6764c08ea5777bef072 | |
parent | Mock OS and File. (diff) | |
download | dedo-47224c438732d021e5aef74af30c7fd5801621d2.tar.gz dedo-47224c438732d021e5aef74af30c7fd5801621d2.tar.xz |
Mock syscall.
-rw-r--r-- | db.go | 8 | ||||
-rw-r--r-- | db_test.go | 14 | ||||
-rw-r--r-- | file.go | 1 | ||||
-rw-r--r-- | file_test.go | 7 | ||||
-rw-r--r-- | syscall_darwin.go | 16 | ||||
-rw-r--r-- | syscall_darwin_test.go | 14 |
6 files changed, 51 insertions, 9 deletions
@@ -27,6 +27,7 @@ type DB struct { opened bool os _os + syscall _syscall file file metafile file data []byte @@ -71,6 +72,9 @@ func (db *DB) Open(path string, mode os.FileMode) error { if db.os == nil { db.os = &sysos{} } + if db.syscall == nil { + db.syscall = &syssyscall{} + } // Exit if the database is currently open. if db.opened { @@ -145,7 +149,7 @@ func (db *DB) mmap() error { // Determine the map size based on the file size. var size int - if info, err := db.os.Stat(db.file.Name()); err != nil { + if info, err := db.os.Stat(db.path); err != nil { return err } else if info.Size() < int64(db.pageSize*2) { return &Error{"file size too small", nil} @@ -154,7 +158,7 @@ func (db *DB) mmap() error { } // Memory-map the data file as a byte slice. - if db.data, err = syscall.Mmap(int(db.file.Fd()), 0, size, syscall.PROT_READ, syscall.MAP_SHARED); err != nil { + if db.data, err = db.syscall.Mmap(int(db.file.Fd()), 0, size, syscall.PROT_READ, syscall.MAP_SHARED); err != nil { return err } @@ -47,6 +47,20 @@ func TestDBOpenMetaFileError(t *testing.T) { }) } +// Ensure that the database limits the upper bound of the page size. +/* +func TestDBLimitPageSize(t *testing.T) { + withMockDB(func(db *DB, mockos *mockos, path string) { + buf := make([]byte, 4096) + mockos.On("OpenFile", path, os.O_RDWR|os.O_CREATE, os.FileMode(0666)).Return(&mockfile{}, nil) + mockos.On("OpenFile", path, os.O_RDWR|os.O_SYNC, os.FileMode(0666)).Return(&mockfile{}, nil) + mockos.On("OpenFile", path, os.O_RDWR|os.O_SYNC, os.FileMode(0666)).Return(&mockfile{}, nil) + err := db.Open(path, 0666) + assert.Equal(t, err, exp) + }) +} +*/ + // withDB executes a function with a database reference. func withDB(fn func(*DB, string)) { f, _ := ioutil.TempFile("", "bolt-") @@ -2,7 +2,6 @@ package bolt type file interface { Fd() uintptr - Name() string ReadAt(b []byte, off int64) (n int, err error) WriteAt(b []byte, off int64) (n int, err error) } diff --git a/file_test.go b/file_test.go index 3f33d14..7f35c22 100644 --- a/file_test.go +++ b/file_test.go @@ -6,18 +6,13 @@ import ( type mockfile struct { mock.Mock - fd uintptr - name string + fd uintptr } func (m *mockfile) Fd() uintptr { return m.fd } -func (m *mockfile) Name() string { - return m.name -} - func (m *mockfile) ReadAt(b []byte, off int64) (n int, err error) { args := m.Called(b, off) return args.Int(0), args.Error(1) diff --git a/syscall_darwin.go b/syscall_darwin.go new file mode 100644 index 0000000..de34193 --- /dev/null +++ b/syscall_darwin.go @@ -0,0 +1,16 @@ +package bolt + +import ( + "syscall" +) + +type _syscall interface { + Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) +} + +type syssyscall struct{} + +func (o *syssyscall) Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + // err = (EACCES, EBADF, EINVAL, ENODEV, ENOMEM, ENXIO, EOVERFLOW) + return syscall.Mmap(fd, offset, length, prot, flags) +} diff --git a/syscall_darwin_test.go b/syscall_darwin_test.go new file mode 100644 index 0000000..9e64cf7 --- /dev/null +++ b/syscall_darwin_test.go @@ -0,0 +1,14 @@ +package bolt + +import ( + "github.com/stretchr/testify/mock" +) + +type mocksyscall struct { + mock.Mock +} + +func (m *mocksyscall) Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + args := m.Called(fd, offset, length, prot, flags) + return args.Get(0).([]byte), args.Error(1) +} |