Line data Source code
1 : /* 2 : This file is part of TALER 3 : Copyright (C) 2021 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 testing_api_cmd_delete_transfer.c 21 : * @brief command to test DELETE /transfers/$TRANSFER_ID 22 : * @author Jonathan Buchanan 23 : */ 24 : #include "platform.h" 25 : #include <taler/taler_exchange_service.h> 26 : #include <taler/taler_testing_lib.h> 27 : #include "taler_merchant_service.h" 28 : #include "taler_merchant_testing_lib.h" 29 : 30 : 31 : /** 32 : * State of a "DELETE /transfer/$TRANSFER_ID" CMD. 33 : */ 34 : struct DeleteTransferState 35 : { 36 : 37 : /** 38 : * Handle for a "DELETE transfer" request. 39 : */ 40 : struct TALER_MERCHANT_TransferDeleteHandle *tdh; 41 : 42 : /** 43 : * The interpreter state. 44 : */ 45 : struct TALER_TESTING_Interpreter *is; 46 : 47 : /** 48 : * Base URL of the merchant serving the request. 49 : */ 50 : const char *merchant_url; 51 : 52 : /** 53 : * Ref to cmd with ID of the transfer to run DELETE for. 54 : */ 55 : const char *transfer_ref; 56 : 57 : /** 58 : * Expected HTTP response code. 59 : */ 60 : unsigned int http_status; 61 : 62 : }; 63 : 64 : 65 : /** 66 : * Callback for a DELETE /transfers/$ID operation. 67 : * 68 : * @param cls closure for this function 69 : * @param hr response being processed 70 : */ 71 : static void 72 2 : delete_transfer_cb (void *cls, 73 : const struct TALER_MERCHANT_HttpResponse *hr) 74 : { 75 2 : struct DeleteTransferState *dts = cls; 76 : 77 2 : dts->tdh = NULL; 78 2 : if (dts->http_status != hr->http_status) 79 : { 80 0 : GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 81 : "Unexpected response code %u (%d) to command %s\n", 82 : hr->http_status, 83 : (int) hr->ec, 84 : TALER_TESTING_interpreter_get_current_label (dts->is)); 85 0 : TALER_TESTING_interpreter_fail (dts->is); 86 0 : return; 87 : } 88 2 : switch (hr->http_status) 89 : { 90 2 : case MHD_HTTP_NO_CONTENT: 91 2 : break; 92 0 : case MHD_HTTP_UNAUTHORIZED: 93 0 : break; 94 0 : case MHD_HTTP_NOT_FOUND: 95 0 : break; 96 0 : case MHD_HTTP_CONFLICT: 97 0 : break; 98 0 : default: 99 0 : GNUNET_break (0); 100 0 : GNUNET_log (GNUNET_ERROR_TYPE_WARNING, 101 : "Unhandled HTTP status %u for DELETE transfer.\n", 102 : hr->http_status); 103 : } 104 2 : TALER_TESTING_interpreter_next (dts->is); 105 : } 106 : 107 : 108 : /** 109 : * Run the "DELETE transfer" CMD. 110 : * 111 : * 112 : * @param cls closure. 113 : * @param cmd command being run now. 114 : * @param is interpreter state. 115 : */ 116 : static void 117 2 : delete_transfer_run (void *cls, 118 : const struct TALER_TESTING_Command *cmd, 119 : struct TALER_TESTING_Interpreter *is) 120 : { 121 2 : struct DeleteTransferState *dts = cls; 122 : const struct TALER_TESTING_Command *ref; 123 : const uint64_t *tid; 124 : 125 2 : dts->is = is; 126 2 : ref = TALER_TESTING_interpreter_lookup_command (is, 127 : dts->transfer_ref); 128 2 : if (NULL == ref) 129 : { 130 0 : GNUNET_break (0); 131 0 : TALER_TESTING_interpreter_fail (dts->is); 132 0 : return; 133 : } 134 2 : if (GNUNET_OK != 135 2 : TALER_TESTING_get_trait_bank_row (ref, 136 : &tid)) 137 : { 138 0 : GNUNET_break (0); 139 0 : TALER_TESTING_interpreter_fail (dts->is); 140 0 : return; 141 : } 142 2 : if (0 == tid) 143 : { 144 0 : GNUNET_break (0); 145 0 : TALER_TESTING_interpreter_fail (dts->is); 146 0 : return; 147 : } 148 2 : dts->tdh = TALER_MERCHANT_transfer_delete ( 149 : TALER_TESTING_interpreter_get_context (is), 150 : dts->merchant_url, 151 : *tid, 152 : &delete_transfer_cb, 153 : dts); 154 2 : GNUNET_assert (NULL != dts->tdh); 155 : } 156 : 157 : 158 : /** 159 : * Free the state of a "DELETE transfer" CMD, and possibly 160 : * cancel a pending operation thereof. 161 : * 162 : * @param cls closure. 163 : * @param cmd command being run. 164 : */ 165 : static void 166 2 : delete_transfer_cleanup (void *cls, 167 : const struct TALER_TESTING_Command *cmd) 168 : { 169 2 : struct DeleteTransferState *dts = cls; 170 : 171 2 : if (NULL != dts->tdh) 172 : { 173 0 : GNUNET_log (GNUNET_ERROR_TYPE_WARNING, 174 : "DELETE /transfers/$TRANSFER_ID operation did not complete\n"); 175 0 : TALER_MERCHANT_transfer_delete_cancel (dts->tdh); 176 : } 177 2 : GNUNET_free (dts); 178 2 : } 179 : 180 : 181 : struct TALER_TESTING_Command 182 2 : TALER_TESTING_cmd_merchant_delete_transfer (const char *label, 183 : const char *merchant_url, 184 : const char *transfer_ref, 185 : unsigned int http_status) 186 : { 187 : struct DeleteTransferState *dts; 188 : 189 2 : dts = GNUNET_new (struct DeleteTransferState); 190 2 : dts->merchant_url = merchant_url; 191 2 : dts->transfer_ref = transfer_ref; 192 2 : dts->http_status = http_status; 193 : { 194 2 : struct TALER_TESTING_Command cmd = { 195 : .cls = dts, 196 : .label = label, 197 : .run = &delete_transfer_run, 198 : .cleanup = &delete_transfer_cleanup 199 : }; 200 : 201 2 : return cmd; 202 : } 203 : }