okami.mom/albedo
git clone https://git.nkp.pet/okami.mom/albedo
eaef427
main
1"""A Python crash injects exactly one reset notice without corrupting history; a 2daemon crash leaves the detached kernel alive, so it injects none.""" 3 4import json 5import urllib .error 6import unittest 7 8from harness import latest_user 9from harness import Albedo ,Provider ,exclusive ,python ,text 10 11NOTICE = ( 12"<system-note>The python kernel got reset and all variables are lost</system-note>" 13) 14 15 16# exclusive: crashes and restarts the daemon 17@exclusive 18class KernelResetTests (unittest .TestCase ): 19def setUp (self ): 20def script (request ): 21if request ["input" ][- 1 ].get ("role" )== "user" : 22prompt = latest_user (request ) 23if prompt == "lose kernel" : 24return python ("import os; os._exit(1)" ) 25if prompt == "recover kernel" + NOTICE : 26return python ("print('kernel-ready')" ) 27return text ("ok" ) 28 29self .provider = Provider (script ) 30self .addCleanup (self .provider .close ) 31self .app = Albedo (self .provider ,protocol = "responses" ) 32self .app .__enter__ () 33self .addCleanup (self .app .__exit__ ,None ,None ,None ) 34 35def turn (self ,session ,prompt ): 36self .app .prompt (session ,prompt ).close () 37self .app .idle (session ) 38return latest_user (self .provider .requests [- 1 ]["request" ]) 39 40def test_kernel_crash_emits_one_shot_reset_notice_and_daemon_crash_none (self ): 41app = self .app 42session = app .session () 43self .assertEqual (self .turn (session ,"first prompt" ),"first prompt" ) 44unused = app .session () 45app .restart (crash = True ) 46self .assertEqual ( 47self .turn (unused ,"unused session's first prompt" ), 48"unused session's first prompt" , 49 ) 50with self .assertRaises (urllib .error .HTTPError )as rejected : 51app .prompt (session ," " ).close () 52self .assertEqual (rejected .exception .code ,400 ) 53self .assertEqual (self .turn (session ,"after restart" ),"after restart" ) 54self .assertEqual (self .turn (session ,"ordinary turn" ),"ordinary turn" ) 55self .assertEqual (self .turn (session ,"lose kernel" ),"lose kernel" ) 56self .assertEqual ( 57self .turn (session ,"recover kernel" ),"recover kernel" + NOTICE 58 ) 59self .assertTrue ( 60any ( 61"kernel-ready" in item .get ("output" ,"" ) 62for item in self .provider .requests [- 1 ]["request" ]["input" ] 63 ) 64 ) 65self .assertEqual (self .turn (session ,"still alive" ),"still alive" ) 66users = [ 67part ["text" ] 68for entry in app .history (session )["items" ] 69if entry ["kind" ]== "user" 70for part in entry ["content" ] 71if part ["kind" ]== "text" 72 ] 73self .assertEqual ( 74users , 75 [ 76"first prompt" , 77"after restart" , 78"ordinary turn" , 79"lose kernel" , 80"recover kernel" , 81"still alive" , 82 ], 83 ) 84with app .api ("/sessions" )as response : 85info = next ( 86item for item in json .load (response )["items" ]if item ["id" ]== session 87 ) 88self .assertEqual (info ["name" ],"still alive" )