diff options
author | Özgür Kesim <oec-taler@kesim.org> | 2023-08-25 13:24:30 +0200 |
---|---|---|
committer | Özgür Kesim <oec-taler@kesim.org> | 2023-08-25 13:24:30 +0200 |
commit | a58f73ecdb995e02a770338aa8a8aa529ccfdfaa (patch) | |
tree | e1f329bb59ffd1fa4419241cf3bc849738103b54 /packages/taler-harness/src/harness/helpers.ts | |
parent | 5ab3070b3a63c2e8fed0e413dea06cf03fb48f1e (diff) | |
parent | 896841aec5dc3594d83cc300349d20ec2270f88e (diff) |
Merge branch 'master' into age-withdraw
Diffstat (limited to 'packages/taler-harness/src/harness/helpers.ts')
-rw-r--r-- | packages/taler-harness/src/harness/helpers.ts | 197 |
1 files changed, 196 insertions, 1 deletions
diff --git a/packages/taler-harness/src/harness/helpers.ts b/packages/taler-harness/src/harness/helpers.ts index 3e91c8bd9..d41ffdd00 100644 --- a/packages/taler-harness/src/harness/helpers.ts +++ b/packages/taler-harness/src/harness/helpers.ts @@ -32,6 +32,7 @@ import { NotificationType, WalletNotification, TransactionMajorState, + Logger, } from "@gnu-taler/taler-util"; import { BankAccessApi, @@ -49,18 +50,24 @@ import { DbInfo, ExchangeService, ExchangeServiceInterface, + FakebankService, getPayto, GlobalTestState, MerchantPrivateApi, MerchantService, MerchantServiceInterface, setupDb, + setupSharedDb, WalletCli, WalletClient, WalletService, WithAuthorization, } from "./harness.js"; +import * as fs from "fs"; + +const logger = new Logger("helpers.ts"); + /** * @deprecated */ @@ -94,6 +101,10 @@ export interface EnvOptions { ageMaskSpec?: string; mixedAgeRestriction?: boolean; + + additionalExchangeConfig?(e: ExchangeService): void; + additionalMerchantConfig?(m: MerchantService): void; + additionalBankConfig?(b: BankService): void; } /** @@ -204,6 +215,179 @@ export async function createSimpleTestkudosEnvironment( }; } +export async function useSharedTestkudosEnvironment(t: GlobalTestState) { + const coinConfig: CoinConfig[] = defaultCoinConfig.map((x) => x("TESTKUDOS")); + + const sharedDir = `/tmp/taler-harness@${process.env.USER}`; + + fs.mkdirSync(sharedDir, { recursive: true }); + + const db = await setupSharedDb(t); + + let bank: FakebankService; + + const prevSetupDone = fs.existsSync(sharedDir + "/setup-done"); + + logger.info(`previous setup done: ${prevSetupDone}`); + + + // Wallet has longer startup-time and no dependencies, + // so we start it rather early. + const walletStartProm = createWalletDaemonWithClient(t, { name: "wallet" }) + + if (fs.existsSync(sharedDir + "/bank.conf")) { + logger.info("reusing existing bank"); + bank = BankService.fromExistingConfig(t, { + overridePath: sharedDir, + }); + } else { + logger.info("creating new bank config"); + bank = await BankService.create(t, { + allowRegistrations: true, + currency: "TESTKUDOS", + database: db.connStr, + httpPort: 8082, + overrideTestDir: sharedDir, + }); + } + + logger.info("setting up exchange"); + + const exchangeName = "testexchange-1"; + const exchangeConfigFilename = sharedDir + `/exchange-${exchangeName}.conf`; + + logger.info(`exchange config filename: ${exchangeConfigFilename}`); + + let exchange: ExchangeService; + + if (fs.existsSync(exchangeConfigFilename)) { + logger.info("reusing existing exchange config"); + exchange = ExchangeService.fromExistingConfig(t, exchangeName, { + overridePath: sharedDir, + }); + } else { + logger.info("creating new exchange config"); + exchange = ExchangeService.create(t, { + name: "testexchange-1", + currency: "TESTKUDOS", + httpPort: 8081, + database: db.connStr, + overrideTestDir: sharedDir, + }); + } + + logger.info("setting up merchant"); + + let merchant: MerchantService; + const merchantName = "testmerchant-1"; + const merchantConfigFilename = sharedDir + `/merchant-${merchantName}}`; + + if (fs.existsSync(merchantConfigFilename)) { + merchant = MerchantService.fromExistingConfig(t, merchantName, { + overridePath: sharedDir, + }); + } else { + merchant = await MerchantService.create(t, { + name: "testmerchant-1", + currency: "TESTKUDOS", + httpPort: 8083, + database: db.connStr, + overrideTestDir: sharedDir, + }); + } + + logger.info("creating bank account for exchange"); + + const exchangeBankAccount = await bank.createExchangeAccount( + "myexchange", + "x", + ); + + logger.info("creating exchange bank account"); + await exchange.addBankAccount("1", exchangeBankAccount); + + bank.setSuggestedExchange(exchange, exchangeBankAccount.accountPaytoUri); + + exchange.addCoinConfigList(coinConfig); + + merchant.addExchange(exchange); + + logger.info("basic setup done, starting services"); + + if (!prevSetupDone) { + // Must be done sequentially, due to a concurrency + // issue in the *-dbinit tools. + await exchange.dbinit(); + await merchant.dbinit(); + } + + const bankStart = async () => { + await bank.start(); + await bank.pingUntilAvailable(); + }; + + const exchangeStart = async () => { + await exchange.start({ + skipDbinit: true, + skipKeyup: prevSetupDone, + }); + await exchange.pingUntilAvailable(); + }; + + const merchStart = async () => { + await merchant.start({ + skipDbinit: true, + }); + await merchant.pingUntilAvailable(); + + if (!prevSetupDone) { + await merchant.addInstance({ + id: "default", + name: "Default Instance", + paytoUris: [getPayto("merchant-default")], + defaultWireTransferDelay: Duration.toTalerProtocolDuration( + Duration.fromSpec({ minutes: 1 }), + ), + }); + + await merchant.addInstance({ + id: "minst1", + name: "minst1", + paytoUris: [getPayto("minst1")], + defaultWireTransferDelay: Duration.toTalerProtocolDuration( + Duration.fromSpec({ minutes: 1 }), + ), + }); + } + }; + + await bankStart() + + const res = await Promise.all([ + exchangeStart(), + merchStart(), + undefined, + walletStartProm, + ]); + + const walletClient = res[3].walletClient; + const walletService = res[3].walletService; + + fs.writeFileSync(sharedDir + "/setup-done", "OK"); + + logger.info("setup done!"); + + return { + commonDb: db, + exchange, + merchant, + walletClient, + walletService, + bank, + exchangeBankAccount, + }; +} + /** * Run a test case with a simple TESTKUDOS Taler environment, consisting * of one exchange, one bank and one merchant. @@ -246,6 +430,9 @@ export async function createSimpleTestkudosEnvironmentV2( bank.setSuggestedExchange(exchange, exchangeBankAccount.accountPaytoUri); + if (opts.additionalBankConfig) { + opts.additionalBankConfig(bank); + } await bank.start(); await bank.pingUntilAvailable(); @@ -272,11 +459,17 @@ export async function createSimpleTestkudosEnvironmentV2( exchange.addCoinConfigList(coinConfig); } + if (opts.additionalExchangeConfig) { + opts.additionalExchangeConfig(exchange); + } await exchange.start(); await exchange.pingUntilAvailable(); merchant.addExchange(exchange); + if (opts.additionalMerchantConfig) { + opts.additionalMerchantConfig(merchant); + } await merchant.start(); await merchant.pingUntilAvailable(); @@ -336,7 +529,7 @@ export async function createWalletDaemonWithClient( const walletClient = new WalletClient({ unixPath: walletService.socketPath, onNotification(n) { - console.log("got notification", n); + console.log(`got ${args.name} notification`, n); if (args.handleNotification) { args.handleNotification(n); } @@ -610,6 +803,8 @@ export async function applyTimeTravel( /** * Make a simple payment and check that it succeeded. + * + * @deprecated */ export async function makeTestPayment( t: GlobalTestState, |