From 8da58bd4943cc0dc407acd62a168412301b07717 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Mon, 8 Nov 2021 15:51:39 +0100 Subject: [PATCH] anastasis-core: fix policy suggestion and add test case --- packages/anastasis-core/src/anastasis-data.ts | 9 ++++ .../src/policy-suggestion.test.ts | 44 +++++++++++++++++++ .../anastasis-core/src/policy-suggestion.ts | 25 ++++++++--- 3 files changed, 72 insertions(+), 6 deletions(-) create mode 100644 packages/anastasis-core/src/policy-suggestion.test.ts diff --git a/packages/anastasis-core/src/anastasis-data.ts b/packages/anastasis-core/src/anastasis-data.ts index 4946e9dfd..e24cdc8a4 100644 --- a/packages/anastasis-core/src/anastasis-data.ts +++ b/packages/anastasis-core/src/anastasis-data.ts @@ -1,6 +1,7 @@ // This file is auto-generated, do not modify. // Generated from v0.2.0-4-g61ea83c on Tue, 05 Oct 2021 10:40:32 +0200 // To re-generate, run contrib/gen-ts.sh from the main anastasis code base. +// XXX: Modified for demo, allowing demo providers for EUR export const anastasisData = { providersList: { @@ -15,6 +16,14 @@ export const anastasisData = { url: "https://kudos.demo.anastasis.lu/", currency: "KUDOS", }, + { + url: "https://anastasis.demo.taler.net/", + currency: "EUR", + }, + { + url: "https://kudos.demo.anastasis.lu/", + currency: "EUR", + }, { url: "http://localhost:8086/", currency: "TESTKUDOS", diff --git a/packages/anastasis-core/src/policy-suggestion.test.ts b/packages/anastasis-core/src/policy-suggestion.test.ts new file mode 100644 index 000000000..6370825da --- /dev/null +++ b/packages/anastasis-core/src/policy-suggestion.test.ts @@ -0,0 +1,44 @@ +import { j2s } from "@gnu-taler/taler-util"; +import test from "ava"; +import { ProviderInfo, suggestPolicies } from "./policy-suggestion.js"; + +test("policy suggestion", async (t) => { + const methods = [ + { + challenge: "XXX", + instructions: "SMS to 123", + type: "sms", + }, + { + challenge: "XXX", + instructions: "What is the meaning of life?", + type: "question", + }, + { + challenge: "XXX", + instructions: "email to foo@bar.com", + type: "email", + }, + ]; + const providers: ProviderInfo[] = [ + { + methodCost: { + sms: "KUDOS:1", + }, + url: "prov1", + }, + { + methodCost: { + question: "KUDOS:1", + }, + url: "prov2", + }, + ]; + const res1 = suggestPolicies(methods, providers); + t.assert(res1.policies.length === 1); + const res2 = suggestPolicies([...methods].reverse(), providers); + t.assert(res2.policies.length === 1); + + const res3 = suggestPolicies(methods, [...providers].reverse()); + t.assert(res3.policies.length === 1); +}); diff --git a/packages/anastasis-core/src/policy-suggestion.ts b/packages/anastasis-core/src/policy-suggestion.ts index 7eb6c21cc..2c25caaa4 100644 --- a/packages/anastasis-core/src/policy-suggestion.ts +++ b/packages/anastasis-core/src/policy-suggestion.ts @@ -84,9 +84,16 @@ function assignProviders( for (const provSel of providerSelections) { // First, check if selection is even possible with the methods offered let possible = true; - for (const methIndex in provSel) { - const provIndex = provSel[methIndex]; + for (const methSelIndex in provSel) { + const provIndex = provSel[methSelIndex]; + if (typeof provIndex !== "number") { + throw Error("invariant failed"); + } + const methIndex = methodSelection[methSelIndex]; const meth = methods[methIndex]; + if (!meth) { + throw Error("invariant failed"); + } const prov = providers[provIndex]; if (!prov.methodCost[meth.type]) { possible = false; @@ -96,7 +103,6 @@ function assignProviders( if (!possible) { continue; } - // Evaluate diversity, always prefer policies // that increase diversity. const providerSet = new Set(); @@ -163,9 +169,18 @@ function assignProviders( /** * A provider selection maps a method selection index to a provider index. + * + * I.e. "PSEL[i] = x" means that provider with index "x" should be used + * for method with index "MSEL[i]" */ type ProviderSelection = number[]; +/** + * A method selection "MSEL[j] = y" means that policy method j + * should use method y. + */ +type MethodSelection = number[]; + /** * Compute provider mappings. * Enumerates all n-combinations with repetition of m providers. @@ -184,7 +199,7 @@ function enumerateProviderMappings( } for (let j = start; j < m; j++) { a[i] = j; - sel(i + 1, j); + sel(i + 1, 0); if (limit && selections.length >= limit) { break; } @@ -199,8 +214,6 @@ interface PolicySelectionResult { policy_providers: PolicyProvider[]; } -type MethodSelection = number[]; - /** * Compute method selections. * Enumerates all n-combinations without repetition of m methods.