From 65a656163797e9dd298b34ec916b982082db7f52 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Wed, 3 Apr 2024 16:21:33 +0200 Subject: wallet-core: allow deposits with balance locked behind refresh --- .../test-wallet-blocked-deposit.ts | 152 +++++++++++++++++++++ .../test-wallet-refresh-blocked.ts | 120 ---------------- .../src/integrationtests/testrunner.ts | 4 +- 3 files changed, 154 insertions(+), 122 deletions(-) create mode 100644 packages/taler-harness/src/integrationtests/test-wallet-blocked-deposit.ts delete mode 100644 packages/taler-harness/src/integrationtests/test-wallet-refresh-blocked.ts (limited to 'packages/taler-harness/src') diff --git a/packages/taler-harness/src/integrationtests/test-wallet-blocked-deposit.ts b/packages/taler-harness/src/integrationtests/test-wallet-blocked-deposit.ts new file mode 100644 index 000000000..cb9c54f1d --- /dev/null +++ b/packages/taler-harness/src/integrationtests/test-wallet-blocked-deposit.ts @@ -0,0 +1,152 @@ +/* + This file is part of GNU Taler + (C) 2020 Taler Systems S.A. + + GNU 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 + Foundation; either version 3, or (at your option) any later version. + + GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along with + GNU Taler; see the file COPYING. If not, see + */ + +/** + * Imports. + */ +import { + AmountString, + NotificationType, + TransactionMajorState, + TransactionMinorState, + j2s, +} from "@gnu-taler/taler-util"; +import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; +import { CoinConfig } from "../harness/denomStructures.js"; +import { GlobalTestState, generateRandomPayto } from "../harness/harness.js"; +import { + createSimpleTestkudosEnvironmentV2, + createWalletDaemonWithClient, + makeTestPaymentV2, + withdrawViaBankV2, +} from "../harness/helpers.js"; + +const coinCommon = { + cipher: "RSA" as const, + durationLegal: "3 years", + durationSpend: "2 years", + durationWithdraw: "7 days", + feeDeposit: "TESTKUDOS:0", + feeRefresh: "TESTKUDOS:0", + feeRefund: "TESTKUDOS:0", + feeWithdraw: "TESTKUDOS:0", + rsaKeySize: 1024, +}; + +/** + * Run test for refreshe after a payment. + */ +export async function runWalletBlockedDeposit(t: GlobalTestState) { + // Set up test environment + + const coinConfigList: CoinConfig[] = [ + { + ...coinCommon, + name: "n1", + value: "TESTKUDOS:1", + }, + { + ...coinCommon, + name: "n5", + value: "TESTKUDOS:5", + }, + ]; + + const { walletClient, bank, exchange, merchant } = + await createSimpleTestkudosEnvironmentV2(t, coinConfigList); + + // Withdraw digital cash into the wallet. + + const { walletClient: w1 } = await createWalletDaemonWithClient(t, { + name: "w1", + persistent: true, + config: { + testing: { + devModeActive: true, + }, + }, + }); + + await withdrawViaBankV2(t, { + walletClient: w1, + bank, + exchange, + amount: "TESTKUDOS:20", + }); + + await w1.call(WalletApiOperation.TestingWaitTransactionsFinal, {}); + + // Prevent the wallet from doing refreshes by injecting a 5xx + // status for all refresh requests. + await w1.call(WalletApiOperation.ApplyDevExperiment, { + devExperimentUri: "taler://dev-experiment/start-block-refresh", + }); + + await makeTestPaymentV2(t, { + merchant, + walletClient: w1, + order: { + summary: "test", + amount: "TESTKUDOS:2", + }, + }); + + const userPayto = generateRandomPayto("foo"); + + const bal = await w1.call(WalletApiOperation.GetBalances, {}); + console.log(`balance: ${j2s(bal)}`); + + const balDet = await w1.call(WalletApiOperation.GetBalanceDetail, { + currency: "TESTKUDOS", + }); + console.log(`balance details: ${j2s(balDet)}`); + + // FIXME: Now check deposit/p2p/pay + + const depositCheckResp = await w1.call(WalletApiOperation.PrepareDeposit, { + amount: "TESTKUDOS:18" as AmountString, + depositPaytoUri: userPayto, + }); + + console.log(`check resp: ${j2s(depositCheckResp)}`); + + const depositCreateResp = await w1.call( + WalletApiOperation.CreateDepositGroup, + { + amount: "TESTKUDOS:18" as AmountString, + depositPaytoUri: userPayto, + }, + ); + + console.log(`create resp: ${j2s(depositCreateResp)}`); + + const depositTrackCond = w1.waitForNotificationCond((n) => { + return ( + n.type === NotificationType.TransactionStateTransition && + n.transactionId === depositCreateResp.transactionId && + n.newTxState.major === TransactionMajorState.Pending && + n.newTxState.minor === TransactionMinorState.Track + ); + }); + + await w1.call(WalletApiOperation.ApplyDevExperiment, { + devExperimentUri: "taler://dev-experiment/stop-block-refresh", + }); + + await depositTrackCond; +} + +runWalletBlockedDeposit.suites = ["wallet"]; diff --git a/packages/taler-harness/src/integrationtests/test-wallet-refresh-blocked.ts b/packages/taler-harness/src/integrationtests/test-wallet-refresh-blocked.ts deleted file mode 100644 index 4662c5110..000000000 --- a/packages/taler-harness/src/integrationtests/test-wallet-refresh-blocked.ts +++ /dev/null @@ -1,120 +0,0 @@ -/* - This file is part of GNU Taler - (C) 2020 Taler Systems S.A. - - GNU 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 - Foundation; either version 3, or (at your option) any later version. - - GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with - GNU Taler; see the file COPYING. If not, see - */ - -/** - * Imports. - */ -import { AmountString, j2s } from "@gnu-taler/taler-util"; -import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; -import { CoinConfig } from "../harness/denomStructures.js"; -import { GlobalTestState } from "../harness/harness.js"; -import { - createSimpleTestkudosEnvironmentV2, - createWalletDaemonWithClient, - makeTestPaymentV2, - withdrawViaBankV2, -} from "../harness/helpers.js"; - -const coinCommon = { - cipher: "RSA" as const, - durationLegal: "3 years", - durationSpend: "2 years", - durationWithdraw: "7 days", - feeDeposit: "TESTKUDOS:0", - feeRefresh: "TESTKUDOS:0", - feeRefund: "TESTKUDOS:0", - feeWithdraw: "TESTKUDOS:0", - rsaKeySize: 1024, -}; - -/** - * Run test for refreshe after a payment. - */ -export async function runWalletRefreshBlockedTest(t: GlobalTestState) { - // Set up test environment - - const coinConfigList: CoinConfig[] = [ - { - ...coinCommon, - name: "n1", - value: "TESTKUDOS:1", - }, - { - ...coinCommon, - name: "n5", - value: "TESTKUDOS:5", - }, - ]; - - const { walletClient, bank, exchange, merchant } = - await createSimpleTestkudosEnvironmentV2(t, coinConfigList); - - // Withdraw digital cash into the wallet. - - const { walletClient: w1 } = await createWalletDaemonWithClient(t, { - name: "w1", - config: { - testing: { - devModeActive: true, - }, - }, - }); - - await withdrawViaBankV2(t, { - walletClient: w1, - bank, - exchange, - amount: "TESTKUDOS:20", - }); - - await w1.call(WalletApiOperation.TestingWaitTransactionsFinal, {}); - - // Prevent the wallet from doing refreshes by injecting a 5xx - // status for all refresh requests. - await w1.call(WalletApiOperation.ApplyDevExperiment, { - devExperimentUri: "taler://dev-experiment/start-block-refresh", - }); - - await makeTestPaymentV2(t, { - merchant, - walletClient: w1, - order: { - summary: "test", - amount: "TESTKUDOS:2", - }, - }); - - const bal = await w1.call(WalletApiOperation.GetBalances, {}); - console.log(`balance: ${j2s(bal)}`); - - const balDet = await w1.call(WalletApiOperation.GetBalanceDetail, { - currency: "TESTKUDOS", - }); - console.log(`balance details: ${j2s(balDet)}`); - - // FIXME: Now check deposit/p2p/pay - - const depositCheckResp = await w1.call(WalletApiOperation.PrepareDeposit, { - amount: "TESTKUDOS:18" as AmountString, - depositPaytoUri: "payto://x-taler-bank/localhost/myuser", - }); - - console.log(`check resp: ${j2s(depositCheckResp)}`); - - // t.assertTrue(false); -} - -runWalletRefreshBlockedTest.suites = ["wallet"]; diff --git a/packages/taler-harness/src/integrationtests/testrunner.ts b/packages/taler-harness/src/integrationtests/testrunner.ts index 2bca91e45..063aefa43 100644 --- a/packages/taler-harness/src/integrationtests/testrunner.ts +++ b/packages/taler-harness/src/integrationtests/testrunner.ts @@ -101,7 +101,7 @@ import { runWalletGenDbTest } from "./test-wallet-gendb.js"; import { runWalletInsufficientBalanceTest } from "./test-wallet-insufficient-balance.js"; import { runWalletNotificationsTest } from "./test-wallet-notifications.js"; import { runWalletObservabilityTest } from "./test-wallet-observability.js"; -import { runWalletRefreshBlockedTest } from "./test-wallet-refresh-blocked.js"; +import { runWalletBlockedDeposit } from "./test-wallet-blocked-deposit.js"; import { runWalletRefreshTest } from "./test-wallet-refresh.js"; import { runWalletWirefeesTest } from "./test-wallet-wirefees.js"; import { runWallettestingTest } from "./test-wallettesting.js"; @@ -213,7 +213,7 @@ const allTests: TestMainFunction[] = [ runWalletWirefeesTest, runDenomLostTest, runWalletDenomExpireTest, - runWalletRefreshBlockedTest, + runWalletBlockedDeposit, ]; export interface TestRunSpec { -- cgit v1.2.3