aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2016-04-04 15:47:09 +0200
committerChristian Grothoff <christian@grothoff.org>2016-04-04 15:47:09 +0200
commit6eb2e73ee0ac813cc6ffc7f3e34cbab3fe84a3fd (patch)
tree94cd6bad222ef1cd49d23bb18e091592fb7347f2
parentdb44dc3e9597903a29a4add98d99bc7e763b6e65 (diff)
implementing /deposit for test
-rw-r--r--src/exchange/test_taler_exchange_aggregator.c122
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;