mirror of https://github.com/etcd-io/bbolt.git
58 lines
1.5 KiB
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
|
|
}))
|
|
}
|