Line data Source code
1 : /*
2 : This file is part of TALER
3 : Copyright (C) 2020 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_orders_paid.c
21 : * @brief command to test POST /orders/$ID/paid.
22 : * @author Jonathan Buchanan
23 : */
24 : #include "platform.h"
25 : struct PostOrdersPaidState;
26 : #define TALER_MERCHANT_POST_ORDERS_PAID_RESULT_CLOSURE struct PostOrdersPaidState
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-orders-ORDER_ID-paid.h>
32 :
33 :
34 : /**
35 : * State of a "POST /orders/$ID/paid" CMD.
36 : */
37 : struct PostOrdersPaidState
38 : {
39 :
40 : /**
41 : * Handle for a "POST /paid" request.
42 : */
43 : struct TALER_MERCHANT_PostOrdersPaidHandle *oph;
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 : * Reference to the "pay" command to verify.
57 : */
58 : const char *pay_reference;
59 :
60 : /**
61 : * The session to use for the request.
62 : */
63 : const char *session_id;
64 :
65 : /**
66 : * Expected HTTP response code.
67 : */
68 : unsigned int http_status;
69 :
70 : };
71 :
72 :
73 : /**
74 : * Response from the merchant after POST /paid.
75 : *
76 : * @param cls pointer to `struct PostOrdersPaidState`.
77 : * @param opr the response.
78 : */
79 : static void
80 4 : paid_cb (struct PostOrdersPaidState *ops,
81 : const struct TALER_MERCHANT_PostOrdersPaidResponse *opr)
82 : {
83 :
84 4 : ops->oph = NULL;
85 4 : if (ops->http_status != opr->hr.http_status)
86 : {
87 0 : GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
88 : "Unexpected response code %u (%d) to command %s\n",
89 : opr->hr.http_status,
90 : (int) opr->hr.ec,
91 : TALER_TESTING_interpreter_get_current_label (ops->is));
92 0 : TALER_TESTING_FAIL (ops->is);
93 : }
94 4 : GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
95 : "Successful order-paid (HTTP status: %u)\n",
96 : ops->http_status);
97 4 : TALER_TESTING_interpreter_next (ops->is);
98 : }
99 :
100 :
101 : /**
102 : * Run a "paid" CMD.
103 : *
104 : * @param cls closure
105 : * @param cmd command being run.
106 : * @param is interpreter state
107 : */
108 : static void
109 4 : paid_run (void *cls,
110 : const struct TALER_TESTING_Command *cmd,
111 : struct TALER_TESTING_Interpreter *is)
112 : {
113 4 : struct PostOrdersPaidState *ops = cls;
114 : const struct TALER_TESTING_Command *pay_cmd;
115 : const char *proposal_reference;
116 : const struct TALER_TESTING_Command *proposal_cmd;
117 : const char *order_id;
118 : const struct TALER_PrivateContractHashP *h_contract_terms;
119 : const struct TALER_MerchantSignatureP *merchant_sig;
120 :
121 4 : ops->is = is;
122 4 : pay_cmd = TALER_TESTING_interpreter_lookup_command (is,
123 : ops->pay_reference);
124 4 : if (NULL == pay_cmd)
125 0 : TALER_TESTING_FAIL (is);
126 4 : if (GNUNET_OK !=
127 4 : TALER_TESTING_get_trait_merchant_sig (pay_cmd,
128 : &merchant_sig))
129 0 : TALER_TESTING_FAIL (is);
130 4 : if (GNUNET_OK !=
131 4 : TALER_TESTING_get_trait_proposal_reference (pay_cmd,
132 : &proposal_reference))
133 0 : TALER_TESTING_FAIL (is);
134 4 : proposal_cmd = TALER_TESTING_interpreter_lookup_command (is,
135 : proposal_reference);
136 :
137 4 : if (NULL == proposal_cmd)
138 0 : TALER_TESTING_FAIL (is);
139 :
140 : {
141 : const json_t *contract_terms;
142 : const char *error_name;
143 : unsigned int error_line;
144 :
145 4 : if (GNUNET_OK !=
146 4 : TALER_TESTING_get_trait_contract_terms (proposal_cmd,
147 : &contract_terms))
148 0 : TALER_TESTING_FAIL (is);
149 : {
150 : /* Get information that needs to be put verbatim in the
151 : * deposit permission */
152 : struct GNUNET_JSON_Specification spec[] = {
153 4 : TALER_JSON_spec_slug ("order_id",
154 : &order_id),
155 4 : GNUNET_JSON_spec_end ()
156 : };
157 :
158 4 : if (GNUNET_OK !=
159 4 : GNUNET_JSON_parse (contract_terms,
160 : spec,
161 : &error_name,
162 : &error_line))
163 : {
164 : char *js;
165 :
166 0 : js = json_dumps (contract_terms,
167 : JSON_INDENT (1));
168 0 : GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
169 : "Parser failed on %s:%u for input `%s'\n",
170 : error_name,
171 : error_line,
172 : js);
173 0 : free (js);
174 0 : TALER_TESTING_FAIL (is);
175 : }
176 : }
177 : }
178 :
179 4 : if (GNUNET_OK !=
180 4 : TALER_TESTING_get_trait_h_contract_terms (proposal_cmd,
181 : &h_contract_terms))
182 0 : TALER_TESTING_FAIL (is);
183 :
184 4 : ops->oph = TALER_MERCHANT_post_orders_paid_create (
185 : TALER_TESTING_interpreter_get_context (is),
186 : ops->merchant_url,
187 : order_id,
188 : ops->session_id,
189 : h_contract_terms,
190 : merchant_sig);
191 : {
192 : enum TALER_ErrorCode ec;
193 :
194 4 : ec = TALER_MERCHANT_post_orders_paid_start (
195 : ops->oph,
196 : &paid_cb,
197 : ops);
198 4 : GNUNET_assert (TALER_EC_NONE == ec);
199 : }
200 : }
201 :
202 :
203 : /**
204 : * Free a "paid" CMD, and cancel it if need be.
205 : *
206 : * @param cls closure.
207 : * @param cmd command currently being freed.
208 : */
209 : static void
210 4 : paid_cleanup (void *cls,
211 : const struct TALER_TESTING_Command *cmd)
212 : {
213 4 : struct PostOrdersPaidState *ops = cls;
214 :
215 4 : if (NULL != ops->oph)
216 : {
217 0 : GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
218 : "Command `%s' did not complete.\n",
219 : TALER_TESTING_interpreter_get_current_label (
220 : ops->is));
221 0 : TALER_MERCHANT_post_orders_paid_cancel (ops->oph);
222 : }
223 4 : GNUNET_free (ops);
224 4 : }
225 :
226 :
227 : struct TALER_TESTING_Command
228 4 : TALER_TESTING_cmd_merchant_post_orders_paid (const char *label,
229 : const char *merchant_url,
230 : const char *pay_reference,
231 : const char *session_id,
232 : unsigned int http_status)
233 : {
234 : struct PostOrdersPaidState *ops;
235 :
236 4 : ops = GNUNET_new (struct PostOrdersPaidState);
237 4 : ops->http_status = http_status;
238 4 : ops->pay_reference = pay_reference;
239 4 : ops->merchant_url = merchant_url;
240 4 : ops->session_id = session_id;
241 : {
242 4 : struct TALER_TESTING_Command cmd = {
243 : .cls = ops,
244 : .label = label,
245 : .run = &paid_run,
246 : .cleanup = &paid_cleanup
247 : };
248 :
249 4 : return cmd;
250 : }
251 : }
|