From f4fb4972ee5692b2d0967971ea079ce6690d3f17 Mon Sep 17 00:00:00 2001 From: James Mills <1290234+prologic@users.noreply.github.com> Date: Wed, 4 Sep 2019 22:45:04 +1000 Subject: [PATCH] Improves test coverage by adding some missing unit tests (#90) * Add Unit Test for testing WithSync() option * Add Unit Test for testing re-indexing * Add Unit Test for testing re-indexing with deleted keys (tombstone values) --- bitcask_test.go | 165 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 165 insertions(+) diff --git a/bitcask_test.go b/bitcask_test.go index 8cd340c..454eeb1 100644 --- a/bitcask_test.go +++ b/bitcask_test.go @@ -5,6 +5,7 @@ import ( "fmt" "io/ioutil" "os" + "path/filepath" "reflect" "sort" "strings" @@ -194,6 +195,170 @@ func TestDeletedKeys(t *testing.T) { }) } +func TestReIndex(t *testing.T) { + assert := assert.New(t) + + testdir, err := ioutil.TempDir("", "bitcask") + assert.NoError(err) + + t.Run("Setup", func(t *testing.T) { + var ( + db *Bitcask + err error + ) + + t.Run("Open", func(t *testing.T) { + db, err = Open(testdir) + assert.NoError(err) + }) + + t.Run("Put", func(t *testing.T) { + err = db.Put([]byte("foo"), []byte("bar")) + assert.NoError(err) + }) + + t.Run("Get", func(t *testing.T) { + val, err := db.Get([]byte("foo")) + assert.NoError(err) + assert.Equal([]byte("bar"), val) + }) + + t.Run("Sync", func(t *testing.T) { + err = db.Sync() + assert.NoError(err) + }) + + t.Run("Close", func(t *testing.T) { + err = db.Close() + assert.NoError(err) + }) + + t.Run("DeleteIndex", func(t *testing.T) { + err := os.Remove(filepath.Join(testdir, "index")) + assert.NoError(err) + }) + }) + + t.Run("Reopen", func(t *testing.T) { + var ( + db *Bitcask + err error + ) + + t.Run("Open", func(t *testing.T) { + db, err = Open(testdir) + assert.NoError(err) + }) + + t.Run("Get", func(t *testing.T) { + val, err := db.Get([]byte("foo")) + assert.NoError(err) + assert.Equal([]byte("bar"), val) + }) + + t.Run("Close", func(t *testing.T) { + err = db.Close() + assert.NoError(err) + }) + }) +} + +func TestReIndexDeletedKeys(t *testing.T) { + assert := assert.New(t) + + testdir, err := ioutil.TempDir("", "bitcask") + assert.NoError(err) + + t.Run("Setup", func(t *testing.T) { + var ( + db *Bitcask + err error + ) + + t.Run("Open", func(t *testing.T) { + db, err = Open(testdir) + assert.NoError(err) + }) + + t.Run("Put", func(t *testing.T) { + err = db.Put([]byte("foo"), []byte("bar")) + assert.NoError(err) + }) + + t.Run("Get", func(t *testing.T) { + val, err := db.Get([]byte("foo")) + assert.NoError(err) + assert.Equal([]byte("bar"), val) + }) + + t.Run("Delete", func(t *testing.T) { + err := db.Delete([]byte("foo")) + assert.NoError(err) + _, err = db.Get([]byte("foo")) + assert.Error(err) + assert.Equal(ErrKeyNotFound, err) + }) + + t.Run("Sync", func(t *testing.T) { + err = db.Sync() + assert.NoError(err) + }) + + t.Run("Close", func(t *testing.T) { + err = db.Close() + assert.NoError(err) + }) + + t.Run("DeleteIndex", func(t *testing.T) { + err := os.Remove(filepath.Join(testdir, "index")) + assert.NoError(err) + }) + }) + + t.Run("Reopen", func(t *testing.T) { + var ( + db *Bitcask + err error + ) + + t.Run("Open", func(t *testing.T) { + db, err = Open(testdir) + assert.NoError(err) + }) + + t.Run("Get", func(t *testing.T) { + _, err := db.Get([]byte("foo")) + assert.Error(err) + assert.Equal(ErrKeyNotFound, err) + }) + + t.Run("Close", func(t *testing.T) { + err = db.Close() + assert.NoError(err) + }) + }) +} + +func TestSync(t *testing.T) { + assert := assert.New(t) + + testdir, err := ioutil.TempDir("", "bitcask") + assert.NoError(err) + + var db *Bitcask + + t.Run("Open", func(t *testing.T) { + db, err = Open(testdir, WithSync(true)) + assert.NoError(err) + }) + + t.Run("Put", func(t *testing.T) { + key := []byte(strings.Repeat(" ", 17)) + value := []byte("foobar") + err = db.Put(key, value) + }) +} + func TestMaxKeySize(t *testing.T) { assert := assert.New(t)