/*
This file is part of TALER
Copyright (C) 2016, 2017 GNUnet e.V.
TALER 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.
TALER 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
TALER; see the file COPYING. If not, see
*/
/**
* @file bank/test_bank_api.c
* @brief testcase to test bank's HTTP API interface against the "real" bank
* @author Christian Grothoff
*/
#include "platform.h"
#include "taler_util.h"
#include "taler_signatures.h"
#include "taler_bank_service.h"
#include
#include
#include
#include "test_bank_interpreter.h"
/**
* Main function that will be run by the scheduler.
*
* @param cls closure
*/
static void
run (void *cls)
{
int *resultp = cls;
static struct TBI_Command commands[] =
{
/* Ask complete history of 'Exchange' user (number 2) */
{ .oc = TBI_OC_HISTORY,
.label = "history-0",
.details.history.account_number = 2,
.details.history.direction = TALER_BANK_DIRECTION_BOTH,
.details.history.start_row_ref = NULL,
.details.history.num_results = 5 },
/* Move money from Bank to Exchange */
{ .oc = TBI_OC_ADMIN_ADD_INCOMING,
.label = "deposit-1",
.details.admin_add_incoming.exchange_base_url = "https://exchange.net/", /* bogus */
.details.admin_add_incoming.subject = "subject 1",
.details.admin_add_incoming.expected_response_code = MHD_HTTP_OK,
.details.admin_add_incoming.credit_account_no = 2,
.details.admin_add_incoming.debit_account_no = 1,
.details.admin_add_incoming.amount = "KUDOS:5.01" },
/* Move money from Bank to Exchange */
{ .oc = TBI_OC_ADMIN_ADD_INCOMING,
.label = "deposit-2",
.details.admin_add_incoming.exchange_base_url = "https://exchange.net/", /* bogus */
.details.admin_add_incoming.subject = "subject 2",
.details.admin_add_incoming.expected_response_code = MHD_HTTP_OK,
.details.admin_add_incoming.credit_account_no = 2,
.details.admin_add_incoming.debit_account_no = 1,
.details.admin_add_incoming.amount = "KUDOS:5.01" },
/* Ask Exchange's incoming history */
{ .oc = TBI_OC_HISTORY,
.label = "history-1c",
.details.history.account_number = 2,
.details.history.direction = TALER_BANK_DIRECTION_CREDIT,
.details.history.start_row_ref = NULL,
.details.history.num_results = 5 },
/* Ask Exchange's outgoing history, 5 records into the future */
{ .oc = TBI_OC_HISTORY,
.label = "history-2d",
.details.history.account_number = 2,
.details.history.direction = TALER_BANK_DIRECTION_DEBIT,
.details.history.start_row_ref = NULL,
.details.history.num_results = 5 },
/* Ask Exchange's outgoing history, last 5 records */
{ .oc = TBI_OC_HISTORY,
.label = "history-2dr",
.details.history.account_number = 2,
.details.history.direction = TALER_BANK_DIRECTION_DEBIT,
.details.history.start_row_ref = NULL,
.details.history.num_results = -5 },
{ .oc = TBI_OC_HISTORY,
.label = "history-2fwd",
.details.history.account_number = 2,
.details.history.direction = TALER_BANK_DIRECTION_DEBIT,
.details.history.start_row_ref = "deposit-1",
.details.history.num_results = 5 },
{ .oc = TBI_OC_REJECT,
.label = "reject-1",
.details.reject.cmd_ref = "deposit-1" },
{ .oc = TBI_OC_HISTORY,
.label = "history-r1",
.details.history.account_number = 2,
.details.history.direction = TALER_BANK_DIRECTION_CREDIT,
.details.history.start_row_ref = NULL,
.details.history.num_results = 5 },
{ .oc = TBI_OC_HISTORY,
.label = "history-r2",
.details.history.account_number = 2,
.details.history.direction = TALER_BANK_DIRECTION_DEBIT,
.details.history.start_row_ref = NULL,
.details.history.num_results = 5 },
{ .oc = TBI_OC_HISTORY,
.label = "history-r3",
.details.history.account_number = 2,
.details.history.direction = TALER_BANK_DIRECTION_BOTH | TALER_BANK_DIRECTION_CANCEL,
.details.history.start_row_ref = NULL,
.details.history.num_results = 5 },
{ .oc = TBI_OC_END }
};
TBI_run_interpreter (resultp,
GNUNET_NO /* we use the "real" taler bank */,
commands);
}
/**
* Main function for the testcase for the bank API.
*
* @param argc expected to be 1
* @param argv expected to only contain the program name
*/
int
main (int argc,
char * const *argv)
{
struct GNUNET_OS_Process *bankd;
unsigned int cnt;
int result;
char *defaultdb = "postgres:///talercheck";
char *dbconn;
if (GNUNET_OK !=
GNUNET_NETWORK_test_port_free (IPPROTO_TCP,
8081))
{
fprintf (stderr,
"Required port %u not available, skipping.\n",
8081);
return 77;
}
GNUNET_log_setup ("test-bank-api",
"WARNING",
NULL);
if (NULL == (dbconn = getenv ("TALER_EXCHANGEDB_POSTGRES_CONFIG")))
dbconn = defaultdb;
char *purgedb_cmd;
GNUNET_asprintf (&purgedb_cmd, "taler-bank-manage -c bank.conf --with-db=%s django flush --no-input",
dbconn);
if (0 != system (purgedb_cmd))
{
fprintf (stderr,
"Could not purge database\n");
return 77;
}
bankd = GNUNET_OS_start_process (GNUNET_NO,
GNUNET_OS_INHERIT_STD_ALL,
NULL, NULL, NULL,
"taler-bank-manage",
"taler-bank-manage",
"--with-db", dbconn,
"-c", "bank.conf",
"serve-http",
"--port", "8080",
NULL);
if (NULL == bankd)
{
fprintf (stderr,
"Failed to launch taler-bank-manage, skipping test\n");
return 77; /* report 'skip' */
}
/* give child time to start and bind against the socket */
fprintf (stderr,
"Waiting for taler-bank-manage to be ready\n");
cnt = 0;
do
{
fprintf (stderr, ".");
sleep (1);
cnt++;
if (cnt > 30)
break;
}
while (0 != system ("wget -q -t 1 -T 1 http://127.0.0.1:8080/ -o /dev/null -O /dev/null"));
fprintf (stderr, "\n");
result = GNUNET_SYSERR;
if (cnt <= 30)
{
fprintf (stderr,
"Ready, running test...\n");
GNUNET_SCHEDULER_run (&run, &result);
}
GNUNET_OS_process_kill (bankd,
SIGTERM);
GNUNET_OS_process_wait (bankd);
GNUNET_OS_process_destroy (bankd);
if (cnt > 30)
{
fprintf (stderr,
"taler-bank-manage failed to start properly.\n");
return 77;
}
return (GNUNET_OK == result) ? 0 : 1;
}
/* end of test_bank_api.c */