@@ -129,27 +129,32 @@ where
129129 let runtime_config_dir = runtime_config_path
130130 . and_then ( Path :: parent)
131131 . map ( ToOwned :: to_owned) ;
132+ let state_dir = toml_resolver. state_dir ( ) ?;
132133 let tls_resolver = runtime_config_dir. clone ( ) . map ( SpinTlsRuntimeConfig :: new) ;
133- let key_value_config_resolver =
134- key_value_config_resolver ( runtime_config_dir, toml_resolver. state_dir ( ) ?) ;
135- let sqlite_config_resolver = sqlite_config_resolver ( toml_resolver. state_dir ( ) ?)
134+ let key_value_resolver = key_value_config_resolver ( runtime_config_dir, state_dir. clone ( ) ) ;
135+ let sqlite_resolver = sqlite_config_resolver ( state_dir. clone ( ) )
136136 . context ( "failed to resolve sqlite runtime config" ) ?;
137137
138+ let toml = toml_resolver. toml ( ) ;
139+ let log_dir = toml_resolver. log_dir ( ) ?;
138140 let source = TomlRuntimeConfigSource :: new (
139- toml_resolver. clone ( ) ,
140- & key_value_config_resolver ,
141+ toml_resolver,
142+ & key_value_resolver ,
141143 tls_resolver. as_ref ( ) ,
142- & sqlite_config_resolver ,
144+ & sqlite_resolver ,
143145 ) ;
146+ // Note: all valid fields in the runtime config must have been referenced at
147+ // this point or the finalizer will fail due to `validate_all_keys_used`
148+ // not passing.
144149 let runtime_config: T = source. try_into ( ) . map_err ( Into :: into) ?;
145150
146151 Ok ( Self {
147152 runtime_config,
148- key_value_resolver : key_value_config_resolver ,
149- sqlite_resolver : sqlite_config_resolver ,
150- state_dir : toml_resolver . state_dir ( ) ? ,
151- log_dir : toml_resolver . log_dir ( ) ? ,
152- toml : toml_resolver . toml ( ) ,
153+ key_value_resolver,
154+ sqlite_resolver,
155+ state_dir,
156+ log_dir,
157+ toml,
153158 } )
154159 }
155160
@@ -461,12 +466,11 @@ mod tests {
461466 fn resolve_toml(
462467 toml: toml:: Table ,
463468 path: impl AsRef <std:: path:: Path >,
464- ) -> ResolvedRuntimeConfig <TestFactorsRuntimeConfig > {
469+ ) -> anyhow :: Result < ResolvedRuntimeConfig <TestFactorsRuntimeConfig > > {
465470 ResolvedRuntimeConfig :: <TestFactorsRuntimeConfig >:: new(
466471 toml_resolver( & toml) ,
467472 Some ( path. as_ref( ) ) ,
468473 )
469- . unwrap( )
470474 }
471475 } ;
472476 }
@@ -502,13 +506,16 @@ mod tests {
502506 type = "spin"
503507 } ;
504508 assert_eq ! (
505- resolve_toml( toml, "." ) . runtime_config. configured_labels( ) ,
509+ resolve_toml( toml, "." )
510+ . unwrap( )
511+ . runtime_config
512+ . configured_labels( ) ,
506513 vec![ "default" , "foo" ]
507514 ) ;
508515
509516 // Test that the default label is added with an empty toml config.
510517 let toml = toml:: Table :: new ( ) ;
511- let runtime_config = resolve_toml ( toml, "config.toml" ) . runtime_config ;
518+ let runtime_config = resolve_toml ( toml, "config.toml" ) . unwrap ( ) . runtime_config ;
512519 assert_eq ! ( runtime_config. configured_labels( ) , vec![ "default" ] ) ;
513520 }
514521
@@ -527,7 +534,7 @@ mod tests {
527534 [ key_value_store. foo]
528535 type = "spin"
529536 } ;
530- let runtime_config = resolve_toml ( toml, "config.toml" ) . runtime_config ;
537+ let runtime_config = resolve_toml ( toml, "config.toml" ) . unwrap ( ) . runtime_config ;
531538 assert ! ( [ "default" , "foo" ]
532539 . iter( )
533540 . all( |label| runtime_config. has_store_manager( label) ) ) ;
@@ -565,6 +572,7 @@ mod tests {
565572 } )
566573 . runtime_config (
567574 resolve_toml ( runtime_config, tmp_dir. path ( ) . join ( "runtime-config.toml" ) )
575+ . unwrap ( )
568576 . runtime_config ,
569577 ) ?;
570578 let mut state = env. build_instance_state ( ) . await ?;
@@ -590,4 +598,29 @@ mod tests {
590598 UserProvidedPath :: Default ,
591599 )
592600 }
601+
602+ #[ test]
603+ fn dirs_are_resolved ( ) {
604+ define_test_factor ! ( sqlite: SqliteFactor ) ;
605+
606+ let toml = toml:: toml! {
607+ state_dir = "/foo"
608+ log_dir = "/bar"
609+ } ;
610+ resolve_toml ( toml, "config.toml" ) . unwrap ( ) ;
611+ }
612+
613+ #[ test]
614+ fn fails_to_resolve_with_unused_key ( ) {
615+ define_test_factor ! ( sqlite: SqliteFactor ) ;
616+
617+ let toml = toml:: toml! {
618+ baz = "/baz"
619+ } ;
620+ // assert returns an error with value "unused runtime config key(s): local_app_dir"
621+ let Err ( e) = resolve_toml ( toml, "config.toml" ) else {
622+ panic ! ( "Should not be able to resolve unknown key" ) ;
623+ } ;
624+ assert_eq ! ( e. to_string( ) , "unused runtime config key(s): baz" ) ;
625+ }
593626}
0 commit comments