aboutsummaryrefslogtreecommitdiff
path: root/db_test.go
diff options
context:
space:
mode:
authorBen Johnson <benbjohnson@yahoo.com>2014-01-31 13:18:51 -0500
committerBen Johnson <benbjohnson@yahoo.com>2014-02-01 12:30:37 -0500
commit1a17a2cf1ee8b509dd00b7f29a01c13108acb2cc (patch)
treed6aa197560053444d76dce1bd198a584c051c7b9 /db_test.go
parentMerge pull request #4 from benbjohnson/api (diff)
downloaddedo-1a17a2cf1ee8b509dd00b7f29a01c13108acb2cc.tar.gz
dedo-1a17a2cf1ee8b509dd00b7f29a01c13108acb2cc.tar.xz
Add RWTransaction.Put().
Diffstat (limited to 'db_test.go')
-rw-r--r--db_test.go74
1 files changed, 51 insertions, 23 deletions
diff --git a/db_test.go b/db_test.go
index 53988b7..50ec3c3 100644
--- a/db_test.go
+++ b/db_test.go
@@ -1,11 +1,14 @@
package bolt
import (
+ "bytes"
+ "fmt"
"io"
"io/ioutil"
"os"
"syscall"
"testing"
+ "testing/quick"
"time"
"unsafe"
@@ -99,25 +102,6 @@ func TestDBMmapStatError(t *testing.T) {
})
}
-// Ensure that mmap errors get returned.
-/*
-func TestDBMmapError(t *testing.T) {
- withMockDB(func(db *DB, mockos *mockos, mocksyscall *mocksyscall, path string) {
- exp := errors.New("")
- file, metafile := &mockfile{}, &mockfile{}
- mockos.On("OpenFile", path, os.O_RDWR|os.O_CREATE, os.FileMode(0666)).Return(file, nil)
- mockos.On("OpenFile", path, os.O_RDWR|os.O_SYNC, os.FileMode(0666)).Return(metafile, nil)
- mockos.On("Getpagesize").Return(0x1000)
- file.On("ReadAt", mock.Anything, int64(0)).Return(0, nil)
- file.On("Stat").Return(&mockfileinfo{"", 0x2000, 0666, time.Now(), false, nil}, nil)
- metafile.On("WriteAt", mock.Anything, int64(0)).Return(0, nil)
- mocksyscall.On("Mmap", 0, int64(0), 0x2000, syscall.PROT_READ, syscall.MAP_SHARED).Return(([]byte)(nil), exp)
- err := db.Open(path, 0666)
- assert.Equal(t, err, exp)
- })
-}
-*/
-
// Ensure that corrupt meta0 page errors get returned.
func TestDBCorruptMeta0(t *testing.T) {
withMockDB(func(db *DB, mockos *mockos, mocksyscall *mocksyscall, path string) {
@@ -150,10 +134,6 @@ func TestDBCorruptMeta0(t *testing.T) {
})
}
-//--------------------------------------
-// Transaction()
-//--------------------------------------
-
// Ensure that a database cannot open a transaction when it's not open.
func TestDBTransactionDatabaseNotOpenError(t *testing.T) {
withDB(func(db *DB, path string) {
@@ -163,6 +143,54 @@ func TestDBTransactionDatabaseNotOpenError(t *testing.T) {
})
}
+// Ensure that a bucket can write a key/value.
+func TestDBPut(t *testing.T) {
+ withOpenDB(func(db *DB, path string) {
+ db.CreateBucket("widgets")
+ err := db.Put("widgets", []byte("foo"), []byte("bar"))
+ assert.NoError(t, err)
+ value, err := db.Get("widgets", []byte("foo"))
+ if assert.NoError(t, err) {
+ assert.Equal(t, value, []byte("bar"))
+ }
+ })
+}
+
+// Ensure that a bucket can write random keys and values across multiple txns.
+func TestDBPutRandom(t *testing.T) {
+ f := func(items testKeyValuePairs) bool {
+ withOpenDB(func(db *DB, path string) {
+ db.CreateBucket("widgets")
+ for _, item := range items {
+ if len(item.Key) == 0 {
+ continue
+ }
+ if err := db.Put("widgets", item.Key, item.Value); err != nil {
+ panic("put error: " + err.Error())
+ }
+ }
+ for _, item := range items {
+ if len(item.Key) == 0 {
+ continue
+ }
+ value, err := db.Get("widgets", item.Key)
+ if err != nil {
+ panic("get error: " + err.Error())
+ }
+ if !bytes.Equal(value, []byte(item.Value)) {
+ // db.CopyFile("/tmp/bolt.random.db")
+ t.Fatalf("value mismatch:\n%x\n%x", item.Value, value)
+ }
+ }
+ fmt.Fprint(os.Stderr, ".")
+ })
+ return true
+ }
+ if err := quick.Check(f, qc()); err != nil {
+ t.Error(err)
+ }
+}
+
// withDB executes a function with a database reference.
func withDB(fn func(*DB, string)) {
f, _ := ioutil.TempFile("", "bolt-")