@@ -55,31 +55,26 @@ func (s *EvmReaderSuite) SetupTest() {
5555 s .inputBox = newMockInputBox ().SetupDefaultBehavior ()
5656 s .contractFactory = newMockAdapterFactory ().SetupDefaultBehavior (s .applicationContract1 , s .applicationContract2 , s .inputBox )
5757
58- s .evmReader = & Service {
59- client : s .client ,
60- repository : s .repository ,
61- defaultBlock : DefaultBlock_Latest ,
62- inputReaderEnabled : true ,
63- hasEnabledApps : true ,
64- adapterFactory : s .contractFactory ,
65- }
66-
6758 logLevel , err := config .GetLogLevel ()
6859 s .Require ().NoError (err )
6960
70- serviceArgs := & service.TickServiceConfigs {
71- BaseConfigs : service.BaseConfigs {
72- Name : "evm-reader" ,
73- LogLevel : logLevel ,
61+ evmReader , err := Create (s .T ().Context (), & CreateInfo {
62+ Config : config.EvmreaderConfig {
63+ LogLevel : logLevel ,
64+ BlockchainHttpRetryMaxWait : 200 * time .Millisecond ,
65+ BlockchainDefaultBlock : DefaultBlock_Latest ,
66+ FeatureInputReaderEnabled : true ,
67+ EvmReaderPollingInterval : 100 * time .Millisecond ,
7468 },
75- PollInterval : 100 * time .Millisecond ,
76- }
77- err = service .InitTickServiceTemplate (& s .evmReader .TickServiceTemplate , serviceArgs , s .evmReader )
69+ Repository : s .repository ,
70+ EthClient : s .client ,
71+ AdapterFactory : s .contractFactory ,
72+ })
7873 s .Require ().NoError (err )
79-
80- s .evmReader .resolver = newApplicationAdapterResolver (s .evmReader .Logger , s .contractFactory )
74+ s .evmReader = evmReader .(* Service )
8175
8276 supCfg := service.SupervisorConfigs {
77+ BaseConfigs : service.BaseConfigs {LogLevel : logLevel },
8378 Factories : []service.FactoryFunction {
8479 func (context.Context , * service.Supervisor ) (service.SupervisedService , error ) {
8580 return s .evmReader , nil
@@ -132,68 +127,101 @@ func wasntNotified(ch <-chan struct{}) bool {
132127}
133128
134129// Service tests
135- func (s * EvmReaderSuite ) TestItStopsWhenSupervisorIsStoppedAfterFirstHeader () {
130+ func (s * EvmReaderSuite ) TestItStopsWhenContextIsCanceled () {
136131 called := newCallNotification (s .client .EnqueueNewHead (100 ))
137132
133+ ctx , cancel := context .WithCancel (s .T ().Context ())
134+
138135 done := make (chan struct {})
139136 go func () {
140- err := s .supervisor .Serve (s . T (). Context () )
141- s .Require ().NoError (err )
137+ err := s .evmReader .Serve (ctx )
138+ s .Require ().ErrorIs (err , context . Canceled )
142139 close (done )
143140 }()
144141
145142 s .Require ().True (waitNotification (called ), "evmreader did not read new header" )
146143
147- s . supervisor . Stop ( false )
144+ cancel ( )
148145
149146 s .Require ().True (waitNotification (done ), "evmreader did not stop after context cancelation" )
150147}
151148
152149func (s * EvmReaderSuite ) TestReadyReflectsServeLifecycle () {
153150 called := newCallNotification (s .client .EnqueueNewHead (100 ))
154151
155- s .Require ().False (s .supervisor .Ready ())
152+ s .Require ().False (s .evmReader .Ready ())
153+
154+ ctx , cancel := context .WithCancel (s .T ().Context ())
156155
157156 done := make (chan struct {})
158157 go func () {
159- err := s .supervisor .Serve (s . T (). Context () )
160- s .Require ().NoError (err )
158+ err := s .evmReader .Serve (ctx )
159+ s .Require ().ErrorIs (err , context . Canceled )
161160 close (done )
162161 }()
163162
164163 s .Require ().True (waitNotification (called ))
165- s .Require ().True (s .supervisor .Ready ())
166- s .Require ().True (wasntNotified (done ))
164+ s .Require ().True (s .evmReader .Ready ())
167165
168- s .supervisor .Stop (false )
166+ s .Require ().True (wasntNotified (done ))
167+ cancel ()
169168 s .Require ().True (waitNotification (done ))
170- s .Require ().False (s .supervisor .Ready ())
169+
170+ s .Require ().True (s .evmReader .Ready ())
171+ time .Sleep (s .evmReader .pollingMaxWait )
172+ s .Require ().False (s .evmReader .Ready ())
171173}
172174
173- func (s * EvmReaderSuite ) TestReadyDoesNotDependOnPollingSuccess () {
175+ func (s * EvmReaderSuite ) TestNotReadyWhilePollingFails () {
174176 var hdr * types.Header
175177 called := newCallNotification (s .client .On ("HeaderByNumber" ,
176178 mock .Anything ,
177179 mock .Anything ,
180+ ).Return (hdr , errors .New ("transient connection error" )))
181+
182+ s .Require ().False (s .evmReader .Ready ())
183+
184+ go func () {
185+ err := s .evmReader .Serve (s .T ().Context ())
186+ s .Require ().ErrorIs (err , context .Canceled )
187+ }()
188+
189+ s .Require ().True (waitNotification (called ))
190+ s .Require ().False (s .evmReader .Ready ())
191+ }
192+
193+ func (s * EvmReaderSuite ) TestReadyIsRecoveredOnPollingSuccess () {
194+ var hdr * types.Header
195+ failCalled := newCallNotification (s .client .On ("HeaderByNumber" ,
196+ mock .Anything ,
197+ mock .Anything ,
178198 ).Return (hdr , errors .New ("transient connection error" )).Once ())
199+ called := newCallNotification (s .client .EnqueueNewHead (100 ))
179200
180- s .Require ().False (s .supervisor .Ready ())
201+ s .Require ().False (s .evmReader .Ready ())
202+
203+ ctx , cancel := context .WithCancel (s .T ().Context ())
181204
182205 done := make (chan struct {})
183206 go func () {
184- err := s .supervisor .Serve (s . T (). Context () )
185- s .Require ().NoError (err )
207+ err := s .evmReader .Serve (ctx )
208+ s .Require ().ErrorIs (err , context . Canceled )
186209 close (done )
187210 }()
188211
189- s .Require ().True (waitNotification (called ))
190- s .Require ().True (s .supervisor .Ready ())
191- s .Require ().True (wasntNotified (done ))
212+ s .Require ().True (waitNotification (failCalled ))
213+ s .Require ().False (s .evmReader .Ready ())
192214
193- s .supervisor .Stop (false )
215+ s .Require ().True (waitNotification (called ))
216+ s .Require ().True (s .evmReader .Ready ())
194217
218+ s .Require ().True (wasntNotified (done ))
219+ cancel ()
195220 s .Require ().True (waitNotification (done ))
196- s .Require ().False (s .supervisor .Ready ())
221+
222+ s .Require ().True (s .evmReader .Ready ())
223+ time .Sleep (s .evmReader .pollingMaxWait )
224+ s .Require ().False (s .evmReader .Ready ())
197225}
198226
199227func (s * EvmReaderSuite ) TestTickScansWithServiceContext () {
0 commit comments