mirror of
https://github.com/etcd-io/bbolt.git
synced 2025-04-27 13:12:47 +00:00
This moves the error variables that had been moved to the internal/common package during recent refactoring to a non-internal errors package, once again allowing consumers to test for particular error conditions. To preserve API compatibility with bbolt v1.3, these error variables are also redefined in the bbolt package, with deprecation notice to migrate to bbolt/errors. Signed-off-by: Josh Rickmar <jrick@zettaport.com>
127 lines
2.7 KiB
Go
127 lines
2.7 KiB
Go
package bbolt
|
|
|
|
import (
|
|
"path/filepath"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"go.etcd.io/bbolt/errors"
|
|
)
|
|
|
|
func TestOpenWithPreLoadFreelist(t *testing.T) {
|
|
testCases := []struct {
|
|
name string
|
|
readonly bool
|
|
preLoadFreePage bool
|
|
expectedFreePagesLoaded bool
|
|
}{
|
|
{
|
|
name: "write mode always load free pages",
|
|
readonly: false,
|
|
preLoadFreePage: false,
|
|
expectedFreePagesLoaded: true,
|
|
},
|
|
{
|
|
name: "readonly mode load free pages when flag set",
|
|
readonly: true,
|
|
preLoadFreePage: true,
|
|
expectedFreePagesLoaded: true,
|
|
},
|
|
{
|
|
name: "readonly mode doesn't load free pages when flag not set",
|
|
readonly: true,
|
|
preLoadFreePage: false,
|
|
expectedFreePagesLoaded: false,
|
|
},
|
|
}
|
|
|
|
fileName, err := prepareData(t)
|
|
require.NoError(t, err)
|
|
|
|
for _, tc := range testCases {
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
db, err := Open(fileName, 0666, &Options{
|
|
ReadOnly: tc.readonly,
|
|
PreLoadFreelist: tc.preLoadFreePage,
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
assert.Equal(t, tc.expectedFreePagesLoaded, db.freelist != nil)
|
|
|
|
assert.NoError(t, db.Close())
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestMethodPage(t *testing.T) {
|
|
testCases := []struct {
|
|
name string
|
|
readonly bool
|
|
preLoadFreePage bool
|
|
expectedError error
|
|
}{
|
|
{
|
|
name: "write mode",
|
|
readonly: false,
|
|
preLoadFreePage: false,
|
|
expectedError: nil,
|
|
},
|
|
{
|
|
name: "readonly mode with preloading free pages",
|
|
readonly: true,
|
|
preLoadFreePage: true,
|
|
expectedError: nil,
|
|
},
|
|
{
|
|
name: "readonly mode without preloading free pages",
|
|
readonly: true,
|
|
preLoadFreePage: false,
|
|
expectedError: errors.ErrFreePagesNotLoaded,
|
|
},
|
|
}
|
|
|
|
fileName, err := prepareData(t)
|
|
require.NoError(t, err)
|
|
|
|
for _, tc := range testCases {
|
|
tc := tc
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
db, err := Open(fileName, 0666, &Options{
|
|
ReadOnly: tc.readonly,
|
|
PreLoadFreelist: tc.preLoadFreePage,
|
|
})
|
|
require.NoError(t, err)
|
|
defer db.Close()
|
|
|
|
tx, err := db.Begin(!tc.readonly)
|
|
require.NoError(t, err)
|
|
|
|
_, err = tx.Page(0)
|
|
require.Equal(t, tc.expectedError, err)
|
|
|
|
if tc.readonly {
|
|
require.NoError(t, tx.Rollback())
|
|
} else {
|
|
require.NoError(t, tx.Commit())
|
|
}
|
|
|
|
require.NoError(t, db.Close())
|
|
})
|
|
}
|
|
}
|
|
|
|
func prepareData(t *testing.T) (string, error) {
|
|
fileName := filepath.Join(t.TempDir(), "db")
|
|
db, err := Open(fileName, 0666, nil)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
if err := db.Close(); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return fileName, nil
|
|
}
|