diff options
Diffstat (limited to 'packages/taler-harness')
| -rw-r--r-- | packages/taler-harness/src/harness/helpers.ts | 35 | ||||
| -rw-r--r-- | packages/taler-harness/src/integrationtests/test-peer-to-peer-pull.ts | 74 | 
2 files changed, 91 insertions, 18 deletions
| diff --git a/packages/taler-harness/src/harness/helpers.ts b/packages/taler-harness/src/harness/helpers.ts index c1ce463fa..d203cc608 100644 --- a/packages/taler-harness/src/harness/helpers.ts +++ b/packages/taler-harness/src/harness/helpers.ts @@ -31,6 +31,7 @@ import {    PreparePayResultType,    NotificationType,    WithdrawalGroupFinishedNotification, +  WalletNotification,  } from "@gnu-taler/taler-util";  import {    BankAccessApi, @@ -297,7 +298,6 @@ export async function createSimpleTestkudosEnvironmentV2(    const walletService = new WalletService(t, {      name: "wallet", -    useInMemoryDb: true,    });    await walletService.start();    await walletService.pingUntilAvailable(); @@ -326,6 +326,39 @@ export async function createSimpleTestkudosEnvironmentV2(    };  } +export interface CreateWalletArgs { +  handleNotification?(wn: WalletNotification): void; +  name: string; +} + +export async function createWalletDaemonWithClient( +  t: GlobalTestState, +  args: CreateWalletArgs, +): Promise<{ walletClient: WalletClient; walletService: WalletService }> { +  const walletService = new WalletService(t, { +    name: "wallet", +    useInMemoryDb: true, +  }); +  await walletService.start(); +  await walletService.pingUntilAvailable(); + +  const walletClient = new WalletClient({ +    unixPath: walletService.socketPath, +    onNotification(n) { +      console.log("got notification", n); +      if (args.handleNotification) { +        args.handleNotification(n); +      } +    }, +  }); +  await walletClient.connect(); +  await walletClient.client.call(WalletApiOperation.InitWallet, { +    skipDefaults: true, +  }); + +  return { walletClient, walletService }; +} +  export interface FaultyMerchantTestEnvironment {    commonDb: DbInfo;    bank: BankService; diff --git a/packages/taler-harness/src/integrationtests/test-peer-to-peer-pull.ts b/packages/taler-harness/src/integrationtests/test-peer-to-peer-pull.ts index 0bab14578..58a1f271e 100644 --- a/packages/taler-harness/src/integrationtests/test-peer-to-peer-pull.ts +++ b/packages/taler-harness/src/integrationtests/test-peer-to-peer-pull.ts @@ -17,12 +17,21 @@  /**   * Imports.   */ -import { AbsoluteTime, Duration, j2s } from "@gnu-taler/taler-util"; +import { +  AbsoluteTime, +  Duration, +  j2s, +  NotificationType, +  WalletNotification, +} from "@gnu-taler/taler-util";  import { WalletApiOperation } from "@gnu-taler/taler-wallet-core";  import { GlobalTestState, WalletCli } from "../harness/harness.js";  import {    createSimpleTestkudosEnvironment, +  createSimpleTestkudosEnvironmentV2, +  createWalletDaemonWithClient,    withdrawViaBank, +  withdrawViaBankV2,  } from "../harness/helpers.js";  /** @@ -31,19 +40,40 @@ import {  export async function runPeerToPeerPullTest(t: GlobalTestState) {    // Set up test environment -  const { bank, exchange } = await createSimpleTestkudosEnvironment(t); +  const { bank, exchange } = await createSimpleTestkudosEnvironmentV2(t); + +  let allW1Notifications: WalletNotification[] = []; +  let allW2Notifications: WalletNotification[] = []; + +  const w1 = await createWalletDaemonWithClient(t, { +    name: "w1", +    handleNotification(wn) { +      allW1Notifications.push(wn); +    }, +  }); +  const w2 = await createWalletDaemonWithClient(t, { +    name: "w2", +    handleNotification(wn) { +      allW2Notifications.push(wn); +    }, +  });    // Withdraw digital cash into the wallet. -  const wallet1 = new WalletCli(t, "w1"); -  const wallet2 = new WalletCli(t, "w2"); -  await withdrawViaBank(t, { -    wallet: wallet2, +  const wallet1 = w1.walletClient; +  const wallet2 = w2.walletClient; + +  const withdrawalDoneCond = wallet2.waitForNotificationCond( +    (x) => x.type === NotificationType.WithdrawGroupFinished, +  ); + +  await withdrawViaBankV2(t, { +    walletClient: wallet2,      bank,      exchange,      amount: "TESTKUDOS:20",    }); -  await wallet1.runUntilDone(); +  await withdrawalDoneCond;    const purse_expiration = AbsoluteTime.toTimestamp(      AbsoluteTime.addDuration( @@ -52,6 +82,10 @@ export async function runPeerToPeerPullTest(t: GlobalTestState) {      ),    ); +  const peerPullCreditReadyCond = wallet2.waitForNotificationCond( +    (x) => x.type === NotificationType.PeerPullCreditReady, +  ); +    const resp = await wallet1.client.call(      WalletApiOperation.InitiatePeerPullCredit,      { @@ -64,9 +98,7 @@ export async function runPeerToPeerPullTest(t: GlobalTestState) {      },    ); -  // Wait until the initiation is actually done. -  // FIXME: Use the daemonized wallet and notifications to know this -  await wallet1.runPending(); +  await peerPullCreditReadyCond;    const checkResp = await wallet2.client.call(      WalletApiOperation.PreparePeerPullDebit, @@ -77,20 +109,23 @@ export async function runPeerToPeerPullTest(t: GlobalTestState) {    console.log(`checkResp: ${j2s(checkResp)}`); -  const acceptResp = await wallet2.client.call( -    WalletApiOperation.ConfirmPeerPullDebit, -    { -      peerPullPaymentIncomingId: checkResp.peerPullPaymentIncomingId, -    }, +  // FIXME: The wallet should emit a more appropriate notification here. +  // Yes, it's technically a withdrawal. +  const peerPullCreditDoneCond = wallet1.waitForNotificationCond( +    (x) => x.type === NotificationType.WithdrawGroupFinished,    ); -  await wallet1.runUntilDone(); -  await wallet2.runUntilDone(); +  await wallet2.client.call(WalletApiOperation.ConfirmPeerPullDebit, { +    peerPullPaymentIncomingId: checkResp.peerPullPaymentIncomingId, +  }); + +  await peerPullCreditDoneCond;    const txn1 = await wallet1.client.call(      WalletApiOperation.GetTransactions,      {},    ); +    const txn2 = await wallet2.client.call(      WalletApiOperation.GetTransactions,      {}, @@ -98,6 +133,11 @@ export async function runPeerToPeerPullTest(t: GlobalTestState) {    console.log(`txn1: ${j2s(txn1)}`);    console.log(`txn2: ${j2s(txn2)}`); + +  console.log(`w1 notifications: ${j2s(allW1Notifications)}`); + +  // Check that we don't have an excessive number of notifications. +  t.assertTrue(allW1Notifications.length <= 60);  }  runPeerToPeerPullTest.suites = ["wallet"]; | 
