diff options
Diffstat (limited to 'packages/taler-harness/src')
-rw-r--r-- | packages/taler-harness/src/harness/harness.ts | 48 | ||||
-rw-r--r-- | packages/taler-harness/src/index.ts | 70 | ||||
-rw-r--r-- | packages/taler-harness/src/integrationtests/test-deposit.ts | 22 | ||||
-rw-r--r-- | packages/taler-harness/src/integrationtests/test-wallet-dbless.ts | 27 |
4 files changed, 155 insertions, 12 deletions
diff --git a/packages/taler-harness/src/harness/harness.ts b/packages/taler-harness/src/harness/harness.ts index 0a898414d..8b74c9e9f 100644 --- a/packages/taler-harness/src/harness/harness.ts +++ b/packages/taler-harness/src/harness/harness.ts @@ -970,6 +970,19 @@ export class ExchangeService implements ExchangeServiceInterface { ); } + async runAggregatorOnceWithTimetravel(opts: { + timetravelMicroseconds: number; + }) { + let timetravelArgArr = []; + timetravelArgArr.push(`--timetravel=${opts.timetravelMicroseconds}`); + await runCommand( + this.globalState, + `exchange-${this.name}-aggregator-once`, + "taler-exchange-aggregator", + [...timetravelArgArr, "-c", this.configFilename, "-t"], + ); + } + async runAggregatorOnce() { try { await runCommand( @@ -1147,6 +1160,9 @@ export class ExchangeService implements ExchangeServiceInterface { exchangeHttpProc: ProcessWrapper | undefined; exchangeWirewatchProc: ProcessWrapper | undefined; + exchangeTransferProc: ProcessWrapper | undefined; + exchangeAggregatorProc: ProcessWrapper | undefined; + helperCryptoRsaProc: ProcessWrapper | undefined; helperCryptoEddsaProc: ProcessWrapper | undefined; helperCryptoCsProc: ProcessWrapper | undefined; @@ -1200,6 +1216,18 @@ export class ExchangeService implements ExchangeServiceInterface { await wirewatch.wait(); this.exchangeWirewatchProc = undefined; } + const aggregatorProc = this.exchangeAggregatorProc; + if (aggregatorProc) { + aggregatorProc.proc.kill("SIGTERM"); + await aggregatorProc.wait(); + this.exchangeAggregatorProc = undefined; + } + const transferProc = this.exchangeTransferProc; + if (transferProc) { + transferProc.proc.kill("SIGTERM"); + await transferProc.wait(); + this.exchangeTransferProc = undefined; + } const httpd = this.exchangeHttpProc; if (httpd) { httpd.proc.kill("SIGTERM"); @@ -1369,6 +1397,22 @@ export class ExchangeService implements ExchangeServiceInterface { ); } + private internalCreateAggregatorProc() { + this.exchangeAggregatorProc = this.globalState.spawnService( + "taler-exchange-aggregator", + ["-c", this.configFilename, ...this.timetravelArgArr], + `exchange-aggregator-${this.name}`, + ); + } + + private internalCreateTransferProc() { + this.exchangeTransferProc = this.globalState.spawnService( + "taler-exchange-transfer", + ["-c", this.configFilename, ...this.timetravelArgArr], + `exchange-transfer-${this.name}`, + ); + } + async start(): Promise<void> { if (this.isRunning()) { throw Error("exchange is already running"); @@ -1398,6 +1442,8 @@ export class ExchangeService implements ExchangeServiceInterface { ); this.internalCreateWirewatchProc(); + this.internalCreateTransferProc(); + this.internalCreateAggregatorProc(); this.exchangeHttpProc = this.globalState.spawnService( "taler-exchange-httpd", @@ -2062,7 +2108,7 @@ export class WalletService { [ "--wallet-db", dbPath, - "-LDEBUG", // FIXME: Make this configurable? + "-LTRACE", // FIXME: Make this configurable? "--no-throttle", // FIXME: Optionally do throttling for some tests? "advanced", "serve", diff --git a/packages/taler-harness/src/index.ts b/packages/taler-harness/src/index.ts index 59fa80411..287e1f5be 100644 --- a/packages/taler-harness/src/index.ts +++ b/packages/taler-harness/src/index.ts @@ -47,7 +47,14 @@ import { lintExchangeDeployment } from "./lint.js"; import { runEnvFull } from "./env-full.js"; import { clk } from "@gnu-taler/taler-util/clk"; import { createPlatformHttpLib } from "@gnu-taler/taler-util/http"; -import { BankAccessApiClient } from "@gnu-taler/taler-wallet-core"; +import { + BankAccessApiClient, + checkReserve, + CryptoDispatcher, + downloadExchangeInfo, + SynchronousCryptoWorkerFactoryPlain, + topupReserveWithDemobank, +} from "@gnu-taler/taler-wallet-core"; const logger = new Logger("taler-harness:index.ts"); @@ -162,7 +169,6 @@ advancedCli await runTestWithState(testState, runEnv1, "env1", true); }); - const sandcastleCli = testingCli.subcommand("sandcastleArgs", "sandcastle", { help: "Subcommands for handling GNU Taler sandcastle deployments.", }); @@ -261,6 +267,66 @@ deploymentCli }); deploymentCli + .subcommand("testTalerdotnetDemo", "test-demo-talerdotnet") + .action(async (args) => { + const http = createPlatformHttpLib(); + const cryptiDisp = new CryptoDispatcher( + new SynchronousCryptoWorkerFactoryPlain(), + ); + const cryptoApi = cryptiDisp.cryptoApi; + const reserveKeyPair = await cryptoApi.createEddsaKeypair({}); + const exchangeBaseUrl = "https://exchange.demo.taler.net/"; + const exchangeInfo = await downloadExchangeInfo(exchangeBaseUrl, http); + await topupReserveWithDemobank({ + amount: "KUDOS:10", + bankAccessApiBaseUrl: + "https://bank.demo.taler.net/demobanks/default/access-api/", + bankBaseUrl: "", + exchangeInfo, + http, + reservePub: reserveKeyPair.pub, + }); + let reserveUrl = new URL(`reserves/${reserveKeyPair.pub}`, exchangeBaseUrl); + reserveUrl.searchParams.set("timeout_ms", "30000"); + console.log("requesting", reserveUrl.href); + const longpollReq = http.fetch(reserveUrl.href, { + method: "GET", + }); + const reserveStatusResp = await longpollReq; + console.log("reserve status", reserveStatusResp.status); + }); + +deploymentCli + .subcommand("testLocalhostDemo", "test-demo-localhost") + .action(async (args) => { + // Run checks against the "env-full" demo deployment on localhost + const http = createPlatformHttpLib(); + const cryptiDisp = new CryptoDispatcher( + new SynchronousCryptoWorkerFactoryPlain(), + ); + const cryptoApi = cryptiDisp.cryptoApi; + const reserveKeyPair = await cryptoApi.createEddsaKeypair({}); + const exchangeBaseUrl = "http://localhost:8081/"; + const exchangeInfo = await downloadExchangeInfo(exchangeBaseUrl, http); + await topupReserveWithDemobank({ + amount: "TESTKUDOS:10", + bankAccessApiBaseUrl: "http://localhost:8082/taler-bank-access/", + bankBaseUrl: "", + exchangeInfo, + http, + reservePub: reserveKeyPair.pub, + }); + let reserveUrl = new URL(`reserves/${reserveKeyPair.pub}`, exchangeBaseUrl); + reserveUrl.searchParams.set("timeout_ms", "30000"); + console.log("requesting", reserveUrl.href); + const longpollReq = http.fetch(reserveUrl.href, { + method: "GET", + }); + const reserveStatusResp = await longpollReq; + console.log("reserve status", reserveStatusResp.status); + }); + +deploymentCli .subcommand("tipStatus", "tip-status") .requiredOption("merchantBaseUrl", ["--merchant-url"], clk.STRING) .requiredOption("merchantApikey", ["--merchant-apikey"], clk.STRING) diff --git a/packages/taler-harness/src/integrationtests/test-deposit.ts b/packages/taler-harness/src/integrationtests/test-deposit.ts index 6aa086107..8ea3fc12e 100644 --- a/packages/taler-harness/src/integrationtests/test-deposit.ts +++ b/packages/taler-harness/src/integrationtests/test-deposit.ts @@ -17,7 +17,11 @@ /** * Imports. */ -import { NotificationType, TransactionState } from "@gnu-taler/taler-util"; +import { + NotificationType, + TransactionMajorState, + TransactionMinorState, +} from "@gnu-taler/taler-util"; import { WalletApiOperation } from "@gnu-taler/taler-wallet-core"; import { GlobalTestState, getPayto } from "../harness/harness.js"; import { @@ -52,11 +56,19 @@ export async function runDepositTest(t: GlobalTestState) { const depositTxId = dgIdResp.transactionId; + const depositTrack = walletClient.waitForNotificationCond( + (n) => + n.type == NotificationType.TransactionStateTransition && + n.transactionId == depositTxId && + n.newTxState.major == TransactionMajorState.Pending && + n.newTxState.minor == TransactionMinorState.Track, + ); + const depositDone = walletClient.waitForNotificationCond( (n) => n.type == NotificationType.TransactionStateTransition && n.transactionId == depositTxId && - n.newTxState == TransactionState.Done, + n.newTxState.major == TransactionMajorState.Done, ); const depositGroupResult = await walletClient.client.call( @@ -70,6 +82,12 @@ export async function runDepositTest(t: GlobalTestState) { t.assertDeepEqual(depositGroupResult.transactionId, depositTxId); + await depositTrack; + + await exchange.runAggregatorOnceWithTimetravel({ + timetravelMicroseconds: 1000 * 1000 * 60 * 60 * 3, + }); + await depositDone; const transactions = await walletClient.client.call( diff --git a/packages/taler-harness/src/integrationtests/test-wallet-dbless.ts b/packages/taler-harness/src/integrationtests/test-wallet-dbless.ts index a1de7617b..35c60a89d 100644 --- a/packages/taler-harness/src/integrationtests/test-wallet-dbless.ts +++ b/packages/taler-harness/src/integrationtests/test-wallet-dbless.ts @@ -59,16 +59,29 @@ export async function runWalletDblessTest(t: GlobalTestState) { const reserveKeyPair = await cryptoApi.createEddsaKeypair({}); - await topupReserveWithDemobank( + let reserveUrl = new URL( + `reserves/${reserveKeyPair.pub}`, + exchange.baseUrl, + ); + reserveUrl.searchParams.set("timeout_ms", "30000"); + const longpollReq = http.fetch(reserveUrl.href, { + method: "GET", + }); + + await topupReserveWithDemobank({ + amount: "TESTKUDOS:10", http, - reserveKeyPair.pub, - bank.baseUrl, - bank.bankAccessApiBaseUrl, + reservePub: reserveKeyPair.pub, + bankAccessApiBaseUrl: bank.bankAccessApiBaseUrl, + bankBaseUrl: bank.baseUrl, exchangeInfo, - "TESTKUDOS:10", - ); + }); + + console.log("waiting for longpoll request"); + const resp = await longpollReq; + console.log(`got response, status ${resp.status}`); - await exchange.runWirewatchOnce(); + console.log(exchangeInfo); await checkReserve(http, exchange.baseUrl, reserveKeyPair.pub); |