@@ -6128,6 +6128,65 @@ network_policies:
61286128 let _ = task. await ;
61296129 }
61306130
6131+ #[ tokio:: test]
6132+ async fn provider_readiness_startup_environment_avoids_unchanged_refresh ( ) {
6133+ let policy = proto_policy_fixture ( ) ;
6134+ let mut settings = settings_poll_result (
6135+ Some ( policy. clone ( ) ) ,
6136+ 1 ,
6137+ openshell_core:: proto:: PolicySource :: Sandbox ,
6138+ ) ;
6139+ settings. provider_env_revision = 6 ;
6140+ let engine = Arc :: new ( OpaEngine :: from_proto ( & policy) . unwrap ( ) ) ;
6141+ let mut ctx = policy_poll_test_context (
6142+ engine. clone ( ) ,
6143+ LoadedPolicyOrigin :: Gateway {
6144+ revision : Some ( LoadedPolicyRevision :: from_snapshot ( & settings) ) ,
6145+ has_last_valid_policy : true ,
6146+ } ,
6147+ default_middleware_connector ( ) ,
6148+ ) ;
6149+ let mut provider = static_provider_environment ( 6 , Some ( "initial" ) ) ;
6150+ provider. policy_hash . clone_from ( & settings. policy_hash ) ;
6151+ let credentials = prepare_provider_environment ( & provider) . unwrap ( ) ;
6152+ ctx. provider_credentials = CapturedProviderEnvironment :: new ( credentials, & provider)
6153+ . install ( & ctx. provider_readiness ) ;
6154+ let generation = engine. current_generation ( ) ;
6155+ let guard = engine. generation_guard ( generation) . unwrap ( ) ;
6156+ let ( policy_gateway, polls, mut reports) = scripted_policy_gateway ( ) ;
6157+ let observed_polls = policy_gateway. polled_sandboxes . clone ( ) ;
6158+ let ( requests, mut received) = tokio:: sync:: mpsc:: unbounded_channel ( ) ;
6159+ let task = tokio:: spawn ( run_policy_poll_loop_with_client (
6160+ ctx,
6161+ ScriptedProviderGateway {
6162+ policy : policy_gateway,
6163+ requests,
6164+ } ,
6165+ ) ) ;
6166+
6167+ polls. send ( settings. clone ( ) ) . unwrap ( ) ;
6168+ expect_policy_report ( & mut reports, 1 ) . await ;
6169+ polls. send ( settings) . unwrap ( ) ;
6170+ timeout ( Duration :: from_secs ( 1 ) , async {
6171+ while observed_polls. lock ( ) . await . len ( ) < 2 {
6172+ tokio:: task:: yield_now ( ) . await ;
6173+ }
6174+ } )
6175+ . await
6176+ . unwrap ( ) ;
6177+
6178+ assert ! (
6179+ timeout( Duration :: from_millis( 50 ) , received. recv( ) )
6180+ . await
6181+ . is_err( ) ,
6182+ "unchanged settings must not refetch the startup environment"
6183+ ) ;
6184+ assert_eq ! ( engine. current_generation( ) , generation) ;
6185+ assert ! ( !guard. is_stale( ) ) ;
6186+ task. abort ( ) ;
6187+ let _ = task. await ;
6188+ }
6189+
61316190 #[ tokio:: test]
61326191 async fn provider_poll_installs_fail_closed_environment_and_acknowledges_policy ( ) {
61336192 let policy = proto_policy_fixture ( ) ;
0 commit comments