Skip to content

Commit 640649b

Browse files
sh-chabeer-1
andauthored
Test/challenger (#61)
* challenger db unit test * challenger eventhandler test * move parse test to provider * check past l1 sequence & add deposit test * oracle & output test * begin & end block handler test * utc time * apply comments * minor corrections * add limit to load challenges * delete unnecessary error check * fix test * test action test * revert test * delete future challenge when block time is same as initialblcktime --------- Co-authored-by: beer-1 <[email protected]>
1 parent b750c56 commit 640649b

22 files changed

+1782
-577
lines changed

challenger/challenger.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ func (c *Challenger) Initialize(ctx types.Context) error {
136136
return errors.Wrap(err, "failed to load pending challenges")
137137
}
138138

139-
c.latestChallenges, err = challengerdb.LoadChallenges(c.db)
139+
c.latestChallenges, err = challengerdb.LoadChallenges(c.db, 5)
140140
if err != nil {
141141
return errors.Wrap(err, "failed to load challenges")
142142
}

challenger/db/db.go

Lines changed: 49 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,34 @@ import (
55
"slices"
66
"time"
77

8+
"github.com/initia-labs/opinit-bots/challenger/eventhandler"
89
challengertypes "github.com/initia-labs/opinit-bots/challenger/types"
910
"github.com/initia-labs/opinit-bots/node"
1011
"github.com/initia-labs/opinit-bots/types"
1112
"github.com/pkg/errors"
1213
)
1314

15+
func GetPendingChallenge(db types.BasicDB, id challengertypes.ChallengeId) (challengertypes.Challenge, error) {
16+
data, err := db.Get(challengertypes.PrefixedPendingChallenge(id))
17+
if err != nil {
18+
return challengertypes.Challenge{}, err
19+
}
20+
challenge := challengertypes.Challenge{}
21+
err = challenge.Unmarshal(data)
22+
return challenge, err
23+
}
24+
25+
func GetPendingChallenges(db types.DB, ids []challengertypes.ChallengeId) (challenges []challengertypes.Challenge, err error) {
26+
for _, id := range ids {
27+
challenge, err := GetPendingChallenge(db, id)
28+
if err != nil {
29+
return nil, err
30+
}
31+
challenges = append(challenges, challenge)
32+
}
33+
return
34+
}
35+
1436
func SavePendingChallenge(db types.BasicDB, challenge challengertypes.Challenge) error {
1537
data, err := challenge.Marshal()
1638
if err != nil {
@@ -43,6 +65,25 @@ func DeletePendingChallenges(db types.BasicDB, challenges []challengertypes.Chal
4365
return nil
4466
}
4567

68+
func DeleteAllPendingChallenges(db types.DB) error {
69+
deletingKeys := make([][]byte, 0)
70+
iterErr := db.Iterate(challengertypes.PendingChallengeKey, nil, func(key []byte, _ []byte) (stop bool, err error) {
71+
deletingKeys = append(deletingKeys, key)
72+
return false, nil
73+
})
74+
if iterErr != nil {
75+
return iterErr
76+
}
77+
78+
for _, key := range deletingKeys {
79+
err := db.Delete(key)
80+
if err != nil {
81+
return err
82+
}
83+
}
84+
return nil
85+
}
86+
4687
func LoadPendingChallenges(db types.DB) (challenges []challengertypes.Challenge, err error) {
4788
iterErr := db.Iterate(challengertypes.PendingChallengeKey, nil, func(_, value []byte) (stop bool, err error) {
4889
challenge := challengertypes.Challenge{}
@@ -67,15 +108,19 @@ func SaveChallenge(db types.BasicDB, challenge challengertypes.Challenge) error
67108
return db.Set(challengertypes.PrefixedChallenge(challenge.Time, challenge.Id), value)
68109
}
69110

70-
func LoadChallenges(db types.DB) (challenges []challengertypes.Challenge, err error) {
111+
func LoadChallenges(db types.DB, limit int) (challenges []challengertypes.Challenge, err error) {
112+
if limit < 0 {
113+
return nil, errors.New("limit must be non-negative")
114+
}
115+
71116
iterErr := db.ReverseIterate(challengertypes.ChallengeKey, nil, func(_, value []byte) (stop bool, err error) {
72117
challenge := challengertypes.Challenge{}
73118
err = challenge.Unmarshal(value)
74119
if err != nil {
75120
return true, err
76121
}
77122
challenges = append(challenges, challenge)
78-
if len(challenges) >= 5 {
123+
if limit != 0 && len(challenges) >= limit {
79124
return true, nil
80125
}
81126
return false, nil
@@ -94,7 +139,7 @@ func DeleteFutureChallenges(db types.DB, initialBlockTime time.Time) error {
94139
if err != nil {
95140
return true, err
96141
}
97-
if !ts.After(initialBlockTime) {
142+
if ts.Before(initialBlockTime) {
98143
return true, nil
99144
}
100145

@@ -135,7 +180,7 @@ func ResetHeight(db types.DB, nodeName string) error {
135180
}
136181
nodeDB := db.WithPrefix([]byte(nodeName))
137182

138-
if err := DeleteAllPendingEvents(nodeDB); err != nil {
183+
if err := eventhandler.DeleteAllPendingEvents(nodeDB); err != nil {
139184
return err
140185
}
141186

@@ -149,41 +194,3 @@ func ResetHeight(db types.DB, nodeName string) error {
149194
fmt.Printf("reset height to 0 for node %s\n", string(nodeDB.GetPrefix()))
150195
return nil
151196
}
152-
153-
func DeleteAllPendingEvents(db types.DB) error {
154-
deletingKeys := make([][]byte, 0)
155-
iterErr := db.Iterate(challengertypes.PendingEventKey, nil, func(key []byte, _ []byte) (stop bool, err error) {
156-
deletingKeys = append(deletingKeys, key)
157-
return false, nil
158-
})
159-
if iterErr != nil {
160-
return iterErr
161-
}
162-
163-
for _, key := range deletingKeys {
164-
err := db.Delete(key)
165-
if err != nil {
166-
return err
167-
}
168-
}
169-
return nil
170-
}
171-
172-
func DeleteAllPendingChallenges(db types.DB) error {
173-
deletingKeys := make([][]byte, 0)
174-
iterErr := db.Iterate(challengertypes.PendingChallengeKey, nil, func(key []byte, _ []byte) (stop bool, err error) {
175-
deletingKeys = append(deletingKeys, key)
176-
return false, nil
177-
})
178-
if iterErr != nil {
179-
return iterErr
180-
}
181-
182-
for _, key := range deletingKeys {
183-
err := db.Delete(key)
184-
if err != nil {
185-
return err
186-
}
187-
}
188-
return nil
189-
}

challenger/db/db_test.go

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
package db
2+
3+
import (
4+
"testing"
5+
"time"
6+
7+
challengertypes "github.com/initia-labs/opinit-bots/challenger/types"
8+
"github.com/initia-labs/opinit-bots/db"
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
func TestPendingChallenge(t *testing.T) {
13+
db, err := db.NewMemDB()
14+
require.NoError(t, err)
15+
16+
challenge := challengertypes.Challenge{
17+
Id: challengertypes.ChallengeId{
18+
Type: challengertypes.EventTypeDeposit,
19+
Id: 10,
20+
},
21+
}
22+
23+
_, err = GetPendingChallenge(db, challenge.Id)
24+
require.Error(t, err)
25+
26+
err = SavePendingChallenge(db, challenge)
27+
require.NoError(t, err)
28+
29+
c, err := GetPendingChallenge(db, challenge.Id)
30+
require.NoError(t, err)
31+
32+
require.Equal(t, challenge, c)
33+
34+
err = DeletePendingChallenge(db, challenge)
35+
require.NoError(t, err)
36+
37+
_, err = GetPendingChallenge(db, challenge.Id)
38+
require.Error(t, err)
39+
}
40+
41+
func TestPendingChallenges(t *testing.T) {
42+
db, err := db.NewMemDB()
43+
require.NoError(t, err)
44+
45+
var challenges []challengertypes.Challenge
46+
var ids []challengertypes.ChallengeId
47+
48+
for i := uint64(0); i < 10; i++ {
49+
challenges = append(challenges, challengertypes.Challenge{
50+
Id: challengertypes.ChallengeId{
51+
Type: challengertypes.EventTypeOracle,
52+
Id: i,
53+
},
54+
})
55+
ids = append(ids, challenges[i].Id)
56+
}
57+
58+
_, err = GetPendingChallenges(db, ids)
59+
require.Error(t, err)
60+
61+
err = SavePendingChallenges(db, challenges)
62+
require.NoError(t, err)
63+
64+
c, err := GetPendingChallenges(db, ids)
65+
require.NoError(t, err)
66+
67+
require.Equal(t, challenges, c)
68+
69+
err = DeletePendingChallenges(db, challenges)
70+
require.NoError(t, err)
71+
72+
_, err = GetPendingChallenges(db, ids)
73+
require.Error(t, err)
74+
}
75+
76+
func TestChallenge(t *testing.T) {
77+
db, err := db.NewMemDB()
78+
require.NoError(t, err)
79+
80+
challenge := challengertypes.Challenge{
81+
Id: challengertypes.ChallengeId{
82+
Type: challengertypes.EventTypeDeposit,
83+
Id: 10,
84+
},
85+
Time: time.Unix(0, 10000).UTC(),
86+
}
87+
88+
challenges, err := LoadChallenges(db, 0)
89+
require.NoError(t, err)
90+
91+
require.Empty(t, challenges)
92+
93+
err = SaveChallenge(db, challenge)
94+
require.NoError(t, err)
95+
96+
challenges, err = LoadChallenges(db, 0)
97+
require.NoError(t, err)
98+
99+
require.Len(t, challenges, 1)
100+
require.Equal(t, challenge, challenges[0])
101+
}
102+
103+
func TestDeleteFutureChallenges(t *testing.T) {
104+
db, err := db.NewMemDB()
105+
require.NoError(t, err)
106+
107+
for i := 1; i <= 10; i++ {
108+
challenge := challengertypes.Challenge{
109+
Id: challengertypes.ChallengeId{
110+
Type: challengertypes.EventTypeOracle,
111+
Id: uint64(i),
112+
},
113+
Time: time.Unix(0, int64(i)).UTC(),
114+
}
115+
err = SaveChallenge(db, challenge)
116+
require.NoError(t, err)
117+
}
118+
119+
err = DeleteFutureChallenges(db, time.Unix(0, 5).UTC())
120+
require.NoError(t, err)
121+
122+
challenges, err := LoadChallenges(db, 0)
123+
require.NoError(t, err)
124+
125+
require.Len(t, challenges, 4)
126+
for i := 1; i <= 4; i++ {
127+
require.Equal(t, uint64(i), challenges[i-1].Id.Id)
128+
}
129+
130+
err = DeleteFutureChallenges(db, time.Unix(0, 8).UTC())
131+
require.NoError(t, err)
132+
133+
challenges, err = LoadChallenges(db, 0)
134+
require.NoError(t, err)
135+
136+
require.Len(t, challenges, 4)
137+
for i := 1; i <= 4; i++ {
138+
require.Equal(t, uint64(i), challenges[i-1].Id.Id)
139+
}
140+
141+
err = DeleteFutureChallenges(db, time.Unix(0, 0).UTC())
142+
require.NoError(t, err)
143+
144+
challenges, err = LoadChallenges(db, 0)
145+
require.NoError(t, err)
146+
147+
require.Len(t, challenges, 0)
148+
}
149+
150+
func TestDeleteAllPendingChallenges(t *testing.T) {
151+
db, err := db.NewMemDB()
152+
require.NoError(t, err)
153+
154+
for i := 1; i <= 10; i++ {
155+
challenge := challengertypes.Challenge{
156+
Id: challengertypes.ChallengeId{
157+
Type: challengertypes.EventTypeOracle,
158+
Id: uint64(i),
159+
},
160+
}
161+
err = SavePendingChallenge(db, challenge)
162+
require.NoError(t, err)
163+
}
164+
165+
err = DeleteAllPendingChallenges(db)
166+
require.NoError(t, err)
167+
168+
challenges, err := LoadPendingChallenges(db)
169+
require.NoError(t, err)
170+
171+
require.Len(t, challenges, 0)
172+
}

0 commit comments

Comments
 (0)