Skip to content

Commit 3ace731

Browse files
Merge 210e4f0 into 499960e
2 parents 499960e + 210e4f0 commit 3ace731

File tree

2 files changed

+108
-1
lines changed

2 files changed

+108
-1
lines changed

dataRetriever/resolvers/baseFullHistoryResolver.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,13 @@ type baseFullHistoryResolver struct {
1010

1111
func (bfhr *baseFullHistoryResolver) getFromStorage(key []byte, epoch uint32) ([]byte, error) {
1212
//we just call the storer to search in the provided epoch. (it will search automatically also in the next epoch)
13-
return bfhr.storer.GetFromEpoch(key, epoch)
13+
buff, err := bfhr.storer.GetFromEpoch(key, epoch)
14+
if err != nil {
15+
// default to a search first, maximize the chance of getting recent data
16+
return bfhr.storer.SearchFirst(key)
17+
}
18+
19+
return buff, err
1420
}
1521

1622
func (bfhr *baseFullHistoryResolver) searchFirst(key []byte) ([]byte, error) {
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package resolvers
2+
3+
import (
4+
"errors"
5+
"testing"
6+
7+
"github.com/multiversx/mx-chain-go/testscommon/storage"
8+
"github.com/stretchr/testify/assert"
9+
)
10+
11+
func TestBaseFullHistoryResolver_SearchFirst(t *testing.T) {
12+
t.Parallel()
13+
14+
testKey := []byte("key")
15+
testValue := []byte("value")
16+
resolver := &baseFullHistoryResolver{
17+
storer: &storage.StorerStub{
18+
SearchFirstCalled: func(key []byte) ([]byte, error) {
19+
assert.Equal(t, testKey, key)
20+
21+
return testValue, nil
22+
},
23+
},
24+
}
25+
26+
val, err := resolver.searchFirst(testKey)
27+
assert.Nil(t, err)
28+
assert.Equal(t, testValue, val)
29+
}
30+
31+
func TestBaseFullHistoryResolver_GetFromStorage(t *testing.T) {
32+
t.Parallel()
33+
34+
testKey := []byte("key")
35+
testValue := []byte("value")
36+
testEpoch := uint32(37)
37+
38+
t.Run("get from epoch returned nil error and not empty buffer", func(t *testing.T) {
39+
resolver := &baseFullHistoryResolver{
40+
storer: &storage.StorerStub{
41+
SearchFirstCalled: func(key []byte) ([]byte, error) {
42+
assert.Fail(t, "should have not called SearchFirst")
43+
44+
return nil, nil
45+
},
46+
GetFromEpochCalled: func(key []byte, epoch uint32) ([]byte, error) {
47+
assert.Equal(t, testKey, key)
48+
assert.Equal(t, testEpoch, epoch)
49+
50+
return testValue, nil
51+
},
52+
},
53+
}
54+
55+
val, err := resolver.getFromStorage(testKey, testEpoch)
56+
assert.Nil(t, err)
57+
assert.Equal(t, testValue, val)
58+
})
59+
t.Run("get from epoch returned nil error and nil buffer", func(t *testing.T) {
60+
resolver := &baseFullHistoryResolver{
61+
storer: &storage.StorerStub{
62+
SearchFirstCalled: func(key []byte) ([]byte, error) {
63+
assert.Fail(t, "should have not called SearchFirst")
64+
65+
return nil, nil
66+
},
67+
GetFromEpochCalled: func(key []byte, epoch uint32) ([]byte, error) {
68+
assert.Equal(t, testKey, key)
69+
assert.Equal(t, testEpoch, epoch)
70+
71+
return nil, nil
72+
},
73+
},
74+
}
75+
76+
val, err := resolver.getFromStorage(testKey, testEpoch)
77+
assert.Nil(t, err)
78+
assert.Equal(t, 0, len(val))
79+
})
80+
t.Run("get from epoch returned error will fallback to search first", func(t *testing.T) {
81+
resolver := &baseFullHistoryResolver{
82+
storer: &storage.StorerStub{
83+
SearchFirstCalled: func(key []byte) ([]byte, error) {
84+
assert.Equal(t, testKey, key)
85+
86+
return testValue, nil
87+
},
88+
GetFromEpochCalled: func(key []byte, epoch uint32) ([]byte, error) {
89+
assert.Equal(t, testKey, key)
90+
assert.Equal(t, testEpoch, epoch)
91+
92+
return nil, errors.New("not found")
93+
},
94+
},
95+
}
96+
97+
val, err := resolver.getFromStorage(testKey, testEpoch)
98+
assert.Nil(t, err)
99+
assert.Equal(t, testValue, val)
100+
})
101+
}

0 commit comments

Comments
 (0)