fix exchange-timetravel test case with latest exchange version

This commit is contained in:
Florian Dold 2022-01-24 21:14:21 +01:00
parent 1374b37d26
commit 26ee8e3c71
No known key found for this signature in database
GPG Key ID: D2E4F00F29D02A4B
3 changed files with 63 additions and 37 deletions

View File

@ -47,6 +47,7 @@ import {
codecForDuration,
} from "./time.js";
import { Amounts, codecForAmountString } from "./amounts.js";
import { strcmp } from "./helpers.js";
/**
* Denomination as found in the /keys response from the exchange.
@ -1125,6 +1126,47 @@ export interface CsDenominationPubKey {
// FIXME: finish definition
}
export namespace DenominationPubKey {
export function cmp(
p1: DenominationPubKey,
p2: DenominationPubKey,
): -1 | 0 | 1 {
if (p1.cipher < p2.cipher) {
return -1;
} else if (p1.cipher > p2.cipher) {
return +1;
}
if (
p1.cipher === DenomKeyType.LegacyRsa &&
p2.cipher === DenomKeyType.LegacyRsa
) {
return strcmp(p1.rsa_public_key, p2.rsa_public_key);
} else if (
p1.cipher === DenomKeyType.Rsa &&
p2.cipher === DenomKeyType.Rsa
) {
if ((p1.age_mask ?? 0) < (p2.age_mask ?? 0)) {
return -1;
} else if ((p1.age_mask ?? 0) > (p2.age_mask ?? 0)) {
return 1;
}
return strcmp(p1.rsa_public_key, p2.rsa_public_key);
} else {
throw Error("unsupported cipher");
}
}
export function lift(p1: DenominationPubKey | string): DenominationPubKey {
if (typeof p1 === "string") {
return {
cipher: DenomKeyType.LegacyRsa,
rsa_public_key: p1,
};
}
return p1;
}
}
export const codecForDenominationPubKey = () =>
buildCodecForUnion<DenominationPubKey>()
.discriminateOn("cipher")

View File

@ -19,17 +19,14 @@
*/
import {
codecForExchangeKeysJson,
ConfirmPayResultType,
DenominationPubKey,
Duration,
durationFromSpec,
PreparePayResultType,
stringifyTimestamp,
} from "@gnu-taler/taler-util";
import {
NodeHttpLib,
PendingOperationsResponse,
readSuccessResponseJsonOrThrow,
WalletApiOperation,
} from "@gnu-taler/taler-wallet-core";
import { makeNoFeeCoinConfig } from "../harness/denomStructures";
import {
@ -40,7 +37,7 @@ import {
MerchantService,
setupDb,
WalletCli,
getPayto
getPayto,
} from "../harness/harness.js";
import { startWithdrawViaBank, withdrawViaBank } from "../harness/helpers.js";
@ -192,19 +189,30 @@ export async function runExchangeTimetravelTest(t: GlobalTestState) {
console.log("=== KEYS RESPONSE 1 ===");
console.log("list issue date", stringifyTimestamp(keys1.list_issue_date));
console.log("num denoms", keys1.denoms.length)
console.log("num denoms", keys1.denoms.length);
console.log("denoms", JSON.stringify(denomPubs1, undefined, 2));
console.log("=== KEYS RESPONSE 2 ===");
console.log("list issue date", stringifyTimestamp(keys2.list_issue_date));
console.log("num denoms", keys2.denoms.length)
console.log("num denoms", keys2.denoms.length);
console.log("denoms", JSON.stringify(denomPubs2, undefined, 2));
for (const da of denomPubs1) {
if (!dps2.has(da.denomPub)) {
let found = false;
for (const db of denomPubs2) {
const d1 = DenominationPubKey.lift(da.denomPub);
const d2 = DenominationPubKey.lift(db.denomPub);
if (DenominationPubKey.cmp(d1, d2) === 0) {
found = true;
break;
}
}
if (!found) {
console.log("=== ERROR ===");
console.log(`denomination with public key ${da.denomPub} is not present in new /keys response`);
console.log(
`denomination with public key ${da.denomPub} is not present in new /keys response`,
);
console.log(
`the new /keys response was issued ${stringifyTimestamp(
keys2.list_issue_date,

View File

@ -27,7 +27,9 @@ import {
AmountJson,
Amounts,
DenominationPubKey,
DenomKeyType, Logger, strcmp
DenomKeyType,
Logger,
strcmp,
} from "@gnu-taler/taler-util";
const logger = new Logger("coinSelection.ts");
@ -210,32 +212,6 @@ function tallyFees(
};
}
function denomPubCmp(
p1: DenominationPubKey,
p2: DenominationPubKey,
): -1 | 0 | 1 {
if (p1.cipher < p2.cipher) {
return -1;
} else if (p1.cipher > p2.cipher) {
return +1;
}
if (
p1.cipher === DenomKeyType.LegacyRsa &&
p2.cipher === DenomKeyType.LegacyRsa
) {
return strcmp(p1.rsa_public_key, p2.rsa_public_key);
} else if (p1.cipher === DenomKeyType.Rsa && p2.cipher === DenomKeyType.Rsa) {
if ((p1.age_mask ?? 0) < (p2.age_mask ?? 0)) {
return -1;
} else if ((p1.age_mask ?? 0) > (p2.age_mask ?? 0)) {
return 1;
}
return strcmp(p1.rsa_public_key, p2.rsa_public_key);
} else {
throw Error("unsupported cipher");
}
}
/**
* Given a list of candidate coins, select coins to spend under the merchant's
* constraints.
@ -302,7 +278,7 @@ export function selectPayCoins(
(o1, o2) =>
-Amounts.cmp(o1.availableAmount, o2.availableAmount) ||
Amounts.cmp(o1.feeDeposit, o2.feeDeposit) ||
denomPubCmp(o1.denomPub, o2.denomPub),
DenominationPubKey.cmp(o1.denomPub, o2.denomPub),
);
// FIXME: Here, we should select coins in a smarter way.