diff options
author | Christian Grothoff <christian@grothoff.org> | 2016-04-10 14:28:54 +0200 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2016-04-10 14:28:54 +0200 |
commit | 5fb65f59b2de184f4fcb1417923711bd64fe781a (patch) | |
tree | 6b178af21710412d38c76201ee7a087332164d46 /src | |
parent | 71107a7b3d5ba0367aad3b6ae926e54c08cb0963 (diff) |
add testcase for profiteering from rounding, also passes, this concludes #4141
Diffstat (limited to 'src')
-rw-r--r-- | src/exchange/taler-exchange-aggregator.c | 2 | ||||
-rw-r--r-- | src/exchange/test_taler_exchange_aggregator.c | 188 |
2 files changed, 186 insertions, 4 deletions
diff --git a/src/exchange/taler-exchange-aggregator.c b/src/exchange/taler-exchange-aggregator.c index 2ff3c2ca8..25ddcf3f6 100644 --- a/src/exchange/taler-exchange-aggregator.c +++ b/src/exchange/taler-exchange-aggregator.c @@ -352,7 +352,7 @@ deposit_cb (void *cls, deposit_fee)) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, - "Fatally malformed record at %llu\n", + "Fatally malformed record at row %llu\n", row_id); return GNUNET_SYSERR; } diff --git a/src/exchange/test_taler_exchange_aggregator.c b/src/exchange/test_taler_exchange_aggregator.c index d109e4cd1..80c14ed67 100644 --- a/src/exchange/test_taler_exchange_aggregator.c +++ b/src/exchange/test_taler_exchange_aggregator.c @@ -1,6 +1,6 @@ /* This file is part of TALER - (C) 2016 GNUnet e.V. + (C) 2016 Inria and GNUnet e.V. TALER is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software @@ -1005,8 +1005,190 @@ run_test () .details.expect_transaction.amount = "EUR:0.01" }, - /* TODO: might want to test "profiteering" from - rounding down... */ + /* Test profiteering if wire deadline is short */ + { + .opcode = OPCODE_DATABASE_DEPOSIT, + .label = "do-deposit-7a", + .details.deposit.merchant_name = "bob", + .details.deposit.merchant_account = 4, + .details.deposit.transaction_id = 1, + .details.deposit.wire_deadline = { 1000LL * 1000 * 0 }, /* 0s */ + .details.deposit.amount_with_fee = "EUR:0.009", + .details.deposit.deposit_fee = "EUR:0" + }, + { + .opcode = OPCODE_RUN_AGGREGATOR, + .label = "run-aggregator-deposit-7a-tiny" + }, + { + .opcode = OPCODE_EXPECT_TRANSACTIONS_EMPTY, + .label = "expect-empty-transactions-after-7a-tiny" + }, + { + .opcode = OPCODE_DATABASE_DEPOSIT, + .label = "do-deposit-7b", + .details.deposit.merchant_name = "bob", + .details.deposit.merchant_account = 4, + .details.deposit.transaction_id = 1, + .details.deposit.wire_deadline = { 1000LL * 1000 * 0 }, /* 0s */ + .details.deposit.amount_with_fee = "EUR:0.009", + .details.deposit.deposit_fee = "EUR:0" + }, + { + .opcode = OPCODE_RUN_AGGREGATOR, + .label = "run-aggregator-deposit-7-profit" + }, + { + .opcode = OPCODE_EXPECT_TRANSACTION, + .label = "expect-deposit-7", + .details.expect_transaction.debit_account = 3, + .details.expect_transaction.credit_account = 4, + .details.expect_transaction.amount = "EUR:0.01" + }, + /* Now check profit was actually taken */ + { + .opcode = OPCODE_DATABASE_DEPOSIT, + .label = "do-deposit-7c", + .details.deposit.merchant_name = "bob", + .details.deposit.merchant_account = 4, + .details.deposit.transaction_id = 1, + .details.deposit.wire_deadline = { 1000LL * 1000 * 0 }, /* 0s */ + .details.deposit.amount_with_fee = "EUR:0.022", + .details.deposit.deposit_fee = "EUR:0" + }, + { + .opcode = OPCODE_RUN_AGGREGATOR, + .label = "run-aggregator-deposit-7c-loss" + }, + { + .opcode = OPCODE_EXPECT_TRANSACTION, + .label = "expect-deposit-7", + .details.expect_transaction.debit_account = 3, + .details.expect_transaction.credit_account = 4, + .details.expect_transaction.amount = "EUR:0.02" + }, + + /* Test that aggregation would happen fully if wire deadline is long */ + { + .opcode = OPCODE_DATABASE_DEPOSIT, + .label = "do-deposit-8a", + .details.deposit.merchant_name = "bob", + .details.deposit.merchant_account = 4, + .details.deposit.transaction_id = 1, + .details.deposit.wire_deadline = { 1000LL * 1000 * 5 }, /* 5s */ + .details.deposit.amount_with_fee = "EUR:0.009", + .details.deposit.deposit_fee = "EUR:0" + }, + { + .opcode = OPCODE_RUN_AGGREGATOR, + .label = "run-aggregator-deposit-8a-tiny" + }, + { + .opcode = OPCODE_EXPECT_TRANSACTIONS_EMPTY, + .label = "expect-empty-transactions-after-8a-tiny" + }, + { + .opcode = OPCODE_DATABASE_DEPOSIT, + .label = "do-deposit-8b", + .details.deposit.merchant_name = "bob", + .details.deposit.merchant_account = 4, + .details.deposit.transaction_id = 1, + .details.deposit.wire_deadline = { 1000LL * 1000 * 5 }, /* 5s */ + .details.deposit.amount_with_fee = "EUR:0.009", + .details.deposit.deposit_fee = "EUR:0" + }, + { + .opcode = OPCODE_RUN_AGGREGATOR, + .label = "run-aggregator-deposit-8b-tiny" + }, + { + .opcode = OPCODE_EXPECT_TRANSACTIONS_EMPTY, + .label = "expect-empty-transactions-after-8b-tiny" + }, + /* now trigger aggregate with large transaction and short deadline */ + { + .opcode = OPCODE_DATABASE_DEPOSIT, + .label = "do-deposit-8c", + .details.deposit.merchant_name = "bob", + .details.deposit.merchant_account = 4, + .details.deposit.transaction_id = 1, + .details.deposit.wire_deadline = { 1000LL * 1000 * 0 }, /* 0s */ + .details.deposit.amount_with_fee = "EUR:0.022", + .details.deposit.deposit_fee = "EUR:0" + }, + { + .opcode = OPCODE_RUN_AGGREGATOR, + .label = "run-aggregator-deposit-8" + }, + { + .opcode = OPCODE_EXPECT_TRANSACTION, + .label = "expect-deposit-8", + .details.expect_transaction.debit_account = 3, + .details.expect_transaction.credit_account = 4, + .details.expect_transaction.amount = "EUR:0.04" + }, + + + /* Test aggregation with fees and rounding profits */ + { + .opcode = OPCODE_DATABASE_DEPOSIT, + .label = "do-deposit-9a", + .details.deposit.merchant_name = "bob", + .details.deposit.merchant_account = 4, + .details.deposit.transaction_id = 1, + .details.deposit.wire_deadline = { 1000LL * 1000 * 5 }, /* 5s */ + .details.deposit.amount_with_fee = "EUR:0.009", + .details.deposit.deposit_fee = "EUR:0.001" + }, + { + .opcode = OPCODE_RUN_AGGREGATOR, + .label = "run-aggregator-deposit-9a-tiny" + }, + { + .opcode = OPCODE_EXPECT_TRANSACTIONS_EMPTY, + .label = "expect-empty-transactions-after-9a-tiny" + }, + { + .opcode = OPCODE_DATABASE_DEPOSIT, + .label = "do-deposit-9b", + .details.deposit.merchant_name = "bob", + .details.deposit.merchant_account = 4, + .details.deposit.transaction_id = 1, + .details.deposit.wire_deadline = { 1000LL * 1000 * 5 }, /* 5s */ + .details.deposit.amount_with_fee = "EUR:0.009", + .details.deposit.deposit_fee = "EUR:0.002" + }, + { + .opcode = OPCODE_RUN_AGGREGATOR, + .label = "run-aggregator-deposit-9b-tiny" + }, + { + .opcode = OPCODE_EXPECT_TRANSACTIONS_EMPTY, + .label = "expect-empty-transactions-after-9b-tiny" + }, + /* now trigger aggregate with large transaction and short deadline */ + { + .opcode = OPCODE_DATABASE_DEPOSIT, + .label = "do-deposit-9c", + .details.deposit.merchant_name = "bob", + .details.deposit.merchant_account = 4, + .details.deposit.transaction_id = 1, + .details.deposit.wire_deadline = { 1000LL * 1000 * 0 }, /* 0s */ + .details.deposit.amount_with_fee = "EUR:0.022", + .details.deposit.deposit_fee = "EUR:0.008" + }, + { + .opcode = OPCODE_RUN_AGGREGATOR, + .label = "run-aggregator-deposit-9" + }, + /* 0.009 + 0.009 + 0.022 - 0.001 - 0.002 - 0.008 = 0.029 => 0.02 */ + { + .opcode = OPCODE_EXPECT_TRANSACTION, + .label = "expect-deposit-9", + .details.expect_transaction.debit_account = 3, + .details.expect_transaction.credit_account = 4, + .details.expect_transaction.amount = "EUR:0.02" + }, /* Everything tested, terminate with success */ { |