/* This file is part of TALER Copyright (C) 2014-2022 Taler Systems SA 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 test_kyc_api.c * @brief testcase to test exchange's HTTP API interface * @author Sree Harsha Totakura * @author Christian Grothoff * @author Marcello Stanisci */ #include "platform.h" #include #include #include #include #include #include #include #include #include #include #include "taler_merchant_testing_lib.h" /** * Configuration file we use. One (big) configuration is used * for the various components for this test. */ #define CONFIG_FILE "test_kyc_api.conf" #define PAYTO_I1 "payto://x-taler-bank/localhost/3?receiver-name=3" /** * Exchange base URL. Could also be taken from config. */ #define EXCHANGE_URL "http://localhost:8081/" /** * 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; /** * Configuration of the bank. */ static struct TALER_TESTING_BankConfiguration bc; /** * Configuration of the exchange. */ static struct TALER_TESTING_ExchangeConfiguration ec; /** * Merchant base URL. */ static char *merchant_url; /** * Merchant instance "i1a" base URL. */ static char *merchant_url_i1a; /** * Merchant process. */ static struct GNUNET_OS_Process *merchantd; /** * 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 of some other user. */ #define USER_ACCOUNT_NAME2 "63" /** * Account number used by the merchant */ #define MERCHANT_ACCOUNT_NAME "3" /** * Execute the taler-exchange-aggregator, closer and transfer commands with * our configuration file. * * @param label label to use for the command. */ #define CMD_EXEC_AGGREGATOR(label) \ TALER_TESTING_cmd_exec_aggregator_with_kyc (label "-aggregator", CONFIG_FILE), \ TALER_TESTING_cmd_exec_transfer (label "-transfer", 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 pay[] = { /** * Move money to the exchange's bank account. */ cmd_transfer_to_exchange ("create-reserve-1", "EUR:10.02"), /** * Make a reserve exist, according to the previous transfer. */ TALER_TESTING_cmd_exec_wirewatch ("wirewatch-1", CONFIG_FILE), TALER_TESTING_cmd_check_bank_admin_transfer ("check_bank_transfer-2", "EUR:10.02", payer_payto, exchange_payto, "create-reserve-1"), TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-1", "create-reserve-1", "EUR:5", 0, MHD_HTTP_OK), TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-2", "create-reserve-1", "EUR:5", 0, MHD_HTTP_OK), TALER_TESTING_cmd_merchant_get_orders ("get-orders-empty", merchant_url, MHD_HTTP_OK, NULL), /** * Check the reserve is depleted. */ TALER_TESTING_cmd_status ("withdraw-status-1", "create-reserve-1", "EUR:0", MHD_HTTP_OK), TALER_TESTING_cmd_merchant_post_orders2 ("create-proposal-1", merchant_url, MHD_HTTP_OK, "1", /* order ID */ GNUNET_TIME_UNIT_ZERO_TS, GNUNET_TIME_UNIT_FOREVER_TS, true, "EUR:5.0", "x-taler-bank", "", "", NULL), TALER_TESTING_cmd_merchant_claim_order ("reclaim-1", merchant_url, MHD_HTTP_OK, "create-proposal-1", NULL), TALER_TESTING_cmd_merchant_pay_order ("deposit-simple", merchant_url, MHD_HTTP_OK, "create-proposal-1", "withdraw-coin-1", "EUR:5", "EUR:4.99", "session-0"), TALER_TESTING_cmd_merchant_post_orders_paid ("verify-order-1-paid", merchant_url, "deposit-simple", "session-1", MHD_HTTP_NO_CONTENT), TALER_TESTING_cmd_check_bank_empty ("check_bank_empty-1"), CMD_EXEC_AGGREGATOR ("run-aggregator"), /* KYC: hence nothing happened at the bank yet: */ TALER_TESTING_cmd_check_bank_empty ("check_bank_empty-2"), /* KYC: we don't even know the legitimization UUID yet */ TALER_TESTING_cmd_merchant_kyc_get ("kyc-pending", merchant_url, NULL, NULL, EXCHANGE_URL, MHD_HTTP_NO_CONTENT), /* now we get the legi UUID */ TALER_TESTING_cmd_merchant_get_order ("get-order-kyc", merchant_url, "create-proposal-1", TALER_MERCHANT_OSC_PAID, false, MHD_HTTP_OK, NULL), /* Now we should get a status of pending */ TALER_TESTING_cmd_merchant_kyc_get ("kyc-pending", merchant_url, NULL, NULL, EXCHANGE_URL, MHD_HTTP_ACCEPTED), TALER_TESTING_cmd_proof_kyc_oauth2 ("kyc-do", "kyc-pending", "kyc-provider-test-oauth2", "pass", MHD_HTTP_SEE_OTHER), CMD_EXEC_AGGREGATOR ("run-aggregator"), TALER_TESTING_cmd_check_bank_transfer ("check_bank_transfer-498c", EXCHANGE_URL, "EUR:4.98", exchange_payto, merchant_payto), TALER_TESTING_cmd_merchant_post_transfer ("post-transfer-1", &bc.exchange_auth, PAYTO_I1, merchant_url, "EUR:4.98", MHD_HTTP_OK, "deposit-simple", NULL), TALER_TESTING_cmd_merchant_get_transfers ("get-transfers-1", merchant_url, PAYTO_I1, MHD_HTTP_OK, "post-transfer-1", NULL), TALER_TESTING_cmd_check_bank_empty ("check_bank_empty-3"), TALER_TESTING_cmd_end () }; struct TALER_TESTING_Command commands[] = { /* general setup */ TALER_TESTING_cmd_oauth ("start-oauth-service", 6666), 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?receiver-name=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"), TALER_TESTING_cmd_check_keys_pull_all_keys ("refetch /keys", 1), TALER_TESTING_cmd_merchant_post_instances ("instance-create-default-setup", merchant_url, "default", PAYTO_I1, "EUR", MHD_HTTP_NO_CONTENT), TALER_TESTING_cmd_batch ("pay", pay), TALER_TESTING_cmd_end () }; TALER_TESTING_run_with_fakebank (is, commands, bc.exchange_auth.wire_gateway_url); } int main (int argc, char *const *argv) { enum GNUNET_GenericReturnValue ret; /* These environment variables get in the way... */ unsetenv ("XDG_DATA_HOME"); unsetenv ("XDG_CONFIG_HOME"); GNUNET_log_setup ("test-kyc-api", "INFO", NULL); if (GNUNET_OK != TALER_TESTING_prepare_fakebank (CONFIG_FILE, "exchange-account-exchange", &bc)) return 77; payer_payto = ("payto://x-taler-bank/localhost/" USER_ACCOUNT_NAME "?receiver-name=" USER_ACCOUNT_NAME); exchange_payto = ("payto://x-taler-bank/localhost/" EXCHANGE_ACCOUNT_NAME "?receiver-name=" EXCHANGE_ACCOUNT_NAME); merchant_payto = ("payto://x-taler-bank/localhost/" MERCHANT_ACCOUNT_NAME "?receiver-name=" MERCHANT_ACCOUNT_NAME); if (NULL == (merchant_url = TALER_TESTING_prepare_merchant (CONFIG_FILE))) return 77; GNUNET_asprintf (&merchant_url_i1a, "%sinstances/i1a/", merchant_url); 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))) return 1; ret = TALER_TESTING_setup_with_exchange (&run, NULL, CONFIG_FILE); GNUNET_OS_process_kill (merchantd, SIGTERM); GNUNET_OS_process_wait (merchantd); GNUNET_OS_process_destroy (merchantd); GNUNET_free (merchant_url); if (GNUNET_OK != ret) return 1; break; default: GNUNET_break (0); return 1; } return 0; } /* end of test_merchant_api.c */