/* This file is part of TALER Copyright (C) 2014, 2015, 2016 GNUnet e.V. and INRIA TALER is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1, 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 Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with TALER; see the file COPYING.LGPL. If not, If not, see */ /** * @file src/benchmark/taler-exchange-benchmark.c * @brief exchange's benchmark * @author Marcello Stanisci */ #include "platform.h" #include #include #include #include #include #include #include /** * How many coins the benchmark should operate on */ static unsigned int pool_size = 100000; /** * Context for running the #ctx's event loop. */ static struct GNUNET_CURL_RescheduleContext *rc; /** * Benchmark's task */ struct GNUNET_SCHEDULER_Task *benchmark_task; /** * Main execution context for the main loop of the exchange. */ static struct GNUNET_CURL_Context *ctx; /** * Handle to access the exchange. */ static struct TALER_EXCHANGE_Handle *exchange; /** * URI under which the exchange is reachable during the benchmark. */ #define EXCHANGE_URI "http://localhost:8081" /** * Run the main interpreter loop that performs exchange operations. * * @param cls closure for benchmark_run() */ static void benchmark_run (void *cls) { GNUNET_log (GNUNET_ERROR_TYPE_INFO, "benchmark_run() invoked\n"); GNUNET_log (GNUNET_ERROR_TYPE_INFO, "gotten pool_size of %d\n", pool_size); /** * 1 Pool's size as an option: DONE, TESTED * 2 Connection to the exchange: DONE, TESTED * 3 Allocation of large enough memory * 4 Withdraw */ } /** * Functions of this type are called to provide the retrieved signing and * denomination keys of the exchange. No TALER_EXCHANGE_*() functions should be called * in this callback. * * @param cls closure * @param keys information about keys of the exchange */ static void cert_cb (void *cls, const struct TALER_EXCHANGE_Keys *keys) { /* check that keys is OK */ #define ERR(cond) do { if(!(cond)) break; GNUNET_break (0); GNUNET_SCHEDULER_shutdown(); return; } while (0) ERR (NULL == keys); ERR (0 == keys->num_sign_keys); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Read %u signing keys\n", keys->num_sign_keys); ERR (0 == keys->num_denom_keys); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Read %u denomination keys\n", keys->num_denom_keys); #undef ERR /* run actual tests via interpreter-loop */ GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Certificate callback invoked, invoking benchmark_run()\n"); benchmark_task = GNUNET_SCHEDULER_add_now (&benchmark_run, NULL); } /** * Function run when the test terminates (good or bad). * Cleans up our state. * * @param cls the interpreter state. */ static void do_shutdown (void *cls) { if (NULL != exchange) { TALER_EXCHANGE_disconnect (exchange); exchange = NULL; } if (NULL != ctx) { GNUNET_CURL_fini (ctx); ctx = NULL; } if (NULL != rc) { GNUNET_CURL_gnunet_rc_destroy (rc); rc = NULL; } } /** * Main function that will be run by the scheduler. * * @param cls closure */ static void run (void *cls) { GNUNET_log (GNUNET_ERROR_TYPE_INFO, "running run()\n"); ctx = GNUNET_CURL_init (&GNUNET_CURL_gnunet_scheduler_reschedule, &rc); GNUNET_assert (NULL != ctx); rc = GNUNET_CURL_gnunet_rc_create (ctx); exchange = TALER_EXCHANGE_connect (ctx, EXCHANGE_URI, &cert_cb, NULL, TALER_EXCHANGE_OPTION_END); GNUNET_assert (NULL != exchange); GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "connected to exchange\n"); GNUNET_SCHEDULER_add_shutdown (&do_shutdown, NULL); } int main (int argc, char * const *argv) { GNUNET_log_setup ("taler-exchange-benchmark", "WARNING", NULL); const struct GNUNET_GETOPT_CommandLineOption options[] = { {'s', "pool-size", NULL, "How many coins this benchmark should instantiate", GNUNET_YES, &GNUNET_GETOPT_set_uint, &pool_size} }; GNUNET_assert (GNUNET_SYSERR != GNUNET_GETOPT_run ("taler-exchange-benchmark", options, argc, argv)); GNUNET_SCHEDULER_run (&run, NULL); }