okami.mom/albedo
git clone https://git.nkp.pet/okami.mom/albedo
fbcd4e8
main
1//// A replayed host call must never run twice, and only a call an earlier 2//// daemon started without answering may come back as "outcome unknown". The 3//// replay that reaches this ledger needs a daemon restart between a call and 4//// its acknowledgement, which E2E cannot place; the ledger is driven here. 5 6import albedo/daemon/store 7import albedo/harness/extensions/python/link 8import gleam/option 9import gleeunit/should 10 11fn recorded () -> #( store . Store , link . Record ) { 12let assert Ok ( ledger ) = store . start ( ":memory:" , "" ) 13let record = 14link . Record ( 15session : "s" , 16kernel : "k1" , 17token : "t" , 18run_dir : "/nowhere" , 19cwd : "/tmp" , 20modules : "[]" , 21out_seq : 0 , 22owned : "{}" , 23) 24let assert Ok ( _ ) = link . create ( ledger , record ) 25#( ledger , record ) 26} 27 28pub fn a_replayed_call_is_answered_not_run_again_test () -> Nil { 29let #( ledger , record ) = recorded () 30link . call ( ledger , record , "c1" ) |> should . equal ( link . Fresh ) 31let assert Ok ( _ ) = link . reply ( ledger , record , "c1" , 1 , "{\"type\":\"reply\"}" ) 32// The kernel never saw our ack and sends the call again: its reply is 33// already on the way through the outbox. 34link . call ( ledger , record , "c1" ) |> should . equal ( link . Answered ) 35link . pending ( ledger , record ) |> should . equal ([#( 1 , "{\"type\":\"reply\"}" )]) 36// Once the kernel has the reply, the call and its frame are gone. 37let assert Ok ( _ ) = link . ack ( ledger , record , 1 ) 38link . pending ( ledger , record ) |> should . equal ([]) 39store . close ( ledger ) 40} 41 42pub fn a_call_an_earlier_daemon_never_answered_is_unknown_test () -> Nil { 43let #( ledger , record ) = recorded () 44link . call ( ledger , record , "c1" ) |> should . equal ( link . Fresh ) 45// The daemon restarted before answering: a replay must not run it again. 46link . call ( ledger , record , "c1" ) |> should . equal ( link . Unknown ) 47store . close ( ledger ) 48} 49 50pub fn a_restarted_daemon_resends_and_keeps_counting_test () -> Nil { 51let #( ledger , record ) = recorded () 52let assert Ok ( _ ) = link . persist ( ledger , record , 1 , "{\"a\":1}" ) 53let assert Ok ( _ ) = link . persist ( ledger , record , 2 , "{\"a\":2}" ) 54let assert Ok ( _ ) = link . ack ( ledger , record , 1 ) 55let assert Ok ( found ) = link . find ( ledger , "s" ) |> option . to_result ( Nil ) 56found . out_seq |> should . equal ( 2 ) 57link . pending ( ledger , found ) |> should . equal ([#( 2 , "{\"a\":2}" )]) 58let assert Ok ( _ ) = link . forget ( ledger , found ) 59link . find ( ledger , "s" ) |> should . equal ( option . None ) 60store . close ( ledger ) 61}