11package executing
22
33import (
4+ "context"
45 "testing"
56 "time"
67
@@ -12,6 +13,7 @@ import (
1213
1314 "github.com/evstack/ev-node/block/internal/cache"
1415 "github.com/evstack/ev-node/block/internal/common"
16+ coreseq "github.com/evstack/ev-node/core/sequencer"
1517 "github.com/evstack/ev-node/pkg/config"
1618 "github.com/evstack/ev-node/pkg/genesis"
1719 "github.com/evstack/ev-node/pkg/store"
@@ -121,3 +123,96 @@ func TestExecutor_NilBroadcasters(t *testing.T) {
121123 assert .Equal (t , cacheManager , executor .cache )
122124 assert .Equal (t , gen , executor .genesis )
123125}
126+
127+ func TestExecutor_CreateBlock_UsesScheduledProposerForHeight (t * testing.T ) {
128+ ds := sync .MutexWrap (datastore .NewMapDatastore ())
129+ memStore := store .New (ds )
130+
131+ cacheManager , err := cache .NewManager (config .DefaultConfig (), memStore , zerolog .Nop ())
132+ require .NoError (t , err )
133+
134+ metrics := common .NopMetrics ()
135+ oldAddr , oldSignerInfo , _ := buildTestSigner (t )
136+ newAddr , newSignerInfo , newSigner := buildTestSigner (t )
137+
138+ entry1 , err := genesis .NewProposerScheduleEntry (1 , oldSignerInfo .PubKey )
139+ require .NoError (t , err )
140+ entry2 , err := genesis .NewProposerScheduleEntry (2 , newSignerInfo .PubKey )
141+ require .NoError (t , err )
142+
143+ gen := genesis.Genesis {
144+ ChainID : "test-chain" ,
145+ InitialHeight : 1 ,
146+ StartTime : time .Now ().Add (- time .Second ),
147+ ProposerAddress : entry1 .Address ,
148+ ProposerSchedule : []genesis.ProposerScheduleEntry {entry1 , entry2 },
149+ DAEpochForcedInclusion : 1 ,
150+ }
151+
152+ executor , err := NewExecutor (
153+ memStore ,
154+ nil ,
155+ nil ,
156+ newSigner ,
157+ cacheManager ,
158+ metrics ,
159+ config .DefaultConfig (),
160+ gen ,
161+ nil ,
162+ nil ,
163+ zerolog .Nop (),
164+ common .DefaultBlockOptions (),
165+ make (chan error , 1 ),
166+ nil ,
167+ )
168+ require .NoError (t , err )
169+
170+ prevHeader := & types.SignedHeader {
171+ Header : types.Header {
172+ Version : types .InitStateVersion ,
173+ BaseHeader : types.BaseHeader {
174+ ChainID : gen .ChainID ,
175+ Height : 1 ,
176+ Time : uint64 (gen .StartTime .UnixNano ()),
177+ },
178+ AppHash : []byte ("state-root-0" ),
179+ ProposerAddress : oldAddr ,
180+ DataHash : common .DataHashForEmptyTxs ,
181+ },
182+ Signature : types .Signature ([]byte ("sig-1" )),
183+ Signer : oldSignerInfo ,
184+ }
185+ prevData := & types.Data {
186+ Metadata : & types.Metadata {
187+ ChainID : gen .ChainID ,
188+ Height : 1 ,
189+ Time : prevHeader .BaseHeader .Time ,
190+ },
191+ Txs : nil ,
192+ }
193+
194+ batch , err := memStore .NewBatch (context .Background ())
195+ require .NoError (t , err )
196+ require .NoError (t , batch .SaveBlockData (prevHeader , prevData , & prevHeader .Signature ))
197+ require .NoError (t , batch .SetHeight (1 ))
198+ require .NoError (t , batch .Commit ())
199+
200+ executor .setLastState (types.State {
201+ Version : types .InitStateVersion ,
202+ ChainID : gen .ChainID ,
203+ InitialHeight : gen .InitialHeight ,
204+ LastBlockHeight : 1 ,
205+ LastBlockTime : prevHeader .Time (),
206+ LastHeaderHash : prevHeader .Hash (),
207+ AppHash : []byte ("state-root-1" ),
208+ })
209+
210+ header , data , err := executor .CreateBlock (context .Background (), 2 , & BatchData {
211+ Batch : & coreseq.Batch {},
212+ Time : time .Now (),
213+ })
214+ require .NoError (t , err )
215+ require .Equal (t , newAddr , header .ProposerAddress )
216+ require .Equal (t , newAddr , header .Signer .Address )
217+ require .Equal (t , uint64 (2 ), data .Height ())
218+ }
0 commit comments