diff options
author | Florian Dold <florian@dold.me> | 2024-06-17 13:05:16 +0200 |
---|---|---|
committer | Florian Dold <florian@dold.me> | 2024-06-17 13:05:16 +0200 |
commit | 05535fdc226f39666ed0a692871f54dea904af7b (patch) | |
tree | 6e9a4d6d376f576f4f1d271b6f6a691d501aeba2 /packages/taler-harness/src | |
parent | b59e472465440d95525e7e3d1225234525948b67 (diff) | |
download | wallet-core-05535fdc226f39666ed0a692871f54dea904af7b.tar.xz |
wallet-core,harness: new test, provide reason for exchange entry update conflicts
Diffstat (limited to 'packages/taler-harness/src')
3 files changed, 136 insertions, 0 deletions
diff --git a/packages/taler-harness/src/harness/harness.ts b/packages/taler-harness/src/harness/harness.ts index 4fc462ddf..d67ca7c48 100644 --- a/packages/taler-harness/src/harness/harness.ts +++ b/packages/taler-harness/src/harness/harness.ts @@ -1468,6 +1468,26 @@ export class ExchangeService implements ExchangeServiceInterface { await sh(this.globalState, "rm-secmod-keys", `rm ${eddsaKeydir}/*`); } + /** + * Generate a new master public key for the exchange. + */ + async regenerateMasterPub(): Promise<void> { + const cfg = Configuration.load(this.configFilename); + const masterPrivFile = cfg + .getPath("exchange-offline", "master_priv_file") + .required(); + fs.unlinkSync(masterPrivFile); + const exchangeMasterKey = createEddsaKeyPair(); + fs.writeFileSync(masterPrivFile, Buffer.from(exchangeMasterKey.eddsaPriv)); + cfg.setString( + "exchange", + "master_public_key", + encodeCrock(exchangeMasterKey.eddsaPub), + ); + + cfg.writeTo(this.configFilename, { excludeDefaults: true }); + } + async purgeDatabase(): Promise<void> { await sh( this.globalState, diff --git a/packages/taler-harness/src/integrationtests/test-exchange-master-pub-change.ts b/packages/taler-harness/src/integrationtests/test-exchange-master-pub-change.ts new file mode 100644 index 000000000..a66d94b57 --- /dev/null +++ b/packages/taler-harness/src/integrationtests/test-exchange-master-pub-change.ts @@ -0,0 +1,114 @@ +/* + 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 <http://www.gnu.org/licenses/> + */ + +/** + * Imports. + */ +import { + ExchangeUpdateStatus, + TalerErrorCode, + j2s, +} from "@gnu-taler/taler-util"; +import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; +import { defaultCoinConfig } from "../harness/denomStructures.js"; +import { + ExchangeService, + GlobalTestState, + setupDb, +} from "../harness/harness.js"; +import { + createSimpleTestkudosEnvironmentV3, + withdrawViaBankV3, +} from "../harness/helpers.js"; + +/** + * Test the wallet's behavior when the exchange switches to a completely + * new master public keyy. + */ +export async function runExchangeMasterPubChangeTest( + t: GlobalTestState, +): Promise<void> { + // Set up test environment + + const { walletClient, exchange, bankClient, exchangeBankAccount } = + await createSimpleTestkudosEnvironmentV3(t); + + const wres = await withdrawViaBankV3(t, { + walletClient, + amount: "TESTKUDOS:10", + bankClient, + exchange, + }); + + await wres.withdrawalFinishedCond; + + t.logStep("withdrawal-done"); + + const exchangesListOld = await walletClient.call( + WalletApiOperation.ListExchanges, + {}, + ); + + console.log(j2s(exchangesListOld)); + + await exchange.stop(); + + // Instead of reconfiguring the old exchange, we just create a new exchange here + // that runs under the same base URL as the old exchange. + + const db2 = await setupDb(t, { + nameSuffix: "e2", + }); + const exchange2 = ExchangeService.create(t, { + name: "testexchange-2", + currency: "TESTKUDOS", + httpPort: 8081, + database: db2.connStr, + }); + + await exchange2.addBankAccount("1", exchangeBankAccount); + exchange2.addCoinConfigList(defaultCoinConfig.map((x) => x("TESTKUDOS"))); + await exchange2.start(); + + t.logStep("exchange-restarted"); + + const err = await t.assertThrowsTalerErrorAsync(async () => { + await walletClient.call(WalletApiOperation.UpdateExchangeEntry, { + exchangeBaseUrl: exchange.baseUrl, + force: true, + }); + }); + + console.log("updateExchangeEntry err:", j2s(err)); + + const exchangesList = await walletClient.call( + WalletApiOperation.ListExchanges, + {}, + ); + + console.log(j2s(exchangesList)); + + t.assertDeepEqual( + exchangesList.exchanges[0].exchangeUpdateStatus, + ExchangeUpdateStatus.UnavailableUpdate, + ); + t.assertDeepEqual( + exchangesList.exchanges[0].unavailableReason?.code, + TalerErrorCode.WALLET_EXCHANGE_ENTRY_UPDATE_CONFLICT, + ); +} + +runExchangeMasterPubChangeTest.suites = ["wallet", "exchange"]; diff --git a/packages/taler-harness/src/integrationtests/testrunner.ts b/packages/taler-harness/src/integrationtests/testrunner.ts index 4588310b1..b329036eb 100644 --- a/packages/taler-harness/src/integrationtests/testrunner.ts +++ b/packages/taler-harness/src/integrationtests/testrunner.ts @@ -42,6 +42,7 @@ import { runDepositTest } from "./test-deposit.js"; import { runExchangeDepositTest } from "./test-exchange-deposit.js"; import { runExchangeManagementFaultTest } from "./test-exchange-management-fault.js"; import { runExchangeManagementTest } from "./test-exchange-management.js"; +import { runExchangeMasterPubChangeTest } from "./test-exchange-master-pub-change.js"; import { runExchangePurseTest } from "./test-exchange-purse.js"; import { runExchangeTimetravelTest } from "./test-exchange-timetravel.js"; import { runFeeRegressionTest } from "./test-fee-regression.js"; @@ -234,6 +235,7 @@ const allTests: TestMainFunction[] = [ runWithdrawalHandoverTest, runWithdrawalAmountTest, runWithdrawalFlexTest, + runExchangeMasterPubChangeTest, ]; export interface TestRunSpec { |