diff options
author | Christian Grothoff <christian@grothoff.org> | 2016-04-04 15:47:09 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2016-04-04 15:47:09 +0200 |
commit | 6eb2e73ee0ac813cc6ffc7f3e34cbab3fe84a3fd (patch) | |
tree | 94cd6bad222ef1cd49d23bb18e091592fb7347f2 | |
parent | db44dc3e9597903a29a4add98d99bc7e763b6e65 (diff) |
implementing /deposit for test
-rw-r--r-- | src/exchange/test_taler_exchange_aggregator.c | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/src/exchange/test_taler_exchange_aggregator.c b/src/exchange/test_taler_exchange_aggregator.c index b9c610e4c..134e98c10 100644 --- a/src/exchange/test_taler_exchange_aggregator.c +++ b/src/exchange/test_taler_exchange_aggregator.c @@ -91,6 +91,16 @@ enum OpCode { OPCODE_EXPECT_TRANSACTIONS_EMPTY, /** + * Execute deposit operation against database. + */ + OPCODE_DATABASE_DEPOSIT, + + /** + * Wait a certain amount of time. + */ + OPCODE_WAIT, + + /** * Expect that we have received the specified transaction. */ OPCODE_EXPECT_TRANSACTION, @@ -126,6 +136,50 @@ struct Command */ struct Transaction expect_transaction; + /** + * If @e opcode is #OPCODE_DATABASE_DEPOST, this + * specifies which deposit operation we should fake. + */ + struct { + + /** + * Each merchant name is automatically mapped to a unique + * merchant public key. + */ + const char *merchant_name; + + /** + * Merchant account number, is mapped to wire details. + */ + uint64_t merchant_account; + + /** + * Merchant's transaction ID. + */ + uint64_t transaction_id; + + /** + * By when does the merchant request the funds to be wired. + */ + struct GNUNET_TIME_Relative wire_deadline; + + /** + * What is the total amount (including exchange fees). + */ + const char *amount_with_fee; + + /** + * How high are the exchange fees? Must be smaller than @e amount_with_fee. + */ + const char *deposit_fee; + + } deposit; + + /** + * How long should we wait if the opcode is #OPCODE_WAIT. + */ + struct GNUNET_TIME_Relative wait_delay; + } details; }; @@ -309,6 +363,59 @@ maint_child_death (void *cls, /** + * Helper function to fake a deposit operation. + * + * @return #GNUNET_OK on success + */ +static int +do_deposit (struct Command *cmd) +{ + struct TALER_EXCHANGEDB_Deposit deposit; + struct TALER_MerchantPrivateKeyP merchant_priv; + int ret; + + memset (&deposit, 0, sizeof (deposit)); + GNUNET_CRYPTO_kdf (&merchant_priv, + sizeof (struct TALER_MerchantPrivateKeyP), + "merchant-priv", + strlen ("merchant-priv"), + cmd->details.deposit.merchant_name, + strlen (cmd->details.deposit.merchant_name), + NULL, 0); + GNUNET_CRYPTO_eddsa_key_get_public (&merchant_priv.eddsa_priv, + &deposit.merchant_pub.eddsa_pub); + GNUNET_CRYPTO_hash_create_random (GNUNET_CRYPTO_QUALITY_WEAK, + &deposit.h_contract); + if ( (GNUNET_OK != + TALER_string_to_amount (cmd->details.deposit.amount_with_fee, + &deposit.amount_with_fee)) || + (GNUNET_OK != + TALER_string_to_amount (cmd->details.deposit.deposit_fee, + &deposit.deposit_fee)) ) + { + GNUNET_break (0); + return GNUNET_SYSERR; + } + deposit.wire = json_pack ("{s:s, s:s, s:I}", + "type", "test", + "bank_uri", "http://localhost:8082/", + "account_number", (json_int_t) cmd->details.deposit.merchant_account); + GNUNET_assert (GNUNET_OK == + TALER_JSON_hash (deposit.wire, + &deposit.h_wire)); + deposit.transaction_id = cmd->details.deposit.transaction_id; + deposit.timestamp = GNUNET_TIME_absolute_get (); + deposit.wire_deadline = GNUNET_TIME_relative_to_absolute (cmd->details.deposit.wire_deadline); + + ret = plugin->insert_deposit (plugin->cls, + session, + &deposit); + json_decref (deposit.wire); + return ret; +} + + +/** * Fail the testcase at the current command. */ static void @@ -349,6 +456,12 @@ interpreter (void *cls, result = 77; GNUNET_SCHEDULER_shutdown (); return; + case OPCODE_WAIT: + state->ioff++; + GNUNET_SCHEDULER_add_delayed (cmd->details.wait_delay, + &interpreter, + state); + return; case OPCODE_RUN_AGGREGATOR: GNUNET_assert (NULL == aggregator_state); aggregator_state = state; @@ -371,6 +484,15 @@ interpreter (void *cls, } state->ioff++; break; + case OPCODE_DATABASE_DEPOSIT: + if (GNUNET_OK != + do_deposit (cmd)) + { + fail (cmd); + return; + } + state->ioff++; + break; case OPCODE_EXPECT_TRANSACTION: { const struct Transaction *want = &cmd->details.expect_transaction; |