testing_api_cmd_get_templates.c (5968B)
1 /* 2 This file is part of TALER 3 Copyright (C) 2022 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_get_templates.c 21 * @brief command to test GET /templates 22 * @author Priscilla HUANG 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 "GET templates" CMD. 33 */ 34 struct GetTemplatesState 35 { 36 37 /** 38 * Handle for a "GET template" request. 39 */ 40 struct TALER_MERCHANT_TemplatesGetHandle *igh; 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 * Expected HTTP response code. 54 */ 55 unsigned int http_status; 56 57 /** 58 * The list of template references. 59 */ 60 const char **templates; 61 62 /** 63 * Length of @e templates. 64 */ 65 unsigned int templates_length; 66 67 }; 68 69 70 /** 71 * Callback for a GET /templates operation. 72 * 73 * @param cls closure for this function 74 * @param tgr response details 75 */ 76 static void 77 get_templates_cb (void *cls, 78 const struct TALER_MERCHANT_TemplatesGetResponse *tgr) 79 { 80 struct GetTemplatesState *gis = cls; 81 82 gis->igh = NULL; 83 if (gis->http_status != tgr->hr.http_status) 84 { 85 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 86 "Unexpected response code %u (%d) to command %s\n", 87 tgr->hr.http_status, 88 (int) tgr->hr.ec, 89 TALER_TESTING_interpreter_get_current_label (gis->is)); 90 TALER_TESTING_interpreter_fail (gis->is); 91 return; 92 } 93 switch (tgr->hr.http_status) 94 { 95 case MHD_HTTP_OK: 96 if (tgr->details.ok.templates_length != gis->templates_length) 97 { 98 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 99 "Length of templates found does not match\n"); 100 TALER_TESTING_interpreter_fail (gis->is); 101 return; 102 } 103 for (unsigned int i = 0; i < gis->templates_length; ++i) 104 { 105 const struct TALER_TESTING_Command *template_cmd; 106 107 template_cmd = TALER_TESTING_interpreter_lookup_command ( 108 gis->is, 109 gis->templates[i]); 110 111 { 112 const char *template_id; 113 114 if (GNUNET_OK != 115 TALER_TESTING_get_trait_template_id (template_cmd, 116 &template_id)) 117 { 118 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 119 "Could not fetch template id\n"); 120 TALER_TESTING_interpreter_fail (gis->is); 121 return; 122 } 123 if (0 != strcmp (tgr->details.ok.templates[i].template_id, 124 template_id)) 125 { 126 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 127 "Template id does not match\n"); 128 TALER_TESTING_interpreter_fail (gis->is); 129 return; 130 } 131 } 132 } 133 break; 134 case MHD_HTTP_UNAUTHORIZED: 135 break; 136 case MHD_HTTP_NOT_FOUND: 137 /* instance does not exist */ 138 break; 139 default: 140 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, 141 "Unhandled HTTP status %u (%d).\n", 142 tgr->hr.http_status, 143 tgr->hr.ec); 144 break; 145 } 146 TALER_TESTING_interpreter_next (gis->is); 147 } 148 149 150 /** 151 * Run the "GET /templates" CMD. 152 * 153 * 154 * @param cls closure. 155 * @param cmd command being run now. 156 * @param is interpreter state. 157 */ 158 static void 159 get_templates_run (void *cls, 160 const struct TALER_TESTING_Command *cmd, 161 struct TALER_TESTING_Interpreter *is) 162 { 163 struct GetTemplatesState *gis = cls; 164 165 gis->is = is; 166 gis->igh = TALER_MERCHANT_templates_get ( 167 TALER_TESTING_interpreter_get_context (is), 168 gis->merchant_url, 169 &get_templates_cb, 170 gis); 171 GNUNET_assert (NULL != gis->igh); 172 } 173 174 175 /** 176 * Free the state of a "GET template" CMD, and possibly 177 * cancel a pending operation thereof. 178 * 179 * @param cls closure. 180 * @param cmd command being run. 181 */ 182 static void 183 get_templates_cleanup (void *cls, 184 const struct TALER_TESTING_Command *cmd) 185 { 186 struct GetTemplatesState *gis = cls; 187 188 if (NULL != gis->igh) 189 { 190 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, 191 "GET /templates operation did not complete\n"); 192 TALER_MERCHANT_templates_get_cancel (gis->igh); 193 } 194 GNUNET_array_grow (gis->templates, 195 gis->templates_length, 196 0); 197 GNUNET_free (gis); 198 } 199 200 201 struct TALER_TESTING_Command 202 TALER_TESTING_cmd_merchant_get_templates (const char *label, 203 const char *merchant_url, 204 unsigned int http_status, 205 ...) 206 { 207 struct GetTemplatesState *gis; 208 209 gis = GNUNET_new (struct GetTemplatesState); 210 gis->merchant_url = merchant_url; 211 gis->http_status = http_status; 212 { 213 const char *clabel; 214 va_list ap; 215 216 va_start (ap, http_status); 217 while (NULL != (clabel = va_arg (ap, const char *))) 218 { 219 GNUNET_array_append (gis->templates, 220 gis->templates_length, 221 clabel); 222 } 223 va_end (ap); 224 } 225 { 226 struct TALER_TESTING_Command cmd = { 227 .cls = gis, 228 .label = label, 229 .run = &get_templates_run, 230 .cleanup = &get_templates_cleanup 231 }; 232 233 return cmd; 234 } 235 } 236 237 238 /* end of testing_api_cmd_get_templates.c */