diff --git a/da/mock/mock.go b/da/mock/mock.go index 0fad3242151..b701acae1c8 100644 --- a/da/mock/mock.go +++ b/da/mock/mock.go @@ -2,6 +2,7 @@ package mock import ( "encoding/binary" + "errors" "github.com/celestiaorg/optimint/da" "github.com/celestiaorg/optimint/log" @@ -71,9 +72,12 @@ func (m *MockDataAvailabilityLayerClient) SubmitBlock(block *types.Block) da.Res func (m *MockDataAvailabilityLayerClient) CheckBlockAvailability(header *types.Header) da.ResultCheckBlock { hash := header.Hash() _, err := m.dalcKV.Get(hash[:]) - if err != nil { + if errors.Is(err, store.ErrKeyNotFound) { return da.ResultCheckBlock{DAResult: da.DAResult{Code: da.StatusSuccess}, DataAvailable: false} } + if err != nil { + return da.ResultCheckBlock{DAResult: da.DAResult{Code: da.StatusError, Message: err.Error()}, DataAvailable: false} + } return da.ResultCheckBlock{DAResult: da.DAResult{Code: da.StatusSuccess}, DataAvailable: true} } diff --git a/store/badger.go b/store/badger.go index 3213975ee23..1209e11f5d6 100644 --- a/store/badger.go +++ b/store/badger.go @@ -1,9 +1,18 @@ package store -import "github.com/dgraph-io/badger/v3" +import ( + "errors" + + "github.com/dgraph-io/badger/v3" +) var _ KVStore = &BadgerKV{} +var ( + // ErrKeyNotFound is returned if key is not found in KVStore. + ErrKeyNotFound = errors.New("key not found") +) + // BadgerKV is a implementation of KVStore using Badger v3. type BadgerKV struct { db *badger.DB @@ -14,6 +23,9 @@ func (b *BadgerKV) Get(key []byte) ([]byte, error) { txn := b.db.NewTransaction(false) defer txn.Discard() item, err := txn.Get(key) + if errors.Is(err, badger.ErrKeyNotFound) { + return nil, ErrKeyNotFound + } if err != nil { return nil, err } diff --git a/store/badger_test.go b/store/badger_test.go new file mode 100644 index 00000000000..4dc94bc276d --- /dev/null +++ b/store/badger_test.go @@ -0,0 +1,75 @@ +package store + +import ( + "errors" + "testing" + + "github.com/dgraph-io/badger/v3" +) + +func TestGetErrors(t *testing.T) { + dalcKV := NewInMemoryKVStore() + + tc := []struct { + name string + key []byte + err error + }{ + {"empty key", []byte{}, badger.ErrEmptyKey}, + {"not found key", []byte("missing key"), ErrKeyNotFound}, + } + + for _, tt := range tc { + t.Run(tt.name, func(t *testing.T) { + _, err := dalcKV.Get(tt.key) + if !errors.Is(err, tt.err) { + t.Errorf("Invalid err, got: %v expected %v", err, tt.err) + } + }) + } +} + +func TestSetErrors(t *testing.T) { + dalcKV := NewInMemoryKVStore() + + tc := []struct { + name string + key []byte + value []byte + err error + }{ + {"empty key", []byte{}, []byte{}, badger.ErrEmptyKey}, + {"invalid key", []byte("!badger!key"), []byte("invalid header"), badger.ErrInvalidKey}, + } + + for _, tt := range tc { + t.Run(tt.name, func(t *testing.T) { + err := dalcKV.Set(tt.key, tt.value) + if !errors.Is(tt.err, err) { + t.Errorf("Invalid err, got: %v expected %v", err, tt.err) + } + }) + } +} + +func TestDeleteErrors(t *testing.T) { + dalcKV := NewInMemoryKVStore() + + tc := []struct { + name string + key []byte + err error + }{ + {"empty key", []byte{}, badger.ErrEmptyKey}, + {"invalid key", []byte("!badger!key"), badger.ErrInvalidKey}, + } + + for _, tt := range tc { + t.Run(tt.name, func(t *testing.T) { + err := dalcKV.Delete(tt.key) + if !errors.Is(err, tt.err) { + t.Errorf("Invalid err, got: %v expected %v", err, tt.err) + } + }) + } +}