Skip to content

Commit

Permalink
NetworkType enum
Browse files Browse the repository at this point in the history
  • Loading branch information
sneurlax committed Oct 15, 2024
1 parent 9df600a commit 78b1aef
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 40 deletions.
67 changes: 41 additions & 26 deletions impls/monero.rs/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,26 @@ use std::sync::Arc;

mod bindings;

pub mod network {
use std::os::raw::c_int;
pub const MAINNET: c_int = 0;
pub const TESTNET: c_int = 1;
pub const STAGENET: c_int = 2;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum NetworkType {
Mainnet = bindings::NetworkType_MAINNET as isize,
Testnet = bindings::NetworkType_TESTNET as isize,
Stagenet = bindings::NetworkType_STAGENET as isize,
}

impl NetworkType {
pub fn from_c_int(value: c_int) -> Option<Self> {
match value {
bindings::NetworkType_MAINNET => Some(NetworkType::Mainnet),
bindings::NetworkType_TESTNET => Some(NetworkType::Testnet),
bindings::NetworkType_STAGENET => Some(NetworkType::Stagenet),
_ => None,
}
}

pub fn to_c_int(self) -> c_int {
self as c_int
}
}

#[derive(Debug)]
Expand Down Expand Up @@ -48,12 +63,12 @@ impl WalletManager {
/// # Example
///
/// ```
/// use monero_c_rust::{WalletManager, network};
/// use monero_c_rust::{WalletManager, NetworkType};
/// use std::fs;
/// use std::path::Path;
///
/// let manager = WalletManager::new().unwrap();
/// let wallet = manager.create_wallet("wallet_name", "password", "English", network::MAINNET);
/// let wallet = manager.create_wallet("wallet_name", "password", "English", NetworkType::Mainnet);
/// assert!(wallet.is_ok());
///
/// // Cleanup: remove the wallet file and its corresponding keys file, if they exist.
Expand All @@ -69,7 +84,7 @@ impl WalletManager {
path: &str,
password: &str,
language: &str,
network_type: c_int,
network_type: NetworkType,
) -> WalletResult<Wallet> {
let c_path = CString::new(path).map_err(|_| WalletError::FfiError("Invalid path".to_string()))?;
let c_password = CString::new(password).map_err(|_| WalletError::FfiError("Invalid password".to_string()))?;
Expand All @@ -81,7 +96,7 @@ impl WalletManager {
c_path.as_ptr(),
c_password.as_ptr(),
c_language.as_ptr(),
network_type,
network_type.to_c_int(),
);

NonNull::new(wallet_ptr)
Expand All @@ -102,7 +117,7 @@ impl Wallet {
/// # Example
///
/// ```
/// use monero_c_rust::{WalletManager, network};
/// use monero_c_rust::{WalletManager, NetworkType};
/// use tempfile::TempDir;
/// use std::fs;
///
Expand All @@ -111,7 +126,7 @@ impl Wallet {
/// let wallet_str = wallet_path.to_str().unwrap();
///
/// let manager = WalletManager::new().unwrap();
/// let wallet_result = manager.create_wallet(wallet_str, "password", "English", network::MAINNET);
/// let wallet_result = manager.create_wallet(wallet_str, "password", "English", NetworkType::Mainnet);
/// assert!(wallet_result.is_ok(), "Failed to create wallet: {:?}", wallet_result.err());
/// let wallet = wallet_result.unwrap();
/// let seed = wallet.get_seed("");
Expand Down Expand Up @@ -149,7 +164,7 @@ impl Wallet {
/// # Example
///
/// ```
/// use monero_c_rust::{WalletManager, network};
/// use monero_c_rust::{WalletManager, NetworkType};
/// use tempfile::TempDir;
/// use std::fs;
///
Expand All @@ -158,7 +173,7 @@ impl Wallet {
/// let wallet_str = wallet_path.to_str().unwrap();
///
/// let manager = WalletManager::new().unwrap();
/// let wallet = manager.create_wallet(wallet_str, "password", "English", network::MAINNET).unwrap();
/// let wallet = manager.create_wallet(wallet_str, "password", "English", NetworkType::Mainnet).unwrap();
/// let address = wallet.get_address(0, 0);
/// assert!(address.is_ok(), "Failed to get address: {:?}", address.err());
///
Expand All @@ -185,7 +200,7 @@ impl Wallet {
/// # Example
///
/// ```
/// use monero_c_rust::{WalletManager, network};
/// use monero_c_rust::{WalletManager, NetworkType};
/// use tempfile::TempDir;
/// use std::fs;
///
Expand All @@ -194,7 +209,7 @@ impl Wallet {
/// let wallet_str = wallet_path.to_str().unwrap();
///
/// let manager = WalletManager::new().unwrap();
/// let wallet_result = manager.create_wallet(wallet_str, "password", "English", network::MAINNET);
/// let wallet_result = manager.create_wallet(wallet_str, "password", "English", NetworkType::Mainnet);
/// assert!(wallet_result.is_ok(), "Failed to create wallet: {:?}", wallet_result.err());
/// let wallet = wallet_result.unwrap();
/// let is_deterministic = wallet.is_deterministic();
Expand All @@ -217,10 +232,10 @@ impl Wallet {
/// # Example
///
/// ```
/// use monero_c_rust::{WalletManager, network, WalletError};
/// use monero_c_rust::{WalletManager, NetworkType, WalletError};
/// let manager = WalletManager::new().unwrap();
/// // Intentionally pass an invalid wallet to force an error.
/// let invalid_wallet = manager.create_wallet("", "", "", network::MAINNET);
/// let invalid_wallet = manager.create_wallet("", "", "", NetworkType::Mainnet);
/// if let Err(err) = invalid_wallet {
/// if let WalletError::WalletErrorCode(_, error_msg) = err {
/// // Check that an error message was produced
Expand Down Expand Up @@ -302,7 +317,7 @@ fn test_wallet_manager_creation() {
let wallet_path = temp_dir.path().join("wallet_name");
let wallet_str = wallet_path.to_str().expect("Failed to convert wallet path to string");

let wallet_result = manager.create_wallet(wallet_str, "password", "English", network::MAINNET);
let wallet_result = manager.create_wallet(wallet_str, "password", "English", NetworkType::Mainnet);
assert!(wallet_result.is_ok(), "WalletManager creation failed");

teardown(&temp_dir).expect("Failed to clean up after test");
Expand All @@ -315,7 +330,7 @@ fn test_wallet_creation() {
let wallet_path = temp_dir.path().join("wallet_name");
let wallet_str = wallet_path.to_str().expect("Failed to convert wallet path to string");

let wallet = manager.create_wallet(wallet_str, "password", "English", network::MAINNET);
let wallet = manager.create_wallet(wallet_str, "password", "English", NetworkType::Mainnet);
assert!(wallet.is_ok(), "Failed to create wallet");
let wallet = wallet.unwrap();
assert!(wallet.is_deterministic().is_ok(), "Wallet creation seems to have failed");
Expand All @@ -330,7 +345,7 @@ fn test_get_seed() {
let wallet_path = temp_dir.path().join("wallet_name");
let wallet_str = wallet_path.to_str().expect("Failed to convert wallet path to string");

let wallet = manager.create_wallet(wallet_str, "password", "English", network::MAINNET).expect("Failed to create wallet");
let wallet = manager.create_wallet(wallet_str, "password", "English", NetworkType::Mainnet).expect("Failed to create wallet");
let result = wallet.get_seed("");
assert!(result.is_ok(), "Failed to get seed: {:?}", result.err());
assert!(!result.unwrap().is_empty(), "Seed is empty");
Expand All @@ -345,7 +360,7 @@ fn test_get_address() {
let wallet_path = temp_dir.path().join("wallet_name");
let wallet_str = wallet_path.to_str().expect("Failed to convert wallet path to string");

let wallet = manager.create_wallet(wallet_str, "password", "English", network::MAINNET).expect("Failed to create wallet");
let wallet = manager.create_wallet(wallet_str, "password", "English", NetworkType::Mainnet).expect("Failed to create wallet");
let result = wallet.get_address(0, 0);
assert!(result.is_ok(), "Failed to get address: {:?}", result.err());
assert!(!result.unwrap().is_empty(), "Address is empty");
Expand All @@ -360,7 +375,7 @@ fn test_is_deterministic() {
let wallet_path = temp_dir.path().join("wallet_name");
let wallet_str = wallet_path.to_str().expect("Failed to convert wallet path to string");

let wallet = manager.create_wallet(wallet_str, "password", "English", network::MAINNET).expect("Failed to create wallet");
let wallet = manager.create_wallet(wallet_str, "password", "English", NetworkType::Mainnet).expect("Failed to create wallet");
let result = wallet.is_deterministic();
assert!(result.is_ok(), "Failed to check if wallet is deterministic: {:?}", result.err());
assert!(result.unwrap(), "Wallet should be deterministic");
Expand All @@ -373,9 +388,9 @@ fn test_wallet_creation_with_different_networks() {
let (manager, temp_dir) = setup().expect("Failed to set up test environment");

let wallets = vec![
("mainnet_wallet", network::MAINNET),
("testnet_wallet", network::TESTNET),
("stagenet_wallet", network::STAGENET),
("mainnet_wallet", NetworkType::Mainnet),
("testnet_wallet", NetworkType::Testnet),
("stagenet_wallet", NetworkType::Stagenet),
];

for (name, net_type) in wallets {
Expand All @@ -396,7 +411,7 @@ fn test_multiple_address_generation() {
let wallet_path = temp_dir.path().join("wallet_name");
let wallet_str = wallet_path.to_str().expect("Failed to convert wallet path to string");

let wallet = manager.create_wallet(wallet_str, "password", "English", network::MAINNET).expect("Failed to create wallet");
let wallet = manager.create_wallet(wallet_str, "password", "English", NetworkType::Mainnet).expect("Failed to create wallet");

for i in 0..5 {
let result = wallet.get_address(0, i);
Expand Down
26 changes: 12 additions & 14 deletions impls/monero.rs/tests/integration_tests.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use monero_c_rust::{WalletManager, network, WalletError, WalletResult};
use monero_c_rust::{WalletManager, NetworkType, WalletError, WalletResult};
use std::fs;
use std::sync::Arc;
use std::time::Instant;
Expand Down Expand Up @@ -88,22 +88,20 @@ fn test_wallet_manager_creation() {
let wallet_path = temp_dir.path().join("test_wallet");
let wallet_str = wallet_path.to_str().expect("Failed to convert wallet path to string");

let wallet_result = manager.create_wallet(wallet_str, "password123", "English", network::MAINNET);
let wallet_result = manager.create_wallet(wallet_str, "password123", "English", NetworkType::Mainnet);
assert!(wallet_result.is_ok(), "WalletManager creation seems to have failed");

teardown(&temp_dir).expect("Failed to clean up after test");
}

#[test]
fn test_wallet_creation() {
println!("Running test_wallet_creation");
let (manager, temp_dir) = setup().expect("Failed to set up test environment");

// Construct the full path for the wallet within temp_dir.
let wallet_path = temp_dir.path().join("test_wallet");
let wallet_path = temp_dir.path().join("wallet_name");
let wallet_str = wallet_path.to_str().expect("Failed to convert wallet path to string");

let wallet = manager.create_wallet(wallet_str, "password123", "English", network::MAINNET);
let wallet = manager.create_wallet(wallet_str, "password", "English", NetworkType::Mainnet);
assert!(wallet.is_ok(), "Failed to create wallet");
let wallet = wallet.unwrap();
assert!(wallet.is_deterministic().is_ok(), "Wallet creation seems to have failed");
Expand All @@ -121,7 +119,7 @@ fn test_get_seed() {
let wallet_str = wallet_path.to_str().expect("Failed to convert wallet path to string");

let wallet = manager
.create_wallet(wallet_str, "password123", "English", network::MAINNET)
.create_wallet(wallet_str, "password123", "English", NetworkType::Mainnet)
.expect("Failed to create wallet");
println!("Attempting to get seed...");
let start = Instant::now();
Expand All @@ -143,7 +141,7 @@ fn test_get_address() {
let wallet_str = wallet_path.to_str().expect("Failed to convert wallet path to string");

let wallet = manager
.create_wallet(wallet_str, "password123", "English", network::MAINNET)
.create_wallet(wallet_str, "password123", "English", NetworkType::Mainnet)
.expect("Failed to create wallet");
println!("Attempting to get address...");
let start = Instant::now();
Expand All @@ -165,7 +163,7 @@ fn test_is_deterministic() {
let wallet_str = wallet_path.to_str().expect("Failed to convert wallet path to string");

let wallet = manager
.create_wallet(wallet_str, "password123", "English", network::MAINNET)
.create_wallet(wallet_str, "password123", "English", NetworkType::Mainnet)
.expect("Failed to create wallet");
println!("Checking if wallet is deterministic...");
let start = Instant::now();
Expand All @@ -184,13 +182,13 @@ fn test_wallet_creation_with_different_networks() {

// Define wallet names and corresponding network types.
let wallets = vec![
("mainnet_wallet", network::MAINNET),
("testnet_wallet", network::TESTNET),
("stagenet_wallet", network::STAGENET),
("mainnet_wallet", NetworkType::Mainnet),
("testnet_wallet", NetworkType::Testnet),
("stagenet_wallet", NetworkType::Stagenet),
];

for (name, net_type) in wallets {
println!("Creating wallet: {} on network type {}", name, net_type);
println!("Creating wallet: {} on network type {:?}", name, net_type);

// Construct the full path for each wallet within temp_dir.
let wallet_path = temp_dir.path().join(name);
Expand All @@ -213,7 +211,7 @@ fn test_multiple_address_generation() {
let wallet_str = wallet_path.to_str().expect("Failed to convert wallet path to string");

let wallet = manager
.create_wallet(wallet_str, "password123", "English", network::MAINNET)
.create_wallet(wallet_str, "password123", "English", NetworkType::Mainnet)
.expect("Failed to create wallet");

for i in 0..5 {
Expand Down

0 comments on commit 78b1aef

Please sign in to comment.