@@ -624,3 +624,53 @@ fn test_kmgmt_match() {
624624        parsec_provider_teardown ( provctx as  * const  OSSL_PROVIDER ) ; 
625625    } 
626626} 
627+ 
628+ #[ test]  
629+ fn  test_kmgmt_dup ( )  { 
630+     use  crate :: { parsec_provider_provider_init,  parsec_provider_teardown} ; 
631+ 
632+     let  out:  * const  OSSL_DISPATCH  = std:: ptr:: null ( ) ; 
633+     let  mut  provctx:  types:: VOID_PTR  = std:: ptr:: null_mut ( ) ; 
634+ 
635+     // Initialize the provider 
636+     let  result:  Result < ( ) ,  parsec_openssl2:: Error >  = unsafe  { 
637+         parsec_provider_provider_init ( 
638+             std:: ptr:: null ( ) , 
639+             std:: ptr:: null ( ) , 
640+             & out as  * const  _  as  * mut  _ , 
641+             & mut  provctx as  * mut  VOID_PTR , 
642+         ) 
643+     } ; 
644+     assert ! ( result. is_ok( ) ) ; 
645+ 
646+     let  keyobj = unsafe  {  parsec_provider_kmgmt_new ( provctx)  } ; 
647+ 
648+     let  my_key_name = "PARSEC_TEST_KEYNAME" . to_string ( ) ; 
649+     let  mut  params = [ 
650+         ossl_param ! ( PARSEC_PROVIDER_KEY_NAME ,  OSSL_PARAM_UTF8_PTR ,  my_key_name) , 
651+         ossl_param ! ( ) , 
652+     ] ; 
653+     let  set_params_res = unsafe  {  parsec_provider_kmgmt_set_params ( keyobj,  & mut  params as  _ )  } ; 
654+     assert_eq ! ( set_params_res,  OPENSSL_SUCCESS ) ; 
655+ 
656+     let  duplicated =
657+         unsafe  {  parsec_provider_keymgmt_dup ( keyobj,  OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS  as  i32 )  } ; 
658+ 
659+     let  duplicated_ptr = duplicated as  * const  ParsecProviderKeyObject ; 
660+     unsafe  { 
661+         Arc :: increment_strong_count ( duplicated_ptr) ; 
662+         let  arc_duplicated = Arc :: from_raw ( duplicated_ptr) ; 
663+         let  duplicated_key_name = arc_duplicated. key_name . lock ( ) . unwrap ( ) ; 
664+ 
665+         assert_eq ! ( 
666+             * duplicated_key_name, 
667+             Some ( "PARSEC_TEST_KEYNAME" . to_string( ) ) 
668+         ) 
669+     } 
670+ 
671+     unsafe  { 
672+         parsec_provider_kmgmt_free ( keyobj) ; 
673+         parsec_provider_kmgmt_free ( duplicated) ; 
674+         parsec_provider_teardown ( provctx as  _ ) ; 
675+     } 
676+ } 
0 commit comments