test_sync_api.c (10062B)
1 /* 2 This file is part of TALER 3 Copyright (C) 2014-2024 Taler Systems SA 4 5 TALER is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as 7 published by the Free Software Foundation; either version 3, or 8 (at your option) any later version. 9 10 TALER is distributed in the hope that it will be useful, but 11 WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public 16 License along with TALER; see the file COPYING. If not, see 17 <http://www.gnu.org/licenses/> 18 */ 19 /** 20 * @file lib/test_sync_api.c 21 * @brief testcase to test sync's HTTP API interface 22 * @author Christian Grothoff 23 */ 24 #include "platform.h" 25 #include <taler/taler_util.h> 26 #include <taler/taler_signatures.h> 27 #include <taler/taler_exchange_service.h> 28 #include <taler/taler_json_lib.h> 29 #include <gnunet/gnunet_util_lib.h> 30 #include <microhttpd.h> 31 #include <taler/taler_bank_service.h> 32 #include <taler/taler_fakebank_lib.h> 33 #include <taler/taler_testing_lib.h> 34 #include <taler/taler_merchant_testing_lib.h> 35 #include <taler/taler_error_codes.h> 36 #include "sync_service.h" 37 #include "sync_testing_lib.h" 38 39 /** 40 * Configuration file we use. One (big) configuration is used 41 * for the various components for this test. 42 */ 43 #define CONFIG_FILE "test_sync_api.conf" 44 45 /** 46 * Exchange base URL. Could also be taken from config. 47 */ 48 #define EXCHANGE_URL "http://localhost:8081/" 49 50 /** 51 * Account number of the exchange at the bank. 52 */ 53 #define EXCHANGE_ACCOUNT_NAME "2" 54 55 /** 56 * Account number of some user. 57 */ 58 #define USER_ACCOUNT_NAME "62" 59 60 /** 61 * Account number used by the merchant 62 */ 63 #define MERCHANT_ACCOUNT_NAME "3" 64 65 /** 66 * Payto URI of the customer (payer). 67 */ 68 static struct TALER_FullPayto payer_payto; 69 70 /** 71 * Payto URI of the exchange (escrow account). 72 */ 73 static struct TALER_FullPayto exchange_payto; 74 75 /** 76 * Payto URI of the merchant (receiver). 77 */ 78 static struct TALER_FullPayto merchant_payto; 79 80 /** 81 * Configuration of the bank. 82 */ 83 static struct TALER_TESTING_Credentials cred; 84 85 /** 86 * Merchant base URL. 87 */ 88 static const char *merchant_url = "http://localhost:8080/"; 89 90 /** 91 * Sync base URL. 92 */ 93 static const char *sync_url = "http://localhost:8084/"; 94 95 96 /** 97 * Execute the taler-exchange-wirewatch command with 98 * our configuration file. 99 * 100 * @param label label to use for the command. 101 */ 102 static struct TALER_TESTING_Command 103 cmd_exec_wirewatch (const char *label) 104 { 105 return TALER_TESTING_cmd_exec_wirewatch (label, 106 CONFIG_FILE); 107 } 108 109 110 /** 111 * Run wire transfer of funds from some user's account to the 112 * exchange. 113 * 114 * @param label label to use for the command. 115 * @param amount amount to transfer, i.e. "EUR:1" 116 * @param url exchange_url 117 */ 118 static struct TALER_TESTING_Command 119 cmd_transfer_to_exchange (const char *label, 120 const char *amount) 121 { 122 return TALER_TESTING_cmd_admin_add_incoming (label, 123 amount, 124 &cred.ba, 125 payer_payto); 126 } 127 128 129 /** 130 * Main function that will tell the interpreter what commands to 131 * run. 132 * 133 * @param cls closure 134 */ 135 static void 136 run (void *cls, 137 struct TALER_TESTING_Interpreter *is) 138 { 139 struct TALER_TESTING_Command commands[] = { 140 TALER_TESTING_cmd_system_start ("start-taler", 141 CONFIG_FILE, 142 "-efms", 143 "-u", "exchange-account-exchange", 144 "-r", "merchant-exchange-default", 145 NULL), 146 TALER_TESTING_cmd_get_exchange ("get-exchange", 147 cred.cfg, 148 NULL, 149 true, 150 true), 151 TALER_TESTING_cmd_merchant_post_instances ("instance-create-admin", 152 merchant_url, 153 "admin", 154 MHD_HTTP_NO_CONTENT), 155 TALER_TESTING_cmd_merchant_post_account ( 156 "instance-create-default-account", 157 merchant_url, 158 merchant_payto, 159 NULL, NULL, 160 MHD_HTTP_OK), 161 162 /** 163 * Move money to the exchange's bank account. 164 */ 165 cmd_transfer_to_exchange ("create-reserve-1", 166 "EUR:10.02"), 167 /** 168 * Make a reserve exist, according to the previous 169 * transfer. 170 */ 171 cmd_exec_wirewatch ("wirewatch-1"), 172 TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-1", 173 "create-reserve-1", 174 "EUR:5", 175 0, 176 MHD_HTTP_OK), 177 TALER_TESTING_cmd_withdraw_amount ("withdraw-coin-2", 178 "create-reserve-1", 179 "EUR:5", 180 0, 181 MHD_HTTP_OK), 182 /* Failed download: no backup exists */ 183 SYNC_TESTING_cmd_backup_nx ("backup-download-nx", 184 sync_url), 185 /* Failed upload: need to pay */ 186 SYNC_TESTING_cmd_backup_upload ("backup-upload-1", 187 sync_url, 188 NULL /* prev upload */, 189 NULL /* last upload */, 190 SYNC_TESTING_UO_NONE, 191 MHD_HTTP_PAYMENT_REQUIRED, 192 "Test-1", 193 strlen ("Test-1")), 194 /* what would we have to pay? */ 195 TALER_TESTING_cmd_merchant_claim_order ("fetch-proposal", 196 merchant_url, 197 MHD_HTTP_OK, 198 "backup-upload-1", 199 NULL), 200 /* make the payment */ 201 TALER_TESTING_cmd_merchant_pay_order ("pay-account", 202 merchant_url, 203 MHD_HTTP_OK, 204 "fetch-proposal", 205 "withdraw-coin-1", 206 "EUR:5", 207 "EUR:4.99", /* must match ANNUAL_FEE in config! */ 208 "session-id"), 209 /* now upload should succeed */ 210 SYNC_TESTING_cmd_backup_upload ("backup-upload-2", 211 sync_url, 212 "backup-upload-1", 213 NULL, 214 SYNC_TESTING_UO_NONE, 215 MHD_HTTP_NO_CONTENT, 216 "Test-1", 217 strlen ("Test-1")), 218 /* now updated upload should succeed */ 219 SYNC_TESTING_cmd_backup_upload ("backup-upload-3", 220 sync_url, 221 "backup-upload-2", 222 NULL, 223 SYNC_TESTING_UO_NONE, 224 MHD_HTTP_NO_CONTENT, 225 "Test-3", 226 strlen ("Test-3")), 227 /* Test download: succeeds! */ 228 SYNC_TESTING_cmd_backup_download ("download-3", 229 sync_url, 230 MHD_HTTP_OK, 231 "backup-upload-3"), 232 /* now updated upload should fail (conflict) */ 233 SYNC_TESTING_cmd_backup_upload ("backup-upload-3b", 234 sync_url, 235 "backup-upload-2", 236 "backup-upload-3", 237 SYNC_TESTING_UO_NONE, 238 MHD_HTTP_CONFLICT, 239 "Test-3b", 240 strlen ("Test-3b")), 241 /* now updated upload should fail (payment requested) */ 242 SYNC_TESTING_cmd_backup_upload ("backup-upload-4", 243 sync_url, 244 "backup-upload-3", 245 "backup-upload-3", 246 SYNC_TESTING_UO_REQUEST_PAYMENT, 247 MHD_HTTP_PAYMENT_REQUIRED, 248 "Test-4", 249 strlen ("Test-4")), 250 /* Test download: previous did NOT change the data on the server! */ 251 SYNC_TESTING_cmd_backup_download ("download-3b", 252 sync_url, 253 MHD_HTTP_OK, 254 "backup-upload-3"), 255 256 TALER_TESTING_cmd_end () 257 }; 258 259 TALER_TESTING_run (is, 260 commands); 261 } 262 263 264 int 265 main (int argc, 266 char *const *argv) 267 { 268 (void) argc; 269 payer_payto.full_payto = 270 (char *) "payto://x-taler-bank/localhost/" USER_ACCOUNT_NAME 271 "?receiver-name=user"; 272 exchange_payto.full_payto = 273 (char *) "payto://x-taler-bank/localhost/" EXCHANGE_ACCOUNT_NAME 274 "?receiver-name=exchange"; 275 merchant_payto.full_payto = 276 (char *) "payto://x-taler-bank/localhost/" MERCHANT_ACCOUNT_NAME 277 "?receiver-name=merchant"; 278 return TALER_TESTING_main (argv, 279 "DEBUG", 280 CONFIG_FILE, 281 "exchange-account-exchange", 282 TALER_TESTING_BS_FAKEBANK, 283 &cred, 284 &run, 285 NULL); 286 } 287 288 289 /* end of test_sync_api.c */