@@ -213,6 +213,101 @@ func TestPlugin_Outcome(t *testing.T) {
213213 require .Equal (t , []int64 {timestamp }, outcomeProto .ObservedDonTimes [executionID ].Timestamps )
214214}
215215
216+ func TestPlugin_OutcomeInitializesMissingObservedDonTimesEntry (t * testing.T ) {
217+ lggr := logger .Test (t )
218+ store := NewStore (DefaultRequestTimeout )
219+ config , offchainCfg := newTestPluginConfig (t ), newTestPluginOffchainConfig (t )
220+ ctx := t .Context ()
221+
222+ plugin , err := NewPlugin (store , config , offchainCfg , lggr )
223+ require .NoError (t , err )
224+
225+ query , err := plugin .Query (ctx , ocr3types.OutcomeContext {PreviousOutcome : []byte ("" )})
226+ require .NoError (t , err )
227+
228+ const executionID = "workflow-missing-prev-entry"
229+ timestamp := time .Now ().UnixMilli ()
230+ observations := []* pb.Observation {
231+ {Timestamp : timestamp , Requests : map [string ]int64 {executionID : 0 }},
232+ {Timestamp : timestamp - int64 (time .Second ), Requests : map [string ]int64 {executionID : 0 }},
233+ {Timestamp : timestamp + int64 (time .Second ), Requests : map [string ]int64 {executionID : 0 }},
234+ {Timestamp : timestamp , Requests : map [string ]int64 {executionID : 0 }},
235+ }
236+
237+ aos := make ([]types.AttributedObservation , len (observations ))
238+ for i , observation := range observations {
239+ rawObs , marshalErr := proto .Marshal (observation )
240+ require .NoError (t , marshalErr )
241+ aos [i ] = types.AttributedObservation {
242+ Observation : rawObs ,
243+ Observer : commontypes .OracleID (1 ),
244+ }
245+ }
246+
247+ prevOutcome := & pb.Outcome {
248+ Timestamp : 0 ,
249+ ObservedDonTimes : map [string ]* pb.ObservedDonTimes {},
250+ }
251+ prevOutcomeBytes , err := proto .Marshal (prevOutcome )
252+ require .NoError (t , err )
253+
254+ outcome , err := plugin .Outcome (ctx , ocr3types.OutcomeContext {PreviousOutcome : prevOutcomeBytes }, query , aos )
255+ require .NoError (t , err )
256+
257+ outcomeProto := & pb.Outcome {}
258+ require .NoError (t , proto .Unmarshal (outcome , outcomeProto ))
259+ require .Contains (t , outcomeProto .ObservedDonTimes , executionID )
260+ require .Equal (t , []int64 {timestamp }, outcomeProto .ObservedDonTimes [executionID ].Timestamps )
261+ }
262+
263+ func TestPlugin_OutcomeKeepsEmptyObservedDonTimesEntries (t * testing.T ) {
264+ lggr := logger .Test (t )
265+ store := NewStore (DefaultRequestTimeout )
266+ config , offchainCfg := newTestPluginConfig (t ), newTestPluginOffchainConfig (t )
267+ ctx := t .Context ()
268+
269+ plugin , err := NewPlugin (store , config , offchainCfg , lggr )
270+ require .NoError (t , err )
271+
272+ query , err := plugin .Query (ctx , ocr3types.OutcomeContext {PreviousOutcome : []byte ("" )})
273+ require .NoError (t , err )
274+
275+ timestamp := time .Now ().UnixMilli ()
276+ observations := []* pb.Observation {
277+ {Timestamp : timestamp , Requests : map [string ]int64 {}},
278+ {Timestamp : timestamp - int64 (time .Second ), Requests : map [string ]int64 {}},
279+ {Timestamp : timestamp + int64 (time .Second ), Requests : map [string ]int64 {}},
280+ {Timestamp : timestamp , Requests : map [string ]int64 {}},
281+ }
282+
283+ aos := make ([]types.AttributedObservation , len (observations ))
284+ for i , observation := range observations {
285+ rawObs , marshalErr := proto .Marshal (observation )
286+ require .NoError (t , marshalErr )
287+ aos [i ] = types.AttributedObservation {
288+ Observation : rawObs ,
289+ Observer : commontypes .OracleID (1 ),
290+ }
291+ }
292+
293+ prevOutcome := & pb.Outcome {
294+ Timestamp : timestamp - int64 (time .Second ),
295+ ObservedDonTimes : map [string ]* pb.ObservedDonTimes {
296+ "workflow-empty" : {},
297+ },
298+ }
299+ prevOutcomeBytes , err := proto .Marshal (prevOutcome )
300+ require .NoError (t , err )
301+
302+ outcome , err := plugin .Outcome (ctx , ocr3types.OutcomeContext {PreviousOutcome : prevOutcomeBytes }, query , aos )
303+ require .NoError (t , err )
304+
305+ outcomeProto := & pb.Outcome {}
306+ require .NoError (t , proto .Unmarshal (outcome , outcomeProto ))
307+ require .Contains (t , outcomeProto .ObservedDonTimes , "workflow-empty" )
308+ require .Empty (t , outcomeProto .ObservedDonTimes ["workflow-empty" ].Timestamps )
309+ }
310+
216311func TestPlugin_FinishedExecutions (t * testing.T ) {
217312 lggr := logger .Test (t )
218313 store := NewStore (DefaultRequestTimeout )
0 commit comments