@@ -7,15 +7,14 @@ import (
77 "fmt"
88 "strings"
99 "sync"
10- "sync/atomic"
1110 "testing"
1211 "time"
1312
1413 testutils "github.com/celestiaorg/utils/test"
1514 "github.com/evstack/ev-node/block"
1615 coreexecutor "github.com/evstack/ev-node/core/execution"
1716 coresequencer "github.com/evstack/ev-node/core/sequencer"
18- datypes "github.com/evstack/ev-node/pkg/da/types "
17+ "github.com/evstack/ev-node/test/testda "
1918 "github.com/ipfs/go-datastore"
2019 dssync "github.com/ipfs/go-datastore/sync"
2120 "github.com/libp2p/go-libp2p/core/peer"
@@ -43,182 +42,30 @@ const (
4342 MockExecutorAddress = "127.0.0.1:40041"
4443)
4544
46- // createTestComponents creates test components for node initialization
47- type dummyDAClient struct {
48- backend * dummyDABackend
49- }
50-
51- type dummyDABackend struct {
52- mu sync.Mutex
53- height uint64
54- maxBlobSz uint64
55- blobs map [uint64 ]map [string ][][]byte // height -> namespace -> blobs
56- failSubmit atomic.Bool
57-
58- tickerMu sync.Mutex
59- tickerStop chan struct {}
60- tickerRefs atomic.Int32
61- }
62-
45+ // sharedDummyDA is a shared DummyDA instance for multi-node tests.
6346var (
64- sharedDABackend * dummyDABackend
65- sharedDABackendOnce sync.Once
47+ sharedDummyDA * testda. DummyDA
48+ sharedDummyDAOnce sync.Once
6649)
6750
68- func getSharedDABackend (maxBlobSize uint64 ) * dummyDABackend {
69- sharedDABackendOnce .Do (func () {
70- sharedDABackend = & dummyDABackend {
71- maxBlobSz : maxBlobSize ,
72- blobs : make (map [uint64 ]map [string ][][]byte ),
73- }
51+ func getSharedDummyDA (maxBlobSize uint64 ) * testda.DummyDA {
52+ sharedDummyDAOnce .Do (func () {
53+ sharedDummyDA = testda .New (testda .WithMaxBlobSize (maxBlobSize ))
7454 })
75-
76- if maxBlobSize > 0 {
77- sharedDABackend .mu .Lock ()
78- if sharedDABackend .maxBlobSz == 0 || maxBlobSize > sharedDABackend .maxBlobSz {
79- sharedDABackend .maxBlobSz = maxBlobSize
80- }
81- sharedDABackend .mu .Unlock ()
82- }
83-
84- return sharedDABackend
85- }
86-
87- func (b * dummyDABackend ) reset () {
88- b .mu .Lock ()
89- b .height = 0
90- b .blobs = make (map [uint64 ]map [string ][][]byte )
91- b .failSubmit .Store (false )
92- b .mu .Unlock ()
93-
94- b .tickerMu .Lock ()
95- if b .tickerStop != nil {
96- close (b .tickerStop )
97- b .tickerStop = nil
98- }
99- b .tickerRefs .Store (0 )
100- b .tickerMu .Unlock ()
55+ return sharedDummyDA
10156}
10257
10358func resetSharedDummyDA () {
104- if sharedDABackend != nil {
105- sharedDABackend . reset ()
59+ if sharedDummyDA != nil {
60+ sharedDummyDA . Reset ()
10661 }
10762}
10863
109- func newDummyDAClient (maxBlobSize uint64 ) * dummyDAClient {
64+ func newDummyDAClient (maxBlobSize uint64 ) * testda. DummyDA {
11065 if maxBlobSize == 0 {
111- maxBlobSize = 2 * 1024 * 1024
112- }
113- return & dummyDAClient {backend : getSharedDABackend (maxBlobSize )}
114- }
115-
116- func (d * dummyDAClient ) Submit (ctx context.Context , data [][]byte , gasPrice float64 , namespace []byte , options []byte ) datypes.ResultSubmit {
117- _ = ctx
118- _ = gasPrice
119- _ = options
120- if d .backend .failSubmit .Load () {
121- return datypes.ResultSubmit {BaseResult : datypes.BaseResult {Code : datypes .StatusError , Message : "simulated DA failure" }}
122- }
123- var blobSz uint64
124- for _ , b := range data {
125- if uint64 (len (b )) > d .backend .maxBlobSz {
126- return datypes.ResultSubmit {BaseResult : datypes.BaseResult {Code : datypes .StatusTooBig , Message : datypes .ErrBlobSizeOverLimit .Error ()}}
127- }
128- blobSz += uint64 (len (b ))
129- }
130- d .backend .mu .Lock ()
131- d .backend .height ++
132- height := d .backend .height
133- if d .backend .blobs [height ] == nil {
134- d .backend .blobs [height ] = make (map [string ][][]byte )
135- }
136- nsKey := string (namespace )
137- d .backend .blobs [height ][nsKey ] = append (d .backend .blobs [height ][nsKey ], data ... )
138- d .backend .mu .Unlock ()
139- return datypes.ResultSubmit {BaseResult : datypes.BaseResult {Code : datypes .StatusSuccess , Height : height , BlobSize : blobSz , SubmittedCount : uint64 (len (data )), Timestamp : time .Now ()}}
140- }
141-
142- func (d * dummyDAClient ) Retrieve (ctx context.Context , height uint64 , namespace []byte ) datypes.ResultRetrieve {
143- _ = ctx
144- d .backend .mu .Lock ()
145- byHeight := d .backend .blobs [height ]
146- var blobs [][]byte
147- if byHeight != nil {
148- blobs = byHeight [string (namespace )]
149- }
150- d .backend .mu .Unlock ()
151-
152- if len (blobs ) == 0 {
153- return datypes.ResultRetrieve {BaseResult : datypes.BaseResult {Code : datypes .StatusNotFound , Height : height , Message : datypes .ErrBlobNotFound .Error (), Timestamp : time .Now ()}}
154- }
155-
156- ids := make ([][]byte , len (blobs ))
157- return datypes.ResultRetrieve {
158- BaseResult : datypes.BaseResult {Code : datypes .StatusSuccess , Height : height , IDs : ids , Timestamp : time .Now ()},
159- Data : blobs ,
160- }
161- }
162- func (d * dummyDAClient ) RetrieveHeaders (ctx context.Context , height uint64 ) datypes.ResultRetrieve {
163- return d .Retrieve (ctx , height , d .GetHeaderNamespace ())
164- }
165- func (d * dummyDAClient ) RetrieveData (ctx context.Context , height uint64 ) datypes.ResultRetrieve {
166- return d .Retrieve (ctx , height , d .GetDataNamespace ())
167- }
168- func (d * dummyDAClient ) RetrieveForcedInclusion (ctx context.Context , height uint64 ) datypes.ResultRetrieve {
169- return d .Retrieve (ctx , height , d .GetForcedInclusionNamespace ())
170- }
171-
172- func (d * dummyDAClient ) GetHeaderNamespace () []byte { return []byte ("hdr" ) }
173- func (d * dummyDAClient ) GetDataNamespace () []byte { return []byte ("data" ) }
174- func (d * dummyDAClient ) GetForcedInclusionNamespace () []byte { return nil }
175- func (d * dummyDAClient ) HasForcedInclusionNamespace () bool { return false }
176- func (d * dummyDAClient ) Get (ctx context.Context , ids []datypes.ID , namespace []byte ) ([]datypes.Blob , error ) {
177- return nil , nil
178- }
179- func (d * dummyDAClient ) GetProofs (ctx context.Context , ids []datypes.ID , namespace []byte ) ([]datypes.Proof , error ) {
180- return nil , nil
181- }
182- func (d * dummyDAClient ) Validate (ctx context.Context , ids []datypes.ID , proofs []datypes.Proof , namespace []byte ) ([]bool , error ) {
183- return nil , nil
184- }
185-
186- func (d * dummyDAClient ) SetSubmitFailure (shouldFail bool ) { d .backend .failSubmit .Store (shouldFail ) }
187-
188- func (d * dummyDAClient ) StartHeightTicker (interval time.Duration ) func () {
189- d .backend .tickerMu .Lock ()
190- if d .backend .tickerStop == nil {
191- d .backend .tickerStop = make (chan struct {})
192- stopCh := d .backend .tickerStop
193- go func () {
194- ticker := time .NewTicker (interval )
195- defer ticker .Stop ()
196- for {
197- select {
198- case <- ticker .C :
199- d .backend .mu .Lock ()
200- d .backend .height ++
201- d .backend .mu .Unlock ()
202- case <- stopCh :
203- return
204- }
205- }
206- }()
207- }
208- d .backend .tickerRefs .Add (1 )
209- d .backend .tickerMu .Unlock ()
210-
211- return func () {
212- if d .backend .tickerRefs .Add (- 1 ) != 0 {
213- return
214- }
215- d .backend .tickerMu .Lock ()
216- defer d .backend .tickerMu .Unlock ()
217- if d .backend .tickerStop != nil {
218- close (d .backend .tickerStop )
219- d .backend .tickerStop = nil
220- }
66+ maxBlobSize = testda .DefaultMaxBlobSize
22167 }
68+ return getSharedDummyDA (maxBlobSize )
22269}
22370
22471func createTestComponents (t * testing.T , config evconfig.Config ) (coreexecutor.Executor , coresequencer.Sequencer , block.DAClient , * p2p.Client , datastore.Batching , * key.NodeKey , func ()) {
0 commit comments