anastasis-core: fix policy suggestion and add test case

This commit is contained in:
Florian Dold 2021-11-08 15:51:39 +01:00
parent 6d7fffc242
commit 8da58bd494
No known key found for this signature in database
GPG Key ID: D2E4F00F29D02A4B
3 changed files with 72 additions and 6 deletions

View File

@ -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",

View File

@ -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);
});

View File

@ -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<string>();
@ -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.