1111 _protocol_version_metrics_value ,
1212 _socket_implementation_metrics_value ,
1313 _http_proxy_type_metrics_value ,
14- _certificate_source_metrics_value ,
1514 IOT_SDK_METRICS_FEATURE_VERSION ,
1615 _get_encoded_feature_list ,
1716 _get_encoded_feature_list_mqtt3 ,
@@ -421,21 +420,16 @@ def test_custom_library_name(self):
421420
422421
423422class TestCertificateSourceMetrics (NativeResourceTest ):
424- """Test certificate source metrics encoding."""
425-
426- def test_certificate_source_mapping_values (self ):
427- """Verify each _CertificateSource maps to the correct metrics value."""
428- self .assertEqual ("A" , _certificate_source_metrics_value (_CertificateSource .CERTIFICATE_FILES ))
429- self .assertEqual ("B" , _certificate_source_metrics_value (_CertificateSource .PKCS11 ))
430- self .assertEqual ("C" , _certificate_source_metrics_value (_CertificateSource .WINDOWS_CERT_STORE ))
431- self .assertEqual ("E" , _certificate_source_metrics_value (_CertificateSource .PKCS12_FILE ))
432- self .assertIsNone (_certificate_source_metrics_value (None ))
433-
434- def test_certificate_source_in_feature_list (self ):
435- """TLS context with certificate source should include feature I in metrics."""
423+ """Test certificate source metrics encoding through the TLS context binding path."""
424+
425+ def _make_tls_ctx_with_source (self , source ):
436426 tls_options = TlsContextOptions ()
437- tls_options ._certificate_source = _CertificateSource .CERTIFICATE_FILES
438- tls_ctx = ClientTlsContext (tls_options )
427+ tls_options ._certificate_source = source
428+ return ClientTlsContext (tls_options )
429+
430+ def test_certificate_source_certificate_files (self ):
431+ """CERTIFICATE_FILES source encodes as 'A' in feature list."""
432+ tls_ctx = self ._make_tls_ctx_with_source (_CertificateSource .CERTIFICATE_FILES )
439433
440434 options = ClientOptions (host_name = "localhost" , port = 8883 , tls_ctx = tls_ctx )
441435 result = _get_encoded_feature_list (options )
@@ -444,6 +438,50 @@ def test_certificate_source_in_feature_list(self):
444438 result_mqtt3 = _get_encoded_feature_list_mqtt3 (proxy_options = None , tls_ctx = tls_ctx )
445439 self .assertIn (f"{ _MetricsFeatureId .CERTIFICATE_SOURCE .value } /A" , result_mqtt3 )
446440
441+ def test_certificate_source_pkcs11 (self ):
442+ """PKCS11 source encodes as 'B' in feature list."""
443+ tls_ctx = self ._make_tls_ctx_with_source (_CertificateSource .PKCS11 )
444+
445+ options = ClientOptions (host_name = "localhost" , port = 8883 , tls_ctx = tls_ctx )
446+ result = _get_encoded_feature_list (options )
447+ self .assertIn (f"{ _MetricsFeatureId .CERTIFICATE_SOURCE .value } /B" , result )
448+
449+ result_mqtt3 = _get_encoded_feature_list_mqtt3 (proxy_options = None , tls_ctx = tls_ctx )
450+ self .assertIn (f"{ _MetricsFeatureId .CERTIFICATE_SOURCE .value } /B" , result_mqtt3 )
451+
452+ def test_certificate_source_windows_cert_store (self ):
453+ """WINDOWS_CERT_STORE source encodes as 'C' in feature list."""
454+ tls_ctx = self ._make_tls_ctx_with_source (_CertificateSource .WINDOWS_CERT_STORE )
455+
456+ options = ClientOptions (host_name = "localhost" , port = 8883 , tls_ctx = tls_ctx )
457+ result = _get_encoded_feature_list (options )
458+ self .assertIn (f"{ _MetricsFeatureId .CERTIFICATE_SOURCE .value } /C" , result )
459+
460+ result_mqtt3 = _get_encoded_feature_list_mqtt3 (proxy_options = None , tls_ctx = tls_ctx )
461+ self .assertIn (f"{ _MetricsFeatureId .CERTIFICATE_SOURCE .value } /C" , result_mqtt3 )
462+
463+ def test_certificate_source_pkcs12 (self ):
464+ """PKCS12_FILE source encodes as 'E' in feature list."""
465+ tls_ctx = self ._make_tls_ctx_with_source (_CertificateSource .PKCS12_FILE )
466+
467+ options = ClientOptions (host_name = "localhost" , port = 8883 , tls_ctx = tls_ctx )
468+ result = _get_encoded_feature_list (options )
469+ self .assertIn (f"{ _MetricsFeatureId .CERTIFICATE_SOURCE .value } /E" , result )
470+
471+ result_mqtt3 = _get_encoded_feature_list_mqtt3 (proxy_options = None , tls_ctx = tls_ctx )
472+ self .assertIn (f"{ _MetricsFeatureId .CERTIFICATE_SOURCE .value } /E" , result_mqtt3 )
473+
474+ def test_no_certificate_source_omits_feature (self ):
475+ """No certificate source (None) should omit feature I from metrics."""
476+ tls_ctx = self ._make_tls_ctx_with_source (None )
477+
478+ options = ClientOptions (host_name = "localhost" , port = 8883 , tls_ctx = tls_ctx )
479+ result = _get_encoded_feature_list (options )
480+ self .assertNotIn (f"{ _MetricsFeatureId .CERTIFICATE_SOURCE .value } /" , result )
481+
482+ result_mqtt3 = _get_encoded_feature_list_mqtt3 (proxy_options = None , tls_ctx = tls_ctx )
483+ self .assertNotIn (f"{ _MetricsFeatureId .CERTIFICATE_SOURCE .value } /" , result_mqtt3 )
484+
447485
448486if __name__ == '__main__' :
449487 unittest .main ()
0 commit comments