@@ -893,6 +893,66 @@ describe("providerMaintenanceRunner", () => {
893893 ) ;
894894 } ) ;
895895
896+ it . effect ( "an interrupted update ends failed instead of running forever" , ( ) => {
897+ const started = Deferred . makeUnsafe < void > ( ) ;
898+ return Effect . gen ( function * ( ) {
899+ const { registry, updateStatesRef } = yield * makeRegistry ( baseNativeCliProvider ) ;
900+ const updater = yield * makeTestRunner ( registry ) ;
901+ const update = yield * updater . updateProvider ( NATIVE_CLI_DRIVER ) . pipe ( Effect . forkScoped ) ;
902+ yield * Deferred . await ( started ) ;
903+ yield * Fiber . interrupt ( update ) ;
904+ const last = ( yield * Ref . get ( updateStatesRef ) ) . at ( - 1 ) ;
905+ assert . deepStrictEqual (
906+ [ last ?. status , last ?. message ] ,
907+ [ "failed" , "Update stopped before it finished." ] ,
908+ ) ;
909+ } ) . pipe (
910+ Effect . provide (
911+ Layer . mergeAll (
912+ layerNonWindowsPlatform ,
913+ layerLatestVersionHttpClient ( "1.0.0" ) ,
914+ layerMockSpawner ( ( ) => ( {
915+ exitCode : Deferred . succeed ( started , undefined ) . pipe ( Effect . andThen ( Effect . never ) ) ,
916+ } ) ) ,
917+ ) ,
918+ ) ,
919+ ) ;
920+ } ) ;
921+
922+ it . effect ( "a request dropped while the final state is written still records it" , ( ) => {
923+ const writing = Deferred . makeUnsafe < void > ( ) ;
924+ const release = Deferred . makeUnsafe < void > ( ) ;
925+ return Effect . gen ( function * ( ) {
926+ const { registry, updateStatesRef } = yield * makeRegistry ( baseNativeCliProvider ) ;
927+ const updater = yield * makeTestRunner ( {
928+ ...registry ,
929+ setProviderMaintenanceActionState : ( input ) =>
930+ input . state ?. status === "succeeded"
931+ ? Deferred . succeed ( writing , undefined ) . pipe (
932+ Effect . andThen ( Deferred . await ( release ) ) ,
933+ Effect . andThen ( registry . setProviderMaintenanceActionState ( input ) ) ,
934+ )
935+ : registry . setProviderMaintenanceActionState ( input ) ,
936+ } ) ;
937+
938+ const update = yield * updater . updateProvider ( NATIVE_CLI_DRIVER ) . pipe ( Effect . forkScoped ) ;
939+ yield * Deferred . await ( writing ) ;
940+ update . interruptUnsafe ( ) ;
941+ yield * Deferred . succeed ( release , undefined ) ;
942+ yield * Fiber . await ( update ) ;
943+
944+ assert . strictEqual ( ( yield * Ref . get ( updateStatesRef ) ) . at ( - 1 ) ?. status , "succeeded" ) ;
945+ } ) . pipe (
946+ Effect . provide (
947+ Layer . mergeAll (
948+ layerNonWindowsPlatform ,
949+ layerLatestVersionHttpClient ( "1.0.0" ) ,
950+ layerMockSpawner ( ( ) => ( { stdout : "updated" } ) ) ,
951+ ) ,
952+ ) ,
953+ ) ;
954+ } ) ;
955+
896956 it . effect ( "prevents concurrent updates for the same provider" , ( ) => {
897957 const startedLatch : { resolve : ( ) => void } = { resolve : ( ) => { } } ;
898958 const releaseLatch : { resolve : ( ) => void } = { resolve : ( ) => { } } ;
0 commit comments