@@ -461,6 +461,32 @@ pub struct TestRunner {
461461 assertion_handler : AssertionHandler ,
462462}
463463
464+ fn parse_bool_flag ( value : & str ) -> bool {
465+ matches ! (
466+ value. trim( ) . to_ascii_lowercase( ) . as_str( ) ,
467+ "true" | "1" | "yes" | "on"
468+ )
469+ }
470+
471+ fn tls_env_defaults ( ) -> HashMap < String , String > {
472+ let mut defaults = HashMap :: new ( ) ;
473+
474+ if let Ok ( value) = std:: env:: var ( crate :: config:: ENV_GRPCTESTIFY_TLS_CA_FILE ) {
475+ defaults. insert ( "ca_cert" . to_string ( ) , value) ;
476+ }
477+ if let Ok ( value) = std:: env:: var ( crate :: config:: ENV_GRPCTESTIFY_TLS_CERT_FILE ) {
478+ defaults. insert ( "client_cert" . to_string ( ) , value) ;
479+ }
480+ if let Ok ( value) = std:: env:: var ( crate :: config:: ENV_GRPCTESTIFY_TLS_KEY_FILE ) {
481+ defaults. insert ( "client_key" . to_string ( ) , value) ;
482+ }
483+ if let Ok ( value) = std:: env:: var ( crate :: config:: ENV_GRPCTESTIFY_TLS_SERVER_NAME ) {
484+ defaults. insert ( "server_name" . to_string ( ) , value) ;
485+ }
486+
487+ defaults
488+ }
489+
464490impl TestRunner {
465491 pub fn full_service_name ( package : & str , service : & str ) -> String {
466492 if package. is_empty ( ) {
@@ -574,28 +600,42 @@ impl TestRunner {
574600 // Configure Client
575601 let document_path = Path :: new ( & document. file_path ) ;
576602
577- let tls_config = document. get_tls_config ( ) . map ( |tls_map| TlsConfig {
578- ca_cert_path : tls_map. get ( "ca_cert" ) . map ( |p| {
579- FileUtils :: resolve_relative_path ( document_path, p)
580- . to_string_lossy ( )
581- . to_string ( )
582- } ) ,
583- client_cert_path : tls_map. get ( "client_cert" ) . map ( |p| {
584- FileUtils :: resolve_relative_path ( document_path, p)
585- . to_string_lossy ( )
586- . to_string ( )
587- } ) ,
588- client_key_path : tls_map. get ( "client_key" ) . map ( |p| {
589- FileUtils :: resolve_relative_path ( document_path, p)
590- . to_string_lossy ( )
591- . to_string ( )
592- } ) ,
593- server_name : tls_map. get ( "server_name" ) . cloned ( ) ,
594- insecure_skip_verify : tls_map
595- . get ( "insecure" )
596- . map ( |s| s == "true" )
597- . unwrap_or ( false ) ,
598- } ) ;
603+ let tls_defaults = tls_env_defaults ( ) ;
604+ let tls_config = document
605+ . get_tls_config_with_defaults ( & tls_defaults)
606+ . map ( |tls_map| TlsConfig {
607+ ca_cert_path : tls_map
608+ . get ( "ca_cert" )
609+ . or_else ( || tls_map. get ( "ca_file" ) )
610+ . map ( |p| {
611+ FileUtils :: resolve_relative_path ( document_path, p)
612+ . to_string_lossy ( )
613+ . to_string ( )
614+ } ) ,
615+ client_cert_path : tls_map
616+ . get ( "client_cert" )
617+ . or_else ( || tls_map. get ( "cert" ) )
618+ . or_else ( || tls_map. get ( "cert_file" ) )
619+ . map ( |p| {
620+ FileUtils :: resolve_relative_path ( document_path, p)
621+ . to_string_lossy ( )
622+ . to_string ( )
623+ } ) ,
624+ client_key_path : tls_map
625+ . get ( "client_key" )
626+ . or_else ( || tls_map. get ( "key" ) )
627+ . or_else ( || tls_map. get ( "key_file" ) )
628+ . map ( |p| {
629+ FileUtils :: resolve_relative_path ( document_path, p)
630+ . to_string_lossy ( )
631+ . to_string ( )
632+ } ) ,
633+ server_name : tls_map. get ( "server_name" ) . cloned ( ) ,
634+ insecure_skip_verify : tls_map
635+ . get ( "insecure" )
636+ . map ( |s| parse_bool_flag ( s) )
637+ . unwrap_or ( false ) ,
638+ } ) ;
599639
600640 // Check for Proto config in document
601641 let proto_config = if let Some ( proto_map) = document. get_proto_config ( ) {
@@ -1616,20 +1656,36 @@ impl TestRunner {
16161656 }
16171657 }
16181658
1619- // Show TLS config if present
1620- if let Some ( tls_config) = document. get_tls_config ( ) {
1659+ // Show TLS config if present (including environment defaults)
1660+ let tls_defaults = tls_env_defaults ( ) ;
1661+ if let Some ( tls_config) = document. get_tls_config_with_defaults ( & tls_defaults) {
16211662 println ! ( ) ;
16221663 println ! ( "🔒 TLS Configuration:" ) ;
1623- if tls_config. contains_key ( "ca_cert" ) {
1624- println ! ( " CA Cert: {}" , tls_config. get( "ca_cert" ) . unwrap( ) ) ;
1664+ if let Some ( ca_cert) = tls_config
1665+ . get ( "ca_cert" )
1666+ . or_else ( || tls_config. get ( "ca_file" ) )
1667+ {
1668+ println ! ( " CA Cert: {}" , ca_cert) ;
16251669 }
1626- if tls_config. contains_key ( "cert" ) {
1627- println ! ( " Client Cert: {}" , tls_config. get( "cert" ) . unwrap( ) ) ;
1670+ if let Some ( client_cert) = tls_config
1671+ . get ( "client_cert" )
1672+ . or_else ( || tls_config. get ( "cert" ) )
1673+ . or_else ( || tls_config. get ( "cert_file" ) )
1674+ {
1675+ println ! ( " Client Cert: {}" , client_cert) ;
16281676 }
1629- if tls_config. contains_key ( "key" ) {
1630- println ! ( " Client Key: {}" , tls_config. get( "key" ) . unwrap( ) ) ;
1677+ if let Some ( client_key) = tls_config
1678+ . get ( "client_key" )
1679+ . or_else ( || tls_config. get ( "key" ) )
1680+ . or_else ( || tls_config. get ( "key_file" ) )
1681+ {
1682+ println ! ( " Client Key: {}" , client_key) ;
16311683 }
1632- if tls_config. get ( "insecure" ) == Some ( & "true" . to_string ( ) ) {
1684+ if tls_config
1685+ . get ( "insecure" )
1686+ . map ( |s| parse_bool_flag ( s) )
1687+ . unwrap_or ( false )
1688+ {
16331689 println ! ( " Insecure Skip Verify: true" ) ;
16341690 }
16351691 }
@@ -1691,6 +1747,54 @@ mod tests {
16911747 assert ! ( runner. write_mode) ;
16921748 }
16931749
1750+ #[ test]
1751+ fn test_parse_bool_flag_truthy_values ( ) {
1752+ assert ! ( parse_bool_flag( "true" ) ) ;
1753+ assert ! ( parse_bool_flag( "1" ) ) ;
1754+ assert ! ( parse_bool_flag( "YES" ) ) ;
1755+ assert ! ( parse_bool_flag( "on" ) ) ;
1756+ }
1757+
1758+ #[ test]
1759+ fn test_parse_bool_flag_falsy_values ( ) {
1760+ assert ! ( !parse_bool_flag( "false" ) ) ;
1761+ assert ! ( !parse_bool_flag( "0" ) ) ;
1762+ assert ! ( !parse_bool_flag( "off" ) ) ;
1763+ assert ! ( !parse_bool_flag( "" ) ) ;
1764+ }
1765+
1766+ #[ test]
1767+ fn test_tls_env_defaults_uses_grpctestify_prefix ( ) {
1768+ unsafe {
1769+ std:: env:: set_var ( crate :: config:: ENV_GRPCTESTIFY_TLS_CA_FILE , "/tmp/ca.pem" ) ;
1770+ std:: env:: set_var (
1771+ crate :: config:: ENV_GRPCTESTIFY_TLS_CERT_FILE ,
1772+ "/tmp/cert.pem" ,
1773+ ) ;
1774+ std:: env:: set_var ( crate :: config:: ENV_GRPCTESTIFY_TLS_KEY_FILE , "/tmp/key.pem" ) ;
1775+ std:: env:: set_var ( crate :: config:: ENV_GRPCTESTIFY_TLS_SERVER_NAME , "localhost" ) ;
1776+ }
1777+
1778+ let defaults = tls_env_defaults ( ) ;
1779+ assert_eq ! ( defaults. get( "ca_cert" ) , Some ( & "/tmp/ca.pem" . to_string( ) ) ) ;
1780+ assert_eq ! (
1781+ defaults. get( "client_cert" ) ,
1782+ Some ( & "/tmp/cert.pem" . to_string( ) )
1783+ ) ;
1784+ assert_eq ! (
1785+ defaults. get( "client_key" ) ,
1786+ Some ( & "/tmp/key.pem" . to_string( ) )
1787+ ) ;
1788+ assert_eq ! ( defaults. get( "server_name" ) , Some ( & "localhost" . to_string( ) ) ) ;
1789+
1790+ unsafe {
1791+ std:: env:: remove_var ( crate :: config:: ENV_GRPCTESTIFY_TLS_CA_FILE ) ;
1792+ std:: env:: remove_var ( crate :: config:: ENV_GRPCTESTIFY_TLS_CERT_FILE ) ;
1793+ std:: env:: remove_var ( crate :: config:: ENV_GRPCTESTIFY_TLS_KEY_FILE ) ;
1794+ std:: env:: remove_var ( crate :: config:: ENV_GRPCTESTIFY_TLS_SERVER_NAME ) ;
1795+ }
1796+ }
1797+
16941798 #[ test]
16951799 fn test_test_runner_with_verbose ( ) {
16961800 let runner = TestRunner :: new ( false , 30 , false , false , true , None ) ;
0 commit comments