From 116c751aaf15566e4ef1e176ccf960a79d9cbcad Mon Sep 17 00:00:00 2001 From: matt raffel Date: Mon, 22 Oct 2018 13:56:55 -0600 Subject: [PATCH 1/6] TOK-455 some of the negative tests complete Signed-off-by: matt raffel --- libsovtoken/tests/payment_chaos_tests.rs | 197 +++++++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 libsovtoken/tests/payment_chaos_tests.rs diff --git a/libsovtoken/tests/payment_chaos_tests.rs b/libsovtoken/tests/payment_chaos_tests.rs new file mode 100644 index 000000000..e6b558208 --- /dev/null +++ b/libsovtoken/tests/payment_chaos_tests.rs @@ -0,0 +1,197 @@ +extern crate libc; +extern crate sovtoken; +extern crate indy; // lib-sdk project + +#[macro_use] +extern crate serde_derive; +#[macro_use] +extern crate serde_json; +#[macro_use] +extern crate log; + +pub mod utils; + +use indy::ErrorCode; +use sovtoken::logic::address::qualified_address_from_verkey; +use sovtoken::logic::config::output_mint_config::MintRequest; +use sovtoken::logic::request::Request; +use sovtoken::logic::parsers::common::TXO; +use sovtoken::utils::base58::{IntoBase58, FromBase58}; +use sovtoken::utils::random::rand_bytes; +use utils::setup::{Setup, SetupConfig}; +use utils::wallet::Wallet; + +pub const VERKEY_LEN: usize = 32; +static VALID_CONFIG_EMPTY_SEED_JSON: &'static str = r#"{}"#; + +// static INPUTS : &'static str = "[\"pay:sov:1\", \"pay:sov:2\"]"; +// static OUTPUTS : &'static str = "[{\"recipient\": \"pay:sov:1\", \"amount\":1}, {\"recipient\": \"pay:sov:2\", \"amount\":2}]"; + + + +pub fn gen_random_base58_verkey() -> String { + let vk_bytes = rand_bytes(VERKEY_LEN); + vk_bytes.into_base58() +} + +pub fn do_minting(pool_handle : i32, wallet : &Wallet, dids : &Vec<&str>, payment_address : &str, amount : i32) { + let mint_output_json = json!([ + { + "recipient": payment_address, + "amount": amount, + } + ]).to_string(); + + let (mint_req, _) = indy::payments::Payment::build_mint_req( + wallet.handle, + Some(&dids[0]), + &mint_output_json, + None, + ).unwrap(); + + trace!("{:?}", &mint_req); + + let mint_req = Request::::multi_sign_request( + wallet.handle, + &mint_req, + dids.clone() + ).unwrap(); + + trace!("{:?}", &mint_req); + + let result = indy::ledger::Ledger::submit_request(pool_handle, &mint_req).unwrap(); +} + +#[test] +pub fn pay_to_non_existent_payment_source_fails() { + + // ---- setup + sovtoken::api::sovtoken_init(); + let wallet = Wallet::new(); + let setup = Setup::new(&wallet, SetupConfig { + num_addresses: 1, + num_trustees: 4, + num_users: 0, + mint_tokens: None, + fees: None, + }); + let payment_addresses = &setup.addresses; + let pool_handle = setup.pool_handle; + let dids = setup.trustees.dids(); + + // ---- create some tokens + do_minting(pool_handle, &wallet, &dids, &payment_addresses[0], 50); + + // ---- spend tokens to address not created + let verkey = gen_random_base58_verkey().to_string(); + let address = qualified_address_from_verkey(&verkey).unwrap(); + + let txo_1 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[0]); + + let pay_input_json = json!([ + txo_1 + ]).to_string(); + + let pay_output_json = json!([ + { + "recipient": address, + "amount": 50 + } + ]).to_string(); + + let (payment_request, op_code) = indy::payments::Payment::build_payment_req(wallet.handle, Some(dids[0]), &pay_input_json, &pay_output_json, None).unwrap(); + + let payment_result = indy::ledger::Ledger::submit_request(pool_handle, &payment_request).unwrap(); + + assert!(false, "hey -> {:?}", pay_input_json); +} + +#[test] +pub fn pay_from_non_existent_payment_source_fails() { + + // ---- setup + sovtoken::api::sovtoken_init(); + let wallet = Wallet::new(); + let setup = Setup::new(&wallet, SetupConfig { + num_addresses: 1, + num_trustees: 4, + num_users: 0, + mint_tokens: None, + fees: None, + }); + let payment_addresses = &setup.addresses; + let pool_handle = setup.pool_handle; + let dids = setup.trustees.dids(); + + // ---- create some tokens + do_minting(pool_handle, &wallet, &dids, &payment_addresses[0], 50); + + + // ---- spend tokens from a valid address that is not in the wallet + + let pay_input_json = json!([ + "txo:sov:3x42qH8UkJac1BuorqjSEvuVjvYkXk8sUAqoVPn1fGCwjLPquu4CndzBHBQ5hX6RSmDVnXGdMPrnWDUN5S1ty4YQP87hW8ubMSzu9M56z1FbAQV6aMSX5h" + ]).to_string(); + + let pay_output_json = json!([ + { + "recipient": payment_addresses[0], + "amount": 50 + } + ]).to_string(); + + match indy::payments::Payment::build_payment_req(wallet.handle, Some(dids[0]), &pay_input_json, &pay_output_json, None) { + Ok(_) => { + assert!(false, "expected build_payment_req to fail"); + }, + Err(ec) => { + assert_eq!(ec, ErrorCode::WalletItemNotFound); + } + + } +} + + +#[test] +pub fn pay_with_insufficent_funds_fails() { + + // ---- setup + sovtoken::api::sovtoken_init(); + let wallet = Wallet::new(); + let setup = Setup::new(&wallet, SetupConfig { + num_addresses: 1, + num_trustees: 4, + num_users: 0, + mint_tokens: None, + fees: None, + }); + let payment_addresses = &setup.addresses; + let pool_handle = setup.pool_handle; + let dids = setup.trustees.dids(); + + // ---- create some tokens + do_minting(pool_handle, &wallet, &dids, &payment_addresses[0], 50); + + // ---- spend more tokens than we minted + let verkey = gen_random_base58_verkey().to_string(); + let address = qualified_address_from_verkey(&verkey).unwrap(); + + let txo_1 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[0]); + + let pay_input_json = json!([ + txo_1 + ]).to_string(); + + let pay_output_json = json!([ + { + "recipient": address, + "amount": 90 + } + ]).to_string(); + + let (payment_request, op_code) = indy::payments::Payment::build_payment_req(wallet.handle, Some(dids[0]), &pay_input_json, &pay_output_json, None).unwrap(); + + let payment_result = indy::ledger::Ledger::submit_request(pool_handle, &payment_request).unwrap(); + + assert!(payment_result.contains("InsufficientFundsError"), "Expected InsufficientFundsError"); +} \ No newline at end of file From 6617026bf9b035f8ec291b66a1f58141d4758593 Mon Sep 17 00:00:00 2001 From: matt raffel Date: Tue, 23 Oct 2018 10:19:36 -0600 Subject: [PATCH 2/6] Adds more tests, cleans up code Signed-off-by: matt raffel --- libsovtoken/tests/payment_chaos_tests.rs | 228 +++++++++++++++++++---- 1 file changed, 194 insertions(+), 34 deletions(-) diff --git a/libsovtoken/tests/payment_chaos_tests.rs b/libsovtoken/tests/payment_chaos_tests.rs index e6b558208..b4662ad2d 100644 --- a/libsovtoken/tests/payment_chaos_tests.rs +++ b/libsovtoken/tests/payment_chaos_tests.rs @@ -2,38 +2,30 @@ extern crate libc; extern crate sovtoken; extern crate indy; // lib-sdk project -#[macro_use] -extern crate serde_derive; -#[macro_use] -extern crate serde_json; -#[macro_use] -extern crate log; +#[macro_use] extern crate log; +#[macro_use] extern crate serde_derive; +#[macro_use] extern crate serde_json; pub mod utils; use indy::ErrorCode; -use sovtoken::logic::address::qualified_address_from_verkey; use sovtoken::logic::config::output_mint_config::MintRequest; use sovtoken::logic::request::Request; -use sovtoken::logic::parsers::common::TXO; -use sovtoken::utils::base58::{IntoBase58, FromBase58}; +use sovtoken::utils::base58::IntoBase58; use sovtoken::utils::random::rand_bytes; use utils::setup::{Setup, SetupConfig}; use utils::wallet::Wallet; -pub const VERKEY_LEN: usize = 32; -static VALID_CONFIG_EMPTY_SEED_JSON: &'static str = r#"{}"#; - -// static INPUTS : &'static str = "[\"pay:sov:1\", \"pay:sov:2\"]"; -// static OUTPUTS : &'static str = "[{\"recipient\": \"pay:sov:1\", \"amount\":1}, {\"recipient\": \"pay:sov:2\", \"amount\":2}]"; - - +// ------------------------------------------------------------------------------------------------ +const VERKEY_LEN: usize = 32; +// ------------------------------------------------------------------------------------------------ pub fn gen_random_base58_verkey() -> String { let vk_bytes = rand_bytes(VERKEY_LEN); vk_bytes.into_base58() } +// ------------------------------------------------------------------------------------------------ pub fn do_minting(pool_handle : i32, wallet : &Wallet, dids : &Vec<&str>, payment_address : &str, amount : i32) { let mint_output_json = json!([ { @@ -59,11 +51,12 @@ pub fn do_minting(pool_handle : i32, wallet : &Wallet, dids : &Vec<&str>, paymen trace!("{:?}", &mint_req); - let result = indy::ledger::Ledger::submit_request(pool_handle, &mint_req).unwrap(); + let _ = indy::ledger::Ledger::submit_request(pool_handle, &mint_req).unwrap(); } +// ------------------------------------------------------------------------------------------------ #[test] -pub fn pay_to_non_existent_payment_source_fails() { +pub fn pay_without_outputs_fails() { // ---- setup sovtoken::api::sovtoken_init(); @@ -78,34 +71,70 @@ pub fn pay_to_non_existent_payment_source_fails() { let payment_addresses = &setup.addresses; let pool_handle = setup.pool_handle; let dids = setup.trustees.dids(); + let tokens : i32 = 50; // ---- create some tokens - do_minting(pool_handle, &wallet, &dids, &payment_addresses[0], 50); - - // ---- spend tokens to address not created - let verkey = gen_random_base58_verkey().to_string(); - let address = qualified_address_from_verkey(&verkey).unwrap(); + do_minting(pool_handle, &wallet, &dids, &payment_addresses[0], tokens); + // ---- create payment request with empty output json let txo_1 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[0]); let pay_input_json = json!([ txo_1 ]).to_string(); + let pay_output_json = json!([ + ]).to_string(); + + match indy::payments::Payment::build_payment_req(wallet.handle, Some(dids[0]), &pay_input_json, &pay_output_json, None) { + Ok(_) => { assert!(false, "Expected CommonInvalidStructure error"); } + Err(ec) => { assert_eq!(ec, ErrorCode::CommonInvalidStructure); } + } + +} + +// ------------------------------------------------------------------------------------------------ +#[test] +pub fn pay_without_inputs_fails() { + + // ---- setup + sovtoken::api::sovtoken_init(); + let wallet = Wallet::new(); + let setup = Setup::new(&wallet, SetupConfig { + num_addresses: 1, + num_trustees: 4, + num_users: 0, + mint_tokens: None, + fees: None, + }); + let payment_addresses = &setup.addresses; + let pool_handle = setup.pool_handle; + let dids = setup.trustees.dids(); + let tokens : i32 = 50; + + // ---- create some tokens + do_minting(pool_handle, &wallet, &dids, &payment_addresses[0], tokens); + + // ---- create payment request with empty input json + let pay_input_json = json!([ + + ]).to_string(); + let pay_output_json = json!([ { - "recipient": address, + "recipient": payment_addresses[0], "amount": 50 } ]).to_string(); - let (payment_request, op_code) = indy::payments::Payment::build_payment_req(wallet.handle, Some(dids[0]), &pay_input_json, &pay_output_json, None).unwrap(); - - let payment_result = indy::ledger::Ledger::submit_request(pool_handle, &payment_request).unwrap(); + match indy::payments::Payment::build_payment_req(wallet.handle, Some(dids[0]), &pay_input_json, &pay_output_json, None) { + Ok(_) => { assert!(false, "Expected CommonInvalidStructure error"); } + Err(ec) => { assert_eq!(ec, ErrorCode::CommonInvalidStructure); } + } - assert!(false, "hey -> {:?}", pay_input_json); } +// ------------------------------------------------------------------------------------------------ #[test] pub fn pay_from_non_existent_payment_source_fails() { @@ -151,7 +180,7 @@ pub fn pay_from_non_existent_payment_source_fails() { } } - +// ------------------------------------------------------------------------------------------------ #[test] pub fn pay_with_insufficent_funds_fails() { @@ -173,9 +202,6 @@ pub fn pay_with_insufficent_funds_fails() { do_minting(pool_handle, &wallet, &dids, &payment_addresses[0], 50); // ---- spend more tokens than we minted - let verkey = gen_random_base58_verkey().to_string(); - let address = qualified_address_from_verkey(&verkey).unwrap(); - let txo_1 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[0]); let pay_input_json = json!([ @@ -184,14 +210,148 @@ pub fn pay_with_insufficent_funds_fails() { let pay_output_json = json!([ { - "recipient": address, + "recipient": payment_addresses[0], + "amount": 90 + } + ]).to_string(); + + let (payment_request, _) = indy::payments::Payment::build_payment_req(wallet.handle, Some(dids[0]), &pay_input_json, &pay_output_json, None).unwrap(); + + let payment_result = indy::ledger::Ledger::submit_request(pool_handle, &payment_request).unwrap(); + + assert!(payment_result.contains("InsufficientFundsError"), "Expected InsufficientFundsError"); +} + +// ------------------------------------------------------------------------------------------------ +#[test] +pub fn pay_with_insufficent_funds_with_several_txo_fails() { + + // ---- setup + sovtoken::api::sovtoken_init(); + let wallet = Wallet::new(); + let setup = Setup::new(&wallet, SetupConfig { + num_addresses: 3, + num_trustees: 4, + num_users: 0, + mint_tokens: None, + fees: None, + }); + let payment_addresses = &setup.addresses; + let pool_handle = setup.pool_handle; + let dids = setup.trustees.dids(); + + // ---- create some tokens + do_minting(pool_handle, &wallet, &dids, &payment_addresses[0], 30); + do_minting(pool_handle, &wallet, &dids, &payment_addresses[1], 10); + do_minting(pool_handle, &wallet, &dids, &payment_addresses[2], 10); + + // ---- spend more tokens than we minted + let txo_1 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[0]); + let txo_2 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[1]); + let txo_3 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[2]); + + let pay_input_json = json!([ + txo_1, txo_2, txo_3 + ]).to_string(); + + let pay_output_json = json!([ + { + "recipient": payment_addresses[0], "amount": 90 } ]).to_string(); - let (payment_request, op_code) = indy::payments::Payment::build_payment_req(wallet.handle, Some(dids[0]), &pay_input_json, &pay_output_json, None).unwrap(); + let (payment_request, _) = indy::payments::Payment::build_payment_req(wallet.handle, Some(dids[0]), &pay_input_json, &pay_output_json, None).unwrap(); let payment_result = indy::ledger::Ledger::submit_request(pool_handle, &payment_request).unwrap(); assert!(payment_result.contains("InsufficientFundsError"), "Expected InsufficientFundsError"); +} + +// ------------------------------------------------------------------------------------------------ +#[test] +pub fn pay_with_funds_remaining_fails() { + + // ---- setup + sovtoken::api::sovtoken_init(); + let wallet = Wallet::new(); + let setup = Setup::new(&wallet, SetupConfig { + num_addresses: 1, + num_trustees: 4, + num_users: 0, + mint_tokens: None, + fees: None, + }); + let payment_addresses = &setup.addresses; + let pool_handle = setup.pool_handle; + let dids = setup.trustees.dids(); + + // ---- create some tokens + do_minting(pool_handle, &wallet, &dids, &payment_addresses[0], 50); + + // ---- spend more tokens than we minted + let txo_1 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[0]); + + let pay_input_json = json!([ + txo_1 + ]).to_string(); + + let pay_output_json = json!([ + { + "recipient": payment_addresses[0], + "amount": 25 + } + ]).to_string(); + + let (payment_request, _) = indy::payments::Payment::build_payment_req(wallet.handle, Some(dids[0]), &pay_input_json, &pay_output_json, None).unwrap(); + + let payment_result = indy::ledger::Ledger::submit_request(pool_handle, &payment_request).unwrap(); + + assert!(payment_result.contains("ExtraFundsError"), "Expected ExtraFundsError"); +} + +// ------------------------------------------------------------------------------------------------ +#[test] +pub fn pay_with_funds_remaining_with_several_txo_fails() { + + // ---- setup + sovtoken::api::sovtoken_init(); + let wallet = Wallet::new(); + let setup = Setup::new(&wallet, SetupConfig { + num_addresses: 3, + num_trustees: 4, + num_users: 0, + mint_tokens: None, + fees: None, + }); + let payment_addresses = &setup.addresses; + let pool_handle = setup.pool_handle; + let dids = setup.trustees.dids(); + + // ---- create some tokens + do_minting(pool_handle, &wallet, &dids, &payment_addresses[0], 30); + do_minting(pool_handle, &wallet, &dids, &payment_addresses[1], 10); + do_minting(pool_handle, &wallet, &dids, &payment_addresses[2], 10); + + // ---- spend more tokens than we minted + let txo_1 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[0]); + let txo_2 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[1]); + let txo_3 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[2]); + + let pay_input_json = json!([ + txo_1, txo_2, txo_3 + ]).to_string(); + + let pay_output_json = json!([ + { + "recipient": payment_addresses[0], + "amount": 25 + } + ]).to_string(); + + let (payment_request, _) = indy::payments::Payment::build_payment_req(wallet.handle, Some(dids[0]), &pay_input_json, &pay_output_json, None).unwrap(); + + let payment_result = indy::ledger::Ledger::submit_request(pool_handle, &payment_request).unwrap(); + + assert!(payment_result.contains("ExtraFundsError"), "Expected ExtraFundsError"); } \ No newline at end of file From 69762b80e052f52095a49df4918b80cfe3fe9011 Mon Sep 17 00:00:00 2001 From: matt raffel Date: Tue, 23 Oct 2018 12:25:30 -0600 Subject: [PATCH 3/6] simplifies error checking Signed-off-by: matt raffel --- libsovtoken/tests/payment_chaos_tests.rs | 106 +++++++++++++++++++---- 1 file changed, 90 insertions(+), 16 deletions(-) diff --git a/libsovtoken/tests/payment_chaos_tests.rs b/libsovtoken/tests/payment_chaos_tests.rs index b4662ad2d..9c708236e 100644 --- a/libsovtoken/tests/payment_chaos_tests.rs +++ b/libsovtoken/tests/payment_chaos_tests.rs @@ -86,10 +86,8 @@ pub fn pay_without_outputs_fails() { let pay_output_json = json!([ ]).to_string(); - match indy::payments::Payment::build_payment_req(wallet.handle, Some(dids[0]), &pay_input_json, &pay_output_json, None) { - Ok(_) => { assert!(false, "Expected CommonInvalidStructure error"); } - Err(ec) => { assert_eq!(ec, ErrorCode::CommonInvalidStructure); } - } + let ec = indy::payments::Payment::build_payment_req(wallet.handle, Some(dids[0]), &pay_input_json, &pay_output_json, None).unwrap_err(); + assert_eq!(ec, ErrorCode::CommonInvalidStructure); } @@ -127,11 +125,8 @@ pub fn pay_without_inputs_fails() { } ]).to_string(); - match indy::payments::Payment::build_payment_req(wallet.handle, Some(dids[0]), &pay_input_json, &pay_output_json, None) { - Ok(_) => { assert!(false, "Expected CommonInvalidStructure error"); } - Err(ec) => { assert_eq!(ec, ErrorCode::CommonInvalidStructure); } - } - + let ec = indy::payments::Payment::build_payment_req(wallet.handle, Some(dids[0]), &pay_input_json, &pay_output_json, None).unwrap_err(); + assert_eq!(ec, ErrorCode::CommonInvalidStructure); } // ------------------------------------------------------------------------------------------------ @@ -169,15 +164,48 @@ pub fn pay_from_non_existent_payment_source_fails() { } ]).to_string(); - match indy::payments::Payment::build_payment_req(wallet.handle, Some(dids[0]), &pay_input_json, &pay_output_json, None) { - Ok(_) => { - assert!(false, "expected build_payment_req to fail"); - }, - Err(ec) => { - assert_eq!(ec, ErrorCode::WalletItemNotFound); + let ec = indy::payments::Payment::build_payment_req(wallet.handle, Some(dids[0]), &pay_input_json, &pay_output_json, None).unwrap_err(); + assert_eq!(ec, ErrorCode::WalletItemNotFound); +} + +// ------------------------------------------------------------------------------------------------ +#[test] +pub fn pay_from_existent_and_non_existent_payment_source_fails() { + + // ---- setup + sovtoken::api::sovtoken_init(); + let wallet = Wallet::new(); + let setup = Setup::new(&wallet, SetupConfig { + num_addresses: 1, + num_trustees: 4, + num_users: 0, + mint_tokens: None, + fees: None, + }); + let payment_addresses = &setup.addresses; + let pool_handle = setup.pool_handle; + let dids = setup.trustees.dids(); + + // ---- create some tokens + do_minting(pool_handle, &wallet, &dids, &payment_addresses[0], 50); + + + // ---- spend tokens from inputs with both an address in the wallet and one address that is not in the wallet + let txo_1 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[0]); + + let pay_input_json = json!([ + txo_1, "txo:sov:3x42qH8UkJac1BuorqjSEvuVjvYkXk8sUAqoVPn1fGCwjLPquu4CndzBHBQ5hX6RSmDVnXGdMPrnWDUN5S1ty4YQP87hW8ubMSzu9M56z1FbAQV6aMSX5h" + ]).to_string(); + + let pay_output_json = json!([ + { + "recipient": payment_addresses[0], + "amount": 50 } + ]).to_string(); - } + let ec = indy::payments::Payment::build_payment_req(wallet.handle, Some(dids[0]), &pay_input_json, &pay_output_json, None).unwrap_err(); + assert_eq!(ec, ErrorCode::WalletItemNotFound); } // ------------------------------------------------------------------------------------------------ @@ -222,6 +250,52 @@ pub fn pay_with_insufficent_funds_fails() { assert!(payment_result.contains("InsufficientFundsError"), "Expected InsufficientFundsError"); } +// ------------------------------------------------------------------------------------------------ +#[test] +pub fn pay_with_insufficent_funds_with_several_output_addresses_fails() { + + // ---- setup + sovtoken::api::sovtoken_init(); + let wallet = Wallet::new(); + let setup = Setup::new(&wallet, SetupConfig { + num_addresses: 2, + num_trustees: 4, + num_users: 0, + mint_tokens: None, + fees: None, + }); + let payment_addresses = &setup.addresses; + let pool_handle = setup.pool_handle; + let dids = setup.trustees.dids(); + + // ---- create some tokens + do_minting(pool_handle, &wallet, &dids, &payment_addresses[0], 50); + + // ---- spend more tokens than we minted sending the outputs (spending) to several addresses + let txo_1 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[0]); + + let pay_input_json = json!([ + txo_1 + ]).to_string(); + + let pay_output_json = json!([ + { + "recipient": payment_addresses[0], + "amount": 45 + }, + { + "recipient": payment_addresses[1], + "amount": 45 + } + ]).to_string(); + + let (payment_request, _) = indy::payments::Payment::build_payment_req(wallet.handle, Some(dids[0]), &pay_input_json, &pay_output_json, None).unwrap(); + + let payment_result = indy::ledger::Ledger::submit_request(pool_handle, &payment_request).unwrap(); + + assert!(payment_result.contains("InsufficientFundsError"), "Expected InsufficientFundsError"); +} + // ------------------------------------------------------------------------------------------------ #[test] pub fn pay_with_insufficent_funds_with_several_txo_fails() { From 048ac19a11bbabab5240b5636bb70207d2db06cc Mon Sep 17 00:00:00 2001 From: matt raffel Date: Tue, 23 Oct 2018 13:14:12 -0600 Subject: [PATCH 4/6] adds another test, removes do_minting in favor of using setup minting functionality Signed-off-by: matt raffel --- libsovtoken/tests/payment_chaos_tests.rs | 141 +++++++++-------------- 1 file changed, 52 insertions(+), 89 deletions(-) diff --git a/libsovtoken/tests/payment_chaos_tests.rs b/libsovtoken/tests/payment_chaos_tests.rs index 9c708236e..bc73c7e42 100644 --- a/libsovtoken/tests/payment_chaos_tests.rs +++ b/libsovtoken/tests/payment_chaos_tests.rs @@ -2,58 +2,15 @@ extern crate libc; extern crate sovtoken; extern crate indy; // lib-sdk project -#[macro_use] extern crate log; #[macro_use] extern crate serde_derive; #[macro_use] extern crate serde_json; pub mod utils; use indy::ErrorCode; -use sovtoken::logic::config::output_mint_config::MintRequest; -use sovtoken::logic::request::Request; -use sovtoken::utils::base58::IntoBase58; -use sovtoken::utils::random::rand_bytes; use utils::setup::{Setup, SetupConfig}; use utils::wallet::Wallet; -// ------------------------------------------------------------------------------------------------ -const VERKEY_LEN: usize = 32; - -// ------------------------------------------------------------------------------------------------ -pub fn gen_random_base58_verkey() -> String { - let vk_bytes = rand_bytes(VERKEY_LEN); - vk_bytes.into_base58() -} - -// ------------------------------------------------------------------------------------------------ -pub fn do_minting(pool_handle : i32, wallet : &Wallet, dids : &Vec<&str>, payment_address : &str, amount : i32) { - let mint_output_json = json!([ - { - "recipient": payment_address, - "amount": amount, - } - ]).to_string(); - - let (mint_req, _) = indy::payments::Payment::build_mint_req( - wallet.handle, - Some(&dids[0]), - &mint_output_json, - None, - ).unwrap(); - - trace!("{:?}", &mint_req); - - let mint_req = Request::::multi_sign_request( - wallet.handle, - &mint_req, - dids.clone() - ).unwrap(); - - trace!("{:?}", &mint_req); - - let _ = indy::ledger::Ledger::submit_request(pool_handle, &mint_req).unwrap(); -} - // ------------------------------------------------------------------------------------------------ #[test] pub fn pay_without_outputs_fails() { @@ -65,16 +22,12 @@ pub fn pay_without_outputs_fails() { num_addresses: 1, num_trustees: 4, num_users: 0, - mint_tokens: None, + mint_tokens: Some(vec![50]), fees: None, }); let payment_addresses = &setup.addresses; let pool_handle = setup.pool_handle; let dids = setup.trustees.dids(); - let tokens : i32 = 50; - - // ---- create some tokens - do_minting(pool_handle, &wallet, &dids, &payment_addresses[0], tokens); // ---- create payment request with empty output json let txo_1 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[0]); @@ -102,16 +55,11 @@ pub fn pay_without_inputs_fails() { num_addresses: 1, num_trustees: 4, num_users: 0, - mint_tokens: None, + mint_tokens: Some(vec![50]), fees: None, }); let payment_addresses = &setup.addresses; - let pool_handle = setup.pool_handle; let dids = setup.trustees.dids(); - let tokens : i32 = 50; - - // ---- create some tokens - do_minting(pool_handle, &wallet, &dids, &payment_addresses[0], tokens); // ---- create payment request with empty input json let pay_input_json = json!([ @@ -140,17 +88,12 @@ pub fn pay_from_non_existent_payment_source_fails() { num_addresses: 1, num_trustees: 4, num_users: 0, - mint_tokens: None, + mint_tokens: Some(vec![50]), fees: None, }); let payment_addresses = &setup.addresses; - let pool_handle = setup.pool_handle; let dids = setup.trustees.dids(); - // ---- create some tokens - do_minting(pool_handle, &wallet, &dids, &payment_addresses[0], 50); - - // ---- spend tokens from a valid address that is not in the wallet let pay_input_json = json!([ @@ -179,17 +122,13 @@ pub fn pay_from_existent_and_non_existent_payment_source_fails() { num_addresses: 1, num_trustees: 4, num_users: 0, - mint_tokens: None, + mint_tokens: Some(vec![50]), fees: None, }); let payment_addresses = &setup.addresses; let pool_handle = setup.pool_handle; let dids = setup.trustees.dids(); - // ---- create some tokens - do_minting(pool_handle, &wallet, &dids, &payment_addresses[0], 50); - - // ---- spend tokens from inputs with both an address in the wallet and one address that is not in the wallet let txo_1 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[0]); @@ -219,16 +158,13 @@ pub fn pay_with_insufficent_funds_fails() { num_addresses: 1, num_trustees: 4, num_users: 0, - mint_tokens: None, + mint_tokens: Some(vec![50]), fees: None, }); let payment_addresses = &setup.addresses; let pool_handle = setup.pool_handle; let dids = setup.trustees.dids(); - // ---- create some tokens - do_minting(pool_handle, &wallet, &dids, &payment_addresses[0], 50); - // ---- spend more tokens than we minted let txo_1 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[0]); @@ -261,16 +197,13 @@ pub fn pay_with_insufficent_funds_with_several_output_addresses_fails() { num_addresses: 2, num_trustees: 4, num_users: 0, - mint_tokens: None, + mint_tokens: Some(vec![50, 1]), fees: None, }); let payment_addresses = &setup.addresses; let pool_handle = setup.pool_handle; let dids = setup.trustees.dids(); - // ---- create some tokens - do_minting(pool_handle, &wallet, &dids, &payment_addresses[0], 50); - // ---- spend more tokens than we minted sending the outputs (spending) to several addresses let txo_1 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[0]); @@ -307,18 +240,13 @@ pub fn pay_with_insufficent_funds_with_several_txo_fails() { num_addresses: 3, num_trustees: 4, num_users: 0, - mint_tokens: None, + mint_tokens: Some(vec![30, 10, 10]), fees: None, }); let payment_addresses = &setup.addresses; let pool_handle = setup.pool_handle; let dids = setup.trustees.dids(); - // ---- create some tokens - do_minting(pool_handle, &wallet, &dids, &payment_addresses[0], 30); - do_minting(pool_handle, &wallet, &dids, &payment_addresses[1], 10); - do_minting(pool_handle, &wallet, &dids, &payment_addresses[2], 10); - // ---- spend more tokens than we minted let txo_1 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[0]); let txo_2 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[1]); @@ -353,16 +281,13 @@ pub fn pay_with_funds_remaining_fails() { num_addresses: 1, num_trustees: 4, num_users: 0, - mint_tokens: None, + mint_tokens: Some(vec![50]), fees: None, }); let payment_addresses = &setup.addresses; let pool_handle = setup.pool_handle; let dids = setup.trustees.dids(); - // ---- create some tokens - do_minting(pool_handle, &wallet, &dids, &payment_addresses[0], 50); - // ---- spend more tokens than we minted let txo_1 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[0]); @@ -384,6 +309,49 @@ pub fn pay_with_funds_remaining_fails() { assert!(payment_result.contains("ExtraFundsError"), "Expected ExtraFundsError"); } +// ------------------------------------------------------------------------------------------------ +#[test] +pub fn pay_with_funds_remaining_with_several_outputs_fails() { + + // ---- setup + sovtoken::api::sovtoken_init(); + let wallet = Wallet::new(); + let setup = Setup::new(&wallet, SetupConfig { + num_addresses: 2, + num_trustees: 4, + num_users: 0, + mint_tokens: Some(vec![50, 1]), + fees: None, + }); + let payment_addresses = &setup.addresses; + let pool_handle = setup.pool_handle; + let dids = setup.trustees.dids(); + + // ---- spend more tokens than we minted + let txo_1 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[0]); + + let pay_input_json = json!([ + txo_1 + ]).to_string(); + + let pay_output_json = json!([ + { + "recipient": payment_addresses[0], + "amount": 15 + }, + { + "recipient": payment_addresses[1], + "amount": 5 + } + ]).to_string(); + + let (payment_request, _) = indy::payments::Payment::build_payment_req(wallet.handle, Some(dids[0]), &pay_input_json, &pay_output_json, None).unwrap(); + + let payment_result = indy::ledger::Ledger::submit_request(pool_handle, &payment_request).unwrap(); + + assert!(payment_result.contains("ExtraFundsError"), "Expected ExtraFundsError"); +} + // ------------------------------------------------------------------------------------------------ #[test] pub fn pay_with_funds_remaining_with_several_txo_fails() { @@ -395,18 +363,13 @@ pub fn pay_with_funds_remaining_with_several_txo_fails() { num_addresses: 3, num_trustees: 4, num_users: 0, - mint_tokens: None, + mint_tokens: Some(vec![30, 10, 10]), fees: None, }); let payment_addresses = &setup.addresses; let pool_handle = setup.pool_handle; let dids = setup.trustees.dids(); - // ---- create some tokens - do_minting(pool_handle, &wallet, &dids, &payment_addresses[0], 30); - do_minting(pool_handle, &wallet, &dids, &payment_addresses[1], 10); - do_minting(pool_handle, &wallet, &dids, &payment_addresses[2], 10); - // ---- spend more tokens than we minted let txo_1 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[0]); let txo_2 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[1]); From 9157152498df1c3049642854751843054e354771 Mon Sep 17 00:00:00 2001 From: matt raffel Date: Tue, 23 Oct 2018 13:18:04 -0600 Subject: [PATCH 5/6] corrected a comment Signed-off-by: matt raffel --- libsovtoken/tests/payment_chaos_tests.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libsovtoken/tests/payment_chaos_tests.rs b/libsovtoken/tests/payment_chaos_tests.rs index bc73c7e42..366548ea1 100644 --- a/libsovtoken/tests/payment_chaos_tests.rs +++ b/libsovtoken/tests/payment_chaos_tests.rs @@ -327,7 +327,7 @@ pub fn pay_with_funds_remaining_with_several_outputs_fails() { let pool_handle = setup.pool_handle; let dids = setup.trustees.dids(); - // ---- spend more tokens than we minted + // ---- spend less tokens than we minted let txo_1 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[0]); let pay_input_json = json!([ @@ -370,7 +370,7 @@ pub fn pay_with_funds_remaining_with_several_txo_fails() { let pool_handle = setup.pool_handle; let dids = setup.trustees.dids(); - // ---- spend more tokens than we minted + // ---- spend less tokens than we minted let txo_1 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[0]); let txo_2 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[1]); let txo_3 = utils::payment::get_utxo::get_first_utxo_txo_for_payment_address(&wallet, pool_handle, dids[0], &payment_addresses[2]); From 624716b5dafee9f3c7d29a5545cb66320bbb85e8 Mon Sep 17 00:00:00 2001 From: matt raffel Date: Tue, 23 Oct 2018 13:55:28 -0600 Subject: [PATCH 6/6] removed duplication of sovtoken::api::sovtoken_init calls Signed-off-by: matt raffel --- libsovtoken/tests/payment_chaos_tests.rs | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/libsovtoken/tests/payment_chaos_tests.rs b/libsovtoken/tests/payment_chaos_tests.rs index 366548ea1..f5b139651 100644 --- a/libsovtoken/tests/payment_chaos_tests.rs +++ b/libsovtoken/tests/payment_chaos_tests.rs @@ -16,7 +16,6 @@ use utils::wallet::Wallet; pub fn pay_without_outputs_fails() { // ---- setup - sovtoken::api::sovtoken_init(); let wallet = Wallet::new(); let setup = Setup::new(&wallet, SetupConfig { num_addresses: 1, @@ -49,7 +48,6 @@ pub fn pay_without_outputs_fails() { pub fn pay_without_inputs_fails() { // ---- setup - sovtoken::api::sovtoken_init(); let wallet = Wallet::new(); let setup = Setup::new(&wallet, SetupConfig { num_addresses: 1, @@ -82,7 +80,6 @@ pub fn pay_without_inputs_fails() { pub fn pay_from_non_existent_payment_source_fails() { // ---- setup - sovtoken::api::sovtoken_init(); let wallet = Wallet::new(); let setup = Setup::new(&wallet, SetupConfig { num_addresses: 1, @@ -116,7 +113,6 @@ pub fn pay_from_non_existent_payment_source_fails() { pub fn pay_from_existent_and_non_existent_payment_source_fails() { // ---- setup - sovtoken::api::sovtoken_init(); let wallet = Wallet::new(); let setup = Setup::new(&wallet, SetupConfig { num_addresses: 1, @@ -152,7 +148,6 @@ pub fn pay_from_existent_and_non_existent_payment_source_fails() { pub fn pay_with_insufficent_funds_fails() { // ---- setup - sovtoken::api::sovtoken_init(); let wallet = Wallet::new(); let setup = Setup::new(&wallet, SetupConfig { num_addresses: 1, @@ -191,7 +186,6 @@ pub fn pay_with_insufficent_funds_fails() { pub fn pay_with_insufficent_funds_with_several_output_addresses_fails() { // ---- setup - sovtoken::api::sovtoken_init(); let wallet = Wallet::new(); let setup = Setup::new(&wallet, SetupConfig { num_addresses: 2, @@ -234,7 +228,6 @@ pub fn pay_with_insufficent_funds_with_several_output_addresses_fails() { pub fn pay_with_insufficent_funds_with_several_txo_fails() { // ---- setup - sovtoken::api::sovtoken_init(); let wallet = Wallet::new(); let setup = Setup::new(&wallet, SetupConfig { num_addresses: 3, @@ -275,7 +268,6 @@ pub fn pay_with_insufficent_funds_with_several_txo_fails() { pub fn pay_with_funds_remaining_fails() { // ---- setup - sovtoken::api::sovtoken_init(); let wallet = Wallet::new(); let setup = Setup::new(&wallet, SetupConfig { num_addresses: 1, @@ -314,13 +306,12 @@ pub fn pay_with_funds_remaining_fails() { pub fn pay_with_funds_remaining_with_several_outputs_fails() { // ---- setup - sovtoken::api::sovtoken_init(); let wallet = Wallet::new(); let setup = Setup::new(&wallet, SetupConfig { num_addresses: 2, num_trustees: 4, num_users: 0, - mint_tokens: Some(vec![50, 1]), + mint_tokens: Some(vec![50]), fees: None, }); let payment_addresses = &setup.addresses; @@ -357,7 +348,6 @@ pub fn pay_with_funds_remaining_with_several_outputs_fails() { pub fn pay_with_funds_remaining_with_several_txo_fails() { // ---- setup - sovtoken::api::sovtoken_init(); let wallet = Wallet::new(); let setup = Setup::new(&wallet, SetupConfig { num_addresses: 3,