, .init = suite_register_local_datareader_init, .fini = suite_register_local_datareader_fini) {   DDS_Security_DatareaderCryptoHandle result;    /* Dummy (even un-initialized) data for now. */   DDS_Security_SecurityException exception = {NULL, 0, 0};   DDS_Security_PropertySeq datareader_properties;   DDS_Security_EndpointSecurityAttributes datareader_security_attributes;   local_datareader_crypto *reader_crypto;    /* Check if we actually have the function. */   CU_ASSERT_FATAL(crypto != NULL);   CU_ASSERT_FATAL(crypto->crypto_key_factory != NULL);   CU_ASSERT_FATAL(crypto->crypto_key_factory->register_local_datareader != NULL);    memset(&exception, 0, sizeof(DDS_Security_SecurityException));   memset(&datareader_properties, 0, sizeof(datareader_properties));    prepare_endpoint_security_attributes(&datareader_security_attributes);    /* Now call the function. */    result = crypto->crypto_key_factory->register_local_datareader(       crypto->crypto_key_factory,       local_participant_crypto_handle,       &datareader_properties,       &datareader_security_attributes,       &exception);    /* A valid handle to be returned */   CU_ASSERT(result != 0);   assert(result != 0); // for Clang's static analyzer    CU_ASSERT(exception.code == DDS_SECURITY_ERR_OK_CODE);    /* NOTE: It would be better to check if the keys have been generated but there is no interface to get them from handle */   reader_crypto = (local_datareader_crypto *)result;    CU_ASSERT_FATAL(reader_crypto->reader_key_material != NULL);   CU_ASSERT(master_salt_not_empty(reader_crypto->reader_key_material));   CU_ASSERT(master_key_not_empty(reader_crypto->reader_key_material));   CU_ASSERT(reader_crypto->metadata_protectionKind == DDS_SECURITY_PROTECTION_KIND_ENCRYPT);    reset_exception(&exception); }  CU_Test(ddssec_builtin_register_local_datareader, 