diff options
author | Florian Dold <florian@dold.me> | 2021-01-14 17:24:44 +0100 |
---|---|---|
committer | Florian Dold <florian@dold.me> | 2021-01-14 17:24:44 +0100 |
commit | 6293de7bfa4d8a52091b251e2333e9710ce1b22a (patch) | |
tree | 79fa71811fff50886568fcd4a5f5d9406565e9d9 | |
parent | 657c4b6377d405640d353a8c5e15dbb6ac59800b (diff) |
fix reserve state machine bug, use simpler denominations in revocation test
5 files changed, 81 insertions, 40 deletions
diff --git a/packages/taler-wallet-cli/src/integrationtests/helpers.ts b/packages/taler-wallet-cli/src/integrationtests/helpers.ts index c51c306c9..f9051ccc0 100644 --- a/packages/taler-wallet-cli/src/integrationtests/helpers.ts +++ b/packages/taler-wallet-cli/src/integrationtests/helpers.ts @@ -45,8 +45,11 @@ import { ConfirmPayResultType, ContractTerms, } from "taler-wallet-core"; -import { FaultInjectedExchangeService, FaultInjectedMerchantService } from "./faultInjection"; -import { defaultCoinConfig } from "./denomStructures"; +import { + FaultInjectedExchangeService, + FaultInjectedMerchantService, +} from "./faultInjection"; +import { CoinConfig, defaultCoinConfig } from "./denomStructures"; export interface SimpleTestEnvironment { commonDb: DbInfo; @@ -63,6 +66,7 @@ export interface SimpleTestEnvironment { */ export async function createSimpleTestkudosEnvironment( t: GlobalTestState, + coinConfig: CoinConfig[] = defaultCoinConfig.map((x) => x("TESTKUDOS")), ): Promise<SimpleTestEnvironment> { const db = await setupDb(t); @@ -99,7 +103,7 @@ export async function createSimpleTestkudosEnvironment( await bank.pingUntilAvailable(); - exchange.addOfferedCoins(defaultCoinConfig); + exchange.addCoinConfigList(coinConfig); await exchange.start(); await exchange.pingUntilAvailable(); @@ -139,7 +143,7 @@ export interface FaultyMerchantTestEnvironment { commonDb: DbInfo; bank: BankService; exchange: ExchangeService; - faultyExchange: FaultInjectedExchangeService, + faultyExchange: FaultInjectedExchangeService; exchangeBankAccount: ExchangeBankAccount; merchant: MerchantService; faultyMerchant: FaultInjectedMerchantService; @@ -185,7 +189,10 @@ export async function createFaultInjectedMerchantTestkudosEnvironment( ); exchange.addBankAccount("1", exchangeBankAccount); - bank.setSuggestedExchange(faultyExchange, exchangeBankAccount.accountPaytoUri); + bank.setSuggestedExchange( + faultyExchange, + exchangeBankAccount.accountPaytoUri, + ); await bank.start(); diff --git a/packages/taler-wallet-cli/src/integrationtests/test-revocation.ts b/packages/taler-wallet-cli/src/integrationtests/test-revocation.ts index 0fcf7a932..de4086df9 100644 --- a/packages/taler-wallet-cli/src/integrationtests/test-revocation.ts +++ b/packages/taler-wallet-cli/src/integrationtests/test-revocation.ts @@ -17,6 +17,7 @@ /** * Imports. */ +import { CoinConfig } from "./denomStructures"; import { GlobalTestState, ExchangeService, @@ -28,7 +29,6 @@ import { withdrawViaBank, makeTestPayment, } from "./helpers"; -import { CoinDumpJson } from "taler-wallet-core"; async function revokeAllWalletCoins(req: { wallet: WalletCli; @@ -45,7 +45,9 @@ async function revokeAllWalletCoins(req: { for (const x of usedDenomHashes.values()) { await exchange.revokeDenomination(x); } - + await exchange.stop(); + await exchange.start(); + await exchange.pingUntilAvailable(); await exchange.keyup(); await exchange.pingUntilAvailable(); await merchant.stop(); @@ -59,12 +61,25 @@ async function revokeAllWalletCoins(req: { export async function runRevocationTest(t: GlobalTestState) { // Set up test environment + const coin_u1: CoinConfig = { + durationLegal: "3 years", + durationSpend: "2 years", + durationWithdraw: "7 days", + rsaKeySize: 1024, + name: `$TESTKUDOS_u1`, + value: `TESTKUDOS:1`, + feeDeposit: `TESTKUDOS:0`, + feeRefresh: `TESTKUDOS:0`, + feeRefund: `TESTKUDOS:0`, + feeWithdraw: `TESTKUDOS:0`, + }; + const { wallet, bank, exchange, merchant, - } = await createSimpleTestkudosEnvironment(t); + } = await createSimpleTestkudosEnvironment(t, [coin_u1]); // Withdraw digital cash into the wallet. diff --git a/packages/taler-wallet-cli/src/integrationtests/testrunner.ts b/packages/taler-wallet-cli/src/integrationtests/testrunner.ts index fbc25168e..2acec0627 100644 --- a/packages/taler-wallet-cli/src/integrationtests/testrunner.ts +++ b/packages/taler-wallet-cli/src/integrationtests/testrunner.ts @@ -170,7 +170,7 @@ export async function runTests(spec: TestRunSpec) { testRootDir, }; - currentChild = child_process.fork(__filename, { + currentChild = child_process.fork(__filename, ["__TWCLI_TESTWORKER"], { env: { TWCLI_RUN_TEST_INSTRUCTION: JSON.stringify(testInstr), ...process.env, @@ -251,9 +251,9 @@ export function getTestInfo(): TestInfo[] { } const runTestInstrStr = process.env["TWCLI_RUN_TEST_INSTRUCTION"]; -if (runTestInstrStr) { +if (runTestInstrStr && process.argv.includes("__TWCLI_TESTWORKER")) { // Test will call taler-wallet-cli, so we must not propagate this variable. - delete process.env["TWCLI_RUN_TEST_NAME"]; + delete process.env["TWCLI_RUN_TEST_INSTRUCTION"]; const { testRootDir, testName } = JSON.parse( runTestInstrStr, ) as RunTestChildInstruction; diff --git a/packages/taler-wallet-core/src/operations/recoup.ts b/packages/taler-wallet-core/src/operations/recoup.ts index 7bbac8a99..f6b29536b 100644 --- a/packages/taler-wallet-core/src/operations/recoup.ts +++ b/packages/taler-wallet-core/src/operations/recoup.ts @@ -83,6 +83,9 @@ async function putGroupAsFinished( recoupGroup: RecoupGroupRecord, coinIdx: number, ): Promise<void> { + logger.trace( + `setting coin ${coinIdx} of ${recoupGroup.coinPubs.length} as finished`, + ); if (recoupGroup.timestampFinished) { return; } @@ -94,6 +97,7 @@ async function putGroupAsFinished( } } if (allFinished) { + logger.trace("all recoups of recoup group are finished"); recoupGroup.timestampFinished = getTimestampNow(); recoupGroup.retryInfo = initRetryInfo(false); recoupGroup.lastError = undefined; @@ -230,7 +234,7 @@ async function recoupRefreshCoin( const recoupRequest = await ws.cryptoApi.createRecoupRequest(coin); const reqUrl = new URL(`/coins/${coin.coinPub}/recoup`, coin.exchangeBaseUrl); - logger.trace("making recoup request"); + logger.trace(`making recoup request for ${coin.coinPub}`); const resp = await ws.http.postJson(reqUrl.href, recoupRequest); const recoupConfirmation = await readSuccessResponseJsonOrThrow( @@ -244,12 +248,14 @@ async function recoupRefreshCoin( const exchange = await ws.db.get(Stores.exchanges, coin.exchangeBaseUrl); if (!exchange) { + logger.warn("exchange for recoup does not exist anymore"); // FIXME: report inconsistency? return; } const exchangeDetails = exchange.details; if (!exchangeDetails) { // FIXME: report inconsistency? + logger.warn("exchange details for recoup not found"); return; } @@ -272,9 +278,11 @@ async function recoupRefreshCoin( const oldCoin = await tx.get(Stores.coins, cs.oldCoinPub); const revokedCoin = await tx.get(Stores.coins, coin.coinPub); if (!revokedCoin) { + logger.warn("revoked coin for recoup not found"); return; } if (!oldCoin) { + logger.warn("refresh old coin for recoup not found"); return; } revokedCoin.status = CoinStatus.Dormant; diff --git a/packages/taler-wallet-core/src/operations/reserves.ts b/packages/taler-wallet-core/src/operations/reserves.ts index 4e4db1fc9..7c878668f 100644 --- a/packages/taler-wallet-core/src/operations/reserves.ts +++ b/packages/taler-wallet-core/src/operations/reserves.ts @@ -604,37 +604,50 @@ async function updateReserve( denoms, ); - if (denomSelInfo.selectedDenoms.length > 0) { - let withdrawalGroupId: string; - - if (!newReserve.initialWithdrawalStarted) { - withdrawalGroupId = newReserve.initialWithdrawalGroupId; - newReserve.initialWithdrawalStarted = true; - } else { - withdrawalGroupId = encodeCrock(randomBytes(32)); - } - - const withdrawalRecord: WithdrawalGroupRecord = { - withdrawalGroupId: withdrawalGroupId, - exchangeBaseUrl: reserve.exchangeBaseUrl, - reservePub: reserve.reservePub, - rawWithdrawalAmount: remainingAmount, - timestampStart: getTimestampNow(), - retryInfo: initRetryInfo(), - lastError: undefined, - denomsSel: denomSelectionInfoToState(denomSelInfo), - secretSeed: encodeCrock(getRandomBytes(64)), - }; + logger.trace( + `Remaining unclaimed amount in reseve is ${Amounts.stringify( + remainingAmount, + )} and can be withdrawn with ${ + denomSelInfo.selectedDenoms.length + } coins`, + ); + if (denomSelInfo.selectedDenoms.length === 0) { + newReserve.reserveStatus = ReserveRecordStatus.DORMANT; newReserve.lastError = undefined; newReserve.retryInfo = initRetryInfo(false); - newReserve.reserveStatus = ReserveRecordStatus.DORMANT; - await tx.put(Stores.reserves, newReserve); - await tx.put(Stores.withdrawalGroups, withdrawalRecord); - return withdrawalRecord; + return; } - return; + + let withdrawalGroupId: string; + + if (!newReserve.initialWithdrawalStarted) { + withdrawalGroupId = newReserve.initialWithdrawalGroupId; + newReserve.initialWithdrawalStarted = true; + } else { + withdrawalGroupId = encodeCrock(randomBytes(32)); + } + + const withdrawalRecord: WithdrawalGroupRecord = { + withdrawalGroupId: withdrawalGroupId, + exchangeBaseUrl: reserve.exchangeBaseUrl, + reservePub: reserve.reservePub, + rawWithdrawalAmount: remainingAmount, + timestampStart: getTimestampNow(), + retryInfo: initRetryInfo(), + lastError: undefined, + denomsSel: denomSelectionInfoToState(denomSelInfo), + secretSeed: encodeCrock(getRandomBytes(64)), + }; + + newReserve.lastError = undefined; + newReserve.retryInfo = initRetryInfo(false); + newReserve.reserveStatus = ReserveRecordStatus.DORMANT; + + await tx.put(Stores.reserves, newReserve); + await tx.put(Stores.withdrawalGroups, withdrawalRecord); + return withdrawalRecord; }, ); @@ -645,8 +658,6 @@ async function updateReserve( withdrawalGroupId: newWithdrawalGroup.withdrawalGroupId, }); await processWithdrawGroup(ws, newWithdrawalGroup.withdrawalGroupId); - } else { - console.trace("withdraw session already existed"); } return { ready: true }; |