okami.mom/albedo
git clone https://git.nkp.pet/okami.mom/albedo
6b74a53
main
1/// Unicode eviction and replay gaps are impractical on the shared E2E event stream. 2import albedo/daemon/event_buffer as buffer 3import gleam/int 4import gleam/json 5import gleam/list 6import gleam/result 7import gleam/string 8import gleeunit/should 9 10/// Replayed events as the text a client receives: the buffer keeps them encoded. 11fn texts ( replayed : Result ( List ( json . Json ), Nil )) -> Result ( List ( String ), Nil ) { 12result . map ( replayed , list . map ( _, json . to_string )) 13} 14 15pub fn replay_is_ordered_and_only_a_gap_requires_reset_test () -> Nil { 16let events = 17int . range ( 1 , 301 , buffer . new (), fn ( events , n ) { 18buffer . push ( events , n , json . int ( n )) 19}) 20buffer . since ( events , 42 , 300 ) |> should . equal ( Error ( Nil )) 21buffer . since ( events , - 1 , 300 ) |> should . equal ( Error ( Nil )) 22buffer . since ( events , 301 , 300 ) |> should . equal ( Error ( Nil )) 23let assert Ok ( retained ) = buffer . since ( events , 44 , 300 ) 24list . length ( retained ) |> should . equal ( 256 ) 25list . first ( retained ) |> should . equal ( Ok ( json . int ( 45 ))) 26buffer . since ( events , 298 , 300 ) 27|> should . equal ( Ok ([ json . int ( 299 ), json . int ( 300 )])) 28buffer . since ( events , 300 , 300 ) |> should . equal ( Ok ([])) 29buffer . since ( buffer . new (), 0 , 0 ) |> should . equal ( Ok ([])) 30} 31 32pub fn byte_budget_evicts_oldest_without_splitting_unicode_test () -> Nil { 33// Two of these fit the budget; a third event evicts the oldest. 34let large = json . string ( string . repeat ( "é" , buffer . budget / 4 - 1 )) 35let events = 36buffer . new () 37|> buffer . push ( 1 , large ) 38|> buffer . push ( 2 , large ) 39let large = json . to_string ( large ) 40buffer . since ( events , 0 , 2 ) |> texts |> should . equal ( Ok ([ large , large ])) 41let events = buffer . push ( events , 3 , json . string ( "next" )) 42buffer . since ( events , 0 , 3 ) |> should . equal ( Error ( Nil )) 43buffer . since ( events , 1 , 3 ) 44|> texts 45|> should . equal ( Ok ([ large , "\"next\"" ])) 46} 47 48pub fn oversized_event_leaves_a_replay_gap_until_the_client_resets_test () -> Nil { 49let events = buffer . new () |> buffer . push ( 1 , json . string ( "before" )) 50let events = 51buffer . push ( events , 2 , json . string ( string . repeat ( "x" , buffer . budget ))) 52buffer . since ( events , 1 , 2 ) |> should . equal ( Error ( Nil )) 53buffer . since ( events , 2 , 2 ) |> should . equal ( Ok ([])) 54let events = buffer . push ( events , 3 , json . string ( "after" )) 55buffer . since ( events , 1 , 3 ) |> should . equal ( Error ( Nil )) 56buffer . since ( events , 2 , 3 ) |> texts |> should . equal ( Ok ([ "\"after\"" ])) 57}