bbolt/internal/surgeon/surgeon_test.go

58 lines
1.5 KiB
Go

package surgeon_test
import (
"fmt"
"testing"
"github.com/stretchr/testify/assert"
bolt "go.etcd.io/bbolt"
"go.etcd.io/bbolt/internal/btesting"
"go.etcd.io/bbolt/internal/surgeon"
)
func TestRevertMetaPage(t *testing.T) {
db := btesting.MustCreateDB(t)
assert.NoError(t,
db.Fill([]byte("data"), 1, 500,
func(tx int, k int) []byte { return []byte(fmt.Sprintf("%04d", k)) },
func(tx int, k int) []byte { return make([]byte, 100) },
))
assert.NoError(t,
db.Update(
func(tx *bolt.Tx) error {
b := tx.Bucket([]byte("data"))
assert.NoError(t, b.Put([]byte("0123"), []byte("new Value for 123")))
assert.NoError(t, b.Put([]byte("1234b"), []byte("additional object")))
assert.NoError(t, b.Delete([]byte("0246")))
return nil
}))
assert.NoError(t,
db.View(
func(tx *bolt.Tx) error {
b := tx.Bucket([]byte("data"))
assert.Equal(t, []byte("new Value for 123"), b.Get([]byte("0123")))
assert.Equal(t, []byte("additional object"), b.Get([]byte("1234b")))
assert.Nil(t, b.Get([]byte("0246")))
return nil
}))
db.Close()
// This causes the whole tree to be linked to the previous state
assert.NoError(t, surgeon.RevertMetaPage(db.Path()))
db.MustReopen()
db.MustCheck()
assert.NoError(t,
db.View(
func(tx *bolt.Tx) error {
b := tx.Bucket([]byte("data"))
assert.Equal(t, make([]byte, 100), b.Get([]byte("0123")))
assert.Nil(t, b.Get([]byte("1234b")))
assert.Equal(t, make([]byte, 100), b.Get([]byte("0246")))
return nil
}))
}