@@ -129,27 +129,32 @@ where
129
129
let runtime_config_dir = runtime_config_path
130
130
. and_then ( Path :: parent)
131
131
. map ( ToOwned :: to_owned) ;
132
+ let state_dir = toml_resolver. state_dir ( ) ?;
132
133
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 ( ) )
136
136
. context ( "failed to resolve sqlite runtime config" ) ?;
137
137
138
+ let toml = toml_resolver. toml ( ) ;
139
+ let log_dir = toml_resolver. log_dir ( ) ?;
138
140
let source = TomlRuntimeConfigSource :: new (
139
- toml_resolver. clone ( ) ,
140
- & key_value_config_resolver ,
141
+ toml_resolver,
142
+ & key_value_resolver ,
141
143
tls_resolver. as_ref ( ) ,
142
- & sqlite_config_resolver ,
144
+ & sqlite_resolver ,
143
145
) ;
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.
144
149
let runtime_config: T = source. try_into ( ) . map_err ( Into :: into) ?;
145
150
146
151
Ok ( Self {
147
152
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,
153
158
} )
154
159
}
155
160
@@ -461,12 +466,11 @@ mod tests {
461
466
fn resolve_toml(
462
467
toml: toml:: Table ,
463
468
path: impl AsRef <std:: path:: Path >,
464
- ) -> ResolvedRuntimeConfig <TestFactorsRuntimeConfig > {
469
+ ) -> anyhow :: Result < ResolvedRuntimeConfig <TestFactorsRuntimeConfig > > {
465
470
ResolvedRuntimeConfig :: <TestFactorsRuntimeConfig >:: new(
466
471
toml_resolver( & toml) ,
467
472
Some ( path. as_ref( ) ) ,
468
473
)
469
- . unwrap( )
470
474
}
471
475
} ;
472
476
}
@@ -502,13 +506,16 @@ mod tests {
502
506
type = "spin"
503
507
} ;
504
508
assert_eq ! (
505
- resolve_toml( toml, "." ) . runtime_config. configured_labels( ) ,
509
+ resolve_toml( toml, "." )
510
+ . unwrap( )
511
+ . runtime_config
512
+ . configured_labels( ) ,
506
513
vec![ "default" , "foo" ]
507
514
) ;
508
515
509
516
// Test that the default label is added with an empty toml config.
510
517
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 ;
512
519
assert_eq ! ( runtime_config. configured_labels( ) , vec![ "default" ] ) ;
513
520
}
514
521
@@ -527,7 +534,7 @@ mod tests {
527
534
[ key_value_store. foo]
528
535
type = "spin"
529
536
} ;
530
- let runtime_config = resolve_toml ( toml, "config.toml" ) . runtime_config ;
537
+ let runtime_config = resolve_toml ( toml, "config.toml" ) . unwrap ( ) . runtime_config ;
531
538
assert ! ( [ "default" , "foo" ]
532
539
. iter( )
533
540
. all( |label| runtime_config. has_store_manager( label) ) ) ;
@@ -565,6 +572,7 @@ mod tests {
565
572
} )
566
573
. runtime_config (
567
574
resolve_toml ( runtime_config, tmp_dir. path ( ) . join ( "runtime-config.toml" ) )
575
+ . unwrap ( )
568
576
. runtime_config ,
569
577
) ?;
570
578
let mut state = env. build_instance_state ( ) . await ?;
@@ -590,4 +598,29 @@ mod tests {
590
598
UserProvidedPath :: Default ,
591
599
)
592
600
}
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
+ }
593
626
}
0 commit comments