@@ -835,6 +835,7 @@ mod tests {
835835 use cb_common:: {
836836 config:: {
837837 CommitBoostConfig , FileLogSettings , LogsSettings , MetricsConfig , StdoutLogSettings ,
838+ TlsMode ,
838839 } ,
839840 signer:: { ProxyStore , SignerLoader } ,
840841 } ;
@@ -1478,4 +1479,241 @@ mod tests {
14781479 }
14791480 Ok ( ( ) )
14801481 }
1482+
1483+ // -------------------------------------------------------------------------
1484+ // Helpers for TLS tests
1485+ // -------------------------------------------------------------------------
1486+
1487+ fn local_signer_config_with_tls ( certs_path : PathBuf ) -> SignerConfig {
1488+ let mut config = local_signer_config ( ) ;
1489+ config. tls_mode = TlsMode :: Certificate ( certs_path) ;
1490+ config
1491+ }
1492+
1493+ /// Returns a `ServiceCreationInfo` whose CB config has `pbs.with_signer =
1494+ /// true` and a local signer with `TlsMode::Certificate(certs_path)`.
1495+ fn service_config_with_tls ( certs_path : PathBuf ) -> ServiceCreationInfo {
1496+ let mut sc = minimal_service_config ( ) ;
1497+ sc. config_info . cb_config . pbs . with_signer = true ;
1498+ sc. config_info . cb_config . signer = Some ( local_signer_config_with_tls ( certs_path) ) ;
1499+ sc
1500+ }
1501+
1502+ // -------------------------------------------------------------------------
1503+ // create_cert_binding
1504+ // -------------------------------------------------------------------------
1505+
1506+ #[ test]
1507+ fn test_create_cert_binding_volume_string ( ) {
1508+ let certs_path = Path :: new ( "/my/certs" ) ;
1509+ let vol = create_cert_binding ( certs_path) ;
1510+ let expected = format ! (
1511+ "/my/certs/{}:{}/{}:ro" ,
1512+ SIGNER_TLS_CERTIFICATE_NAME ,
1513+ SIGNER_TLS_CERTIFICATES_PATH_DEFAULT ,
1514+ SIGNER_TLS_CERTIFICATE_NAME
1515+ ) ;
1516+ assert_eq ! ( vol, Volumes :: Simple ( expected) ) ;
1517+ }
1518+
1519+ // -------------------------------------------------------------------------
1520+ // add_tls_certs_volume
1521+ // -------------------------------------------------------------------------
1522+
1523+ #[ test]
1524+ fn test_add_tls_certs_volume_happy_path ( ) -> eyre:: Result < ( ) > {
1525+ let dir = tempfile:: tempdir ( ) ?;
1526+ let certs_path = dir. path ( ) ;
1527+ std:: fs:: write ( certs_path. join ( SIGNER_TLS_CERTIFICATE_NAME ) , b"cert" ) ?;
1528+ std:: fs:: write ( certs_path. join ( SIGNER_TLS_KEY_NAME ) , b"key" ) ?;
1529+
1530+ let mut volumes = vec ! [ ] ;
1531+ add_tls_certs_volume ( & mut volumes, certs_path) ?;
1532+
1533+ assert_eq ! ( volumes. len( ) , 2 ) ;
1534+ assert ! (
1535+ matches!( & volumes[ 0 ] , Volumes :: Simple ( s) if s. contains( SIGNER_TLS_CERTIFICATE_NAME ) )
1536+ ) ;
1537+ assert ! ( matches!( & volumes[ 1 ] , Volumes :: Simple ( s) if s. contains( SIGNER_TLS_KEY_NAME ) ) ) ;
1538+ Ok ( ( ) )
1539+ }
1540+
1541+ #[ test]
1542+ fn test_add_tls_certs_volume_missing_cert_returns_error ( ) -> eyre:: Result < ( ) > {
1543+ let dir = tempfile:: tempdir ( ) ?;
1544+ let certs_path = dir. path ( ) ;
1545+ std:: fs:: write ( certs_path. join ( SIGNER_TLS_KEY_NAME ) , b"key" ) ?;
1546+
1547+ let result = add_tls_certs_volume ( & mut vec ! [ ] , certs_path) ;
1548+ assert ! ( result. is_err( ) ) ;
1549+ assert ! ( result. unwrap_err( ) . to_string( ) . contains( "certificate or key not found" ) ) ;
1550+ Ok ( ( ) )
1551+ }
1552+
1553+ #[ test]
1554+ fn test_add_tls_certs_volume_missing_key_returns_error ( ) -> eyre:: Result < ( ) > {
1555+ let dir = tempfile:: tempdir ( ) ?;
1556+ let certs_path = dir. path ( ) ;
1557+ std:: fs:: write ( certs_path. join ( SIGNER_TLS_CERTIFICATE_NAME ) , b"cert" ) ?;
1558+
1559+ let result = add_tls_certs_volume ( & mut vec ! [ ] , certs_path) ;
1560+ assert ! ( result. is_err( ) ) ;
1561+ assert ! ( result. unwrap_err( ) . to_string( ) . contains( "certificate or key not found" ) ) ;
1562+ Ok ( ( ) )
1563+ }
1564+
1565+ #[ test]
1566+ fn test_add_tls_certs_volume_missing_both_returns_error ( ) -> eyre:: Result < ( ) > {
1567+ let dir = tempfile:: tempdir ( ) ?;
1568+ let result = add_tls_certs_volume ( & mut vec ! [ ] , dir. path ( ) ) ;
1569+ assert ! ( result. is_err( ) ) ;
1570+ Ok ( ( ) )
1571+ }
1572+
1573+ #[ test]
1574+ fn test_add_tls_certs_volume_creates_missing_directory ( ) -> eyre:: Result < ( ) > {
1575+ let dir = tempfile:: tempdir ( ) ?;
1576+ let certs_path = dir. path ( ) . join ( "new_certs_dir" ) ;
1577+ assert ! ( !certs_path. exists( ) , "pre-condition: directory must not exist yet" ) ;
1578+
1579+ let result = add_tls_certs_volume ( & mut vec ! [ ] , & certs_path) ;
1580+
1581+ // Directory created even though cert/key are absent
1582+ assert ! ( certs_path. exists( ) , "directory should have been created" ) ;
1583+ // cert/key still missing → error
1584+ assert ! ( result. is_err( ) ) ;
1585+ Ok ( ( ) )
1586+ }
1587+
1588+ // -------------------------------------------------------------------------
1589+ // create_pbs_service – TLS cert volume/env
1590+ // -------------------------------------------------------------------------
1591+
1592+ #[ test]
1593+ fn test_create_pbs_service_with_tls_adds_cert_env_and_volume ( ) -> eyre:: Result < ( ) > {
1594+ let mut sc = service_config_with_tls ( PathBuf :: from ( "/my/certs" ) ) ;
1595+ let service = create_pbs_service ( & mut sc) ?;
1596+
1597+ assert ! ( has_env_key( & service, SIGNER_TLS_CERTIFICATES_PATH_ENV ) ) ;
1598+ assert ! ( has_volume( & service, SIGNER_TLS_CERTIFICATE_NAME ) ) ;
1599+ Ok ( ( ) )
1600+ }
1601+
1602+ #[ test]
1603+ fn test_create_pbs_service_without_tls_no_cert_env ( ) -> eyre:: Result < ( ) > {
1604+ let mut sc = minimal_service_config ( ) ;
1605+ let service = create_pbs_service ( & mut sc) ?;
1606+
1607+ assert ! ( !has_env_key( & service, SIGNER_TLS_CERTIFICATES_PATH_ENV ) ) ;
1608+ assert ! ( !has_volume( & service, SIGNER_TLS_CERTIFICATE_NAME ) ) ;
1609+ Ok ( ( ) )
1610+ }
1611+
1612+ // -------------------------------------------------------------------------
1613+ // create_signer_service_local – TLS cert volumes
1614+ // -------------------------------------------------------------------------
1615+
1616+ #[ test]
1617+ fn test_create_signer_service_local_with_tls_adds_cert_and_key_volumes ( ) -> eyre:: Result < ( ) > {
1618+ let dir = tempfile:: tempdir ( ) ?;
1619+ let certs_path = dir. path ( ) . to_path_buf ( ) ;
1620+ std:: fs:: write ( certs_path. join ( SIGNER_TLS_CERTIFICATE_NAME ) , b"cert" ) ?;
1621+ std:: fs:: write ( certs_path. join ( SIGNER_TLS_KEY_NAME ) , b"key" ) ?;
1622+
1623+ let mut sc = service_config_with_tls ( certs_path) ;
1624+ let signer_config = sc. config_info . cb_config . signer . clone ( ) . unwrap ( ) ;
1625+ let loader = SignerLoader :: File { key_path : "/keys/keys.json" . into ( ) } ;
1626+ let service = create_signer_service_local ( & mut sc, & signer_config, & loader, & None ) ?;
1627+
1628+ assert ! ( has_volume( & service, SIGNER_TLS_CERTIFICATE_NAME ) ) ;
1629+ assert ! ( has_volume( & service, SIGNER_TLS_KEY_NAME ) ) ;
1630+ Ok ( ( ) )
1631+ }
1632+
1633+ #[ test]
1634+ fn test_create_signer_service_local_without_tls_no_cert_key_volumes ( ) -> eyre:: Result < ( ) > {
1635+ let mut sc = minimal_service_config ( ) ;
1636+ let signer_config = local_signer_config ( ) ;
1637+ let loader = SignerLoader :: File { key_path : "/keys/keys.json" . into ( ) } ;
1638+ let service = create_signer_service_local ( & mut sc, & signer_config, & loader, & None ) ?;
1639+
1640+ // SIGNER_TLS_CERTIFICATES_PATH_ENV is always emitted by the signer service,
1641+ // but no cert.pem / key.pem volume bindings should exist in insecure mode.
1642+ assert ! ( !has_volume( & service, SIGNER_TLS_CERTIFICATE_NAME ) ) ;
1643+ assert ! ( !has_volume( & service, SIGNER_TLS_KEY_NAME ) ) ;
1644+ Ok ( ( ) )
1645+ }
1646+
1647+ // -------------------------------------------------------------------------
1648+ // create_signer_service_dirk – TLS cert volumes
1649+ // -------------------------------------------------------------------------
1650+
1651+ #[ test]
1652+ fn test_create_signer_service_dirk_with_tls_adds_cert_and_key_volumes ( ) -> eyre:: Result < ( ) > {
1653+ let dir = tempfile:: tempdir ( ) ?;
1654+ let certs_path = dir. path ( ) . to_path_buf ( ) ;
1655+ std:: fs:: write ( certs_path. join ( SIGNER_TLS_CERTIFICATE_NAME ) , b"cert" ) ?;
1656+ std:: fs:: write ( certs_path. join ( SIGNER_TLS_KEY_NAME ) , b"key" ) ?;
1657+
1658+ let mut sc = service_config_with_tls ( certs_path) ;
1659+ let signer_config = dirk_signer_config ( ) ;
1660+ let service = create_signer_service_dirk (
1661+ & mut sc,
1662+ & signer_config,
1663+ Path :: new ( "/certs/client.crt" ) ,
1664+ Path :: new ( "/certs/client.key" ) ,
1665+ Path :: new ( "/dirk_secrets" ) ,
1666+ & None ,
1667+ & None ,
1668+ ) ?;
1669+
1670+ assert ! ( has_volume( & service, SIGNER_TLS_CERTIFICATE_NAME ) ) ;
1671+ assert ! ( has_volume( & service, SIGNER_TLS_KEY_NAME ) ) ;
1672+ Ok ( ( ) )
1673+ }
1674+
1675+ #[ test]
1676+ fn test_create_signer_service_dirk_without_tls_no_cert_key_volumes ( ) -> eyre:: Result < ( ) > {
1677+ let mut sc = minimal_service_config ( ) ;
1678+ let signer_config = dirk_signer_config ( ) ;
1679+ let service = create_signer_service_dirk (
1680+ & mut sc,
1681+ & signer_config,
1682+ Path :: new ( "/certs/client.crt" ) ,
1683+ Path :: new ( "/certs/client.key" ) ,
1684+ Path :: new ( "/dirk_secrets" ) ,
1685+ & None ,
1686+ & None ,
1687+ ) ?;
1688+
1689+ assert ! ( !has_volume( & service, SIGNER_TLS_CERTIFICATE_NAME ) ) ;
1690+ assert ! ( !has_volume( & service, SIGNER_TLS_KEY_NAME ) ) ;
1691+ Ok ( ( ) )
1692+ }
1693+
1694+ // -------------------------------------------------------------------------
1695+ // create_module_service – TLS cert env/volume
1696+ // -------------------------------------------------------------------------
1697+
1698+ #[ test]
1699+ fn test_create_module_service_with_signer_tls_adds_cert_env_and_volume ( ) -> eyre:: Result < ( ) > {
1700+ let module = commit_module ( ) ;
1701+ let mut sc = service_config_with_tls ( PathBuf :: from ( "/my/certs" ) ) ;
1702+ let ( _, service) = create_module_service ( & module, "https://cb_signer:20000" , & mut sc) ?;
1703+
1704+ assert ! ( has_env_key( & service, SIGNER_TLS_CERTIFICATES_PATH_ENV ) ) ;
1705+ assert ! ( has_volume( & service, SIGNER_TLS_CERTIFICATE_NAME ) ) ;
1706+ Ok ( ( ) )
1707+ }
1708+
1709+ #[ test]
1710+ fn test_create_module_service_without_signer_tls_no_cert_env ( ) -> eyre:: Result < ( ) > {
1711+ let module = commit_module ( ) ;
1712+ let mut sc = minimal_service_config ( ) ;
1713+ let ( _, service) = create_module_service ( & module, "http://cb_signer:20000" , & mut sc) ?;
1714+
1715+ assert ! ( !has_env_key( & service, SIGNER_TLS_CERTIFICATES_PATH_ENV ) ) ;
1716+ assert ! ( !has_volume( & service, SIGNER_TLS_CERTIFICATE_NAME ) ) ;
1717+ Ok ( ( ) )
1718+ }
14811719}
0 commit comments