...

Source file src/go.etcd.io/bbolt/db_whitebox_test.go

Documentation: go.etcd.io/bbolt

     1  package bbolt
     2  
     3  import (
     4  	"path/filepath"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  	"github.com/stretchr/testify/require"
     9  )
    10  
    11  func TestOpenWithPreLoadFreelist(t *testing.T) {
    12  	testCases := []struct {
    13  		name                    string
    14  		readonly                bool
    15  		preLoadFreePage         bool
    16  		expectedFreePagesLoaded bool
    17  	}{
    18  		{
    19  			name:                    "write mode always load free pages",
    20  			readonly:                false,
    21  			preLoadFreePage:         false,
    22  			expectedFreePagesLoaded: true,
    23  		},
    24  		{
    25  			name:                    "readonly mode load free pages when flag set",
    26  			readonly:                true,
    27  			preLoadFreePage:         true,
    28  			expectedFreePagesLoaded: true,
    29  		},
    30  		{
    31  			name:                    "readonly mode doesn't load free pages when flag not set",
    32  			readonly:                true,
    33  			preLoadFreePage:         false,
    34  			expectedFreePagesLoaded: false,
    35  		},
    36  	}
    37  
    38  	fileName, err := prepareData(t)
    39  	require.NoError(t, err)
    40  
    41  	for _, tc := range testCases {
    42  		t.Run(tc.name, func(t *testing.T) {
    43  			db, err := Open(fileName, 0666, &Options{
    44  				ReadOnly:        tc.readonly,
    45  				PreLoadFreelist: tc.preLoadFreePage,
    46  			})
    47  			require.NoError(t, err)
    48  
    49  			assert.Equal(t, tc.expectedFreePagesLoaded, db.freelist != nil)
    50  
    51  			assert.NoError(t, db.Close())
    52  		})
    53  	}
    54  }
    55  
    56  func TestMethodPage(t *testing.T) {
    57  	testCases := []struct {
    58  		name            string
    59  		readonly        bool
    60  		preLoadFreePage bool
    61  		expectedError   error
    62  	}{
    63  		{
    64  			name:            "write mode",
    65  			readonly:        false,
    66  			preLoadFreePage: false,
    67  			expectedError:   nil,
    68  		},
    69  		{
    70  			name:            "readonly mode with preloading free pages",
    71  			readonly:        true,
    72  			preLoadFreePage: true,
    73  			expectedError:   nil,
    74  		},
    75  		{
    76  			name:            "readonly mode without preloading free pages",
    77  			readonly:        true,
    78  			preLoadFreePage: false,
    79  			expectedError:   ErrFreePagesNotLoaded,
    80  		},
    81  	}
    82  
    83  	fileName, err := prepareData(t)
    84  	require.NoError(t, err)
    85  
    86  	for _, tc := range testCases {
    87  		tc := tc
    88  		t.Run(tc.name, func(t *testing.T) {
    89  			db, err := Open(fileName, 0666, &Options{
    90  				ReadOnly:        tc.readonly,
    91  				PreLoadFreelist: tc.preLoadFreePage,
    92  			})
    93  			require.NoError(t, err)
    94  			defer db.Close()
    95  
    96  			tx, err := db.Begin(!tc.readonly)
    97  			require.NoError(t, err)
    98  
    99  			_, err = tx.Page(0)
   100  			require.Equal(t, tc.expectedError, err)
   101  
   102  			if tc.readonly {
   103  				require.NoError(t, tx.Rollback())
   104  			} else {
   105  				require.NoError(t, tx.Commit())
   106  			}
   107  
   108  			require.NoError(t, db.Close())
   109  		})
   110  	}
   111  }
   112  
   113  func prepareData(t *testing.T) (string, error) {
   114  	fileName := filepath.Join(t.TempDir(), "db")
   115  	db, err := Open(fileName, 0666, nil)
   116  	if err != nil {
   117  		return "", err
   118  	}
   119  	if err := db.Close(); err != nil {
   120  		return "", err
   121  	}
   122  
   123  	return fileName, nil
   124  }
   125  

View as plain text