Skip to content

Commit 7a32bee

Browse files
committed
fix: prevent FFIError message leaks in tests
1 parent 245e5a9 commit 7a32bee

1 file changed

Lines changed: 30 additions & 46 deletions

File tree

key-wallet-ffi/tests/test_error_conversions.rs

Lines changed: 30 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2,120 +2,106 @@
22
33
use key_wallet_ffi::error::{FFIError, FFIErrorCode};
44

5+
/// Helper to test an FFIError conversion and clean up the message
6+
fn assert_ffi_error_code(mut ffi_err: FFIError, expected: FFIErrorCode) {
7+
assert_eq!(ffi_err.code, expected);
8+
unsafe { ffi_err.free_message() };
9+
}
10+
511
#[test]
612
fn test_key_wallet_error_to_ffi_error() {
713
use key_wallet::Error as KeyWalletError;
814

915
// Test InvalidMnemonic conversion
1016
let err = KeyWalletError::InvalidMnemonic("bad mnemonic".to_string());
11-
let ffi_err: FFIError = err.into();
12-
assert_eq!(ffi_err.code, FFIErrorCode::InvalidMnemonic);
17+
assert_ffi_error_code(err.into(), FFIErrorCode::InvalidMnemonic);
1318

1419
// Test InvalidNetwork conversion
1520
let err = KeyWalletError::InvalidNetwork;
16-
let ffi_err: FFIError = err.into();
17-
assert_eq!(ffi_err.code, FFIErrorCode::InvalidNetwork);
21+
assert_ffi_error_code(err.into(), FFIErrorCode::InvalidNetwork);
1822

1923
// Test InvalidAddress conversion
2024
let err = KeyWalletError::InvalidAddress("bad address".to_string());
21-
let ffi_err: FFIError = err.into();
22-
assert_eq!(ffi_err.code, FFIErrorCode::InvalidAddress);
25+
assert_ffi_error_code(err.into(), FFIErrorCode::InvalidAddress);
2326

2427
// Test InvalidDerivationPath conversion
2528
let err = KeyWalletError::InvalidDerivationPath("bad path".to_string());
26-
let ffi_err: FFIError = err.into();
27-
assert_eq!(ffi_err.code, FFIErrorCode::InvalidDerivationPath);
29+
assert_ffi_error_code(err.into(), FFIErrorCode::InvalidDerivationPath);
2830

2931
// Test InvalidParameter conversion
3032
let err = KeyWalletError::InvalidParameter("bad param".to_string());
31-
let ffi_err: FFIError = err.into();
32-
assert_eq!(ffi_err.code, FFIErrorCode::InvalidInput);
33+
assert_ffi_error_code(err.into(), FFIErrorCode::InvalidInput);
3334

3435
// Test Serialization conversion
3536
let err = KeyWalletError::Serialization("serialization failed".to_string());
36-
let ffi_err: FFIError = err.into();
37-
assert_eq!(ffi_err.code, FFIErrorCode::SerializationError);
37+
assert_ffi_error_code(err.into(), FFIErrorCode::SerializationError);
3838

3939
// Test WatchOnly conversion
4040
let err = KeyWalletError::WatchOnly;
41-
let ffi_err: FFIError = err.into();
42-
assert_eq!(ffi_err.code, FFIErrorCode::InvalidState);
41+
assert_ffi_error_code(err.into(), FFIErrorCode::InvalidState);
4342

4443
// Test CoinJoinNotEnabled conversion
4544
let err = KeyWalletError::CoinJoinNotEnabled;
46-
let ffi_err: FFIError = err.into();
47-
assert_eq!(ffi_err.code, FFIErrorCode::InvalidState);
45+
assert_ffi_error_code(err.into(), FFIErrorCode::InvalidState);
4846

4947
// Test KeyError conversion (should map to WalletError)
5048
let err = KeyWalletError::KeyError("key error".to_string());
51-
let ffi_err: FFIError = err.into();
52-
assert_eq!(ffi_err.code, FFIErrorCode::WalletError);
49+
assert_ffi_error_code(err.into(), FFIErrorCode::WalletError);
5350

5451
// Test Base58 conversion (should map to WalletError)
5552
let err = KeyWalletError::Base58;
56-
let ffi_err: FFIError = err.into();
57-
assert_eq!(ffi_err.code, FFIErrorCode::WalletError);
53+
assert_ffi_error_code(err.into(), FFIErrorCode::WalletError);
5854
}
5955

6056
#[test]
6157
fn test_wallet_manager_error_to_ffi_error() {
6258
use key_wallet_manager::wallet_manager::WalletError;
6359

64-
// Test WalletNotFound conversion
6560
let wallet_id = [0u8; 32];
61+
62+
// Test WalletNotFound conversion
6663
let err = WalletError::WalletNotFound(wallet_id);
67-
let ffi_err: FFIError = err.into();
68-
assert_eq!(ffi_err.code, FFIErrorCode::NotFound);
64+
assert_ffi_error_code(err.into(), FFIErrorCode::NotFound);
6965

7066
// Test InvalidMnemonic conversion
7167
let err = WalletError::InvalidMnemonic("bad mnemonic".to_string());
72-
let ffi_err: FFIError = err.into();
73-
assert_eq!(ffi_err.code, FFIErrorCode::InvalidMnemonic);
68+
assert_ffi_error_code(err.into(), FFIErrorCode::InvalidMnemonic);
7469

7570
// Test InvalidNetwork conversion
7671
let err = WalletError::InvalidNetwork;
77-
let ffi_err: FFIError = err.into();
78-
assert_eq!(ffi_err.code, FFIErrorCode::InvalidNetwork);
72+
assert_ffi_error_code(err.into(), FFIErrorCode::InvalidNetwork);
7973

8074
// Test AccountNotFound conversion
8175
let err = WalletError::AccountNotFound(0);
82-
let ffi_err: FFIError = err.into();
83-
assert_eq!(ffi_err.code, FFIErrorCode::NotFound);
76+
assert_ffi_error_code(err.into(), FFIErrorCode::NotFound);
8477

8578
// Test AddressGeneration conversion
8679
let err = WalletError::AddressGeneration("failed to generate".to_string());
87-
let ffi_err: FFIError = err.into();
88-
assert_eq!(ffi_err.code, FFIErrorCode::InvalidAddress);
80+
assert_ffi_error_code(err.into(), FFIErrorCode::InvalidAddress);
8981

9082
// Test InvalidParameter conversion
9183
let err = WalletError::InvalidParameter("bad param".to_string());
92-
let ffi_err: FFIError = err.into();
93-
assert_eq!(ffi_err.code, FFIErrorCode::InvalidInput);
84+
assert_ffi_error_code(err.into(), FFIErrorCode::InvalidInput);
9485

9586
// Test TransactionBuild conversion
9687
let err = WalletError::TransactionBuild("tx build failed".to_string());
97-
let ffi_err: FFIError = err.into();
98-
assert_eq!(ffi_err.code, FFIErrorCode::InvalidTransaction);
88+
assert_ffi_error_code(err.into(), FFIErrorCode::InvalidTransaction);
9989

10090
// Test InsufficientFunds conversion
10191
let err = WalletError::InsufficientFunds;
102-
let ffi_err: FFIError = err.into();
103-
assert_eq!(ffi_err.code, FFIErrorCode::InvalidState);
92+
assert_ffi_error_code(err.into(), FFIErrorCode::InvalidState);
10493

10594
// Test WalletCreation conversion
10695
let err = WalletError::WalletCreation("creation failed".to_string());
107-
let ffi_err: FFIError = err.into();
108-
assert_eq!(ffi_err.code, FFIErrorCode::WalletError);
96+
assert_ffi_error_code(err.into(), FFIErrorCode::WalletError);
10997

11098
// Test WalletExists conversion
11199
let err = WalletError::WalletExists(wallet_id);
112-
let ffi_err: FFIError = err.into();
113-
assert_eq!(ffi_err.code, FFIErrorCode::InvalidState);
100+
assert_ffi_error_code(err.into(), FFIErrorCode::InvalidState);
114101

115102
// Test AccountCreation conversion
116103
let err = WalletError::AccountCreation("account creation failed".to_string());
117-
let ffi_err: FFIError = err.into();
118-
assert_eq!(ffi_err.code, FFIErrorCode::WalletError);
104+
assert_ffi_error_code(err.into(), FFIErrorCode::WalletError);
119105
}
120106

121107
#[test]
@@ -201,9 +187,7 @@ fn test_error_message_consistency() {
201187

202188
// Convert to FFIError
203189
let ffi_err: FFIError = key_err.into();
204-
// Note: We can't easily check the message in FFIError since it's a raw pointer
205-
// but we know it should contain the original message
206-
assert_eq!(ffi_err.code, FFIErrorCode::InvalidMnemonic);
190+
assert_ffi_error_code(ffi_err, FFIErrorCode::InvalidMnemonic);
207191
}
208192

209193
#[test]

0 commit comments

Comments
 (0)