Line data Source code
1 : /*
2 : This file is part of TALER
3 : Copyright (C) 2023 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 src/testing/testing_api_cmd_post_account.c
21 : * @brief command to test POST /account
22 : * @author Christian Grothoff
23 : */
24 : #include "platform.h"
25 : struct PostAccountState;
26 : #define TALER_MERCHANT_POST_PRIVATE_ACCOUNTS_RESULT_CLOSURE struct PostAccountState
27 : #include <taler/taler_exchange_service.h>
28 : #include <taler/taler_testing_lib.h>
29 : #include "taler/taler_merchant_service.h"
30 : #include "taler/taler_merchant_testing_lib.h"
31 : #include <taler/merchant/post-private-accounts.h>
32 :
33 :
34 : /**
35 : * State of a "POST /account" CMD.
36 : */
37 : struct PostAccountState
38 : {
39 :
40 : /**
41 : * Handle for a "GET product" request.
42 : */
43 : struct TALER_MERCHANT_PostPrivateAccountsHandle *aph;
44 :
45 : /**
46 : * The interpreter state.
47 : */
48 : struct TALER_TESTING_Interpreter *is;
49 :
50 : /**
51 : * Base URL of the merchant serving the request.
52 : */
53 : const char *merchant_url;
54 :
55 : /**
56 : * Wire hash of the created account, set on success.
57 : */
58 : struct TALER_MerchantWireHashP h_wire;
59 :
60 : /**
61 : * RFC 8905 URI for the account to create.
62 : */
63 : struct TALER_FullPayto payto_uri;
64 :
65 : /**
66 : * Credit facade URL for the account to create.
67 : */
68 : char *credit_facade_url;
69 :
70 : /**
71 : * Credit facade credentials for the account to create.
72 : */
73 : json_t *credit_facade_credentials;
74 :
75 : /**
76 : * Expected HTTP response code.
77 : */
78 : unsigned int http_status;
79 :
80 : };
81 :
82 :
83 : /**
84 : * Callback for a POST /account operation.
85 : *
86 : * @param cls closure for this function
87 : * @param apr response being processed
88 : */
89 : static void
90 10 : post_account_cb (struct PostAccountState *pas,
91 : const struct TALER_MERCHANT_PostPrivateAccountsResponse *apr)
92 : {
93 :
94 10 : pas->aph = NULL;
95 10 : if (pas->http_status != apr->hr.http_status)
96 : {
97 0 : GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
98 : "Unexpected response code %u (%d) to command %s\n",
99 : apr->hr.http_status,
100 : (int) apr->hr.ec,
101 : TALER_TESTING_interpreter_get_current_label (pas->is));
102 0 : TALER_TESTING_interpreter_fail (pas->is);
103 0 : return;
104 : }
105 10 : switch (apr->hr.http_status)
106 : {
107 10 : case MHD_HTTP_OK:
108 10 : pas->h_wire = apr->details.ok.h_wire;
109 10 : break;
110 0 : case MHD_HTTP_UNAUTHORIZED:
111 0 : break;
112 0 : case MHD_HTTP_FORBIDDEN:
113 0 : break;
114 0 : case MHD_HTTP_NOT_FOUND:
115 0 : break;
116 0 : case MHD_HTTP_CONFLICT:
117 0 : break;
118 0 : default:
119 0 : GNUNET_break (0);
120 0 : GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
121 : "Unhandled HTTP status %u for POST /account.\n",
122 : apr->hr.http_status);
123 : }
124 10 : TALER_TESTING_interpreter_next (pas->is);
125 : }
126 :
127 :
128 : /**
129 : * Run the "POST /account" CMD.
130 : *
131 : *
132 : * @param cls closure.
133 : * @param cmd command being run now.
134 : * @param is interpreter state.
135 : */
136 : static void
137 10 : post_account_run (void *cls,
138 : const struct TALER_TESTING_Command *cmd,
139 : struct TALER_TESTING_Interpreter *is)
140 : {
141 10 : struct PostAccountState *pas = cls;
142 :
143 10 : pas->is = is;
144 10 : pas->aph = TALER_MERCHANT_post_private_accounts_create (
145 : TALER_TESTING_interpreter_get_context (is),
146 : pas->merchant_url,
147 : pas->payto_uri);
148 10 : if (NULL != pas->credit_facade_url)
149 0 : TALER_MERCHANT_post_private_accounts_set_options (
150 : pas->aph,
151 : TALER_MERCHANT_post_private_accounts_option_credit_facade_url (
152 : pas->credit_facade_url));
153 10 : if (NULL != pas->credit_facade_credentials)
154 0 : TALER_MERCHANT_post_private_accounts_set_options (
155 : pas->aph,
156 : TALER_MERCHANT_post_private_accounts_option_credit_facade_credentials (
157 : pas->credit_facade_credentials));
158 : {
159 : enum TALER_ErrorCode ec;
160 :
161 10 : ec = TALER_MERCHANT_post_private_accounts_start (
162 : pas->aph,
163 : &post_account_cb,
164 : pas);
165 10 : GNUNET_assert (TALER_EC_NONE == ec);
166 : }
167 10 : }
168 :
169 :
170 : /**
171 : * Offers information from the POST /account CMD state to other
172 : * commands.
173 : *
174 : * @param cls closure
175 : * @param[out] ret result (could be anything)
176 : * @param trait name of the trait
177 : * @param index index number of the object to extract.
178 : * @return #GNUNET_OK on success
179 : */
180 : static enum GNUNET_GenericReturnValue
181 2 : post_account_traits (void *cls,
182 : const void **ret,
183 : const char *trait,
184 : unsigned int index)
185 : {
186 2 : struct PostAccountState *pps = cls;
187 : struct TALER_TESTING_Trait traits[] = {
188 2 : TALER_TESTING_make_trait_h_wires (
189 : 0,
190 2 : &pps->h_wire),
191 2 : TALER_TESTING_make_trait_h_wire (
192 2 : &pps->h_wire),
193 2 : TALER_TESTING_make_trait_payto_uris (
194 : 0,
195 2 : &pps->payto_uri),
196 2 : TALER_TESTING_make_trait_merchant_base_url (
197 : pps->merchant_url),
198 2 : TALER_TESTING_trait_end (),
199 : };
200 :
201 2 : return TALER_TESTING_get_trait (traits,
202 : ret,
203 : trait,
204 : index);
205 : }
206 :
207 :
208 : /**
209 : * Free the state of a "POST product" CMD, and possibly
210 : * cancel a pending operation thereof.
211 : *
212 : * @param cls closure.
213 : * @param cmd command being run.
214 : */
215 : static void
216 10 : post_account_cleanup (void *cls,
217 : const struct TALER_TESTING_Command *cmd)
218 : {
219 10 : struct PostAccountState *pas = cls;
220 :
221 10 : if (NULL != pas->aph)
222 : {
223 0 : GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
224 : "POST /account operation did not complete\n");
225 0 : TALER_MERCHANT_post_private_accounts_cancel (pas->aph);
226 : }
227 10 : GNUNET_free (pas->payto_uri.full_payto);
228 10 : GNUNET_free (pas->credit_facade_url);
229 10 : json_decref (pas->credit_facade_credentials);
230 10 : GNUNET_free (pas);
231 10 : }
232 :
233 :
234 : struct TALER_TESTING_Command
235 10 : TALER_TESTING_cmd_merchant_post_account (
236 : const char *label,
237 : const char *merchant_url,
238 : struct TALER_FullPayto payto_uri,
239 : const char *credit_facade_url,
240 : const json_t *credit_facade_credentials,
241 : unsigned int http_status)
242 : {
243 : struct PostAccountState *pas;
244 :
245 10 : pas = GNUNET_new (struct PostAccountState);
246 10 : pas->merchant_url = merchant_url;
247 : pas->payto_uri.full_payto
248 10 : = GNUNET_strdup (payto_uri.full_payto);
249 10 : if (NULL != credit_facade_url)
250 0 : pas->credit_facade_url = GNUNET_strdup (credit_facade_url);
251 10 : if (NULL != credit_facade_credentials)
252 : pas->credit_facade_credentials
253 0 : = json_incref ((json_t *) credit_facade_credentials);
254 10 : pas->http_status = http_status;
255 : {
256 10 : struct TALER_TESTING_Command cmd = {
257 : .cls = pas,
258 : .label = label,
259 : .run = &post_account_run,
260 : .cleanup = &post_account_cleanup,
261 : .traits = &post_account_traits
262 : };
263 :
264 10 : return cmd;
265 : }
266 : }
267 :
268 :
269 : /* end of testing_api_cmd_post_account.c */
|