/*
This file is part of Anastasis
Copyright (C) 2020, 2021 Anastasis SARL
Anastasis is free software; you can redistribute it and/or modify it under the
terms of the GNU General Public License as published by the Free Software
Foundation; either version 3, or (at your option) any later version.
Anastasis is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with
Anastasis; see the file COPYING.GPL. If not, see
*/
/**
* @file testing/test_anastasis_api.c
* @brief testcase to test anastasis' HTTP API interface
* @author Christian Grothoff
* @author Dennis Neufeld
* @author Dominik Meister
*/
#include "platform.h"
#include "anastasis_testing_lib.h"
#include
/**
* Configuration file we use. One (big) configuration is used
* for the various components for this test.
*/
#define CONFIG_FILE "test_anastasis_api.conf"
/**
* Exchange base URL. Could also be taken from config.
*/
#define EXCHANGE_URL "http://localhost:8081/"
/**
* Account number of the exchange at the bank.
*/
#define EXCHANGE_ACCOUNT_NAME "2"
/**
* Account number of some user.
*/
#define USER_ACCOUNT_NAME "62"
/**
* Account number used by the merchant
*/
#define MERCHANT_ACCOUNT_NAME "3"
/**
* Configuration of the bank.
*/
static struct TALER_TESTING_BankConfiguration bc;
/**
* Configuration of the exchange.
*/
static struct TALER_TESTING_ExchangeConfiguration ec;
/**
* Payto URI of the customer (payer).
*/
static char *payer_payto;
/**
* Payto URI of the exchange (escrow account).
*/
static char *exchange_payto;
/**
* Payto URI of the merchant (receiver).
*/
static char *merchant_payto;
/**
* Merchant base URL.
*/
static char *merchant_url;
/**
* Anastasis base URL.
*/
static char *anastasis_url;
/**
* Merchant process.
*/
static struct GNUNET_OS_Process *merchantd;
/**
* Anastasis process.
*/
static struct GNUNET_OS_Process *anastasisd;
/**
* Name of the file for exchanging the secret.
*/
static char *file_secret;
/**
* Execute the taler-exchange-wirewatch command with our configuration
* file.
*
* @param label label to use for the command.
*/
static struct TALER_TESTING_Command
cmd_exec_wirewatch (char *label)
{
return TALER_TESTING_cmd_exec_wirewatch (label,
CONFIG_FILE);
}
/**
* Run wire transfer of funds from some user's account to the
* exchange.
*
* @param label label to use for the command.
* @param amount amount to transfer, i.e. "EUR:1"
* @param url exchange_url
*/
static struct TALER_TESTING_Command
cmd_transfer_to_exchange (const char *label,
const char *amount)
{
return TALER_TESTING_cmd_admin_add_incoming (label,
amount,
&bc.exchange_auth,
payer_payto);
}
/**
* Main function that will tell the interpreter what commands to run.
*
* @param cls closure
*/
static void
run (void *cls,
struct TALER_TESTING_Interpreter *is)
{
struct TALER_TESTING_Command withdraw[] = {
cmd_transfer_to_exchange ("create-reserve-1",
"EUR:10.02"),
cmd_exec_wirewatch ("wirewatch-1"),
TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-1",
"create-reserve-1",
"EUR:5",
0, /* age */
MHD_HTTP_OK),
TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-2",
"create-reserve-1",
"EUR:5",
0, /* age */
MHD_HTTP_OK),
TALER_TESTING_cmd_status ("withdraw-status-1",
"create-reserve-1",
"EUR:0",
MHD_HTTP_OK),
TALER_TESTING_cmd_end ()
};
struct TALER_TESTING_Command policy[] = {
ANASTASIS_TESTING_cmd_policy_store ("policy-store-1",
anastasis_url,
NULL /* prev upload */,
MHD_HTTP_PAYMENT_REQUIRED,
ANASTASIS_TESTING_PSO_NONE,
"Test-1",
strlen ("Test-1")),
/* what would we have to pay? */
TALER_TESTING_cmd_merchant_claim_order ("fetch-proposal",
merchant_url,
MHD_HTTP_OK,
"policy-store-1",
NULL),
/* make the payment */
TALER_TESTING_cmd_merchant_pay_order ("pay-account",
merchant_url,
MHD_HTTP_OK,
"fetch-proposal",
"withdraw-coin-1",
"EUR:5",
"EUR:4.99", /* must match ANNUAL_FEE in config! */
NULL),
ANASTASIS_TESTING_cmd_policy_store ("policy-store-2",
anastasis_url,
"policy-store-1",
MHD_HTTP_NO_CONTENT,
ANASTASIS_TESTING_PSO_NONE,
"Test-1",
strlen ("Test-1")),
ANASTASIS_TESTING_cmd_policy_lookup ("policy-lookup-1",
anastasis_url,
MHD_HTTP_OK,
"policy-store-2"),
TALER_TESTING_cmd_end ()
};
struct TALER_TESTING_Command truth[] = {
ANASTASIS_TESTING_cmd_truth_question (
"truth-store-1",
anastasis_url,
NULL,
"The-Answer",
ANASTASIS_TESTING_TSO_NONE,
MHD_HTTP_NO_CONTENT),
ANASTASIS_TESTING_cmd_truth_solve (
"keyshare-lookup-1",
anastasis_url,
"The-Answer",
NULL, /* payment ref */
"truth-store-1",
0,
MHD_HTTP_OK),
ANASTASIS_TESTING_cmd_truth_store (
"truth-store-2",
anastasis_url,
NULL,
"file",
"text/plain",
strlen (file_secret),
file_secret,
ANASTASIS_TESTING_TSO_NONE,
MHD_HTTP_NO_CONTENT),
ANASTASIS_TESTING_cmd_truth_solve (
"challenge-fail-1",
anastasis_url,
"Wrong-Answer",
NULL, /* payment ref */
"truth-store-1", /* upload ref */
0, /* security question mode */
MHD_HTTP_FORBIDDEN),
ANASTASIS_TESTING_cmd_truth_challenge (
"file-challenge-run-1",
anastasis_url,
NULL, /* payment ref */
"truth-store-2", /* upload ref */
MHD_HTTP_PAYMENT_REQUIRED),
/* what would we have to pay? */
TALER_TESTING_cmd_merchant_claim_order ("fetch-proposal-2",
merchant_url,
MHD_HTTP_OK,
"file-challenge-run-1",
NULL),
/* make the payment */
TALER_TESTING_cmd_merchant_pay_order ("pay-account-2",
merchant_url,
MHD_HTTP_OK,
"fetch-proposal-2",
"withdraw-coin-2",
"EUR:1.01",
"EUR:1",
NULL),
ANASTASIS_TESTING_cmd_truth_challenge (
"file-challenge-run-2",
anastasis_url,
"file-challenge-run-1", /* payment ref */
"truth-store-2",
MHD_HTTP_OK),
ANASTASIS_TESTING_cmd_truth_solve (
"file-challenge-run-3",
anastasis_url,
"file-challenge-run-2", /* answer */
"file-challenge-run-1", /* payment ref */
"truth-store-2",
1,
MHD_HTTP_OK),
TALER_TESTING_cmd_end ()
};
struct TALER_TESTING_Command commands[] = {
/* general setup */
TALER_TESTING_cmd_auditor_add ("add-auditor-OK",
MHD_HTTP_NO_CONTENT,
false),
TALER_TESTING_cmd_wire_add ("add-wire-account",
"payto://x-taler-bank/localhost/2",
MHD_HTTP_NO_CONTENT,
false),
TALER_TESTING_cmd_exec_offline_sign_keys ("offline-sign-future-keys",
CONFIG_FILE),
TALER_TESTING_cmd_exec_offline_sign_fees ("offline-sign-fees",
CONFIG_FILE,
"EUR:0.01",
"EUR:0.01",
"EUR:0.01"),
TALER_TESTING_cmd_check_keys_pull_all_keys ("refetch /keys",
1),
TALER_TESTING_cmd_merchant_post_instances ("instance-create-default",
merchant_url,
"default",
merchant_payto,
"EUR",
MHD_HTTP_NO_CONTENT),
ANASTASIS_TESTING_cmd_config ("salt-request-1",
anastasis_url,
MHD_HTTP_OK),
TALER_TESTING_cmd_batch ("withdraw",
withdraw),
TALER_TESTING_cmd_batch ("policy",
policy),
TALER_TESTING_cmd_batch ("truth",
truth),
TALER_TESTING_cmd_end ()
};
TALER_TESTING_run_with_fakebank (is,
commands,
bc.exchange_auth.wire_gateway_url);
}
int
main (int argc,
char *const *argv)
{
int ret;
/* These environment variables get in the way... */
unsetenv ("XDG_DATA_HOME");
unsetenv ("XDG_CONFIG_HOME");
GNUNET_log_setup ("test-anastasis-api",
"DEBUG",
NULL);
if (GNUNET_OK !=
TALER_TESTING_prepare_fakebank (CONFIG_FILE,
"exchange-account-exchange",
&bc))
return 77;
{
char dir[] = "/tmp/test-anastasis-file-XXXXXX";
if (NULL == mkdtemp (dir))
{
GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR,
"mkdtemp",
dir);
return 77;
}
GNUNET_asprintf (&file_secret,
"%s/.secret",
dir);
}
payer_payto = ("payto://x-taler-bank/localhost/" USER_ACCOUNT_NAME);
exchange_payto = ("payto://x-taler-bank/localhost/" EXCHANGE_ACCOUNT_NAME);
merchant_payto = ("payto://x-taler-bank/localhost/" MERCHANT_ACCOUNT_NAME);
if (NULL ==
(merchant_url = TALER_TESTING_prepare_merchant (CONFIG_FILE)))
return 77;
TALER_TESTING_cleanup_files (CONFIG_FILE);
if (NULL ==
(anastasis_url = ANASTASIS_TESTING_prepare_anastasis (CONFIG_FILE)))
return 77;
TALER_TESTING_cleanup_files (CONFIG_FILE);
switch (TALER_TESTING_prepare_exchange (CONFIG_FILE,
GNUNET_YES,
&ec))
{
case GNUNET_SYSERR:
GNUNET_break (0);
return 1;
case GNUNET_NO:
return 77;
case GNUNET_OK:
if (NULL == (merchantd =
TALER_TESTING_run_merchant (CONFIG_FILE,
merchant_url)))
{
GNUNET_break (0);
return 1;
}
if (NULL == (anastasisd =
ANASTASIS_TESTING_run_anastasis (CONFIG_FILE,
anastasis_url)))
{
GNUNET_break (0);
GNUNET_OS_process_kill (merchantd,
SIGTERM);
GNUNET_OS_process_wait (merchantd);
GNUNET_OS_process_destroy (merchantd);
return 1;
}
ret = TALER_TESTING_setup_with_exchange (&run,
NULL,
CONFIG_FILE);
GNUNET_OS_process_kill (merchantd,
SIGTERM);
GNUNET_OS_process_kill (anastasisd,
SIGTERM);
GNUNET_OS_process_wait (merchantd);
GNUNET_OS_process_wait (anastasisd);
GNUNET_OS_process_destroy (merchantd);
GNUNET_OS_process_destroy (anastasisd);
GNUNET_free (merchant_url);
GNUNET_free (anastasis_url);
if (GNUNET_OK != ret)
{
GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
"Test failed in interpreter\n");
return 1;
}
break;
default:
GNUNET_break (0);
return 1;
}
return 0;
}
/* end of test_anastasis_api.c */