diff options
author | Ben Johnson <benbjohnson@yahoo.com> | 2014-02-16 13:51:35 -0700 |
---|---|---|
committer | Ben Johnson <benbjohnson@yahoo.com> | 2014-02-16 13:59:07 -0700 |
commit | b22480fd32daa1c3f6542f4158916651610c3d6e (patch) | |
tree | fbdf8f185404a1eaa92c927bf0fce63126b69f5f /db_test.go | |
parent | Add CreateBucketIfNotExists(). (diff) | |
download | dedo-b22480fd32daa1c3f6542f4158916651610c3d6e.tar.gz dedo-b22480fd32daa1c3f6542f4158916651610c3d6e.tar.xz |
Add Transaction.ForEach().
Diffstat (limited to 'db_test.go')
-rw-r--r-- | db_test.go | 67 |
1 files changed, 67 insertions, 0 deletions
@@ -1,6 +1,7 @@ package bolt import ( + "bytes" "io" "io/ioutil" "os" @@ -215,6 +216,72 @@ func TestDBTransactionBlockWhileClosed(t *testing.T) { }) } +// Ensure a database can loop over all key/value pairs in a bucket. +func TestDBForEach(t *testing.T) { + withOpenDB(func(db *DB, path string) { + db.CreateBucket("widgets") + db.Put("widgets", []byte("foo"), []byte("0000")) + db.Put("widgets", []byte("baz"), []byte("0001")) + db.Put("widgets", []byte("bar"), []byte("0002")) + + var index int + err := db.ForEach("widgets", func(k, v []byte) error { + switch index { + case 0: + assert.Equal(t, k, []byte("bar")) + assert.Equal(t, v, []byte("0002")) + case 1: + assert.Equal(t, k, []byte("baz")) + assert.Equal(t, v, []byte("0001")) + case 2: + assert.Equal(t, k, []byte("foo")) + assert.Equal(t, v, []byte("0000")) + } + index++ + return nil + }) + assert.NoError(t, err) + assert.Equal(t, index, 3) + }) +} + +// Ensure a database can stop iteration early. +func TestDBForEachShortCircuit(t *testing.T) { + withOpenDB(func(db *DB, path string) { + db.CreateBucket("widgets") + db.Put("widgets", []byte("bar"), []byte("0000")) + db.Put("widgets", []byte("baz"), []byte("0000")) + db.Put("widgets", []byte("foo"), []byte("0000")) + + var index int + err := db.ForEach("widgets", func(k, v []byte) error { + index++ + if bytes.Equal(k, []byte("baz")) { + return &Error{"marker", nil} + } + return nil + }) + assert.Equal(t, err, &Error{"marker", nil}) + assert.Equal(t, index, 2) + }) +} + +// Ensure a database returns an error when trying to attempt a for each on a missing bucket. +func TestDBForEachBucketNotFound(t *testing.T) { + withOpenDB(func(db *DB, path string) { + err := db.ForEach("widgets", func(k, v []byte) error { return nil }) + assert.Equal(t, err, ErrBucketNotFound) + }) +} + +// Ensure a closed database returns an error when executing a for each. +func TestDBForEachWhileClosed(t *testing.T) { + withDB(func(db *DB, path string) { + err := db.ForEach("widgets", func(k, v []byte) error { return nil }) + assert.Equal(t, err, ErrDatabaseNotOpen) + }) +} + // Ensure a closed database returns an error when finding a bucket. func TestDBBucketWhileClosed(t *testing.T) { withDB(func(db *DB, path string) { |