package bbolt import ( "path/filepath" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) 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: 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 }