Skip to content

Commit

Permalink
Merge pull request #5141 from multiversx/add-unit-tests-for-storage
Browse files Browse the repository at this point in the history
Added unit tests for `storage` package
  • Loading branch information
iulianpascalau authored Apr 5, 2023
2 parents ab254ba + eb7d868 commit be41a4a
Show file tree
Hide file tree
Showing 31 changed files with 1,940 additions and 185 deletions.
7 changes: 2 additions & 5 deletions factory/bootstrap/bootstrapComponents.go
Original file line number Diff line number Diff line change
Expand Up @@ -165,15 +165,12 @@ func (bcf *bootstrapComponentsFactory) Create() (*bootstrapComponents, error) {
return nil, err
}

unitOpener, err := createUnitOpener(
unitOpener := createUnitOpener(
bootstrapDataProvider,
latestStorageDataProvider,
storage.DefaultEpochString,
storage.DefaultShardString,
)
if err != nil {
return nil, err
}

dataSyncerFactory := bootstrap.NewScheduledDataSyncerFactory()

Expand Down Expand Up @@ -340,7 +337,7 @@ func createUnitOpener(
latestDataFromStorageProvider storage.LatestStorageDataProviderHandler,
defaultEpochString string,
defaultShardString string,
) (storage.UnitOpenerHandler, error) {
) storage.UnitOpenerHandler {
argsStorageUnitOpener := storageFactory.ArgsNewOpenStorageUnits{
BootstrapDataProvider: bootstrapDataProvider,
LatestStorageDataProvider: latestDataFromStorageProvider,
Expand Down
165 changes: 165 additions & 0 deletions storage/cache/cache_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
package cache

import (
"testing"
"time"

"github.com/multiversx/mx-chain-go/testscommon"
"github.com/stretchr/testify/assert"
)

func TestNewTimeCache_ShouldWork(t *testing.T) {
t.Parallel()

instance := NewTimeCache(0)
assert.NotNil(t, instance)
}

func TestNewTimeCacher(t *testing.T) {
t.Parallel()

t.Run("invalid argument should error", func(t *testing.T) {
t.Parallel()

args := ArgTimeCacher{
DefaultSpan: time.Second - time.Nanosecond,
CacheExpiry: time.Second,
}

instance, err := NewTimeCacher(args)
assert.Nil(t, instance)
assert.NotNil(t, err)
})
t.Run("should work", func(t *testing.T) {
t.Parallel()

args := ArgTimeCacher{
DefaultSpan: time.Second,
CacheExpiry: time.Second,
}

instance, err := NewTimeCacher(args)
assert.NotNil(t, instance)
assert.Nil(t, err)
})
}

func TestNewLRUCache(t *testing.T) {
t.Parallel()

t.Run("invalid argument should error", func(t *testing.T) {
t.Parallel()

instance, err := NewLRUCache(0)
assert.Nil(t, instance)
assert.NotNil(t, err)
})
t.Run("should work", func(t *testing.T) {
t.Parallel()

instance, err := NewLRUCache(1)
assert.NotNil(t, instance)
assert.Nil(t, err)
})
}

func TestNewPeerTimeCache(t *testing.T) {
t.Parallel()

t.Run("invalid argument should error", func(t *testing.T) {
t.Parallel()

instance, err := NewPeerTimeCache(nil)
assert.Nil(t, instance)
assert.NotNil(t, err)
})
t.Run("should work", func(t *testing.T) {
t.Parallel()

instance, err := NewPeerTimeCache(&testscommon.TimeCacheStub{})
assert.NotNil(t, instance)
assert.Nil(t, err)
})
}

func TestNewCapacityLRU(t *testing.T) {
t.Parallel()

t.Run("invalid argument should error", func(t *testing.T) {
t.Parallel()

instance, err := NewCapacityLRU(0, 1)
assert.Nil(t, instance)
assert.NotNil(t, err)
})
t.Run("should work", func(t *testing.T) {
t.Parallel()

instance, err := NewCapacityLRU(1, 1)
assert.NotNil(t, instance)
assert.Nil(t, err)
})
}

func TestNewLRUCacheWithEviction(t *testing.T) {
t.Parallel()

t.Run("invalid argument should error", func(t *testing.T) {
t.Parallel()

instance, err := NewLRUCacheWithEviction(0, nil)
assert.Nil(t, instance)
assert.NotNil(t, err)
})
t.Run("should work", func(t *testing.T) {
t.Parallel()

t.Run("nil handler should work", func(t *testing.T) {
t.Parallel()

instance, err := NewLRUCacheWithEviction(1, nil)
assert.NotNil(t, instance)
assert.Nil(t, err)
})
t.Run("with handler should work", func(t *testing.T) {
t.Parallel()

instance, err := NewLRUCacheWithEviction(1, func(key interface{}, value interface{}) {})
assert.NotNil(t, instance)
assert.Nil(t, err)
})
})
}

func TestNewImmunityCache(t *testing.T) {
t.Parallel()

t.Run("invalid argument should error", func(t *testing.T) {
t.Parallel()

config := CacheConfig{
MaxNumBytes: 0,
MaxNumItems: 0,
NumChunks: 0,
Name: "test",
NumItemsToPreemptivelyEvict: 0,
}
instance, err := NewImmunityCache(config)
assert.Nil(t, instance)
assert.NotNil(t, err)
})
t.Run("should work", func(t *testing.T) {
t.Parallel()

config := CacheConfig{
MaxNumBytes: 4,
MaxNumItems: 4,
NumChunks: 1,
Name: "test",
NumItemsToPreemptivelyEvict: 1,
}
instance, err := NewImmunityCache(config)
assert.NotNil(t, instance)
assert.Nil(t, err)
})
}
15 changes: 12 additions & 3 deletions storage/clean/oldDataCleanerProvider_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import (
"testing"

"github.com/multiversx/mx-chain-core-go/core"
"github.com/multiversx/mx-chain-core-go/core/check"
"github.com/multiversx/mx-chain-go/config"
"github.com/multiversx/mx-chain-go/storage"
"github.com/multiversx/mx-chain-go/testscommon/nodeTypeProviderMock"
Expand All @@ -15,7 +14,7 @@ func TestNewOldDataCleanerProvider_NilNodeTypeProviderShouldErr(t *testing.T) {
t.Parallel()

odcp, err := NewOldDataCleanerProvider(nil, config.StoragePruningConfig{})
require.True(t, check.IfNil(odcp))
require.Nil(t, odcp)
require.Equal(t, storage.ErrNilNodeTypeProvider, err)
}

Expand All @@ -24,7 +23,7 @@ func TestNewOldDataCleanerProvider_ShouldWork(t *testing.T) {

odcp, err := NewOldDataCleanerProvider(&nodeTypeProviderMock.NodeTypeProviderStub{}, config.StoragePruningConfig{})
require.NoError(t, err)
require.False(t, check.IfNil(odcp))
require.NotNil(t, odcp)
}

func TestOldDataCleanerProvider_ShouldCleanShouldReturnObserverIfInvalidNodeType(t *testing.T) {
Expand Down Expand Up @@ -70,3 +69,13 @@ func TestOldDataCleanerProvider_ShouldClean(t *testing.T) {
}
require.False(t, odcp.ShouldClean())
}

func TestOldDataCleanerProvider_IsInterfaceNil(t *testing.T) {
t.Parallel()

var odcp *oldDataCleanerProvider
require.True(t, odcp.IsInterfaceNil())

odcp, _ = NewOldDataCleanerProvider(&nodeTypeProviderMock.NodeTypeProviderStub{}, config.StoragePruningConfig{})
require.False(t, odcp.IsInterfaceNil())
}
22 changes: 14 additions & 8 deletions storage/clean/oldDatabaseCleaner_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ import (
"errors"
"testing"

"github.com/multiversx/mx-chain-core-go/core/check"
"github.com/multiversx/mx-chain-core-go/data/block"
"github.com/multiversx/mx-chain-go/dataRetriever"
"github.com/multiversx/mx-chain-go/epochStart"
"github.com/multiversx/mx-chain-go/storage"
"github.com/multiversx/mx-chain-go/storage/mock"
"github.com/multiversx/mx-chain-go/testscommon"
storageStubs "github.com/multiversx/mx-chain-go/testscommon/storage"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

Expand Down Expand Up @@ -68,9 +68,9 @@ func TestNewOldDatabaseCleaner(t *testing.T) {
odc, err := NewOldDatabaseCleaner(args)
require.Equal(t1, tt.expectedErr, err)
if err == nil {
require.False(t1, check.IfNil(odc))
assert.NotNil(t1, odc)
} else {
require.True(t1, check.IfNil(odc))
assert.Nil(t1, odc)
}
})
}
Expand Down Expand Up @@ -100,7 +100,6 @@ func TestOldDatabaseCleaner_EpochChangeShouldErrIfOldestEpochComputationFails(t
odc, _ := NewOldDatabaseCleaner(args)
odc.pathRemover = fileRemover
odc.directoryReader = directoryReader
require.False(t, check.IfNil(odc))

handlerFunc.EpochStartAction(&block.Header{Epoch: 5})
require.False(t, fileRemoverWasCalled)
Expand Down Expand Up @@ -132,7 +131,6 @@ func TestOldDatabaseCleaner_EpochChangeDirectoryReadFailsShouldNotRemove(t *test
odc, _ := NewOldDatabaseCleaner(args)
odc.pathRemover = fileRemover
odc.directoryReader = directoryReader
require.False(t, check.IfNil(odc))

handlerFunc.EpochStartAction(&block.Header{Epoch: 5})
require.False(t, fileRemoverWasCalled)
Expand Down Expand Up @@ -164,7 +162,6 @@ func TestOldDatabaseCleaner_EpochChangeNoEpochDirectory(t *testing.T) {
odc, _ := NewOldDatabaseCleaner(args)
odc.pathRemover = fileRemover
odc.directoryReader = directoryReader
require.False(t, check.IfNil(odc))

handlerFunc.EpochStartAction(&block.Header{Epoch: 5})
require.False(t, fileRemoverWasCalled)
Expand Down Expand Up @@ -199,7 +196,6 @@ func TestOldDatabaseCleaner_EpochChangeShouldNotRemoveIfNewOldestEpochIsOlder(t
odc, _ := NewOldDatabaseCleaner(args)
odc.pathRemover = fileRemover
odc.directoryReader = directoryReader
require.False(t, check.IfNil(odc))

handlerFunc.EpochStartAction(&block.Header{Epoch: 5})
require.Empty(t, removedFiles)
Expand Down Expand Up @@ -243,7 +239,6 @@ func TestOldDatabaseCleaner_EpochChange(t *testing.T) {
odc, _ := NewOldDatabaseCleaner(args)
odc.pathRemover = fileRemover
odc.directoryReader = directoryReader
require.False(t, check.IfNil(odc))

handlerFunc.EpochStartAction(&block.Header{Epoch: 5})
require.Empty(t, removedFiles)
Expand Down Expand Up @@ -283,3 +278,14 @@ func createMockArgs() ArgsOldDatabaseCleaner {
OldDataCleanerProvider: &testscommon.OldDataCleanerProviderStub{},
}
}

func TestOldDatabaseCleaner_IsInterfaceNil(t *testing.T) {
t.Parallel()

var odc *oldDatabaseCleaner
require.True(t, odc.IsInterfaceNil())

args := createMockArgs()
odc, _ = NewOldDatabaseCleaner(args)
require.False(t, odc.IsInterfaceNil())
}
73 changes: 73 additions & 0 deletions storage/database/db_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package database

import (
"testing"

"github.com/stretchr/testify/assert"
)

func TestNewMemDB(t *testing.T) {
t.Parallel()

instance := NewMemDB()
assert.NotNil(t, instance)
}

func TestNewlruDB(t *testing.T) {
t.Parallel()

t.Run("invalid argument should error", func(t *testing.T) {
t.Parallel()

instance, err := NewlruDB(0)
assert.Nil(t, instance)
assert.NotNil(t, err)
})
t.Run("should work", func(t *testing.T) {
t.Parallel()

instance, err := NewlruDB(1)
assert.NotNil(t, instance)
assert.Nil(t, err)
})
}

func TestNewLevelDB(t *testing.T) {
t.Parallel()

t.Run("invalid argument should error", func(t *testing.T) {
t.Parallel()

instance, err := NewLevelDB(t.TempDir(), 0, 0, 0)
assert.Nil(t, instance)
assert.NotNil(t, err)
})
t.Run("should work", func(t *testing.T) {
t.Parallel()

instance, err := NewLevelDB(t.TempDir(), 1, 1, 1)
assert.NotNil(t, instance)
assert.Nil(t, err)
_ = instance.Close()
})
}

func TestNewSerialDB(t *testing.T) {
t.Parallel()

t.Run("invalid argument should error", func(t *testing.T) {
t.Parallel()

instance, err := NewSerialDB(t.TempDir(), 0, 0, 0)
assert.Nil(t, instance)
assert.NotNil(t, err)
})
t.Run("should work", func(t *testing.T) {
t.Parallel()

instance, err := NewSerialDB(t.TempDir(), 1, 1, 1)
assert.NotNil(t, instance)
assert.Nil(t, err)
_ = instance.Close()
})
}
Loading

0 comments on commit be41a4a

Please sign in to comment.